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. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。