子類繼承父類
- “繼承‘是面向對象最顯著的一個特性。
- 一個子類繼承父類,這個子類就會自動獲得了父類中定義的成員變量和成員方法,同時,這個子類也可以定義新的成員變量和成員方法。
- 父類又稱為超類或基類,子類又稱為派生類。通過子類繼承父類,使得復用父類的代碼變得非常容易,能夠大大縮短開發周期,降低開發費用。
下圖用UML圖體現類之間的繼承關系,圖中子類用空心三角箭頭指向父類。
Java語言只支持單繼承,不支持多繼承,B類繼承A類的語法如下:
繼承的語法機制:
- Java虛擬機在裝載一個子類之前,必須先裝載它的父類。
- 因為一個子類對象肯定要擁有父類對象的屬性,所以在一個子類對象數據中是包含一個父類對象數據的。那么在創建初始化一個子類對象時,就必須要先創建初始化一個父類對象。所以在調用子類構造方法時,肯定會先調用父類的構造方法,以初始化這個子類對象里的父類對象。
- 父類的構造方法是不能被子類繼承的,但是子類的構造方法中可以調用、也必須調用父類的構造方法。
- 如果在子類的構造方法中需要顯式調用父類的構造方法,那么就要在子類構造方法中的第一行,使用語句“super(實參列表)”來調用父類的構造方法。
- 如果在子類的構造方法中沒有顯式調用父類的構造方法,則編譯器會自動在子類構造方法中的第一行,添加調用父類無參構造方法的語句“super()”,如果此時父類沒有定義無參的構造方法,則會出現編譯錯誤。
方法的覆蓋和變量的隱藏
- 如果一個子類對繼承自父類的某個方法的實現“不滿意” ,子類可以重新實現這個方法。這種語法機制稱為“方法的覆蓋”(Override)
- 與方法的覆蓋 類似的語法機制是 變量的隱藏 。所謂變量的隱藏 是指:在子類中可以定義父類中以及定義的成員變量,或者說,可以定義和父類成員變量同名的成員變量,此時子類的成員變量同名的成員變量隱藏了父類的成員變量。
方法的覆蓋需要注意以下幾點:
- 子類重新實現的方法必須和父類中被覆蓋的方法具有完全一致的:方法名、參數列表和放回值類型,否則就不能稱為方法的覆蓋。
- 在子類的方法中,可以通過語句“super.方法名”,來顯式調用父類中被覆蓋的方法。
- 子類不能覆蓋父類中用“static”、“private”或者“final" 修飾符修飾的方法。
- 只有當一個子類能夠訪問父類的某個方法時,父類的這個方法才能被子類覆蓋。
案例