2017-09-15 97 views
1

當發生class C extends B時發生錯誤。但是,當我寫new A().super();問題解決了。請考慮下面的代碼:由另一個內部類擴展的內部類

public class A { 
     public class B extends A { 
      public class C extends B { 
       public C() { 
        // No enclosing instance of type A is available due to some intermediate constructor error 
        // new A().super(); 
       } 
      } 
     } 
    } 

我的問題是,爲什麼class C cannot extend Class B?爲什麼打電話new A().super();解決了這個問題?這是什麼意思?有沒有更好的方法來解決它(不使用靜態嵌套類)?

+0

兩個版本(有和沒有'新的A()。super();'編譯對我來說很好。我正在運行java 1.8.0_144。 – Turing85

+1

關於「發生錯誤」和「問題」,你能更具體嗎? – Henry

+1

關於「更好的解決方法」,我會考慮將嵌套類層次重構爲單獨的類,但當然取決於實際代碼的建模。 –

回答

2
將被編譯和執行打印「OK」

最簡單的代碼片斷:

public class A { 
     public class B extends A { 
      public class C extends B { 
       public C() { 
        System.out.println("OK"); 
       } 
      } 
     } 

     public static void main(String[] args) { 
      new A().new B().new C(); 
     } 
    } 

這裏是A,B和C.即實例化的另一exampleC類可以延伸乙類如你的問題的初始代碼片段。您的代碼在語法方面是正確的,並且可以無需增加任何不必要的new A().super()

對於考慮進行編譯,讓我們參考tutorial內部類,這些定義都是非靜態的。對於靜態情況下,正確的名稱是Static Nested Class和

將InnerClass的實例可以的在OuterClass

一個實例中只存在實例化一個內部類,你必須先實例化外部類

這意味着,內部類只存在於特定的OuterClass實例而不是OuterClass類的上下文中,這就是爲什麼new A()確實解決了問題,因此提供了運行時實例其中BC確實存在

+0

調用新的A()不能解決問題。調用新的A()。super();解決了這個問題。請解釋一下,調用它的輸出是什麼? – Alice

+1

@愛麗絲的教程就在那裏。你讀過它嗎?調用'new A()。super();'指示編譯器創建一個'A'的新實例,然後在'A'上調用超級構造函數('C',即'B'的構造函數) (因此'.super()' - 部分)。因此,'C'實例綁定到新創建的'A'實例。 – Turing85

+0

@ Turing85我同意A的一個新實例調用超級構造函數,但我不認爲超級是C. – Alice

相關問題