1. 程式人生 > >java繼承派生和多型詳解

java繼承派生和多型詳解

繼承

繼承,顧名思義,就是把已經有的拿過來歸為己用,java中的繼承也不例外。
舉個例子,假如現在有這樣一個需求,讓我們寫一個關於狗的Dog類,Dog類中有狗的名字、年齡,還有狗的兩種行為,也就是這個類的兩種方法,分別是run(跑)方法和bark(犬吠)方法,那麼我們就可以這樣寫:

public class Dog {
	String name;
	int age;
	
	public void run()
	{
		System.out.println("狗在跑!");
	}
	public void bark()
	{
		System.out.println("狗在叫!"
); } }

很好,我們實現了Dog這個類,那麼現在如果讓我們寫一個拉布拉多類(狗的一種)呢?顯然,拉布拉多也具有名字、年齡、跑、叫的行為,那麼如果我們從頭開始寫拉布拉多這個類,就太麻煩了,我們還要重新寫一遍剛才寫的東西,這個時候,就要用到繼承,所以我們可以這樣去寫:

public class Labuladuo extends Dog {
	
}

extends是繼承的關鍵字,通過extends,我們實現了讓拉布拉多這個類繼承了Dog這個類,這不難理解,畢竟,拉布拉多就是狗的一種嘛。現在,由於我們的訪問許可權設定的都是public,那麼父類具有的東西子類也有,於是,拉布拉多也有了名字、年齡兩個成員變數,有了跑和叫兩個方法。

那麼派生是什麼呢?

顧名思義,派生是在繼承了一些東西的基礎上增添了新的東西,派生是依存於繼承的,子類在拿來父類的東西去使用的同時,可以增添新的東西或者對繼承來的東西進行覆寫讓其適用於子類。例如,我們現在在繼承了Dog類的拉布拉多類中新增一個給盲人導盲的方法daoMang(),那麼,我們僅僅用子類物件才能呼叫這個方法,而用父類物件無法呼叫,因為這個方法是子類拉布拉多類獨有的,也就是說,這是從父類的基礎上拓展出來的方法,也就是派生。此時的拉布拉多,既可以使用父類Dog類的所有狗都共有的run和bark方法,也同時具有了Dog類的name和age的狗的基本屬性。

public class
Labuladuo extends Dog { public void daoMang() { System.out.println("我會導盲!"); } }

多型

多型顧名思義就是一個事物有多種狀態,在java中指的是繼承父類或者實現介面時有多種繼承狀態和實現方式。

很多搞不清楚多型是什麼的人都是因為不清楚多型的應用場景和優點是什麼,多型主要有如下兩個應用:

1.開發人員不必為每一個子類編寫功能呼叫,只需要對抽象基類進行處理即可。大大提高程式的可複用性。

例如我們上面的程式碼,Dog類是各種狗的基類,Dog中的run方法雖然各種狗都繼承了下來,但是,針對於所有狗來說,每種狗的跑步方式不一樣,這時,我們就可以在每種狗類中覆寫這個run方法,這樣,每種狗就實現了不同的跑步狀態,這就是多型。

2.派生類的功能可以被基類的方法或引用變數所呼叫,這叫向後相容,可以提高可擴充性和可維護性

舉個例子,我們現在有一個貓類,派生出了波斯貓,橘貓,布偶貓幾種子類,現在我們想要獲取貓的shape,如果我們再用**波斯貓 c = new 波斯貓()然後使用c.shape()獲取未免有些太麻煩而且不合邏輯了,畢竟,我們想要的是貓普遍的形狀,而不單單是波斯貓的形狀,這時我們可以直接用貓 c = new 波斯貓()**然後用c.shape直接就可以獲取貓的形狀,這樣方便了許多而且更符合邏輯了。