來源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.htmlhtml
---------------------java
java繼承中對構造函數是不繼承的,只是調用(隱式或顯式)。函數
如下是例子:spa
public class FatherClass {
public FatherClass() {
System.out.println(100);
}htm
public FatherClass(int age) {
System.out.println(age);
}對象
}blog
public class SonClass extends FatherClass{繼承
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {get
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:建立有參構造函數後,系統就再也不有默認無參構造函數。
若是沒有任何構造函數,系統會默認有一個無參構造函數。