為什么java構造函數的構造器只能在第一行寫this() 或者super() ?


最近在看內部類, 但是被“為什么匿名內部類或者局部內部類使用方法的局部變量時, 局部變量一定得是final類型”困擾着, 在網上查找資料的時候, 發現我對類初始化完全不了解, 之前的認識都是錯誤! 所以回頭又看了看基礎的初始化, 在看初始化的時候, 就發現一點, 就是“為什么只能在構造器的第一行寫this() 或者super()?” 我比較笨,又想了好久,上網查了下資料,看了看書才明白。

在說這個問題之前,首先得要明白super()和this()的意義:

  1. this() 之所以存在, 我個人認為原因很簡單, 就是為了代碼的復用(純粹的個人觀點, 不知道是否正確)
  2. super()之所以存在, 是有很重要的原因的! 因為子類與父類之間是繼承關系, 而繼承就意味着得到父類中所有的成員變量和方法. 既然能夠得到父類的這些成員, 也就意味着子類可以訪問父類的方法和成員變量(當然, 得到不意味着就可以任意使用, 使用的前提是必須是有相應的訪問權限) , 如果子類在使用父類成員的時候, 父類內的成員變量沒有得到正確的初始化, 那么就會發生意想不到的錯誤, 所以問題就出現在了這里, 如何保證父類成員是安全的呢? 這就得保證父類得到了正確的初始化, 而父類對象正確的初始化就離不開父類的構造函數, super存在的意義也正是如此. 在子類的構造函數中,如果沒有顯式使用super() , 並且第一行沒有使用this()調用子類的構造函數, 那么編譯器就會自動在第一行補齊super()來調用父類的默認構造函數, 如果父類沒有默認的構造函數就會報錯.

為什么一定要在第一行?

  super()在第一行的原因就是: 子類有可能訪問了父類對象, 比如在構造函數中使用父類對象的成員函數和變量, 在成員初始化使用了父類, 在代碼塊中使用了父類等, 所以為保證在子類可以訪問父類對象之前要完成對父類對象的初始化

  this()在第一行的原因就是: 為保證父類對象初始化的唯一性. 我們假設一種情況, 類B是類A的子類, 如果this()可以在構造函數的任意行使用, 那么會出現什么情況呢? 首先程序運行到構造函數B()的第一行, 發現沒有調用this()和super(), 就自動在第一行補齊了super() , 完成了對父類對象的初始化, 然后返回子類的構造函數繼續執行, 當運行到構造函數B()的"this(2) ;"時, 調用B類對象的B(int) 構造函數, 在B(int)中, 還會對父類對象再次初始化! 這就造成了對資源的浪費, 當然也有可能造成某些意想不到的結果, 不管怎樣, 總之是不合理的, 所以this() 不能出現在除第一行以外的其他行!

 

當創建一個子類對象的時候, 該對象會包含一個父類的子對象, 不管你是否使用.

//thinking in java筆記,如果有不對的地方,還望指正^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM