這里是關(guān)于Java構(gòu)造函數(shù)被問(wèn)到問(wèn)題的總結(jié)。
12.1 為什么創(chuàng)建一個(gè)子類對(duì)象父類的構(gòu)造函數(shù)也會(huì)被調(diào)用。
class Super {
String s;
public Super() {
System.out.println("Super");
}
}
public class Sub extends Super {
public Sub(){
System.out.println("Sub");
}
public static void main(String[] args){
Sub s = new Sub();
}
}
//它打?。?Super
Sub
當(dāng)從其他類繼承時(shí)候,super() 將在構(gòu)造函數(shù)中被第一個(gè)調(diào)用。如果沒(méi)有,編譯器將插入那個(gè)調(diào)用。這就是為什么當(dāng)子類對(duì)象創(chuàng)建的時(shí)候,父類對(duì)象被調(diào)用的原因。
它沒(méi)有創(chuàng)建兩個(gè)對(duì)象,僅僅是一個(gè)子類對(duì)象被創(chuàng)建。父類構(gòu)造函數(shù)被調(diào)用的原因是父類構(gòu)造函數(shù)中也許有一些私有的屬性需要通過(guò)它的構(gòu)造函數(shù)來(lái)初始化。
當(dāng)編譯插入超類的構(gòu)造函數(shù)時(shí)候,子類構(gòu)造函數(shù)看起來(lái)像下面這樣:
Public Sub() {
Super();
System.out.println(“sub”);
}
11.2 隱式的構(gòu)造函數(shù)沒(méi)有被默認(rèn)的構(gòu)造函數(shù)定義
這是一個(gè)被很多開發(fā)者看到的錯(cuò)誤信息:
“隱式的父類構(gòu)造函數(shù)沒(méi)有備定義默認(rèn)的構(gòu)造函數(shù),必須定義一個(gè)確定的構(gòu)造函數(shù)?!?/p>

編譯錯(cuò)誤發(fā)生是因?yàn)槟J(rèn)的父類構(gòu)造函數(shù)沒(méi)有被定義。在java中,如果一個(gè)類沒(méi)有定義一個(gè)構(gòu)造函數(shù),編譯器將為這個(gè)類插入一個(gè)沒(méi)有參數(shù)的默認(rèn)構(gòu)造函數(shù)。
如果構(gòu)造函數(shù)在父類中被定義了,在這個(gè)例子中為super(String s),編譯器將不會(huì)插入一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù)。這就是上面父類的情景。
在子類的構(gòu)造函數(shù)中,既有有參的構(gòu)造函數(shù),又有無(wú)參的構(gòu)造函數(shù),將調(diào)用父類無(wú)參的構(gòu)造函數(shù)。
當(dāng)編譯器試圖在兩個(gè)子類中插入super()調(diào)用兩個(gè)無(wú)參的構(gòu)造函數(shù)時(shí)候,但是父類默認(rèn)構(gòu)造函數(shù)沒(méi)有被定義,編譯器就報(bào)了這個(gè)錯(cuò)誤。
修改這個(gè)問(wèn)題,簡(jiǎn)單的
1.在父類中添加一個(gè)Super()構(gòu)造函數(shù)
Public Super() {
System.out.println(“Super”);
}
或者
2.在父類中刪除自己定義的構(gòu)造函數(shù)。
3.在子類構(gòu)造函數(shù)中添加父類構(gòu)造函數(shù)Super(value)的調(diào)用。
下面的代碼是沒(méi)問(wèn)題的

子類的構(gòu)造函數(shù)明確調(diào)用了父類的有參構(gòu)造函數(shù)。