当你定义一个调用另一个构造函数的Javaclass 构造函数时,你需要将构造函数的调用放在构造函数定义的顶部。
例如,下面的Product 类有两个构造函数,第一个构造函数调用第二个:
class Product {
public String name;
public Product() {
this("Mouse");
this.name = "Keyboard";
}
public Product(String name) {
this.name = name;
}
}
当你把构造函数调用移到this.name 赋值的下面时,Java会抛出call to this must be first statement in constructor :
class Product {
public String name;
public Product() {
this.name = "Keyboard";
this("Mouse"); // ERROR
}
public Product(String name) {
this.name = name;
}
}
这是因为当你在调用构造函数之前运行其他语句,那么你可能会调用一些尚未定义的方法或状态。
当你扩展一个超类时也会发生同样的情况。你需要在其他事情之前调用super() 构造函数。
当super() 构造函数之前的其他语句被允许时,那么你可能会尝试调用或操作尚未构造的类成员和方法。
这是Java自己制定的规则,通过禁用类对象的初始化和其他赋值和操作之间的动态顺序来防止错误。
因此,当你需要执行构造函数链或调用超类构造函数时,请确保在第一行进行。