標籤:java類的繼承
java中的繼承用extends關鍵字來實現,被繼承的類叫做超類、父類、基類,實現繼承的類稱為子類、衍生類別。
子類是一種特殊的父類,因此可以看作父類是大類,子類是小類。
extends實際上是拓展的意思,而父類和子類的關係實際上用拓展來解釋似乎更加的恰當,子類在父類功能的基礎上增加新的功能。
在繼承中,除開父類的構造器以外,子類幾乎可以繼承父類所有的功能和屬性。
每個類最多隻能有一個直接的父類,可以有無限多個間接父類,就像人一樣,只能有一個親生父親。
若一個類定義的時候沒有顯示定義直接父類,則預設繼承java.lang.Object,他是所有類的父類,因此所有的java對象都可以調用java.lang.Object的執行個體方法。
父類引用可以指向子類對象,即聲明一個父類型的變數可以執行個體化為子類的對象,這也是java多態性的一個重要的實現方式。除此之外,方法的重載也是多態性的實現方式之一。
需要注意的是,重寫方法和被重寫的方法必須同時都是類方法或者同時都不是類方法。
繼承中還有一個很重要的概念是重寫,對於子類重寫過的方法,使用時究竟使用重寫前的版本還是重寫後的版本,取決於對象的類型而不是引用的類型。
重寫的時候,子類方法會覆蓋父類的方法,父類private方法不可被重寫。
有的時候,當子類定義了與父類同名的屬性時,也會覆蓋父類的屬性。正常情況下,子類定義的方法、子類屬性直接存取該屬性時,都會預設訪問覆蓋後的方法和屬性而無法訪問到被覆蓋的方法和屬性。但是在子類定義的執行個體方法中可以通過super來訪問父類被覆蓋的方法和屬性。
如果子類中沒有和父類同名的屬性,那麼訪問的時候不需要用super,可以直接存取。和this一樣,super也不能出現static方法中。
繼承的時候不繼承父類的構造器,如果在子類中一定要用的話,也可以通過super來調用。而即使不顯示的調用父類構造器,系統也會預設在子類構造器執行體的第一行調用父類構造器一次,只不過是調用父類的無參構造器。
super調用和this調用不會同時出現。
子類構造器調用父類構造器有幾種情況:
1.super顯示調用,系統會根據super裡的實參列表選擇調用父類的哪個構造器。
2.子類構造器執行體的第一行用了this調用本類重載的構造器,那麼在執行調用的構造器的第一行會調用父類的構造器。
3.子類中既沒有this調用也沒有super調用,系統會預設在子類構造器執行體的第一行調用父類的無參構造。
建立任何對象總是從該類繼承樹的最頂層構造開始執行,然後依次向下,最後才是本類。
學習日記(十三)java類的繼承