多態下的向上轉型和向下轉型

多態: 對於用一個事物具有多種表現形式,比如動物的叫聲有多種,鳥叫聲,狗叫聲,豬叫聲等多種不同結果,稱之爲多態。多態要有繼承,方法的重寫以及父類引用指向子類對象!(這句很重要!)
向上轉型: 父類引用指向子類對象。通俗地說就是將子類對象轉爲父類對象,此處父類對象可以是接口,向上轉型是從一個較具體的類轉化爲一個較抽象的類。
向下轉型: 將父類對象轉化爲子類對象的稱爲向下轉型,向下轉型是從一個較抽象的類轉化爲一個較具體的類

向上轉型實例

package practice;

public class Animal {
	public void voice() {
		System.out.println("普通動物叫聲");
	}
	public void Animal_test_voice(Animal c) {   //傳入父類Animal的c作爲形參 ,父類的引用,引用下邊的子類對象
		c.voice(); 
	}
	public static void main(String[]args) {
		Animal a = new cat();     //向上轉型   cat()子類對象,被上邊的父類引用
		Animal d = new dog();
		a.voice();    //到類Animal_test_voice執行,因爲cat屬於Animal中的一類
		d.voice();

//向下轉型需要先做向上轉型再做向下轉型,詳細下邊會解釋
		cat a2 = (cat)a;    //向下轉型,強制類型轉化,將a轉化爲a2
		a2.catvoice();    //輸出喵喵喵
	}
}
class cat extends Animal {    //繼承Animal
	public void voice() {     //
		System.out.println("貓叫聲");
	}
	public void catvoice() {
		System.out.println("喵喵喵");     //這是cat類的一個方法,不屬於Animal類 
	}
}
class pig extends Animal{
	public void voice() {
		System.out.println("豬叫聲");
	}
}
class dog extends Animal{
	public void voice() {
		System.out.println("狗叫聲");
	}
}

輸出結果爲

貓叫聲
狗叫聲
喵喵喵

Animal a = new cat(); //向上轉型,子類對象轉化爲父類
這一句是向上轉型的關鍵,一般都爲 父類 參數 = new 子類對象

向下轉型呢,程序在運行時需要通過編譯,在上邊Animal a = new cat();,將Animal賦給a,在執行a.voice時,編譯器先找Animal裏邊尋找cat的voice,有人會問爲什麼不寫a.catvoice,這是不行的,編譯器會認爲a是屬於Animal,而catvoice方法是cat類裏邊的,不屬於Animal,所以需要做強制類型轉換cat a2 = (cat)a; 將a這個重新賦給cat a2

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