子類繼承父類時構(gòu)造函數(shù)相關(guān)問題解析
一、總結(jié)
1.子類創(chuàng)建對象時會調(diào)用父類的構(gòu)造方法
2.采用super顯示聲明了就是調(diào)用這個顯示聲明的父類構(gòu)造方法,沒有則默認(rèn)調(diào)用父類的那個空構(gòu)造方法(父類中聲明了帶參數(shù)的構(gòu)造方法,默認(rèn)的就要顯示寫出)。
摘抄網(wǎng)絡(luò):在創(chuàng)建子類對象時,會把父類里的成員變量和方法也加載進(jìn)內(nèi)存(因為要加載進(jìn)內(nèi)存,所以要看下這些數(shù)據(jù)是怎么初始化的,所以調(diào)用了父類的構(gòu)造,僅此而已,并不是去創(chuàng)建了父類對象)
二、分析
1.子類為什么可以繼承父類的屬性與方法?
子類對象中包含一個父類對象
在子類對象在創(chuàng)建過程中,先調(diào)用父類構(gòu)造方法(先創(chuàng)建出內(nèi)置的父類對象),然后再創(chuàng)建出自己的對象。
所以子類構(gòu)造時,會先調(diào)用父類的構(gòu)造方法,如果你在子類構(gòu)造方法中不顯示指明調(diào)用父類的哪個構(gòu)造方法,系統(tǒng)會給你默認(rèn)加上super()。這時父類必須有一個無參的構(gòu)造方法,不然會報錯。
2.子類在構(gòu)造時,形參可以是多少個?(設(shè)父類有可訪問的成員屬性m個,子類倘若增加自己的則增加了n個)
A:子類沒有新加自己的屬性時,它會有從父類繼承過來的m個屬性。這個時候要是子類寫帶參數(shù)的構(gòu)造方法,是對繼承過來的m個參數(shù)有選擇的進(jìn)行初始化。
B:子類有自己新加的屬性時,它的屬性會有從父類繼承過來的m個+自己新加的n個,一共是m+n個,然后選擇性的寫構(gòu)造方法。
3.存在繼承關(guān)系時,如何看子類的構(gòu)造方法?
- 反正會先調(diào)用父類的構(gòu)造方法
- 顯示寫了:super(參數(shù)列表),先依照此對繼承的父類屬性初始化
- 沒有寫:調(diào)用父類的無參構(gòu)造方法super()
4.構(gòu)造方法里面是如何對屬性進(jìn)行賦值的?
形參一個兩個三個還是多少個都不重要,怎么賦值取決于你構(gòu)造方法的方法體里面進(jìn)行的操作!(未初始化的成員變量會有默認(rèn)值(局部變量需要顯示賦初值))
eg:子類構(gòu)造方法里面?zhèn)鬟f三個參數(shù)
1.你可以選擇這樣,將str賦值給父類屬性,num1與num2賦值給自己新加的屬性。
//子類son的構(gòu)造方法
Son(String str,int num,char ch){
super(str);
System.out.println("子類有參構(gòu)造方法");
this.num = num;
this.char = ch;
}
2.你也可以選擇將str和num賦值給父類,char賦值給自己。
//子類son的構(gòu)造方法2
Son(String str,int num,char ch){
super(str,num);
System.out.println("子類有參構(gòu)造方法");
this.char = ch;
}
所以說,我們只需要記得子類構(gòu)造方法必定會調(diào)用父類的構(gòu)造方法,至于各種屬性的賦值,都是由方法內(nèi)部決定的,而不是形參位置、數(shù)量等決定屬性的初始化。
三、實例
package yang.polymorphic; class Father{ public String str1; public int num1; Father(){ System.out.println("父類無參構(gòu)造方法"); } Father(String str){ System.out.println("父類有參構(gòu)造方法1"); this.str1 = str; } } class Son extends Father{ public String str2; public int num2; Son(){ //你不顯示調(diào)用父類的構(gòu)造方法時,會默認(rèn)加上super() System.out.println("子類無參構(gòu)造方法"); } Son(String str){ System.out.println("子類有參構(gòu)造方法1"); this.str2 = str; } Son(String str,int num){ super(str); System.out.println("子類有參構(gòu)造方法2"); this.num2 = num; } } public class Test { public static void main(String[] args) { Son son = new Son("dd",22); System.out.println("1."+son.str1+"--"+son.str2+"--"+son.num1+"--"+son.num2); System.out.println("-------------------------------"); Son son2 = new Son("yy"); System.out.println("2."+son2.str1+"--"+son2.str2+"--"+son2.num1+"--"+son2.num2); } }
輸出結(jié)果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
新手小白學(xué)JAVA 日期類Date SimpleDateFormat Calendar(入門)
本文主要介紹了JAVA 日期類Date SimpleDateFormat Calendar,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10SpringBoot使用spring.factories加載默認(rèn)配置的實現(xiàn)代碼
在日常開發(fā)過程中,發(fā)布一些產(chǎn)品或者框架時,會遇到某些功能需要一些配置才能正常運行,這時我們需要的提供默認(rèn)配置項,同時用戶也能覆蓋進(jìn)行個性化2024-06-06SpringBoot基于Sentinel在服務(wù)上實現(xiàn)接口限流
這篇文章主要介紹了SpringBoot基于Sentinel在服務(wù)上實現(xiàn)接口限流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題
這篇文章主要介紹了idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Java數(shù)據(jù)結(jié)構(gòu)之散列表(動力節(jié)點Java學(xué)院整理)
散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵字(key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。這篇文章給大家介紹了java數(shù)據(jù)結(jié)構(gòu)之散列表,包括基本概念和散列函數(shù)相關(guān)知識,需要的的朋友參考下吧2017-04-04如何在JDK 9中更簡潔使用 try-with-resources 語句
本文詳細(xì)介紹了自 JDK 7 引入的 try-with-resources 語句的原理和用法,以及介紹了 JDK 9 對 try-with-resources 的改進(jìn),使得用戶可以更加方便、簡潔的使用 try-with-resources 語句。,需要的朋友可以參考下2019-06-06