1 回答

TA貢獻1788條經驗 獲得超4個贊
非靜態內部類有一些特別之處。
靜態內部類沒有。頂級課程沒有它。任何內部接口或枚舉都沒有。
那個特殊的東西是一個看不見的領域。
這個不可見的字段是類型Outer,它是final。它在其構造函數中被初始化為第一件事,并且,是的,非靜態內部類的每個構造函數都有一個神奇的不可見參數,類型為 ,用作Outer此字段。
所以,當你寫:
public class Outer {
public class Inner {
}
}
編譯器將像您實際編寫的那樣編譯此代碼:
public class Outer {
public static class Inner {
private final Outer I_AM_MAGIC;
public Inner(Outer outer) {
this.I_AM_MAGIC = outer;
}
}
}
你可以使用javap反編譯工具看到這個隱藏的魔法;通過-verbose,-private你會看到這些。這種魔法存在的原因是您可以從內部調用外部的實例方法,但是..您在什么實例上調用這些外部方法?在那個隱藏的實例上!
請注意,這段奇異的、看似怪異的代碼:someOuter.new Inner()實際上是合法的 Java 代碼。當new Inner()從 中的非靜態上下文中調用時Outer,this實例作為不可見參數傳遞給該構造函數,但如果您不在那里,代碼根本不會編譯......除非您使用語法outer.new Inner()。
編譯器會阻止您添加靜態方法的原因是Inner它被認為會導致一些混亂?;旧?,你的問題的答案是:“沒有充分的理由......只是......規范說java編譯器不能允許它,因此,javac不允許它”。
請注意,實際上這些非靜態內部類是令人困惑的東西。我強烈建議你教自己總是做你的內部課程static,除非你真的知道你在做什么。即使那樣,也要三思。然后再三思。然后也許考慮制作一個非靜態內部類。
添加回答
舉報