JAVA中“多型”案例學習

weixin_43231398發表於2019-01-02

最近學習了多型的概念和使用,在此記錄學習一下。
首先,什麼是多型?
多型是指同一個方法被呼叫,會因為呼叫物件的不同導致完全不同的行為。
說的有點抽象。先了解一下多型的三要素:繼承重寫父類引用指向子類物件
1. 多型是指 方法是多型,不是屬性的多型
2. 多型的存在要有三個條件:繼承、重寫和父類引用指向子類物件
3. 父類引用指向子類物件後,用該父類引用呼叫子類重寫的方法,此時多型就出現了

繼承和重寫比較好理解,那什麼叫做父類引用指向子類物件?這麼抽象的描述怎麼理解?
舉例來說:

首先實現類的繼承和方法重寫

public class Animal{
	public void shout() {
		System.out.println("動物叫");
	}
}

class Cat extends Animal{
	public void shout() {
		System.out.println("貓叫");
	}
}


然後進行列印測試

/**
*定義一個Test類
**/
public class Test {
	public static void main(String[] args) {
	//正常的例項化
		Animal a = new Animal();
		animalCry(a);
		
		//這就發生了多型,因為有了繼承、重寫和父類引用指向子類物件Animal a = new Dog();
		Dog d = new Dog();
		animalCry(d);//狗叫
		
		animalCry(new Cat());//貓叫
	}
	
	static void animalCry(Animal a) {  //相當於進行了例項化Animal a = new Dog()/Animal a = new Cat()
		a.shout();  //因為傳的物件不一樣,所以呼叫的方法也不一樣
	}
}

Animal a = new Dog()或者Animal a = new Cat()就叫做父類引用"Animal a "指向了子類物件 “new Dog()”。
其實只要記住一點,在實際執行是時候是看的“=”右邊的是誰。左邊只是在給a 貼了一個Animal的標籤而已,但是本質上還是Dog或者Cat。
所以依次會列印出:動物叫、狗叫、貓叫

多型的使用是比較常見的,在另外一個特別重要的概念“回撥”中也會用到。後續再來補充。

補充一下

其實與多型密切相關的一個概念還有向上轉型向下轉型
還是拿上面的程式碼舉例:
父類引用指向子類物件其實是向上轉型

//向上轉型,編譯器認為a是Animal,執行起來還是以Dog執行
Animal a = new Dog();

向下轉型

//假如直接將a賦值給d,編譯器不會通過,需要強制轉型
Dog d = a;
Dog d = (Dog)a;

強制轉型時要注意可能會出現錯誤(雖然編譯不會報錯),什麼意思呢?
現在給Dog 類中新增一個新的方法:

class Dog extends Animal{
	public void shout() {
		System.out.println("狗叫");
	}
	public void fly(){
		System.out.println("狗會飛");
	}
}

再加入一個向上轉型:Animal c = new Cat();
把c強制轉成Dog類:

//在編譯的時候d2中有fly()這個方法,但是在執行的時候沒有這個方法,會報錯!
Dog d2 = (Dog)c;

相關文章