(9)2017.8.9-面向對象(4)

每天且筆記的時間都到了第二天,現在繼續回顧面向對象的知識點,前幾篇文章裏已經寫了有關封裝和繼承的知識,這篇文章我們就着重看看java面向對象的最後一個特性:多態。

首先我們從多態的概念說起,多態可以理解爲一個事物的多種表現形態,它在java中有兩個體現:

第一就是方法的重載(overlode)和重寫(overwrite)

第二就是對象的多態性(抽象類,接口,轉型)

方法的重寫和重載在之前已經說過了,那麼什麼是對象的多態性呢,其實從字面含義來理解對象的多態性就是一種對象的多種形態,在java中,子類可以替代父類的對象使用。

那麼多態性就會有使用前提了,一共有兩點,分別是:

(1)要繼承,實現(接口)

(2)要有子類對父類方法的重寫,使子類具有不同的方法實現

我們在這裏就會用到一個很神奇的東西:轉型,它分爲上轉型和下轉型。

其中上轉型是將父類的引用類型指向子類的對象,我們以一個例子來描述上轉型:

首先,我們創建父類Animal,並在其中我創建了兩個子類爲Dog類和Cat類,在其中重寫了eat()的方法,這樣我們就滿足了多態的兩個前置條件:

package cn.hpe.www;

public class Animal {
	public void eat() {
		System.out.println("emmmmm....");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("喫魚");
	}

	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("喫骨頭");
	}

	public void watchDoor() {
		System.out.println("看家");
	}
}
最後我們創建TestAnimal類來演示上轉型的效果:

package cn.hpe.www;

public class TestAnimal {
	
	public static void main(String[] args) {
		Animal cat = new Cat();
		Animal dog = new Dog();
		Animal animal = new Animal();
function(cat);function(dog);// dog.eat();function(animal);}public static void function(Animal a){a.eat();}}

記住,上轉型就是將父類類型的引用指向子類,所以我們在這個main方法中直接使用了上轉型,我們執行的方法其實實質性的子類重寫的方法,這時我們輸出的結果是:


注意一點那就是子類對象的多態性,並不適用於屬性,也不是用於靜態方法。

那麼有童鞋會問了,向下轉型又是什麼呢,向下轉型就是父引用的對象轉換爲子類類型

我們還是舉個例子,假設我在剛纔的子類Dog類裏添加一個父類沒有的方法watchDoor(),在Cat裏面我也加一個CatchMouse

那麼我在調用的時候不能直接通父類調用抓老鼠和看門方法,因爲父類中沒有這兩個方法,此時我們就需要進行下轉型:

package cn.hpe.www;

public class TestAnimal {
	static Animal cat = new Cat();
	static Animal dog = new Dog();
	static Animal animal = new Animal();
	public static void main(String[] args) {
		
		function(cat);

		function(dog);
//		dog.eat();
		function(animal);
	}
	public static void function(Animal a){
		a.eat();
		if(a instanceof Cat){
			Cat c = (Cat) cat;
			c.catchMouse();
		}
		if(a instanceof Dog){
			Dog d = (Dog) dog;
			d.watchDoor();
		}
		
	}
}

向下轉型時,要使用強轉符:()

這裏用到了一個叫instanceof的東西,它是用來判斷前後類是否一致,如果一致返回true不一致返回false

運行結果:


這樣我們就可以在父類中調用子類中的對象了。

說了這麼多,那多態有啥好處啊,它的主要好處有:

(1)可以增強程序的可擴展性及可維護性,使代碼更加簡潔。 

(2)不但能減少編碼的工作量,也能大大提高程序的可維護性及可擴展性。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章