1. 程式人生 > >Java總結---繼承(不斷完善ing..)

Java總結---繼承(不斷完善ing..)

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.
Constructors, static initializers, and instance initializers are not members and  therefore are not inherited.(構造器、靜態初始化塊、例項初始化塊不繼承)
2.然而,從記憶體實現角度。
子類是“繼承”了父類全部,更具體的,如《java程式設計思想》129頁裡寫道:  建立匯出類時,該匯出類物件會包含基類的子物件只是說這個子物件不全對外開放(開放多少?根據訪問修飾符決定)。 根據訪問修飾符,子類和父類如果: --1在同一個包:public,protected,預設訪問級別(包訪問級別) 三種類型
--2不在同個包: public,protected 兩種
四、基本語法
(1)Java不支援多繼承,也就是說子類至多隻能有一個父類(但可以有多個間接父類,比如所有類都直接或間接繼承自Object類)。 (2)super與this:
在子類變數或方法 與 父類重名時,可用super this特指區分。super還可用來訪問 子類物件持有的父類子物件的構造器、變數等。(由於子類物件持有父類子物件的特性,靜態域不能使用super)
(3)構造器不能被繼承,但是子類初始化前一定要(或自動)被呼叫。 (4)多次講解和訪問修飾符有關,貼出下圖關係:

    訪問許可權   類   包  子類  其他包

    public       ∨   ∨   ∨     ∨

    protect     ∨   ∨   ∨     ×

    default    ∨   ∨   ×     ×

    private     ∨   ×   ×     ×

四、方法的過載和覆蓋(或者說重寫,一個意思)

(1)方法過載(Overload)
定義:對於類的方法(包括從父類中繼承的方法),如果有兩兩個方法的方法名相同,但引數列表(引數的順序也得考慮不一致,那麼可以說一個方法是另個的過載。 必須滿足的條件: --方法名相同 --引數列表(型別,個數或順序)不同 --返回值型別可以不同(不能以返回值區分過載!) --方法的修飾符可以不同
(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?