Java總結---繼承(不斷完善ing..)
阿新 • • 發佈:2019-02-19
java三大特性:封裝、繼承、多型
繼承
一、目的:實現程式碼的複用 二、簡單例子(A繼承了C):三、繼承的本質public class A extends C { //檢測哪些可以在子類裡使用 public void test22(){ //int aa = a;private報錯,許可權不可見(編譯不通過) int bb = b;//預設(包)訪問許可權的,因為和父類在同一個包所以通過,否則不通過 int cc = c;//protected的(編譯通過) int dd = d;//public的(編譯通過) } } class C{ private int a; int b; protected int c; public int d; }
這個得從兩個角度講:繼承語法角度 和 記憶體實現角度
Members of a class that are declared private are not inherited by subclasses of that class. Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared.2.然而,從記憶體實現角度。Constructors, static initializers, and instance initializers are not members and therefore are not inherited.(構造器、靜態初始化塊、例項初始化塊不繼承)
子類是“繼承”了父類全部,更具體的,如《java程式設計思想》129頁裡寫道: 建立匯出類時,該匯出類物件會包含基類的子物件。只是說這個子物件不全對外開放(開放多少?根據訪問修飾符決定)。 根據訪問修飾符,子類和父類如果: --1在同一個包:public,protected,預設訪問級別(包訪問級別) 三種類型四、基本語法--2不在同個包: public,protected 兩種
(1)Java不支援多繼承,也就是說子類至多隻能有一個父類(但可以有多個間接父類,比如所有類都直接或間接繼承自Object類)。 (2)super與this:
在子類變數或方法 與 父類重名時,可用super this特指區分。super還可用來訪問 子類物件持有的父類子物件的構造器、變數等。(由於子類物件持有父類子物件的特性,靜態域不能使用super)
(3)構造器不能被繼承,但是子類初始化前一定要(或自動)被呼叫。 (4)多次講解和訪問修飾符有關,貼出下圖關係:訪問許可權 類 包 子類 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×
四、方法的過載和覆蓋(或者說重寫,一個意思)
定義:對於類的方法(包括從父類中繼承的方法),如果有兩兩個方法的方法名相同,但引數列表(引數的順序也得考慮)不一致,那麼可以說一個方法是另個的過載。 必須滿足的條件: --方法名相同 --引數列表(型別,個數或順序)不同 --返回值型別可以不同(不能以返回值區分過載!) --方法的修飾符可以不同(2)方法重寫(覆蓋)(Override)
定義:子類方法的名稱、引數簽名和返回型別必須與父類方法的名稱、引數簽名和返回型別相匹配,那麼可以說,子類方法覆蓋了父類的方法 必須滿足的條件(來自《java面向物件程式設計》): 1.名稱、引數簽名和返回型別相同。子類方法的返回值與父類必須相同。 2.方法覆蓋中子類方法不能縮小父類方法的訪問許可權。例如父類方法是public的,子類方法不能是預設修飾,protected,private修飾。(防止與多型衝突) 3.子類方法不能丟擲比父類方法更多的異常。 4.方法覆蓋只能是在子類和父類之間,同一個類中只能是方法過載。 5.父類的靜態方法不能被覆蓋成非靜態方法。 6.子類可以覆蓋父類中的靜態方法,用以遮蔽父類中的靜態方法。 7。父類的非靜態方法不能被子類覆蓋為靜態方法。 8.父類的私有方法不能被子類覆蓋。 9.父類的抽象方法可以被子類通過兩中途徑覆蓋:一是子類實現父類的抽象方法;二是子類重新宣告父類的抽象方法。 10.父類的非抽象方法可以被子類覆蓋成抽象方法。(3)覆蓋與過載的異同 五、繼承的缺陷
1、繼承破壞了封裝(最大的缺陷)。於父類而言,它的實現細節對於子類來說都是透明的。
2、父類變,子類就必須變。
3、繼承是一種強耦合關係。
所以說當我們使用繼承的時候,我們需要確信使用繼承確實是有效可行的辦法。那麼到底要不要使用繼承呢?《Think in java》中提供瞭解決辦法:問一問自己是否需要從子類向父類進行向上轉型。如果必須向上轉型,則繼承是必要的,但是如果不需要,則應當好好考慮自己是否需要繼承。
慎用繼承!
參考:
1.《java面向物件程式設計》孫衛琴
2.《java程式設計思想》
3.http://blog.csdn.net/chenssy/article/details/12785831utm_source=itdadao&utm_medium=referral
4.http://blog.csdn.net/nanruitao10/article/details/52635038?