關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題
Java子類在實例化時默認(rèn)調(diào)用的是父類的無參構(gòu)造函數(shù),不論實例化時調(diào)用的是子類的有參還是無參構(gòu)造函數(shù),
可以參考這篇Java子類實例化總是默認(rèn)調(diào)用父類的無參構(gòu)造操作
1、當(dāng)父類沒有顯式定義構(gòu)造方法時,
編輯器會默認(rèn)為此類添加一個隱式無參構(gòu)造函數(shù)。此時子類可以有自己的無參和有參構(gòu)造方法。不論實例化時調(diào)用的是子類的有參還是無參構(gòu)造函數(shù),默認(rèn)調(diào)用的是父類的無參構(gòu)造函數(shù)。
2、當(dāng)父類有顯式定義無參構(gòu)造方法時,
此時子類也可以有自己的無參和有參構(gòu)造方法。類似于1,同樣默認(rèn)隱式調(diào)用父類的無參構(gòu)造方法。
3、當(dāng)父類只有顯式定義有參構(gòu)造方法時,
(1)子類定義無參方法會出錯:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隱式父類構(gòu)造函數(shù)Father()未定義, 必須顯式調(diào)用另一個構(gòu)造函數(shù),當(dāng)此時調(diào)用父類的有參構(gòu)造函數(shù)時,使用super(i),這里i是參數(shù),會提示i沒有定義,因為此時是無參構(gòu)造函數(shù),此時要使子類也有無參構(gòu)造函數(shù),只能在子類的無參構(gòu)造函數(shù)中調(diào)用父類的有參構(gòu)造函數(shù),并給父類的有參構(gòu)造函數(shù)賦一個實參;
(2)在子類的有參構(gòu)造函數(shù)中使用super(i)調(diào)用父類的有參構(gòu)造函數(shù)不會出錯,因此若父類只有有參的構(gòu)造方法,子類也只能有有參的構(gòu)造方法,且子類的有參構(gòu)造方法必須顯示調(diào)用父類的有參構(gòu)造方法。
分析:默認(rèn)都是調(diào)用父類的無參構(gòu)造函數(shù),當(dāng)父類有有參構(gòu)造函數(shù)時,編輯器不會為父類添加無參的構(gòu)造函數(shù),在子類繼承父類時,本來是默認(rèn)在構(gòu)造函數(shù)第一行都是默認(rèn)有使用super()調(diào)用父類無參構(gòu)造函數(shù)的,現(xiàn)在父類沒有無參構(gòu)造函數(shù),因此提示顯示調(diào)用另一個構(gòu)造函數(shù)(即有參構(gòu)造函數(shù))。
提醒一點,當(dāng)沒有子類繼承父類時,父類只定義有參構(gòu)造函數(shù)是沒有問題的。
4、當(dāng)父類和子類都有無參和有參構(gòu)造方法時,默認(rèn)是子類構(gòu)造方法都是調(diào)用父類的無參構(gòu)造方法的,但當(dāng)子類的有參構(gòu)造方法使用super(i)調(diào)用父類的有參構(gòu)造方法時,帶參數(shù)實例化時就不再調(diào)用父類的無參構(gòu)造方法,而是調(diào)用父類的有參構(gòu)造方法,因為是顯示調(diào)用(人為強制的)。
總結(jié):
父類有無參構(gòu)造函數(shù)時(顯示或隱式),子類的有參和無參構(gòu)造函數(shù)都是默認(rèn)調(diào)用父類的無參構(gòu)造函數(shù);當(dāng)父類只有有參構(gòu)造函數(shù)時,子類可以有有參和無參構(gòu)造函數(shù),子類有參構(gòu)造函數(shù)必須顯式調(diào)用父類的有參構(gòu)造函數(shù),子類無參構(gòu)造函數(shù)也必須顯式調(diào)用父類的有參構(gòu)造函數(shù),但需給父類有參構(gòu)造函數(shù)賦實參。
1中的示例:
package classTest;class Father1{}class Son1 extends Father1{ public Son1() { System.out.println('子類的無參構(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();}}
運行結(jié)果:
子類的無參構(gòu)造方法
2中的示例:
package classTest;class Father1{ public Father1() { }}class Son1 extends Father1{ public Son1() { System.out.println('子類的無參構(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();}}
運行結(jié)果:
子類的無參構(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);//此時會報錯 super(1);//此時不會報錯,調(diào)用父類構(gòu)造函數(shù),但參數(shù)值是固定的,不能在調(diào)用時傳入其他值。 System.out.println('子類的無參構(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ù)沒有定義
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('父類的無參構(gòu)造方法');} public Father1(int i) { System.out.println('父類中的有參構(gòu)造方法'+i); }}class Son1 extends Father1{ public Son1() { System.out.println('子類的無參構(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é)果:
父類的無參構(gòu)造方法
子類的無參構(gòu)造方法
-----
父類中的有參構(gòu)造方法5
子類中有參構(gòu)造方法5
以上這篇關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JSP之表單提交get和post的區(qū)別詳解及實例2. 詳解瀏覽器的緩存機制3. Xml簡介_動力節(jié)點Java學(xué)院整理4. Python 實現(xiàn)勞拉游戲的實例代碼(四連環(huán)、重力四子棋)5. 一款功能強大的markdown編輯器tui.editor使用示例詳解6. python多線程和多進(jìn)程關(guān)系詳解7. Python xlrd/xlwt 創(chuàng)建excel文件及常用操作8. 存儲于xml中需要的HTML轉(zhuǎn)義代碼9. .Net加密神器Eazfuscator.NET?2023.2?最新版使用教程10. ASP動態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗分享
