2 回答

TA貢獻1798條經驗 獲得超3個贊
我得出父類總是需要默認或無參數構造函數的結論是否正確?
不。子類構造函數必須做的第一件事是調用其中一個超類構造函數。如果你不這樣做,那么編譯器會為你調用超類的無參數構造函數。但是,如果超類沒有,那當然會失敗。
你的代碼應該是:
class Pony extends Horse {
Pony(int age) {
super(age);
}
}
看,超類已經有一個年齡字段,可能還有使用該字段的方法。所以在子類中重新聲明一個是錯誤的并且適得其反。

TA貢獻1866條經驗 獲得超5個贊
要使其編譯為您需要調用super(int)
而不是super()
隱式調用。
Pony(int?age)?{ ????super(age); ????????this.age?=?age; }
然后您可能會注意到兩者Horse
都有Pony
完全相同的字段,其中包含完全相同的數據。如果類基于 ( ) 已經定義了這個字段,為什么還Pony
需要這個字段?age
Pony
Horse
Pony(int?age)?{ ????super(age); }
這就是繼承的美妙之處:您可以使用基類中已經編寫的任何內容。
但是,編譯器抱怨父類沒有默認構造函數。
它抱怨是因為,正如我上面提到的,它無法調用super()
.
如果構造函數體不以顯式構造函數調用開始,并且聲明的構造函數不是原始類 Object 的一部分,則構造函數體隱式地以超類構造函數調用“super();”開始,這是對構造函數的調用它的直接超類不帶參數。
如果我希望父類和子類只有帶參數的構造函數怎么辦?
然后子類應該總是明確聲明它想調用父類的構造函數。
我得出父類總是需要默認或無參數構造函數的結論是否正確?
不,有一個沒有默認構造函數的父類是可以的,只要它的子類不調用super()
.
添加回答
舉報