2013-07-05 35 views
-5

當我做一個抽象類,然後在它的構造函數。 爲什麼在我的超類中聲明相同參數的子類中創建構造函數是強制的?在java中的繼承和使用構造函數

+0

因爲,據推測,您的抽象類沒有默認的構造函數。 –

+1

你好,歡迎來到SO。將一些代碼示例包含在您的問題中總是一個更好的主意,這樣我們可以更好地瞭解您的問題,並更有效地回答您。請添加一些代碼示例。 –

+2

不是。沒有要求這樣做。但是,如果你的父類有一個參數化構造函數,你必須聲明**構造函數,因爲構造函數不是繼承的。 –

回答

1

僅當您的抽象基類沒有定義無參數默認構造函數時。因爲你爲抽象超類添加了一個參數化構造函數,所以編譯器現在不會自動提供一個默認構造函數。

而且它是不正確的說

爲什麼它應該是強制使與我在超類中聲明相同的參數子類構造函數?

,因爲可以很好地定義諸如

SubClass(/* no parameters */) { 
    super(1); // calls SuperClass(int i) constructor 
} 
+0

+1提及約0個arg默認構造方法位 – ha9u63ar

0

知道事情的關鍵一子類的構造是在子類構造函數必須調用父類的構造函數。一種方法是爲你添加呼叫:

public MySubClass(int i) { 
    super(i); 
    ... more code goes here ... 
} 

這不會編譯除非父類與單個int參數的構造函數。

如果您沒有調用父構造函數,編譯器會爲您添加一個,並調用父類中默認的無參數構造函數。生成的代碼看起來有點像這樣:

public MySubClass(int i) { 
    super(); // Note: this line added by compiler if not present 
    ... original code goes here ... 
} 

但是,再次,父類必須有一個無參數構造函數。

很容易創建一個類,沒有思考,沒有無參數的構造函數,因爲通常我們會習慣編譯器爲您添加一個無參數構造函數。這就是它被稱爲默認構造函數的原因。

但是,如果父類具有帶參數的構造函數,則不會創建默認構造函數,並且第2代碼示例將失敗。 (實際上,無論你將調用放到父類,無參數構造函數還是依靠編譯器來添加,它都會失敗。)

一種解決方案是向父類添加一個顯式無參數構造函數與正則構造函數與參數。如果您想限制哪些類可以撥打電話,您甚至可以製作protected

另一種解決方案是將子類中的調用添加到實際存在的構造函數中。在這個例子中,那將是一個參數爲int的構造函數。