# 類的繼承
繼承是面向對象的三大特性之一,也是軟件實現復用的重要手段之一
Java中的繼承是單繼承,每個子類都只有一個直接父類,有時候我們也把父類叫做基類或超類。
但是Java中存在**多層繼承**,常用的比如每個子類只有一個直接父類,但是該父類依然存在其自身的父類。另外我們也可以通過內部類或者接口來實現多層繼承。
**注意**:雖然類繼承可以實現代碼的復用,但是如果繼承的結構過多,也會造成代碼段的閱讀困難,一般不建議繼承的結構超過3層。
## 繼承的特點
> 父類和子類是一種一般和特殊的關系。例如水果和蘋果,蘋果是一種特殊的水果
在Java中定義子類繼承父類的語法為:
~~~
[修飾符] class SubClass extends SuperClass {
}
~~~
~~~
實例:
public class Animal {
String sex;
int age;
String type;
}
/繼承
public class Dog extends Animal {
}
~~~
extends字面意思解釋擴展,其實就是子類除了擁有父類的所有成員變量和方法外,還具備自己的特殊屬性。
> 在子類中是不能夠訪問父類中通過private修飾的相關成員變量和方法的,這也符合private的使用方式
## 重寫父類方法
在子類中包含與父類相同的方法簽名的現象稱之為【方法重寫(override)】,有時也稱之為方法覆蓋。我們可以說子類重寫了父類的方法,子類覆蓋了父類的方法。
子類重寫方法的意義:子類繼承父類之后,調用父類的方法,就不需要重復寫,可以節省代碼量。
如果使用條件變更,父類的方法不能滿足使用需求,那么就需要重寫方法,把父類的方法給覆蓋掉。重寫,也能實現代碼的多樣性。就好比父親和兒子的關系,兒子會繼承父親的所有特性,但是兒子呢也會自己發展。
> 重寫父類方法需要遵循的規則:
> 返回值和訪問控制修飾符可以不一樣,但要符合“兩同兩小一大”的原則
> 兩同:方法名和參數列表必須相同(方法簽名相同)
> 兩小:子類的返回值類型和拋出的異常類要比父類的返回值類型和拋出的異常類更小。這里說的返回值類型小指的是子類和父類的關系。
> 一大:子類的訪問權限要比父類的訪問權限要大或相等
**注意**:子類重寫父類的方法,實際上也是方法的多態性的表現;
## super限定
super的使用和this很相似。
如果需要在子類中使用父類被覆蓋的方法,可以使用super關鍵字。
同樣我們也可以使用super.fun()來調用沒有別覆蓋的方法,但是這樣寫沒有什么意義,因為在子類中就可以直接調用,無需使用super關鍵字。
~~~
//父類中
protected void say() {
System.out.println("吼,嘶鳴");
}
//子類中
@Override
protected void say() {
String type = super.type;
String sayWang = this.sayWang;
System.out.println("汪汪汪");
}
public void fatherSay() {
super.say();
}
~~~
## 關于繼承的幾點說明
子類能夠繼承父類的信息包括:
* 沒有使用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的準備
- JAVA的運行原理
- JDK配置
- 我的第一個JAVA程序
- 類與對象
- 基礎語言要素
- 數據類型
- Eclipse的安裝與使用
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏與封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final修飾符
- 抽象類
- 接口
- 設計模式
- 單例模式
- 工廠模式
- 集合框架
- 集合排序
- 常用類學習
- 異常處理
- Java基礎綜合練習
- JAVA高級
- 泛型
- 多線程
- 線程的創建
- 線程的生命周期
- 線程同步
- 線程通信
- 輸入輸出流(I/O編程)
- File文件操作
- 字節流與字符流
- 數據庫
- 數據庫介紹
- 數據庫安裝
- SQL
- 表的基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用
- JavaWeb