---關於Java構造函數的評論和理解!

基礎:
new XXX_class(...)  ///本身是從外部創建一個類的對象,當然就會觸發構造函數,這樣的形式要求:
1. 構造函數是public的
2. 構造函數不能有返回值(代碼就是空在那裏, 不要使用void)


今天看了這個帖子:
https://blog.csdn.net/abcdefgzmy/article/details/50696955

總結一下就是:
Java的構造函數,有參數的和無參數的,對應當前類來說沒有區別的,而對於子類來說,他起到了默認構造函數的作用, 子類構造函數用了super(...) 就是明確了它對應父類構造函數.
  #super(...) 指的是有參構造函數(下同此意思),就是說如果是super()就不用寫了
對於一個類來說, 全部構造函數可以沒有,這種情況,他的構造全部來自於他的父類,

比如你:  new Child(...)/new Child()  就是一次性創建一個對象, 從結構上說都是先構造父類部分然後子類然後再構造本類部分,每個部分都要有一個構造函數被執行的,保持這個從父親到子的單一構造函數鏈條(不考慮構造函數的相互調用情況), 應該是Java設計的規範了!


實踐發現:
任何情況,如果按照上面說的邏輯不能產生這個單一的鏈條,都不能編譯通過了,構造鏈條的構建是從最下面的類開始的!

情況1.例如: B類繼承A類
A沒有無參構造函數,B沒有無參構造函數或者無參構造函數沒有去調用super(...), 結果就是,編譯不能通過
情況2.B類繼承A類
A沒有無參構造,B有有無參構造,無參有呼叫super(...),B類有這個有參構造,所以編譯沒有問題

Java編譯類的時候有檢查當前默認無參構造是否可以完成構造鏈條的功能,如果不能就出錯,必須保證有父類的類默認構造必須被完成.
沒有繼承任何類的類,沒有做這個檢查,說明javac編譯類的時候使用了默認無參構造來自與javac的編譯器,編譯器只會給編譯的當前類提供默認無參構造,









 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章