2011-06-11 42 views
95

所以說我有一個擴展超類的子類。在什麼情況下,我需要明確鍵入super()才能讓超類構造函數運行?你什麼時候需要顯式調用超類的構造函數?

我正在看一本關於抽象類的書中的例子,當他們用非抽象的子類擴展它時,子類的默認構造函數是空白的,並且有一個說明超類的默認構造函數將被調用的註釋。與此同時,我也看到了在這裏的情況下,某人的問題沒有明確地呼籲super()

區別於從子類的默認/非默認構造函數調用超類的默認/非默認構造函數?

+0

是我還是沒有答案解決「爲什麼你需要調用一個超類的構造函數在一個子類」 – 2016-04-09 08:03:45

回答

137

從未需要的正好

super(); 

那會是什麼那裏,如果你不指定任何東西。您需要指定構造函數調用,如果:

  • 你想在同一個類來調用它有參數的超類構造函數
  • 你想鏈到另一個構造函數,而不是父類的構造的

你聲稱:

同時我也看到了在這裏的實例,其中一個人的問題不是explic它打電話給super()。

你能舉幾個例子嗎?我無法想象這怎麼可能...

+4

是的,我應該更清楚。這是超級(有爭論)。感謝您的回答。 – jhlu87 2011-06-11 21:35:28

+0

你說得對。但是關於這個:'同時我也看到了在這裏某些人的問題沒有明確地調用super()的例子。「當父構造函數沒有noarg構造函數時會發生這種情況。在這種情況下,如果你沒有明確地調用super(),你會得到一個錯誤。 – ACV 2016-02-26 13:24:38

+1

@ACV:顯式調用'super()'也不會在那裏工作。使用非空參數列表調用superconstructor *會起作用,但只使用'super()'不會。 – 2016-02-26 13:28:19

10

如果你沒有明確地調用一個超級構造函數,那麼將調用參數less構造函數(super())。這意味着如果超類沒有可用的無參數構造函數,則必須自己調用特定的構造函數。

但是,即使您可以使用默認構造函數 - 取決於您的代碼,通常情況下您還是需要不同的構造函數。

另請注意,如果沒有聲明構造函數,編譯器會自動生成一個公共的默認構造函數,但只要您編寫自己的構造函數,就不會再發生這種情況。

+1

只是爲了確保我明白。如果在我的超類中,我有一個構造函數,它不是默認的構造函數(說它需要一個參數)。然後在我的子類的構造函數中,我需要顯式調用super(param),因爲編譯器將不再生成超類的默認構造函數? – jhlu87 2011-06-11 21:38:01

+1

@ jhlu87,正確的 – bestsss 2011-06-11 21:46:46

4

super()方法總是在子類的構造函數中調用,即使它沒有明確寫入代碼。

您需要編寫它的唯一時間是在具有不同初始化參數的超類中有多個super(...)方法。

+5

「唯一需要編寫它的時間是,如果超類中有幾個具有不同初始化參數的超類(...)方法。」不對。只要有一個可用的參數較少的構造函數,就可以有一百個其他構造函數沒有任何問題。 – Voo 2011-06-11 21:28:12

相關問題