Java構(gòu)造函數(shù)里的一些坑記錄super()和this()
super() 和 this()
這個(gè)很好理解, super() 就是在子類的構(gòu)造函數(shù)里調(diào)用父類的構(gòu)造函數(shù)
this() 就是調(diào)用同類的另1個(gè)不同參數(shù)類型的構(gòu)造函數(shù).
坑1 super()和this()都只能用在構(gòu)造函數(shù)中,且必須是方法體第一行
大家都知道, 其實(shí)這不算坑
坑2 某些情況下,構(gòu)造方法不會(huì)被自動(dòng)繼承,如果需要必須重寫
例如, 父類:
@Slf4j public class ParentC1 { private int id; private String name; public ParentC1(){ this.id = 1; this.name = "name"; log.info("ParentC1().."); }
子類:
@Slf4j public class ChildC1 extends ParentC1 { private int age; }
這時(shí)子類是自動(dòng)繼承父類的無參函數(shù)的, 可以被實(shí)例化…
但是 如果加上另1個(gè)參數(shù)類型的構(gòu)造函數(shù)給子類
@Slf4j public class ChildC1 extends ParentC1 { private int age; public ChildC1(int id, String name) { this.age = 1; log.info("ChildC1(id, name).."); } }
這時(shí)就不能通過無參構(gòu)造函數(shù)實(shí)例化子類了, 因?yàn)閖ava發(fā)現(xiàn)子類已有1個(gè)構(gòu)造函數(shù), 不會(huì)自動(dòng)從父類繼承。
坑3 子類總會(huì)隱含地調(diào)用父類構(gòu)造函數(shù)(super())
注意, 這里兩個(gè)關(guān)鍵字, 隱含和調(diào)用
隱含意思是隱患了super() 聲明, 調(diào)用是指的調(diào)用而不是繼承。
例子1:
例如, 父類:
@Slf4j public class ParentC1 { private int id; private String name; public ParentC1(){ this.id = 1; this.name = "name"; log.info("ParentC1().."); }
子類:
@Slf4j public class ChildC1 extends ParentC1 { private int age; public ChildC1() { log.info("ChildC1().."); } }
這是調(diào)用子類無參構(gòu)造和函數(shù)時(shí),會(huì)調(diào)用父類無參構(gòu)造方法, 無論有無聲明super()
例子2:
例如, 父類:
@Slf4j public class ParentC1 { private int id; private String name; public ParentC1(){ this.id = 1; this.name = "name"; log.info("ParentC1().."); } public ParentC1(int id, String name) { this.id = id; this.name = name; log.info("ParentC1(id, name).."); }
子類:
@Slf4j public class ChildC1 extends ParentC1 { private int age; public ChildC1(){ log.info("ChildC1().."); } public ChildC1(int id, String name) { super(id,name); this.age = 1; log.info("ChildC1(id, name).."); } }
父類和都增加了(int id, String name) 這個(gè)雙參構(gòu)造 函數(shù)
在子類的雙參構(gòu)造函數(shù)里顯示調(diào)用父類的雙參構(gòu)造函數(shù)。
這時(shí), 調(diào)用子類雙參構(gòu)造函數(shù)時(shí), 父類的雙參構(gòu)造函數(shù)會(huì)被調(diào)用, 順理成章,這例子主要用于下面的例子對(duì)比。
例子3:
例如, 父類:
@Slf4j public class ParentC1 { private int id; private String name; public ParentC1(){ this.id = 1; this.name = "name"; log.info("ParentC1().."); } public ParentC1(int id, String name) { this.id = id; this.name = name; log.info("ParentC1(id, name).."); }
子類:
@Slf4j public class ChildC1 extends ParentC1 { private int age; public ChildC1(){ log.info("ChildC1().."); } public ChildC1(int id, String name) { //super(id,name); this.age = 1; log.info("ChildC1(id, name).."); } }
這個(gè)例子3 對(duì)比例子2 只是隱藏了子類雙參構(gòu)造函數(shù)里的 super(id, name)
重點(diǎn)來了, 這是調(diào)用子類雙參構(gòu)造函數(shù),仍然會(huì)嘗試調(diào)用父類的構(gòu)造函數(shù), 但是會(huì)默認(rèn)調(diào)用父類的無參構(gòu)造函數(shù)。
例子4:
例如, 父類:
@Slf4j public class ParentC1 { private int id; private String name; public ParentC1(int id, String name) { this.id = id; this.name = name; log.info("ParentC1(id, name).."); }
子類:
@Slf4j public class ChildC1 extends ParentC1 { private int age; public ChildC1(){ log.info("ChildC1().."); } public ChildC1(int id, String name) { //super(id,name); this.age = 1; log.info("ChildC1(id, name).."); } }
例子4 相對(duì)于例子3 刪除了父類的無參構(gòu)造函數(shù), how is it then?
這是編譯失敗, 同時(shí)會(huì)被IDE科普教育
子類找不到可以默認(rèn)調(diào)用的父類無參函數(shù),
而子類雙參構(gòu)造 函數(shù)是不會(huì)默認(rèn)調(diào)用父類的雙參構(gòu)造函數(shù)的, 即使參數(shù)類型完全一樣。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java之不通過構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象問題
- Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說明
- JAVA構(gòu)造函數(shù)不能使用void關(guān)鍵字問題
- java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行
- JAVA中的構(gòu)造函數(shù)(方法)
- Java中靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)和普通代碼塊的區(qū)別
- java如何不通過構(gòu)造函數(shù)創(chuàng)建對(duì)象(Unsafe)
相關(guān)文章
Java中語音url轉(zhuǎn)換成InputStream的示例代碼
在Java中,可以使用java.net.URL和java.net.URLConnection類來將語音URL轉(zhuǎn)換為InputStream,本文通過示例代碼介紹Java中語音url轉(zhuǎn)換成InputStream的相關(guān)知識(shí),感興趣的朋友一起看看吧2024-01-01應(yīng)用市場中Java攔截器和切面的使用實(shí)例詳解
這篇文章主要介紹了應(yīng)用市場中Java攔截器和切面的使用實(shí)例詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01SpringBoot3.x集成nacos并實(shí)現(xiàn)多環(huán)境配置的操作步驟
本文詳細(xì)介紹了如何在Springboot3.x中集成Nacos2.x版本,包括nacos的安裝、配置更改,以及在集成過程中遇到的問題,如端口設(shè)置、依賴版本調(diào)整等,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10java查詢近七日數(shù)據(jù)功能的實(shí)現(xiàn)
這篇文章主要介紹了java查詢近七日數(shù)據(jù)功能的實(shí)現(xiàn),文章內(nèi)容詳細(xì),簡單易懂,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2023-01-01java HttpClient傳輸json格式的參數(shù)實(shí)例講解
這篇文章主要介紹了java HttpClient傳輸json格式的參數(shù)實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01ShardingSphere結(jié)合MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐
在實(shí)際開發(fā)中,如果表的數(shù)據(jù)過大我們需要把一張表拆分成多張表,本文主要介紹了使用ShardingSphere實(shí)現(xiàn)MySQL分庫分表,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03SpringBoot自動(dòng)配置與啟動(dòng)流程詳細(xì)分析
這篇文章主要介紹了SpringBoot自動(dòng)配置原理分析,SpringBoot是我們經(jīng)常使用的框架,那么你能不能針對(duì)SpringBoot實(shí)現(xiàn)自動(dòng)配置做一個(gè)詳細(xì)的介紹。如果可以的話,能不能畫一下實(shí)現(xiàn)自動(dòng)配置的流程圖。牽扯到哪些關(guān)鍵類,以及哪些關(guān)鍵點(diǎn)2022-11-11