由於內部類構建器必須同封裝類對象的一個句柄聯系到一起,所以從一個內部類繼承的時候,情況會稍微變得有些復雜。這兒的問題是封裝類的“秘密”句柄必須獲得初始化,而且在衍生類中不再有一個默認的對象可以連接。解決這個問題的辦法是采用一種特殊的語法,明確建立這種關聯:
//: InheritInner.java // Inheriting an inner class class WithInner { class Inner {} } public class InheritInner extends WithInner.Inner { //! InheritInner() {} // Won't compile InheritInner(WithInner wi) { wi.super(); } public static void main(String[] args) { WithInner wi = new WithInner(); InheritInner ii = new InheritInner(wi); } } ///:~
從中可以看到,InheritInner只對內部類進行了擴展,沒有擴展外部類。但在需要創建一個構建器的時候,默認對象已經沒有意義,我們不能只是傳遞封裝對象的一個句柄。此外,必須在構建器中采用下述語法:
enclosingClassHandle.super();
它提供了必要的句柄,以便程序正確編譯。