9 回答

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

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