關於Java中的動態多態


-----------------------------------------------------------------------------------------題記


關於動態多態的一些測試和個人的理解。


-----------------------------------------------------------------------------------------代碼(附詳細註釋)

package polymorphic.dynamic;

public class Father {

	public String name = "Father";
	
	public static void main(String[] args) {

		/*
		 * 動態多態:
		 * 
		 * 指在調用方法後,在運行的時候才能決定到底是調用父類的方法還是子類的方法,
		 * 
		 * 若子類沒有重寫父類的方法,則調用父類的方法,
		 * 
		 * 若子類重寫父類的方法,則調用子類的方法。
		 */
		
		//----------------動態多態(【子對象】的【父引用】強轉【子引用】  --代碼片段1)----------------
		
		/*
		 * 多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
		 * 
		 * eg:馬和牛都繼承動物(即都屬於動物),那麼有:
		 * 
		 * 動物 animal1 = new 牛();
		 * 
		 * 動物 animal2 = new 馬();
		 * 
		 * 若有參數列表,如:public void function(動物 animal){},
		 * 
		 * 那麼animal1和animal2都可以放入該參數列表,因爲牛和馬都是動物。
		 * 
		 * 另,new不同類的對象的原因就是要使用其中的不同的成員方法和成員變量(因爲子類可能發生方法的重寫),
		 * 
		 * 所以有animal1.run(),則調用牛重寫的的run()(若牛類重寫run()),而animal2.run(),調用馬重寫的run()(若馬類重寫run()),
		 * 
		 * 即,同一個類中的方法(都是由父類繼承過來的方法)表現出來不同的狀態(功能),這就是動態多態。
		 * 
		 */
		
		Father father1 = new Son();
		
		//由多態產生強轉
		
		/*
		 * 在使用過程中將其進行強轉的原因:該引用是對父類的成員變量和成員方法的引用,故無法引用子類擴展的成員變量或者方法。
		 */
		
		Son son1 = (Son) father1;
		
		System.out.println(son1.name);

		
		//----------------運行異常1(【父對象】的【父引用】強轉【子引用】  --代碼片段2)----------------
		
		Father father2 = new Father();
		
		/*
		 * father2是對Father類的引用,son2是對Son類的引用,
		 * 
		 * son2可以引用到更多的成員方法和成員變量(子類擴展的成員方法和成員變量),
		 * 
		 * 而son2即將所指向的對象(即father2所指向的對象)是不能滿足其引用所能夠調用的全部成員方法和成員變量。
		 */
		
		Son son2 = (Son) father2;

		
		//----------------運行異常2(【子對象間】的【子引用】相互強轉  --代碼片段3)----------------
		
		Father father3 = new Daughter();
		
		/*
		 * 同理,daughter和son相對父類擴展的成員變量或方法可能不一樣,故無法相互引用。
		 */
		
		Son son3 = (Son) father3;
		
	}
	
}

class Son extends Father {
	
	public String name = "son";
	
}

class Daughter extends Father {
	
	public String name = "daughter";
	
}


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