# 類的繼承
繼承是面向對象的三大特性之一,也是實現軟件復用的重要手段。
Java中是單繼承,每個子類只有一個直接父類。有的時候把父類也成為基類或者超類。
## 繼承的特點
> 父類和子類是一種一般和特殊的關系。例如水果和蘋果,蘋果是一種特殊的水果。
在Java中定義子類繼承父類的語法為
~~~
[修飾符] class SubClass extends SuperClass {
// 類定義部分
}
~~~
extends字面解釋為擴展,其實就是子類除了擁有父類所有的成員變量和方法之外,還具備自己的特殊屬性。
> 在子類中是不能訪問父類中定義的private相關的成員變量和方法的,這點也完全符合private的使用方式。
## 重寫父類的方法
在子類中包含與父類同方法簽名的現象稱為「方法重寫(Override)」,有時也稱為方法覆蓋。我們可以說子類重寫了父類的方法,也可以說子類覆蓋了父類的方法。
> 返回值和訪問控制修飾符可以不一樣,但是要符合“兩同兩小一大原則”
> 作為兩同就是方法名和方法的參數列表相同
> 兩小:子類的返回值類型和拋出的異常類要比父類的返回值類型和拋出的異常類更小或者相等。這里說的返回值類型小值得的是子類和父類的關系。
> 一大:子類的訪問權限要比父類的訪問權限要大或者相等
## super限定
super的使用和this的使用很相似。
如果需要在子類中調用父類被覆蓋的方法,可以使用super關鍵字。
同樣也可以通過super.fun()調用沒有被覆蓋的方法,但是這樣寫沒有什么特別的意義,因為本身在子類中就可以直接調用,無需使用super關鍵字。
## 關于繼承的幾點說明
子類能夠繼承父類的信息包括:
* 沒有使用private修飾符修飾的成員變量和方法,子類都能夠繼承
* 子類重寫了父類的方法,則父類的方法會被隱藏,隱藏的方法或者成員變量可以通過super關鍵字進行訪問
* 引入super關鍵字的原因是可以訪問被隱藏的成員變量和屬性,而且super只能在子類的方法定義中使用。
## 調用父類的構造器
> 在子類的構造器中,無論如何在第一行語句中都會調用一次父類的構造器。
如果沒有顯式的調用,那么會調用父類的沒有參數的構造器,如果父類沒有定義空參數的構造器,則此時會無法編譯。
對象創建的過程就是調用對象類的構造器的過程,一個構造器最基本的組成
~~~
[修飾符] 類名 {
super(...); 調用父類的構造器,如果沒有會調用父類的無參構造器
}
~~~
super()必須出現在第一行,而且只能有一個。
this和super在同一構造器中只可能出現一次。
子類構造器調用父類構造器可能出現的情況有
* 子類構造器執行體的第一行顯式的使用super調用父類的構造器,此時系統將根據super(params)調用對應的構造器。
* 子類構造器執行提的第一行顯式的使用this調用重載的構造器,系統將根據this(params)調用對應的重載構造器,本類中的對應的構造器在去調用父類的構造器。
* 子類構造器中既沒有super又沒有this,子類在執行構造器語句前執行父類的無參構造器。
* 無論如何子類都會調用一次父類的構造器。
> 在實際的開發過程中,我們一般都會保證在一個類中有一個無參的構造器的存在。因為如果在其類的子類中沒有定義構造器,或者定義了構造器沒有顯式的去調用父類的構造器,子類也能被成功的編譯。