前言
繼承是面向對象語法的三大特征之一。繼承可以降低代碼編寫的冗余度,提高編程的效率。通過繼承,子類獲得了父類的成員變量和方法。一個子類如何繼承父類的字段和方法,如何修改從父類繼承過來的子類的方法呢。今天我們開始學習有關JAVA繼承的知識。
繼承
繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
繼承的作用:通過繼承可以快速創建新的類,實現代碼的重用,提高程序的可維護性,節省大量創建新類的時間,提高開發效率和開發質量。
在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:
class 父類{
... //成員變量、成員方法
}
class 子類 extends 父類{
... //類體
}
例如:
運行結果為:
學生
Tom
19
注意:
子類不能選擇性繼承父類;
Java不支持多重繼承,但一個類可以實現多個接口,從而克服單繼承的缺點;
構造方法不會被子類繼承,但可以從子類中調用父類的構造方法。
繼承的優點
- 繼承過來的字段和方法,可以像任何其他字段和方法一樣被直接使用;
- 在子類中可以聲明一個與父類中同名的新字段或靜態方法,從而“隱藏”父類中的字段或方法;
- 可以在子類中聲明一個在父類中沒有的新字段和方法;
- 可以在子類中編寫一個父類當中具有相同名的新實例方法,這稱為“方法重寫”或“方法覆蓋”;
- 可以在子類中編寫一個調用父類構造方法的子類構造方法,既可以隱式地實現,也可以通過使用關鍵字super來實現。
重寫和隱藏父類方法
子類繼承了父類中的所有成員及方法,但在某種情況下,子類中該方法所表示的行為與其父類中該方法所表示的行為不完全相同,例如,在父類語言中定義了說話這個方法,而在子類中說話的方法是不同的:外國人說英文,中國人說中文,這時我們就需要重寫或隱藏父類的該方法。
重寫父類中的方法
當一個子類中一個實例方法具有與其父類中的一個實例方法相同的簽名(指名稱、參數個數和類型)和返回值時,稱子類中的方法“重寫”了父類的方法。例如:
運行結果為:
大家好,歡迎學習Java!!!
GoodBye,everyone
注意:重寫的方法具有與其所重寫的方法相同的名稱、參數數量、類型和返回值。
隱藏父類中的方法
如果一個子類定義了一個靜態類方法,而這個類方法與其父類的一個類方法具有相同的簽名(指名稱、參數格式和類型)和返回值,則稱在子類中的這個類方法“隱藏”了父類中的該類方法。
- 當調用被重寫的方法時,調用的版本是子類的方法;
- 當調用被隱藏的方法時,調用的版本取決于是從父類中調用還是從子類中調用。
運行結果為:
可以看出,得到調用的隱藏方法是父類中的方法,而得到調用的重寫方法是子類中的方法。
方法重寫和隱藏后的修飾符
在子類中被重寫的方法,其訪問權限允許大于但不允許小于被其重寫的方法,例如:父類中一個受保護的實例方法(protected)在子類中可以是公共的(public)的,但不可以是私有的(private)。如果一個方法在父類中是static方法,那么在子類也必須是static方法;如果一個方法在父類中是實例方法,那么在子類中也必須是實例方法。
子類訪問父類私有成員
子類繼承其父類的所有public和protected成員,但不能繼承其父類的private成員。那么如何在子類中訪問到父類中的字段呢,我們可以在父類中提供用來訪問其私有字段的public或protected方法,子類使用這些方法來訪問相應的字段。例如:
運行結果為:
使用super關鍵字
使用super調用父類中重寫的方法、訪問父類中被隱藏的字段
子類重寫了父類中的某一個方法,隱藏父類中的字段,假如想在子類中訪問到父類中被重寫的方法和隱藏父類的字段,可以在子類中通過使用關鍵字super來調用父類中被重寫的方法和訪問父類中被隱藏的字段。例如:
運行結果為:
使用super調用父類的無參數構造方法/有參數構造方法
子類不繼承其父類的構造方法。
- 當使用無參數的super()時,父類的無參數構造方法就會被調用;
- 當使用帶有參數的super()方法時,父類的有參數構造方法就會被調用。
例如:
運行結果為:
注意:
- 如果要初始化父類中的字段,可以在子類的構造方法中通過關鍵字super調用父類的構造方法;
- 對父類的構造放的調用必須放在子類構造方法的第一行;
- 如果父類構造器沒有參數,則在子類的構造器中不需要使用 super 關鍵字調用父類構造器,系統會自動調用父類的無參構造器;
- 如果父類的構造器帶有參數,則必須在子類的構造器中顯式地通過 super 關鍵字調用父類的構造器并配以適當的參數列表;
- 子類是不繼承父類的構造器(構造方法或者構造函數)的,它只是調用(隱式或顯式)。