相对于超类构造函数的最终变量初始化

时间:2014-07-04 18:37:22

标签: java initialization final superclass

正如此(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();
    }
}

1 个答案:

答案 0 :(得分:3)

final int a=5;

是一个常量变量,它是一个常量表达式。编译器将用它的值替换对它的所有引用。

所以

System.out.println("B="+a);

实际上会编译为

System.out.println("B="+5); // B=5