正如这篇 (Initialize field before super constructor runs?) 文章所述,所有非静态变量都在父类(super class)构造函数运行后初始化,但在下面的示例中,在调试时我看到变量在父构造函数运行之前未初始化, 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();
}
}
最佳答案
这个
final int a=5;
是常量变量,也就是常量表达式。编译器将用它的值替换对它的所有引用。
所以
System.out.println("B="+a);
实际上会编译成
System.out.println("B="+5); // B=5
关于java - 相对于父类(super class)构造函数的最终可变初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24579456/