亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

即使子類已經定義了構造函數,父類是否也總是需要一個默認的或無參數的構造函數?

即使子類已經定義了構造函數,父類是否也總是需要一個默認的或無參數的構造函數?

胡子哥哥 2023-04-26 14:32:58
我無法編譯此代碼。class Horse {    private int age;    Horse(int age) {        this.age = age;    }}class Pony extends Horse {    private int age;    Pony(int age) { //here compiler complains about no default constructor in parent class        this.age = age;    }}我知道當父類只有帶有參數的構造函數時,您必須為子類定義一個構造函數,這就是我所做的。但是,編譯器抱怨父類沒有默認構造函數。我得出父類總是需要默認或無參數構造函數的結論是否正確?如果我希望父類和子類只有帶參數的構造函數怎么辦?
查看完整描述

2 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

我得出父類總是需要默認或無參數構造函數的結論是否正確?


不。子類構造函數必須做的第一件事是調用其中一個超類構造函數。如果你不這樣做,那么編譯器會為你調用超類的無參數構造函數。但是,如果超類沒有,那當然會失敗。


你的代碼應該是:


class Pony extends Horse {

    Pony(int age) {

        super(age);

    }

}

看,超類已經有一個年齡字段,可能還有使用該字段的方法。所以在子類中重新聲明一個是錯誤的并且適得其反。


查看完整回答
反對 回復 2023-04-26
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

要使其編譯為您需要調用super(int)而不是super()隱式調用。

Pony(int?age)?{
????super(age);
????????this.age?=?age;
}

然后您可能會注意到兩者Horse都有Pony完全相同的字段,其中包含完全相同的數據。如果類基于 ( ) 已經定義了這個字段,為什么還Pony需要這個字段?agePonyHorse

Pony(int?age)?{
????super(age);
}

這就是繼承的美妙之處:您可以使用基類中已經編寫的任何內容。


但是,編譯器抱怨父類沒有默認構造函數。

它抱怨是因為,正如我上面提到的,它無法調用super().

如果構造函數體不以顯式構造函數調用開始,并且聲明的構造函數不是原始類 Object 的一部分,則構造函數體隱式地以超類構造函數調用“super();”開始,這是對構造函數的調用它的直接超類不帶參數。


如果我希望父類和子類只有帶參數的構造函數怎么辦?

然后子類應該總是明確聲明它想調用父類的構造函數。


我得出父類總是需要默認或無參數構造函數的結論是否正確?

不,有一個沒有默認構造函數的父類是可以的,只要它的子類不調用super().


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號