在这部分的代码中展现了很多的特性:
- 重载构造器
- 用this(…)调用另一个构造器
- 无参数构造器
- 对象初始化块
- 静态初始化块
- 实例域初始化
下面来为大家展示代码以及最后运行出的一个结果:
Employee类
package com.example.constructor;
import java.util.Random;
public class Employee {
private static int nextId;
private int id;
private String name = ""; // 实例变量初始化
private double salary;
// 静态代码块
static {
Random generator = new Random();
// 设置nextId为一个0到9999的随机数
nextId = generator.nextInt(10000);
}
// 对象初始化块
{
id = nextId;
nextId++;
}
// 三个重载的构造方法
public Employee(String n, double s) {
name = n;
salary = s;
}
public Employee(double s) {
// 引用了 Employee(String n, double s) 构造方法
this("Emploree #" + nextId, s);
}
// 默认构造方法
public Employee() {
// name初始化为""
// salary没有明确设置——初始化为 0
// id被初始化在初始化块里
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
}
测试类
package com.example.constructor;
public class ConstructorTest {
public static void main(String[] args) {
// 填充员工给三个员工对象
Employee[] staff = new Employee[3];
/*
1、首先执行静态代码块,为nextId赋值一个随机数,静态代码块只执行一次
2、执行 new Employee("Harry", 40000) ,把参数值传递过去
3、调用构造方法,初始化参数,name默认为null,salary默认为0.0
4、为name赋值为"",在对象代码块中为id赋值
5、在构造方法中将传递过去的参数值分别赋值给name和salary
6、staff对象构建成功
*/
staff[0] = new Employee("Harry", 40000);
/*
1、把参数值传递过去
2、它的构造方法中引用了 Employee(String n, double s) 构造方法
3、调用 Employee(String n, double s) 构造方法,为初始化参数,name默认为null,salary默认为0.0
4、为name赋值为"",在对象代码块中为id赋值
5、在构造方法中将传递过去的参数值分别赋值给name和salary
6、staff对象构建成功
*/
staff[1] = new Employee(60000);
/*
1、调用无参构造函数
2、初始化参数,name默认为空,salary默认为0.0
3、为name赋初值为"",在对象代码块中为id赋值为nextId的值
4、结束返回,staff对象构建成功
*/
staff[2] = new Employee();
// 输出所有的员工对象
for (Employee employee : staff) {
System.out.println(employee);
}
}
}
结果: