聲明:剛剛接觸java不久,如果理解有錯誤或偏差望各位大佬強勢批判
java中子類能繼承父類的構造方法嗎?
父類代碼:
1 class Father { 2 String name ; //就不set/get了 3 //Father類無參構造方法 4 public Father(){ 5 System.out.println("這是Father類的無參構造方法"); 6 } 7 //Father類有參構造方法 8 public Father(String name) { 9 this.name = name; 10 System.out.println("這是Father類的有參構造方法:"+this.name); 11 } 12 13 }
子類代碼:
1 class Sun extends Father { 2 //這里java會為你提供一個默認的構造方法,但是代碼上是不會顯示出來的 3 //public Sun(){} 4 }
所以運行測試類,創建父類對象,調用無參構造方法初始化
結果:
1 public class FatherTest01 { 2 public static void main(String[] args) { 3 Father ff = new Father(); 4 5 //Sun ss = new Sun(); 6 } 7 }
有以下結果:【輸出結果都用紅色字體表示】
這是Father類的無參構造方法
所以運行測試類,創建父類對象,調用有參構造方法初始化
Father ff = new Father("小明");
有以下結果:【輸出結果都用紅色字體表示】
這是Father類的有參構造方法:小明
然后我們再創建子類:Sun類對象,調用無參構造方法初始化
Sun ss = new Sun();
有以下結果:【輸出結果都用紅色字體表示】
這是Father類的無參構造方法
可以見得子類對象默認調用了父類的無參構造方法,因為這時Sun類中沒有構造方法,所以java會默認提供無參構造方法,
public Sun(){
//這個構造方法中又會默認調用父類的無參構造方法,即public Father(){
System.out.println("這是Father類的無參構造方法");},因此會有以上結果
}
所以以上結果跟我們顯示創建Sun類無參構造方法的結果一樣,即:
public Sun(){
}
再次驗證:
將Sun類中的無參構造方法寫成這樣:
class Sun extends Father {
//String name = "sun";
public Sun(){
System.out.println("這是sun類的無參構造方法");
}
}
結果:【這里會先調用父類的構造方法,因此結果會先出現父類無參構造方法中的語句,即隱式語句:super();】
這是Father類的無參構造方法
這是sun類的無參構造方法
因此,構造方法是一個類獨有的方法,不會被其他類繼承,但是在子類實例化對象時候,如果子類的構造器沒有顯式的調用父類構造器,則自動調用父類的默認無參構造器,相當於默認省略了super();
假設父類只有有參構造方法,沒有無參構造方法會怎么樣呢?
class Father {
String name ; //就不set/get了
//Father類無參構造方法
/*public Father(){
System.out.println("這是Father類的無參構造方法");
}*/
//Father類有參構造方法
public Father(String name) {
this.name = name;
System.out.println("這是Father類的有參構造方法:"+this.name);
}
}
此時運行成語,編譯器就會報錯:The constructor Father() is undefined
總結:
子類實例化對象時,會先調用父類的構造方法,如果子類的構造方法沒有顯式的調用父類的構造方法,默認調用super();
子類要使用父類有參的構造方法,使用super(參數)形式,且super()必須是子類構造方法中的第一行語句。
如果父類沒有不帶參數的構造方法,且子類的構造方法中有沒有顯式的調用父類其他構造方法,則java編譯器會報錯
另外:方法是沒有繼承一說的,只有覆寫或者重載,類和類之間才能叫繼承。
備注:構造器==構造方法
