首先,建構方法本身會有一個隱式的無參構造(預設):
①不寫建構方法,類別中的第一行程式碼事實上有一個預設的無參構造(系統會隱式為你寫好)
public class Student { private String name; // public Student() {} 隐式地“写”在这里,你看不见 // Strudent类中虽然没有写构造方法,但相当于有上面的无参构造 // 只不过是隐式的,你看不见 }
(推薦影片:java影片教學 )
②只寫帶參構造方法,相當於只有該帶參構造方法(隱式的無參構造會被屏蔽無視掉,視為無效)
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()
本文來自php中文網,java教學專欄,歡迎學習!
以上是JAVA繼承中子父類別的建構方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!