java中繼承,子類是否繼承父類的構造函數
java繼承中子類是不會繼承父類的構造函數的,隻是必須調用(隐式或者顯式)
下面來看例子:
public class TestExtends {
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
class FooClass{
public FooClass() {
System.out.println(100);
}
public FooClass(int count) {
System.out.println(count);
}
}
class SonClass extends FooClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
}
運作結果:
100
1234
接下來分析為什麼會産生這樣的結果:
程式在執行SonClass s = new SonClass(66);這行時,調用
public SonClass(int c) {
System.out.println(1234); //在執行這行時系統會優先調用父類的無參構造函數super();
}
是以子類在執行上面的構造方法時,等價于執行了下面的代碼:
public SonClass(int c) {
super(); // 必須在第一行調用,否則不能編譯
System.out.println(1234); //在執行這行時系統會優先調用父類的無參構造函數super();
}
是以結果為:
100 1234
接下來介紹另外一種情況(顯式調用),如果子類構造函數是這樣寫的:
public SonClass(int c) {
super(2); // 必須寫在第一行,否則不能編譯,顯式調用父類構造函數後,系統就不在預設調用無參構造函數了
System.out.println(1234);
}
執行結構是:
2 1234
總結:
構造函數是不能繼承的,隻是用來在子類調用,(如果父類沒有無參構造函數,建立子類時,必須在子類構造函數代碼體的第一行顯式調用父類的有參數構造函數,否則不能編譯);
如果父類沒有有參構造函數,那麼在建立子類時可以不顯式調用父類構造函數,系統會預設調用父類的無參構造函數super();
如果父類沒有無參構造函數,那系統就調不了預設的無參構造函數了,是以不顯示調用編譯也就無法通過了;
補充說明:
在java中,建立有參構造函數後,系統就不在有預設的無參構造函數
如果父類中沒有任何構造函數,系統會預設有一個無參的構造函數