首先,構(gòu)造方法本身會(huì)有一個(gè)隱式的無(wú)參構(gòu)造(默認(rèn)):
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的獻(xiàn)縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!①不寫構(gòu)造方法,類中的第一行代碼事實(shí)上有一個(gè)默認(rèn)的無(wú)參構(gòu)造(系統(tǒng)會(huì)隱式為你寫好)
public class Student { private String name; // public Student() {} 隱式地“寫”在這里,你看不見 // Strudent類中雖然沒有寫構(gòu)造方法,但相當(dāng)于有上面的無(wú)參構(gòu)造 // 只不過是隱式的,你看不見 }
②只寫帶參構(gòu)造方法,相當(dāng)于只有該帶參構(gòu)造方法(隱式的無(wú)參構(gòu)造會(huì)被屏蔽無(wú)視掉,視為無(wú)效)
public class Student { private String name; public Student(String name) { this.name=name; } // 此時(shí)原來(lái)Strudent類中的隱式的無(wú)參構(gòu)造方法被屏蔽了,無(wú)效了 // 類中只有帶參構(gòu)造 }
③若想同時(shí)擁有無(wú)參和帶參構(gòu)造,必須顯式地寫出無(wú)參和帶參構(gòu)造方法
public class Student { private String name; public Student() {} // 顯式地將無(wú)參構(gòu)造寫出來(lái) public Student(String name) { this.name=name; } // 若想Strudent類中擁有無(wú)參構(gòu)造方法,必須顯式地寫出來(lái) }
進(jìn)一步結(jié)合繼承,就需要考慮到子父類:
④在子類的構(gòu)造方法(無(wú)論是無(wú)參和有參)中,方法中的第一行代碼事實(shí)上都隱式地包含了父類的無(wú)參構(gòu)造方法
即: super()
public class Stu extends Student { private String name; public Stu() { // super(); // 在子類的無(wú)參構(gòu)造中,super()是隱式的“寫”在這里的 } public Stu(String name) { // super(); this.name=name; // 在子類的帶參構(gòu)造,上面的super()同樣也是隱式的“寫”在這里的 } }
這就是為什么,調(diào)用子類的構(gòu)造方法時(shí),都會(huì)先調(diào)用父類的無(wú)參構(gòu)造方法了,因?yàn)槟J(rèn)的super()存在。
⑤同理,類似與上面的②,此時(shí)若寫一個(gè)有參構(gòu)造,super(xx)會(huì)把隱式的super()屏蔽掉
public class Stu extends Student { private String name; public Stu(String name) { // super(); 原來(lái)隱式寫在這里的super()被屏蔽了,無(wú)效了 super(name); // 在子類的帶參構(gòu)造, 由于的super(name)的存在,super()無(wú)效了 //此時(shí)子類的帶參構(gòu)造中,只有super(name) } }
這就是為什么當(dāng)父類沒有無(wú)參構(gòu)造(即只有帶參構(gòu)造——對(duì)應(yīng)情況②)時(shí),子類的構(gòu)造方法編譯無(wú)法通過。這是因?yàn)樽宇惖臉?gòu)造函數(shù)(帶參或無(wú)參)將調(diào)用父類的無(wú)參構(gòu)造函數(shù)。 由于編譯器試圖向子類中的2個(gè)構(gòu)造函數(shù)中插入super() ,但父類的默認(rèn)構(gòu)造函數(shù)未定義,因此編譯器會(huì)報(bào)告錯(cuò)誤消息。
要解決這個(gè)問題,只需要
1)添加一個(gè)無(wú)參構(gòu)造函數(shù)給父類——顯式地在父類中添加無(wú)參構(gòu)造
2)刪除父類中自定義的有參構(gòu)造函數(shù)——等價(jià)于恢復(fù)了默認(rèn)的無(wú)參構(gòu)造
3)將 Super(XXX) 添加到子類構(gòu)造函數(shù)——通過⑤的原來(lái)來(lái)屏蔽默認(rèn)的super()
以上就是JAVA繼承中子父類的構(gòu)造方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!