2014-07-04 98 views
1

在該(Initialize field before super constructor runs?)後的狀態,所有的非靜態變量獲得超類的構造函數運行後初始化,但在下面的例子中,在調試時我看到變量沒有初始化之前父構造運行,打印功能打印,好像它被初始化的結果「B = 5」。最終vairable初始化相對於超類的構造函數

當我使用非最終變量結果是「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(); 
    } 
} 

回答

3

final int a=5; 

爲常數的變量,它是一個常量表達式。編譯器將用它的值替換對它的所有引用。

所以

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

實際上將編譯爲

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