假設我有以下代碼:爲什麼對靜態變量的非靜態引用可編譯?
public class Everything{
public static int answer = 42;
public int getAnswer(){
return this.answer;
}
}
技術上來講,this.answer
實際上並不存在,但是編譯器讓我們了與警告。爲什麼我們不會得到編譯錯誤呢?
假設我有以下代碼:爲什麼對靜態變量的非靜態引用可編譯?
public class Everything{
public static int answer = 42;
public int getAnswer(){
return this.answer;
}
}
技術上來講,this.answer
實際上並不存在,但是編譯器讓我們了與警告。爲什麼我們不會得到編譯錯誤呢?
this
是對Everything
的實例的有效參考。因此,它是對Everything
類的有效參考,因此是訪問該類的任何靜態成員和/或方法的有效方法。
你甚至可以這樣做:
Everything nothing = null;
nothing.answer; // Does not throw an NPE!!
一般來說,這不是很好的做法... IDEA,例如,會警告你,你「通過一個實例引用訪問靜態成員」。
當加載Everything類時,所有的靜態塊和靜態變量都按它們出現的順序執行/初始化。所以對靜態變量的任何進一步的引用都會引用這些。使用類名或實例從同一個類訪問它們並不重要。 (甚至fge指出的空引用)
您的IDE很可能會顯示警告。 *通過實例引用*或類似的東西訪問靜態成員。 – maba
它們是可編譯的,因爲規範說它是允許的。還有什麼其他原因? – dlev