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中,創建有參構造函數后,系統就不在有默認的無參構造函數
- 如果父類中沒有任何構造函數,系統會默認有一個無參的構造函數
