首页 > 编程语言 >零基础学Java(14)对象构造

零基础学Java(14)对象构造

时间:2022-08-20 15:22:05浏览次数:75  
标签:初始化 Java 14 Employee2 构造 new nextId public name

对象构造

之前学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制。
 

重载

有些类有多个构造器。例如,可以如下构造一个空的StringBuilder对象:

var messages = new StringBuilder();

或者,可以指定一个初始字符串:

var todoList = new StringBuilder("To do:\n");

这种功能叫做重载。如果多个方法有相同的名字、不同的参数,便出现了重载。编译器必须挑选出具体调用哪个方法。它用各个方法首部中的参数类型与特定方法调用中所使用的的值类型进行匹配,来选出正确的方法。如果编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他的更好(这个查找匹配的过程被称为重载解析)
 

默认字段初始化

如果在构造器中没有显式地为字段设置初始值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null
 

静态初始化块

如果类的静态字段需要很复杂的初始化代码,那么可以使用静态的初始化块。
将代码放在一个块中,并标记关键字static。下面给出一个示例。其功能是将员工ID的起始值赋予一个小于1000的随机整数

// 静态初始化块
static {
    var generator = new Random();
    nextId = generator.nextInt(1000);
}

在类第一次加载的时候,将会进行静态字段的初始化。与实例字段一样,除非将静态字段显式地设置成其他值,否则默认的初始值是0、false或null。所有的静态字段初始化方法以及静态初始化块都将依照类声明中出现的顺序执行。
 

实战

下面的程序会展示很多特性

  • 重载构造器
  • this(...)调用另一个构造器
  • 无参数构造器
  • 对象初始化块
  • 静态初始化块
  • 实例字段初始化
import java.util.Random;


public class ConstructorTest {
    public static void main(String[] args) {
        Employee2[] staff = new Employee2[3];
        staff[0] = new Employee2("Harry", 40000);
        staff[1] = new Employee2(60000);
        staff[2] = new Employee2();

        for (Employee2 e: staff) {
            System.out.println("name=" + e.getName() + ", id=" + e.getId() + ", salary=" + e.getSalary());
        }
    }
}

class Employee2 {
    private static int nextId;
    private int id;
    private String name = "";
    private double salary;

    // 静态初始化块
    static {
        Random generator = new Random();
        // 设置在0-9999之间的随机数变量nextId
        nextId = generator.nextInt(10000);
    }

    // 对象初始化块
    {
        id = nextId;
        nextId++;
    }

    /**
     * 3个重载构造函数
     */
    public Employee2(String n, double s) {
        this.name = n;
        this.salary = s;
    }

    public Employee2(double s) {
        this("新名字" + nextId, s);
    }

    public Employee2() {}

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }
    public int getId() {
        return id;
    }
}

运行结果如下:

name=Harry, id=2775, salary=40000.0
name=新名字2776, id=2776, salary=60000.0
name=, id=2777, salary=0.0

标签:初始化,Java,14,Employee2,构造,new,nextId,public,name
From: https://www.cnblogs.com/jiakecong/p/16495218.html

相关文章

  • javascript:null和undefined的区别(chrome 104.0.5112.101)
    一,js代码:<html><head><metacharset="utf-8"/><title>测试</title></head><body><buttononclick="test()">测试</button><script>functiontest......
  • jd-jui 反编译Save成java文件时,去除行号
    清除行号注释/*  2600  */1.按Ctrl+F弹出查找窗口(然后点击文件查找页签)。2.设置目录为jd-gui反编译保存java文件存放目录。3.查找模式设置为正则表达式4..查找......
  • Spring 03: 基于xml的构造方法注入
    注入方式具体有3种注入方式:通过构造方法的a.参数名称注入b.参数下标注入c.默认参数顺序注入参数名称注入School实体类packagecom.example.pojo03;public......
  • Java SPI机制
    SPI全称ServiceProviderInterface,是java提供的一套服务发现机制,它可以用来启用框架扩展的替换组件。SPI作用:为这些被扩展的API寻找服务发现。SPI是调用方来制定接口规......
  • Tomcat 10无法使用javax包
    可以导入新的jakarta包<dependencies><!--servlet依赖--><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artif......
  • Jenkins升级java版本
    1.安装JDK11yuminstalljava-11-openjdk*-y2.查看当前使用的java版本可以看到以下信息则可以继续安装jenkins[root@bogon~]#java-versionopenjdkversion"11.0......
  • java8中的lambda表达式实用详解
    java8中的lambda表达式实用详解1.lambda简介​ Lambda表达式(lambdaexpression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda......
  • C++primer练习16.1-14
    练习16.1::实例化就是模板通过实际调用而确定类型及其运算,抽象到具体练习16.2template<typenameT>intcompare(constT&v1,constT&v2){if(v1<v2)return-1;......
  • Java SE 13 新增特性
    JavaSE13新增特性作者:Grey原文地址:JavaSE13新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_features新版Switch使用方式switch语......
  • 代码审计(Java)——WebGoat_AuthenticationFlaws
     零、SecurePassword这里没什么可审计的,经典的爆破,定期更换复杂度相当的密码吧……一、Passwordreset1.level2这里题目给出的信息是登录自己的WebWolf......