java为什么getX()方法首先执行而不是构造函数
在下面的代码段中,为什么getX()
方法首先执行而不是构造函数:
public class ConsructorQuestion {
int x = getX(); // same this.getX();
public int getX() {
System.out.println(x + " via method ");
return 10;
}
public ConsructorQuestion() {
System.out.println(x+" via constructor");
}
public static void main(String[] args) {
ConsructorQuestion t = new ConsructorQuestion();
}
}
# 1 楼答案
如果构造函数没有链接到同一类中的另一个构造函数(通过调用^{),编译器会将字段初始值设定项(和实例初始化块)注入类中每个构造函数的开头(就在调用
super(...)
,隐式或显式之后)。如果你看一下生成的字节码,你会发现你的类是这样的:构建实例时的操作顺序包含在JLS§12.5中:
注意#4和#5的顺序
# 2 楼答案
实例变量在构造函数体执行之前初始化(但在超类构造函数体执行之后)
因此,在您的示例中,
int x = getX();
在构造函数主体之前执行这相当于将
x
的初始化移动到构造函数的第一行: