# 類的繼承
繼承是面向對象的三大特性之一,也是實現軟件復用的重要手段。
Java中是單繼承,每個子類只有一個直接父類。有的時候把父類也成為基類或者超類。
但是Java中存在**多層繼承**,常用的比如每個子類只有一個直接父類,但是該父類仍然有其自身的父類。另外我們也可以使用內部類和接口來實現多層繼承(通過接口和內部類實現多層繼承的知識自學)
**注意**:雖然類繼承可以實現代碼的復用,但是如果繼承的結構過多,也會造成代碼閱讀的困難,一般不建議繼承結構超過3層。
## 繼承的特點
> 父類和子類是一種一般和特殊的關系。例如水果和蘋果,蘋果是一種特殊的水果。
在Java中定義子類繼承父類的語法為
~~~
[修飾符] class SubClass extends SuperClass {
// 類定義部分
}
~~~
extends字面解釋為擴展,其實就是子類除了擁有父類所有的成員變量和方法之外,還具備自己的特殊屬性。
> 在子類中是不能訪問父類中定義的private相關的成員變量和方法的,這點也完全符合private的使用方式。
## 重寫父類的方法
在子類中包含與父類同方法簽名的現象稱為「方法重寫(Override)」,有時也稱為方法覆蓋。我們可以說子類重寫了父類的方法,也可以說子類覆蓋了父類的方法。
子類重寫方法的意義:子類繼承了父類之后,調用父類的方法,就不需要重復寫,節省代碼量。
如果使用條件變更,父類的方法不能滿足使用需求,那么就需要重寫方法了,把父類的方法覆蓋掉。重寫,也能實現代碼的多樣性。就好比父親和兒子的關系,兒子會繼承父親的所有特性,但是兒子也可以自己發展。
> 重寫父類方法需要遵循的規則:
> 返回值和訪問控制修飾符可以不一樣,但是要符合“兩同兩小一大原則”
> 作為兩同就是方法名和方法的參數列表相同
> 兩小:子類的返回值類型和拋出的異常類要比父類的返回值類型和拋出的異常類更小或者相等。這里說的返回值類型小值指的是子類和父類的關系。
> 一大:子類的訪問權限要比父類的訪問權限要大或者相等
**注意**:子類重寫父類的方法,實際上也是方法的多態性的表現。
## super限定
super的使用和this的使用很相似。
如果需要在子類中調用父類被覆蓋的方法,可以使用super關鍵字。
同樣也可以通過super.fun()調用沒有被覆蓋的方法,但是這樣寫沒有什么特別的意義,因為本身在子類中就可以直接調用,無需使用super關鍵字。
## 關于繼承的幾點說明
子類能夠繼承父類的信息包括:
* 沒有使用private修飾符修飾的成員變量和方法,子類都能夠繼承
* 子類重寫了父類的方法,則父類的方法會被隱藏,隱藏的方法或者成員變量可以通過super關鍵字進行訪問
* 引入super關鍵字的原因是可以訪問被隱藏的成員變量和屬性,而且super只能在子類的方法定義中使用。
## 調用父類的構造器
> 在Java的世界里,所有的類都是Object類的子類。
在子類的構造器中,無論如何在第一行語句中都會調用一次父類的構造器。
如果沒有顯式的調用,那么會調用父類的沒有參數的構造器,如果父類沒有定義空參數的構造器,則此時會無法編譯。
對象創建的過程就是調用對象類的構造器的過程,一個構造器最基本的組成
~~~
[修飾符] 類名 {
super(...); 調用父類的構造器,如果沒有會調用父類的無參構造器
}
~~~
super()必須出現在第一行,而且只能有一個。
this和super在同一構造器中只可能出現一次。
子類構造器調用父類構造器可能出現的情況有
* 子類構造器執行體的第一行顯式的使用super調用父類的構造器,此時系統將根據super(params)調用對應的構造器。
* 子類構造器執行提的第一行顯式的使用this調用重載的構造器,系統將根據this(params)調用對應的重載構造器,本類中的對應的構造器再去調用父類的構造器。
* 子類構造器中既沒有super又沒有this,子類在執行構造器語句前執行父類的無參構造器。
* 無論如何子類都會調用一次父類的構造器。
> 在實際的開發過程中,我們一般都會保證在一個類中有一個無參的構造器的存在。因為如果在其類的子類中沒有定義構造器,或者定義了構造器沒有顯式的去調用父類的構造器,子類也能被成功的編譯。
## super,this,super(),this()
| | super | this | super() | this() |
| --- | --- | --- | --- | --- |
| 用處 | super可以用在子類的成員方法中 |this可以用在成員方法中 | super()可以用在子類的構造器中 |this()可以用在本類的構造器中|
| 目的 | 調用父類非私有(No private)的成員變量或成員方法 | 調用本類的成員變量或成員方法 | 調用父類的構造器 | 調用本類的構造器 |
> super和this可以同時出現,而super()和this()不能同時出現在一個構造器中
- JAVA基礎
- JAVA開發準備
- JAVA介紹
- 開發JAVA的準備
- JAVA的運行原理
- JDK配置
- 我的第一個JAVA程序
- 類與對象
- 基礎語言要素
- 數據類型
- eclipse的安裝與使用
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏與封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final修飾符
- 抽象類
- 接口
- 內部類
- 設計模式
- 單例模式
- 工廠模式
- 集合框架
- 集合排序
- 常用類學習
- 異常處理
- Java基礎測試
- 綜合案例一
- JAVA高級
- 泛型
- 多線程
- 線程的創建
- 線程的生命周期
- 線程同步
- 線程通信
- 輸入輸出流(I/O編程)
- File文件操作
- 字節流與字符流
- 數據庫
- 數據庫介紹
- 數據庫安裝
- SQL
- 表的基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用