2013-05-29 43 views
0

假設我有以下代碼:爲什麼對靜態變量的非靜態引用可編譯?

public class Everything{ 
    public static int answer = 42; 

    public int getAnswer(){ 
     return this.answer; 
    } 
} 

技術上來講,this.answer實際上並不存在,但是編譯器讓我們了與警告。爲什麼我們不會得到編譯錯誤呢?

+0

您的IDE很可能會顯示警告。 *通過實例引用*或類似的東西訪問靜態成員。 – maba

+0

它們是可編譯的,因爲規範說它是允許的。還有什麼其他原因? – dlev

回答

3

this是對Everything的實例的有效參考。因此,它是對Everything類的有效參考,因此是訪問該類的任何靜態成員和/或方法的有效方法。

你甚至可以這樣做:

Everything nothing = null; 
nothing.answer; // Does not throw an NPE!! 

一般來說,這不是很好的做法... IDEA,例如,會警告你,你「通過一個實例引用訪問靜態成員」。

+0

我絕對同意,沒有人應該寫這樣的代碼。我想我只是總是將一個類的實例和類本身視爲完全不同的構造。我認爲類和類實例之間的界限可以被模糊化,但是隻有在編寫可怕的代碼時才真的很奇怪。 – CodeBlind

+0

@BenLawry將此行爲與C#進行對比,在該實例變量上調用靜態方法是編譯時錯誤。 – dlev

0

當加載Everything類時,所有的靜態塊和靜態變量都按它們出現的順序執行/初始化。所以對靜態變量的任何進一步的引用都會引用這些。使用類名或實例從同一個類訪問它們並不重要。 (甚至fge指出的空引用)

相關問題