5
當您使用私有內部類編譯Java類時,由於某種原因,似乎會自動合成一個匿名類。這個類是足以重現:私有內部類合成意外的匿名類
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
在編譯時,這會產生預期的SynthesizeAnonymous.class
和SynthesizeAnonymous$InnerClass.class
文件,但它也產生一個奇怪的SynthesizeAnonymous$1.class
文件對應於該合成的java.lang.Object
一個匿名子類。如果你看看javap
的反彙編,看起來InnerClass
的默認構造函數獲得了這個匿名類型的隱藏參數,並且在調用new InnerClass()
時將null
傳遞給它。
爲什麼創建這個類?即使InnerClass
不是靜態的,也會創建它,但如果InnerClass
不是私有的或者沒有創建InnerClass
的實例,則不會創建它。是否有某種形式的訪問控制?這是如何運作的?