可能重複:
Why can’t enum’s constructor access static fields?爲什麼枚舉構造函數不能訪問靜態字段
enum Test {
e1,e2;
int i=0;
static int j=5;
Test(){
System.out.println(i+" "+j);
}
}
在上面的代碼構造函數可以訪問實例變量而不是靜態變量J
我已經閱讀了與其他作者有關的答案都說e1和e2在初始化J(靜態字段)之前初始化,但是根據java spec所有靜態字段 初始化的時候曾經把類加載到內存中,也就是在構造函數運行之前。 所以在運行Test()構造函數之前,必須初始化靜態變量j。我無法理解限制,任何機構都可以讓我理解。我已經閱讀了問題的答案Why can't enum's constructor access static fields?但我不滿意如下答案: - 在靜態字段全部被初始化之前調用構造函數。
想,如果採取與一個簡單的類象枚舉另一個例子
class Test{
public static final Test t=new Test();
static int a=5;
Test(){
System.out.println(a);
}
public static void main(String[] args) {
}
}
這裏根據有參數的構造將靜態字段的初始化之前運行,它也運行,因爲它是印刷0(由於JVM做了動初始化)。但沒有編譯錯誤或沒有運行時問題。那麼爲什麼同樣的事情不會發生在枚舉上。
其實很好的問題,我不明白爲什麼這是。可能與Java編譯器如何編譯類文件有關。 – Gerbrand
我不是java專家,但不是枚舉的成員('e1'和'e2'上面)基本上是'enum'的靜態成員?因此,當*他們*被初始化爲值時,必須調用構造函數。但'j'不會被初始化? –
Java中的每個枚舉類似*擴展java.lang.Enum類的類。這個'java.lang.Enum'不能被其他的* normal *類擴展。 所以,你的論點「像枚舉一樣簡單的類」產生預期的輸出是無效的。 – Prasanth