2013-05-19 102 views
23

靜態變量分析一些奇怪的場景在以下靜態塊:的java:訪問內部靜態塊

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(i); // Compilation error "Cannot reference a field before it is defined" 
} 

private static int i=100; 

雖然相同的代碼工作正常同時使用:

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(MyClass.i); // Compiles OK 
} 

private static int i=100; 

不知道爲什麼變量初始化不需要使用類名的變量訪問,而SOP需要?

+0

您是不是要在兩個塊中顯示錯誤? – Bohemian

+1

@Bohemian我認爲這是一個複製/粘貼失敗。第二個塊不應該顯示錯誤。 –

+0

另請參閱http://stackoverflow.com/questions/15820302/recursive-initializer-works-when-i-add-this – ZhongYu

回答

10

這是因爲restrictions on the use of Fields during Initialization。特別是,靜態初始化塊內聲明的行之前的靜態字段只能在表達式的左側(即賦值),除非它們完全限定(在你的情況下爲MyClass.i)。

例如:如果您在i = 100;之後插入int j = i;,您將得到相同的錯誤。

解決該問題的顯而易見的方法是在之前聲明static int i;靜態初始化塊。

+0

+1很酷。我不知道,也沒有遇到過。我也不敢相信這花了我很長的時間才能確定你的名字:/ – Bohemian

+0

@Bohemian我想知道你在想什麼。 – assylias

+3

你並不像你第一次看起來那麼愚蠢:) – Bohemian

0

這是因爲編譯器在做靜態代碼分析,例如活動變量分析(反向分析)。它會爲每個程序點計算在下一次寫入之前變量是否被讀取。