2014-02-06 29 views
4

我對Java中數據初始化有點困惑。我已經讀過,在Class中調用任何方法之前,所有的類字段都將被初始化。關於Java中數據初始化的混淆

考慮這個問題:

public class TestCls { 

    public static int test = getInt(); 

    static{ 
     System.out.println("Static initializer: " + test); 
    } 

    public static int getInt(){ 

     System.out.println("giveInt func: " + test); 
     return 10; 
    } 

    public static void main(String... args){ 
     System.out.println("Main: " + test); 
    } 

輸出:

giveInt func: 0 
static initializer: 10 
main: 10 

這裏 '測試' 領域獲得通過調用駐留在同一類getInt()函數的值。但是,當getInt()被稱爲'test'時,字段將被初始化爲默認值,即0(見getInt()函數內部)。我的問題是什麼時候getInt()函數會被調用?它是在定義'測試'字段時被調用,還是在初始化類中的所有字段後被調用。

+1

你讀的是一個簡化。查看JLS [類實例創建表達式的運行時評估](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.4)故事。 –

回答

1

你可以通過添加更多的字段來測試。

public class TestCls { 

    public static int test = getInt(); 
    public static int moreJunk = initializeMoreJunk(); 

    static{ 
     System.out.println("Static initializer: test=" + test + ", moreJunk=" + moreJunk); 
    } 

    public static int getInt(){ 

     System.out.println("giveInt func: " + test); 
     System.out.println("moreJunk=" + moreJunk); 
     return 10; 
    } 

    public static int initializeMoreJunk() { 
     return -1; 
    } 

    public static void main(String... args){ 
     System.out.println("Main: " + test); 
    } 
} 

用的輸出:

giveInt func: 0 
moreJunk=0 
Static initializer: test=10, moreJunk=-1 
Main: 10 

這表明(原始整數默認爲0),然後初始化塊和方法被調用,從頂部出發那類變量得到初始化爲默認值的第一下課。

3

以下是上述代碼中發生的情況。

  1. 創建類和所有靜態類級變量(屬性,數據成員,曾經你想打電話給他們什麼)被初始化到適當的初始值(0 INT,空的對象引用)。
  2. 從頂部開始,執行靜態初始化塊。
  3. 輸入主要方法。

這會導致您看到的(正確)輸出。