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

 

首先,構造方法自己會有一個隱式的無參構造(默認):html

  ①不寫構造方法,類中的第一行代碼事實上有一個默認的無參構造(系統會隱式爲你寫好)函數

    

public class Student { private String name; // public Student() {} 隱式地「寫」在這裏,你看不見 // Strudent類中雖然沒有寫構造方法,但至關於有上面的無參構造 // 只不過是隱式的,你看不見
 }

 

  ②只寫帶參構造方法,至關於只有該帶參構造方法(隱式的無參構造會被屏蔽無視掉,視爲無效)this

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

 

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

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

 

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

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

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

這就是爲何,調用子類的構造方法時,都會先調用父類的無參構造方法了,由於默認的super()存在。htm

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

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

 

這就是爲何當父類沒有無參構造(即只有帶參構造——對應狀況②)時,子類的構造方法編譯沒法經過。這是由於子類的構造函數(帶參或無參)將調用父類的無參構造函數。 因爲編譯器試圖向子類中的2個構造函數中插入super() ,但父類的默認構造函數未定義,所以編譯器會報告錯誤消息繼承

要解決這個問題,只須要three

      1)添加一個無參構造函數給父類——顯式地在父類中添加無參構造

      2)刪除父類中自定義的有參構造函數——等價於恢復了默認的無參構造
      3)將 Super(XXX) 添加到子類構造函數——經過⑤的原來來屏蔽默認的super()  

 

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

 

 

 

 

原文出處:https://www.cnblogs.com/12three/p/11914709.html

相關文章
相關標籤/搜索