java中子類繼承父類時是否繼承構造函數(shù)
java繼承中對構造函數(shù)是不繼承的,只是調用(隱式或顯式)。
以下是例子:
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);
}
}
編譯后執(zhí)行結果如下是什么呢?
分析:SonClass s = new SonClass(66);執(zhí)行這句時,調用
public SonClass(int c) {
System.out.println(1234);//系統(tǒng)會自動先調用父類的無參構造函數(shù)(super())
}
在這個構造函數(shù)中,等價于
public SonClass(int c) {
super();//必須是第1行,否則不能編譯
System.out.println(1234);
}
所以結果是 100
1234
3.如果子類構造函數(shù)是這樣寫的
public SonClass(int c) {
super(22);//必須是第1行,否則不能編譯
//顯式調用了super后,系統(tǒng)就不再調用無參的super()了;
System.out.println(1234);
}
執(zhí)行結果是 22
1234
總結1:構造函數(shù)不能繼承,只是調用而已。
如果父類沒有無參構造函數(shù)
創(chuàng)建子類時,不能編譯,除非在構造函數(shù)代碼體中第一行,必須是第一行顯式調用父類有參構造函數(shù)
如下:
SonClass (){
super(777);//顯示調用父類有參構造函數(shù)
System.out.println(66);
}
如果不顯示調用父類有參構造函數(shù),系統(tǒng)會默認調用父類無參構造函數(shù)super();
但是父類中沒有無參構造函數(shù),那它不是不能調用了。所以編譯就無法通過了。
總結2:創(chuàng)建有參構造函數(shù)后,系統(tǒng)就不再有默認無參構造函數(shù)。
如果沒有任何構造函數(shù),系統(tǒng)會默認有一個無參構造函數(shù)。