这个java程序很简单,而且有很多注释,所以你可以很快理解它。但是,为什么在构造staff[1]时,程序首先转到语句:
this("Employee #" + nextId, s);
然后转到对象初始化 block ,然后再回到语句,好困惑。为什么不先使用对象初始化 block
import java.util.*;
public class ConstructorTest
{
public static void main(String[] args)
{
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Harry", 40000);
staff[1] = new Employee(60000);
staff[2] = new Employee();
// print out information about all Employee objects
for (Employee e : staff)
System.out.println("name=" + e.getName()
+ ",id=" + e.getId()
+ ",salary=" + e.getSalary());
}
}
class Employee
{
// three overloaded constructors
public Employee(String n, double s)
{
name = n;
salary = s;
}
public Employee(double s)
{
// calls the Employee(String, double) constructor
this("Employee #" + nextId, s);
}
// the default constructor
public Employee()
{
// name initialized to ""--see below
// salary not explicitly set--initialized to 0
// id initialized in initialization block
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public int getId()
{
return id;
}
private static int nextId;
private int id;
private String name = ""; // instance field initialization
private double salary;
// static initialization block
static
{
Random generator = new Random();
// set nextId to a random number between 0 and 9999
nextId = generator.nextInt(10000);
}
// object initialization block
{
id = nextId;
nextId++;
}
}
最佳答案
因为 this("Employee #"+ nextId, s);
包含对父类(super class)构造函数的隐式调用,当然必须在子类的初始化 block 之前执行。
使用实例初始化器通常是一个坏主意,因为它们并不为人所知,除了构造函数之外不能做任何事情,并且混合两者会导致困惑。
关于java构造函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687030/