“簡單不先于復雜,而是在復雜之后.” —— Alan Perlis
繼承
-
為什么要繼承
說到OOP(面向對象)的特點,就不得不提繼承,他使代碼擁有了其他非OOP所沒有的一種獨特性---可復用性。
當你先創建了一個類之后,再創建一個新類,即使他和你之前的類有相似的功能,你還是需要重新編寫此類。然而通過繼承,你也許可以不這么做。
-
繼承確定了一種關系
在繼承關系里,被繼承的類被稱為父類,而繼承的類就被稱為子類。子類繼承了父類所有的屬性(盡管private成員被隱藏起來,并且不可訪問)和方法,不僅如此,子類還可以根據自己的獨特性,擴展屬性和方法。
代碼
class Person {
public Person() {
}
}
class Man extends Person {
public Man() {
}
}
類Man繼承于Person類,這樣一來的話,Person類稱為父類(基類),Man類稱為子類(導出類)。如果兩個類存在繼承關系,則子類會自動繼承父類的方法和變量,在子類中可以調用父類的方法和變量。在java中,只允許單繼承,也就是說 一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。
子類繼承父類的成員變量
當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:
1.能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;
2.對于父類的包訪問權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3.對于子類可以繼承的父類成員變量,如果在子類中出現了同名稱的成員變量,則會發生隱藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關鍵字來進行引用。
子類繼承父類的方法
1.能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;
2. 對于父類的包訪問權限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3.對于子類可以繼承的父類成員方法,如果在子類中出現了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關鍵字來進行引用
重寫父類方法
-
注意事項
子類方法訪問權限大于等于父類方法權限;
子類可以訪問父類被重寫的方法.
繼承特點:
- 單繼承
單繼承和多繼承各自的優缺點:
- 多繼承復用性更高,單繼承復用性低;
- 多繼承關系復雜且有菱形缺陷,單繼承沒有;