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