引用自《Java 核心技术 卷1》ch4.6 对象构造
构造器的具体处理步骤:
- 如果构造器第一行调用了第二个构造器, 则基于所提供的的参数执行第二个构造器
- 否则,
- 所有数据域被初始化为默认值(0、false 或null)。
- 按照在类声明中出现的次序, 依次执行所有域初始化语句和初始化块。
- 先执行静态初始化块,再执行对象初始化块。
- 静态初始化块只执行一次,对象初始化块在每次创建这个类的对象时均执行
- 执行这个构造器的主体.
代码如下:(书上的代码)
public class ConstructorTest {
public static void main(String[] args) {
Employee[] staff = new Employee[3];
staff[0] = new Employee("harry", 4000);
staff[1] = new Employee(6000);
staff[2] = new Employee();
for (Employee employee : staff) {
System.out.println("name = " + employee.getName()
+ ", id = " + employee.getId() + ", salary = " + employee.getSalary());
}
}
}
class Employee {
private static int nextId;
private int id;
private String name = "tom"; // 实例字段初始化
private double salary;
// 静态初始化块(只执行一次,且先于对象初始化之前执行)
static {
System.out.println("静态初始化块");
Random generator = new Random();
// set nextId to a random number between 0 and 9999
nextId = generator.nextInt(10000);
}
// 对象初始化块(每次创建对象都执行一次)
{
System.out.println("对象初始化块");
System.out.println("name = " + name); // 实例字段初始化优先于对象初始化之前执行
id = nextId;
nextId++;
}
// three overload constructor(在实例字段初始化、静态初始化块、对象初始化块之后执行)
public Employee(String name, double salary) {
System.out.println("构造器:Employee(String name, double salary)");
this.name = name;
this.salary = salary;
}
public Employee(double s) {
// call the Employee(String name, double salary) constructor
this("Employee #" + nextId, s);
System.out.println("构造器:Employee(double s)");
}
// the default constructor
public Employee() {
System.out.println("构造器:Employee()");
// name initialized to "" --see above
// salary not explicitly set --initialized to 0
// id initialized in initialization block
}
public double getId() {
return id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
public String getName() {
return name;
}
public boolean equals(Employee other) {
// 类中的一个方法可以访问所有所属类的所有对象的私有数据
return name.equals(other.name);
}
}
执行结果如下: