在學習的過程中,有很多學生對super及this關鍵字老是分不清,或者是不知道怎么去用,特別是在構造器之中,更是迷惑。我在這里主要針對學生上課中遇到的一點問題加以介紹,希望對大家學習有所幫助。
首先,我們先看下面一個例子:
這個例子非常簡單,有一個子類Child繼承于父類Father,然后在測試類Test中使用子類引用。調用子類中的fun方法,執行結果和我們預料的一樣:
我們知道,使用new操作符,我們會調用類中相應的構造器,所以,在執行"Child c = new Child(); "這條語句時,我們應該去調用子類中無參的構造器,但是在子類Child中貌似沒有構造器。這時大家要注意了,其實我們每個類中,實際上是有一個無參的構造器的。但是,如果程序員自定義了構造器,這時我們只能使用自己的構造器。所以,這時也不難理解,為什么我們new子類實例,是沒有報錯的了!所以,我們添上一個無參構造器,結果也是一樣的。
說到這里,有些同學會問,父類中是否也有默認的無參構造器呢?答案是肯定的!
細心的同學這時會發現,為什么父類中的構造器先于子類的構造器執行呢?我經常會給學生這樣解釋"老子都沒有,哪來的兒子",雖然這句話比較粗俗,但是一語道出了真諦。子類繼承父類,父類都不存在,子類談何繼承?但這只是我們邏輯上的理解,java語言怎么解釋的呢?這時就有了我們的主角:this,super。
this代表本類引用,super代表父類引用,構造器中亦是如此。看實例:
這是不是一目了然啊?原來在子類構造器中隱藏著一個super(),它就代表父類中的無參構造器!