2 回答

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

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