1. 程式人生 > >JAVA繼承中子父類的構造方法

JAVA繼承中子父類的構造方法

 

首先,構造方法本身會有一個隱式的無參構造(預設):

  ①不寫構造方法,類中的第一行程式碼事實上有一個預設的無參構造(系統會隱式為你寫好)

    

public class Student {
        private String name;
//        public Student() {}      隱式地“寫”在這裡,你看不見

//  Strudent類中雖然沒有寫構造方法,但相當於有上面的無參構造
//   只不過是隱式的,你看不見

}

 

  ②只寫帶參構造方法,相當於只有該帶參構造方法(隱式的無參構造會被遮蔽無視掉,視為無效)

public class Student {
        private String name;
        public Student(String name) {
            this.name=name;
        }
//  此時原來Strudent類中的隱式的無參構造方法被遮蔽了,無效了
//  類中只有帶參構造

}

 

  ③若想同時擁有無參和帶參構造,必須顯式地寫出無參和帶參構造方法

public class Student {
        private String name;
        public Student() {}
// 顯式地將無參構造寫出來        
        public Student(String name) {
            this.name=name;
        }
//  若想Strudent類中擁有無參構造方法,必須顯式地寫出來


}

 

進一步結合繼承,就需要考慮到子父類:

  ④在子類的構造方法(無論是無參和有參)中,方法中的第一行程式碼事實上都隱式地包含了父類的無參構造方法
    即: super()

public class Stu extends Student {
    private String name;
    public Stu() {
    // super();
    // 在子類的無參構造中,super()是隱式的“寫”在這裡的
    }
    
    public Stu(String name) {
    // super();
    this.name=name;
    // 在子類的帶參構造,上面的super()同樣也是隱式的“寫”在這裡的
    }

}

這就是為什麼,呼叫子類的構造方法時,都會先呼叫父類的無參構造方法了,因為預設的super()存在。

 ⑤同理,類似與上面的②,此時若寫一個有參構造,super(xx)會把隱式的super()遮蔽掉 

public class Stu extends Student {
    private String name;
    
    public Stu(String name) {
    // super();  原來隱式寫在這裡的super()被遮蔽了,無效了
    super(name);
    
    // 在子類的帶參構造, 由於的super(name)的存在,super()無效了
    //此時子類的帶參構造中,只有super(name)
    }

}

 

這就是為什麼當父類沒有無參構造(即只有帶參構造——對應情況②)時,子類的構造方法編譯無法通過。這是因為子類的建構函式(帶參或無參)將呼叫父類的無參建構函式。 由於編譯器試圖向子類中的2個建構函式中插入super() ,但父類的預設建構函式未定義,因此編譯器會報告錯誤訊息。

要解決這個問題,只需要

      1)新增一個無參建構函式給父類——顯式地在父類中新增無參構造

      2)刪除父類中自定義的有參建構函式——等價於恢復了預設的無參構造
      3)將 Super(XXX) 新增到子類建構函式——通過⑤的原來來遮蔽預設的super()  

 

一些關於子父類有參無參的組合情況(其實就是排列組合)練習,有興趣的可以自己驗證一下,如下(圖片來源https://blog.csdn.net/asd991543753/article/details/89284108):

 

 

 

&n