2013-07-11 82 views
2

我這段代碼混淆一點點:Java中的super()。這是什麼意思?

class A{ 
    class B{ 
    } 
} 

class C extends A.B{ 
    C(A a){ 
     a.super(); 
    } 
} 

是什麼意思: 「a.super();」 ? 之前我認爲超級鏈接到她的父類,但「超()」 - 父母的構造函數的鏈接,但真正的A類沒有父類(不介意對象...),那是什麼意思超級在這種情況下?

Thx everyone。

回答

3

它是合格的超類構造函數調用。

JLS 1.8

顯式構造函數調用語句可以分爲兩種:

  1. 可選的構造調用這個(可能帶有明確的類型參數的開頭)的關鍵字開頭。它們用於調用同一個類的替代構造函數。

  2. 超類構造函數調用以super關鍵字(可能以顯式類型參數開頭)或主表達式開始。它們用於調用直接超類的構造函數。超類的構造函數調用可以進一步細分:

  3. 不合格的超類構造函數調用以關鍵字super開頭(可能以顯式類型參數開頭)。

  4. 合格的超類構造函數調用以一個主表達式開始。它們允許子類構造函數明確指定新創建的對象相對於直接超類的直接封閉實例(第8.1.3節)。當超類是內部類時,這可能是必要的。

5

超()調用父類的默認構造函數。如果你沒有定義構造函數,你的類總是有一個不可見的默認構造函數,它不需要任何參數。在這種情況下,您正在調用Object類的構造函數。

+0

不,這是錯誤的。我也是這麼想的。但是,實際上 'a.super()'='A.B()',所以B的類構造函數。我在這裏找到: http://stackoverflow.com/a/2831567/2572927 ,我發現一個感興趣的時刻: '類A { 類B { B(String s)將{打印(S); (C構造函數!);} } } C類擴展AB {0} } }' 這是正常的工作,所以'a.super()'='A.B()'。我想是的,我希望它是真相=) –