正如此(Initialize field before super constructor runs?)帖子所述,所有非静态变量在超类构造函数运行后初始化,但在下面的示例中,在调试时我看到在父构造函数运行之前未初始化变量,print函数打印结果“B = 5”,就像它被初始化一样。
当我使用非最终变量时,结果是“B = 0”,如预期的那样。
发生了什么事?
这是代码:
public class A {
int a=77;
public A(int i){
printMe();
}
public void printMe(){
System.out.println("A "+a);
}
}
public class B extends A{
//static int a=5; //test will print 5
final int a=5; //test will print 5
//int a=5; ////test will print 0
public B() {
super(0);
}
public void printMe(){
System.out.println("B="+a);
}
public static void main(String[] args) {
new B();
}
}
答案 0 :(得分:3)
此
final int a=5;
是一个常量变量,它是一个常量表达式。编译器将用它的值替换对它的所有引用。
所以
System.out.println("B="+a);
实际上会编译为
System.out.println("B="+5); // B=5