最近在複習一些java基礎的東西。發現繼承後構造函數的繼承很有意思,是以進行了一下測試:
- 測試1-如果父類不主動建立構造函數則子類建立構造函數沒有限制。
- 測試2-如果父類建立不含參構造函數則子類建立構造函數沒有限制且先執行父類的構造函數。
- 測試3-如果父類建立含參構造函數則子類建立構造函數需要先super父類函數且先執行父類的構造函數。
- 測試4-如果父類建立多個含參構造函數則子類建立構造函數需要先super指定的父類函數(如父類包含無參構造函數則子類可以不super父類函數同測試2)。
測試1-如果父類不主動建立構造函數則子類建立構造函數沒有限制
父類
public class Father {
}
子類
public class Child extends Father {
public Child(String a, int b) {
System.out.println("這是子類的構造函數");
}
public static void main(String[] args) {
Child t3 = new Child("xx",);
}
}
結果
這是子類的構造函數
測試2-如果父類建立不含參構造函數則子類建立構造函數沒有限制且先執行父類的構造函數
父類
public class Father {
public Father() {
System.out.println("這是父類的構造函數");
}
}
子類
public class Child extends Father {
public Child(String a, int b) {
System.out.println("這是子類的構造函數");
}
public static void main(String[] args) {
Child t3 = new Child("xx",);
}
}
結果
這是父類的構造函數
這是子類的構造函數
測試3-如果父類建立含參構造函數則子類建立構造函數需要先super父類函數且先執行父類的構造函數
父類
public class Father {
public Father(int a) {
System.out.println("這是父類的構造函數");
}
}
子類
public class Child extends Father {
public Child(String a, int b) {
super();
System.out.println("這是子類的構造函數");
}
public static void main(String[] args) {
Child t3 = new Child("xx",);
}
}
結果
這是父類的構造函數
這是子類的構造函數
測試4-如果父類建立多個含參構造函數則子類建立構造函數需要先super指定的父類函數(如父類包含無參構造函數則子類可以不super父類函數同測試2)
父類
public class Father {
public Father(int a) {
System.out.println("這是父類的構造函數1");
}
public Father(String b) {
System.out.println("這是父類的構造函數2");
}
}
子類
public class Child extends Father {
public Child(){
super("a");
System.out.println("這是子類的構造函數調用2");
}
public Child(String a, int b) {
super();
System.out.println("這是子類的構造函數調用1");
}
public static void main(String[] args) {
Child t3 = new Child("xx",);
Child t4 = new Child();
}
}
結果
這是父類的構造函數1
這是子類的構造函數調用1
這是父類的構造函數2
這是子類的構造函數調用2
綜上測試得出如下結論:
1、如果父類不主動建立構造函數或者父類有無參的構造函數則子類可以不考慮父類的構造函數。
2、如果子類需要繼承父類的含參構造函數則需要使用super指令(如果父類包含多個含參構造函數則依據參數使用super指令)
3、如果父類建立了構造函數且都含有參數,則子類必須使用super指令。