Java構(gòu)造函數(shù)里的一些坑記錄super()和this()
super() 和 this()
這個很好理解, super() 就是在子類的構(gòu)造函數(shù)里調(diào)用父類的構(gòu)造函數(shù)
this() 就是調(diào)用同類的另1個不同參數(shù)類型的構(gòu)造函數(shù).
坑1 super()和this()都只能用在構(gòu)造函數(shù)中,且必須是方法體第一行
大家都知道, 其實這不算坑
坑2 某些情況下,構(gòu)造方法不會被自動繼承,如果需要必須重寫
例如, 父類:
@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ù)的, 可以被實例化…
但是 如果加上另1個參數(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)..");
}
}
這時就不能通過無參構(gòu)造函數(shù)實例化子類了, 因為java發(fā)現(xiàn)子類已有1個構(gòu)造函數(shù), 不會自動從父類繼承。

坑3 子類總會隱含地調(diào)用父類構(gòu)造函數(shù)(super())
注意, 這里兩個關(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ù)時,會調(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òu)造 函數(shù)
在子類的雙參構(gòu)造函數(shù)里顯示調(diào)用父類的雙參構(gòu)造函數(shù)。
這時, 調(diào)用子類雙參構(gòu)造函數(shù)時, 父類的雙參構(gòu)造函數(shù)會被調(diào)用, 順理成章,這例子主要用于下面的例子對比。

例子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)..");
}
}
這個例子3 對比例子2 只是隱藏了子類雙參構(gòu)造函數(shù)里的 super(id, name)
重點來了, 這是調(diào)用子類雙參構(gòu)造函數(shù),仍然會嘗試調(diào)用父類的構(gòu)造函數(shù), 但是會默認調(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 相對于例子3 刪除了父類的無參構(gòu)造函數(shù), how is it then?
這是編譯失敗, 同時會被IDE科普教育
子類找不到可以默認調(diào)用的父類無參函數(shù),
而子類雙參構(gòu)造 函數(shù)是不會默認調(diào)用父類的雙參構(gòu)造函數(shù)的, 即使參數(shù)類型完全一樣。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復的操作方法
這篇文章主要介紹了MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Intellij IDEA 與maven 版本不符 Unable to import maven project See
這篇文章主要介紹了Intellij IDEA 與maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound,本文通過圖文給大家分享解決方案,需要的朋友可以參考下2020-08-08

