2
當嵌套枚舉類試圖訪問外部時,它會收到有關無法訪問靜態上下文中的非靜態字段的錯誤消息。但是,將字段包置於本地,或者使用超級關鍵字「修復」問題,這在錯誤消息中並不明顯。嵌套枚舉不能訪問枚舉類的私有字段
如果枚舉是一個嵌套類,那就沒有三人
public enum EnumExample {
One {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
public int getMemberVariable2OK() {
return memberVariable2;
}
};
private final int memberVariable = 1;
final int memberVariable2 = 1;
}
預期 -
的錯誤消息不說清楚,採用了超。關鍵字會「解決」問題。它看起來不是正確的行爲,但如果是錯誤信息,則不會提供解決方案。
實際 - 與下面相同的行爲。
However following compiles absolutely fine.
public class Enumtest {
public class NestedNotEnum extends Enumtest {
public int getMemberVariableFailes() {
// compiles just fine.
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}
可有一個闡述爲什麼發生這種情況。
如果兩個EnumExample的子類的一個實例,和靜態嵌套類EnumExample的。該字段在超類中定義,並應可供子類訪問。因此它應該被保護而不是私人的。 –
@JBNizet,你是對的,但恕我直言,錯誤信息的文本是有點混亂。 '一個'確實是靜態成員和'EnumExample'的一個子類。作爲一個子類,它不應該能夠訪問super的私有成員。但是,如果明確寫出「超級」字,就可以。恕我直言,這是奇怪的... – AlexR
是的,這也是我的擔憂...文本消息是相當混亂,我運行它在Linux和solaris上都和Java 6和Java 7,但得到了相同的答案... :( –