java繼承中對建構函式是不繼承的,只是調用(隱式或顯式)。
以下是例子:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
編譯後執行結果如下是什麼呢?
分析:SonClass s = new SonClass(66);執行這句時,調用
public SonClass(int c) {
System.out.println(1234);//系統會自動先調用父類的無參建構函式(super())
}
在這個建構函式中,等價於
public SonClass(int c) {
super();//必須是第1行,否則不能編譯
System.out.println(1234);
}
所以結果是 100
1234
在建立子類的對象時,Java虛擬機器首先執行父類的構造方法,然後再執行子類的構造方法。在多級繼承的情況下,將從繼承樹的最上層的父類開始,依次執行各個類的構造方法,這可以保證子類對象從所有直接或間接父類中繼承的執行個體變數都被正確地初始化。
3.如果子類建構函式是這樣寫的
public SonClass(int c) {
super(22);//必須是第1行,否則不能編譯
//顯式調用了super後,系統就不再調用無參的super()了;
System.out.println(1234);
}
執行結果是 22
1234
總結1:建構函式不能繼承,只是調用而已。
如果父類沒有無參建構函式
建立子類時,不能編譯,除非在建構函式代碼體中第一行,必須是第一行顯式調用父類有參建構函式
如下:
SonClass (){
super(777);//顯示調用父類有參建構函式
System.out.println(66);
}
如果不顯示調用父類有參建構函式,系統會預設調用父類無參建構函式super();
但是父類中沒有無參建構函式,那它不是不能調用了。所以編譯就無法通過了。
總結2:建立有參建構函式後,系統就不再有預設無參建構函式。
如果沒有任何建構函式,系統會預設有一個無參建構函式。