1. 程式人生 > 實用技巧 >JavaSE10-繼承&super&this&抽象類

JavaSE10-繼承&super&this&抽象類

1.繼承

1.1 概述

多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那一個類即可。

其中,多個類可以稱為子類,單獨那一個類稱為父類、超類(superclass)或者基類。

1.2 定義

繼承:就是子類繼承父類的屬性和行為,使得子類物件具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。

1.3 好處

1. 提高程式碼的複用性。

2. 類與類之間產生了關係,是多型的前提。

1.4 繼承的格式

1 class 父類 {
2     ...
3 }
4 
5 class 子類 extends 父類 {
6     ...
7 }

1.5 繼承後的特點——成員變數

成員變數不重名

  如果子類父類中出現不重名的成員變數,這時的訪問是沒有影響的。

成員變數重名

  子父類中出現了同名的成員變數時,在子類中需要訪問父類中非私有成員變數時,需要使用 super 關鍵字,修飾父類成員變數,類似於之前學過的 this 。

  格式:

1 super.變數

父類中的成員變數非私有,子類中可以直接訪問。若父類中的成員變數私有了,子類是不能直接訪問的。

通常編碼時,我們遵循封裝的原則,使用private修飾成員變數,在父類中提供公共的getXxx方法和setXxx方法來訪問父類的私有成員變數。

1.6 繼承後的特點——成員方法

成員方法不重名

如果子類父類中出現不重名的成員方法,這時的呼叫是沒有影響的。物件呼叫方法時,會先在子類中查詢有沒有對應的方法,若子類中存在就會執行子類中的方法,若子類中不存在就會執行父類中相應的方法。

成員方法重名——重寫(Override)

如果子類父類中出現重名的成員方法,這時的訪問是一種特殊情況,叫做方法重寫 (Override)。

方法重寫 :子類中出現與父類一模一樣的方法時(返回值型別,方法名和引數列表都相同),會出現覆蓋效 果,也稱為重寫或者複寫。宣告不變,重新實現。

比如:

1 class fu {
2   public void pr(){//do something}      
3 } 4 5 class zi extends fu{ 6   @Override 7   public void pr(){//do another thing} 8 }

重寫的意義:子類可以根據需要,定義特定於自己的行為。既沿襲了父類的功能名稱,又根據子類的需要重新實現父類方法,從 而進行擴充套件增強。

注意事項:

1. 子類方法覆蓋父類方法,必須要保證許可權大於等於父類許可權。

2. 子類方法覆蓋父類方法,返回值型別、函式名和引數列表都要一模一樣。

1.7 繼承後的特點——構造方法

當類之間產生了關係,其中各類中的構造方法,又產生了哪些影響呢?

首先我們要回憶兩個事情,構造方法的定義格式和作用。

1. 構造方法的名字是與類名一致的。所以子類是無法繼承父類構造方法的。

2. 構造方法的作用是初始化成員變數的。所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中預設有一個 super() ,表示呼叫父類的構造方法,父類成員變數初始化後,才可以給子類使用。

1.8 super和this

父類空間優先於子類物件產生

  在每次建立子類物件時,先初始化父類空間,再建立其子類物件本身。

  目的在於子類物件中包含了其對應的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,則子類可以隨意使用父類成員。

  程式碼體現在子類的構造方法呼叫時,一定先呼叫父類的構造方法。

super和this的含義

  super :代表父類的儲存空間標識(可以理解為父親的引用)。

  this :代表當前物件的引用(誰呼叫就代表誰)。

super和this的用法

  1.訪問成員變數

1 this.成員變數 ‐‐ 本類的
2 super.成員變數 ‐‐ 父類的
3 this.成員方法名() ‐‐ 本類的
4 super.成員方法名() ‐‐ 父類的

  2.訪問構造方法

1 this(...) ‐‐ 本類的構造方法
2 super(...) ‐‐ 父類的構造方法

  3.注意

  子類的每個構造方法中均有預設的super(),呼叫父類的空參構造。

  手動呼叫父類構造會覆蓋預設的super()。

  super() 和 this() 都必須是在構造方法的第一行,所以不能同時出現。

1.9 繼承的特點

1. Java只支援單繼承,不支援多繼承。

2. Java支援多層繼承(繼承體系)。

3. 子類和父類是一種相對的概念。

2.抽象類

2.1 概述

由來

父類中的方法,被它的子類們重寫,子類各自的實現都不盡相同。那麼父類的方法宣告和方法主體,只有宣告還有意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱為抽象方法。Java語法規定,包含抽象方法的類就是抽象類

定義

抽象方法 : 沒有方法體的方法。

抽象類:包含抽象方法的類。

2.2 abstract使用格式

抽象方法

使用 abstract 關鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個方法名,而沒有方法體。

定義格式:

1 修飾符 abstract 返回值型別 方法名 (引數列表);

抽象類

如果一個類包含抽象方法,那麼該類必須是抽象類。

定義格式:

1 abstract class 類名字 {
2     ……
3 }

繼承抽象類的子類必須重寫父類所有的抽象方法。

否則,該子類也必須宣告為抽象類。

最終,必須有子類實現該父類的抽象方法,否則,從最初的父類到最終的子類都不能建立物件,失去意義。

2.3 注意事項

1. 抽象類不能建立物件,如果建立,編譯無法通過而報錯。只能建立其非抽象子類的物件。

2. 抽象類中,可以有構造方法,是供子類建立物件時,初始化父類成員使用的。

3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。