9 回答

TA貢獻3條經(jīng)驗 獲得超4個贊
?java中每個類必須有一個構(gòu)造函數(shù),如果沒有顯示的聲明構(gòu)造函數(shù),那么編譯器會自動加一個無參的構(gòu)造函數(shù)。當顯示定義了帶參數(shù)的構(gòu)造函數(shù)之后,而沒有顯示的定義無參構(gòu)造函數(shù),那么這個類就沒有無參構(gòu)造函數(shù)了。
?子類繼承父類,必須在子類的構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù),如果子類的構(gòu)造函數(shù)中,沒有顯示的調(diào)用父類的構(gòu)造函數(shù),那么會自動調(diào)用父類的無參數(shù)構(gòu)造函數(shù),如果父類沒有無參數(shù)構(gòu)造函數(shù),那么子類中必須顯示的調(diào)用父類的構(gòu)造函數(shù)(使用super關(guān)鍵字即可),而且必須是在構(gòu)造方法的第一個語句 中進行調(diào)用。
????? ? PS:現(xiàn)在說說你的代碼的問題,父類Animal沒有顯示的定義無參構(gòu)造函數(shù),所以只有有參構(gòu)造函數(shù),子類必須調(diào)用父類的構(gòu)造方法(即父類的有參構(gòu)造方法),用來初始化父類。(子類在執(zhí)行過程中,先執(zhí)行父類,所以必須初始化父類的構(gòu)造器,避免出現(xiàn)錯誤)。
//?父類Animal public?class?Animal?{ private?String?color; private?String?size; //?只定義了有參構(gòu)造函數(shù),未顯示定義無參構(gòu)造函數(shù) public?Animal(String?color,?String?size){ this.color?=?color; this.size?=?size; } } //?子類Dog繼承父類Animal class?Dog?extends?Animal(){ ????//?子類繼承父類,需要調(diào)用父類的構(gòu)造方法,使用super關(guān)鍵字即可 ????public?Dog(String?color,?String?size,?String?test)?{ super(color,?size);?//?必須放在第一個構(gòu)造函數(shù)第一行 } }
下面是你想達到的效果:
public?class?Animal?{ private?String?color; private?String?size; //?顯示定義無參構(gòu)造函數(shù) public?Animal(){} public?Animal(String?color,?String?size){ this.color?=?color; this.size?=?size; } } class?Cat?extends?Animal{ public?Cat(String?color,?String?size,?String?test){ super();?//?其實也是調(diào)用了父類的無參構(gòu)造方法,編譯器默認調(diào)用而已,也可以不寫該super() } }

TA貢獻15條經(jīng)驗 獲得超30個贊
子類不滿意父類的構(gòu)造器,想重新寫一個構(gòu)造器,但是必須要調(diào)用父類的構(gòu)造器,為什么必須要調(diào)用父類的構(gòu)造器,是不是你后面說的要先創(chuàng)建父類對象,調(diào)用父類的構(gòu)造器,然后再創(chuàng)建子類對象,調(diào)用子類的構(gòu)造器。那它干嘛不去父類里調(diào),要在子類里再寫一遍,還有既然是先調(diào)用父類構(gòu)造器,再調(diào)用子類構(gòu)造器,為什么我圖片中打印出來只有子類(我還以為是先打印父類再打印子類,不解)
添加回答
舉報