關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問(wèn)題
Java子類在實(shí)例化時(shí)默認(rèn)調(diào)用的是父類的無(wú)參構(gòu)造函數(shù),不論實(shí)例化時(shí)調(diào)用的是子類的有參還是無(wú)參構(gòu)造函數(shù),
可以參考這篇Java子類實(shí)例化總是默認(rèn)調(diào)用父類的無(wú)參構(gòu)造操作
1、當(dāng)父類沒(méi)有顯式定義構(gòu)造方法時(shí),
編輯器會(huì)默認(rèn)為此類添加一個(gè)隱式無(wú)參構(gòu)造函數(shù)。此時(shí)子類可以有自己的無(wú)參和有參構(gòu)造方法。不論實(shí)例化時(shí)調(diào)用的是子類的有參還是無(wú)參構(gòu)造函數(shù),默認(rèn)調(diào)用的是父類的無(wú)參構(gòu)造函數(shù)。
2、當(dāng)父類有顯式定義無(wú)參構(gòu)造方法時(shí),
此時(shí)子類也可以有自己的無(wú)參和有參構(gòu)造方法。類似于1,同樣默認(rèn)隱式調(diào)用父類的無(wú)參構(gòu)造方法。
3、當(dāng)父類只有顯式定義有參構(gòu)造方法時(shí),
(1)子類定義無(wú)參方法會(huì)出錯(cuò):Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隱式父類構(gòu)造函數(shù)Father()未定義, 必須顯式調(diào)用另一個(gè)構(gòu)造函數(shù),當(dāng)此時(shí)調(diào)用父類的有參構(gòu)造函數(shù)時(shí),使用super(i),這里i是參數(shù),會(huì)提示i沒(méi)有定義,因?yàn)榇藭r(shí)是無(wú)參構(gòu)造函數(shù),此時(shí)要使子類也有無(wú)參構(gòu)造函數(shù),只能在子類的無(wú)參構(gòu)造函數(shù)中調(diào)用父類的有參構(gòu)造函數(shù),并給父類的有參構(gòu)造函數(shù)賦一個(gè)實(shí)參;
(2)在子類的有參構(gòu)造函數(shù)中使用super(i)調(diào)用父類的有參構(gòu)造函數(shù)不會(huì)出錯(cuò),因此若父類只有有參的構(gòu)造方法,子類也只能有有參的構(gòu)造方法,且子類的有參構(gòu)造方法必須顯示調(diào)用父類的有參構(gòu)造方法。
分析:默認(rèn)都是調(diào)用父類的無(wú)參構(gòu)造函數(shù),當(dāng)父類有有參構(gòu)造函數(shù)時(shí),編輯器不會(huì)為父類添加無(wú)參的構(gòu)造函數(shù),在子類繼承父類時(shí),本來(lái)是默認(rèn)在構(gòu)造函數(shù)第一行都是默認(rèn)有使用super()調(diào)用父類無(wú)參構(gòu)造函數(shù)的,現(xiàn)在父類沒(méi)有無(wú)參構(gòu)造函數(shù),因此提示顯示調(diào)用另一個(gè)構(gòu)造函數(shù)(即有參構(gòu)造函數(shù))。
提醒一點(diǎn),當(dāng)沒(méi)有子類繼承父類時(shí),父類只定義有參構(gòu)造函數(shù)是沒(méi)有問(wèn)題的。
4、當(dāng)父類和子類都有無(wú)參和有參構(gòu)造方法時(shí),默認(rèn)是子類構(gòu)造方法都是調(diào)用父類的無(wú)參構(gòu)造方法的,但當(dāng)子類的有參構(gòu)造方法使用super(i)調(diào)用父類的有參構(gòu)造方法時(shí),帶參數(shù)實(shí)例化時(shí)就不再調(diào)用父類的無(wú)參構(gòu)造方法,而是調(diào)用父類的有參構(gòu)造方法,因?yàn)槭秋@示調(diào)用(人為強(qiáng)制的)。
總結(jié):
父類有無(wú)參構(gòu)造函數(shù)時(shí)(顯示或隱式),子類的有參和無(wú)參構(gòu)造函數(shù)都是默認(rèn)調(diào)用父類的無(wú)參構(gòu)造函數(shù);當(dāng)父類只有有參構(gòu)造函數(shù)時(shí),子類可以有有參和無(wú)參構(gòu)造函數(shù),子類有參構(gòu)造函數(shù)必須顯式調(diào)用父類的有參構(gòu)造函數(shù),子類無(wú)參構(gòu)造函數(shù)也必須顯式調(diào)用父類的有參構(gòu)造函數(shù),但需給父類有參構(gòu)造函數(shù)賦實(shí)參。
1中的示例:
package classTest; class Father1{ } class Son1 extends Father1{ public Son1() { System.out.println("子類的無(wú)參構(gòu)造方法"); } public Son1(int i) { System.out.println("子類中有參構(gòu)造方法"+i); } } public class TestExtend { public static void main(String[] args) { Son1 s = new Son1(); } }
運(yùn)行結(jié)果:
子類的無(wú)參構(gòu)造方法
2中的示例:
package classTest; class Father1{ public Father1() { } } class Son1 extends Father1{ public Son1() { System.out.println("子類的無(wú)參構(gòu)造方法"); } public Son1(int i) { System.out.println("子類中有參構(gòu)造方法"+i); } } public class TestExtend { public static void main(String[] args) { Son1 s = new Son1(); } }
運(yùn)行結(jié)果:
子類的無(wú)參構(gòu)造方法
3中的示例(1):
package classTest; class Father1{ public Father1(int i) { System.out.println("父類中的有參構(gòu)造方法"+i); } } class Son1 extends Father1{ public Son1() { //下兩行需注釋掉一行 super(i);//此時(shí)會(huì)報(bào)錯(cuò) super(1);//此時(shí)不會(huì)報(bào)錯(cuò),調(diào)用父類構(gòu)造函數(shù),但參數(shù)值是固定的,不能在調(diào)用時(shí)傳入其他值。 System.out.println("子類的無(wú)參構(gòu)造方法"); } public Son1(int i) { super(i); System.out.println("子類中有參構(gòu)造方法"+i); } } public class TestExtend { public static void main(String[] args) { Son1 s = new Son1(); } }
結(jié)果:顯示參數(shù)沒(méi)有定義
Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved to a variable
3中的示例(2):
package classTest; class Father1{ public Father1(int i) { System.out.println("父類中的有參構(gòu)造方法"+i); } } class Son1 extends Father1{ public Son1(int i) { super(i); System.out.println("子類中有參構(gòu)造方法"+i); } } public class TestExtend { public static void main(String[] args) { System.out.println("-----"); Son1 a = new Son1(5); } }
結(jié)果:
-----
父類中的有參構(gòu)造方法5
子類中有參構(gòu)造方法5
4中的示例:
package classTest; class Father1{ public Father1() { System.out.println("父類的無(wú)參構(gòu)造方法"); } public Father1(int i) { System.out.println("父類中的有參構(gòu)造方法"+i); } } class Son1 extends Father1{ public Son1() { System.out.println("子類的無(wú)參構(gòu)造方法"); } public Son1(int i) { super(i); System.out.println("子類中有參構(gòu)造方法"+i); } } public class TestExtend { public static void main(String[] args) { Son1 s = new Son1(); System.out.println("-----"); Son1 a = new Son1(5); } }
結(jié)果:
父類的無(wú)參構(gòu)造方法
子類的無(wú)參構(gòu)造方法
-----
父類中的有參構(gòu)造方法5
子類中有參構(gòu)造方法5
以上這篇關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析
這篇文章主要介紹了Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析,介紹了其簡(jiǎn)介,實(shí)例以及優(yōu)缺點(diǎn)分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Java Swing樹(shù)狀組件JTree用法實(shí)例詳解
這篇文章主要介紹了Java Swing樹(shù)狀組件JTree用法,結(jié)合具體實(shí)例形式分析了Swing組件JTree構(gòu)成樹(shù)狀列表的節(jié)點(diǎn)設(shè)置與事件響應(yīng),以及自定義圖形節(jié)點(diǎn)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Java爬蟲(chóng) 信息抓取的實(shí)現(xiàn)
本文主要介紹 Java爬蟲(chóng) 信息抓取的實(shí)現(xiàn),這里詳細(xì)介紹了如何實(shí)現(xiàn)該方法,并附示例代碼供大家學(xué)習(xí)參考,有興趣的小伙伴可以參考下2016-09-09springBoot service層事務(wù)控制的操作
這篇文章主要介紹了springBoot service層事務(wù)控制的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02解決若依pageHelper在動(dòng)態(tài)切換數(shù)據(jù)源問(wèn)題
這篇文章主要介紹了解決pageHelper在動(dòng)態(tài)切換數(shù)據(jù)源問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01