-----------------------------------------------------------------------------------------題記
關於動態多態的一些測試和個人的理解。
-----------------------------------------------------------------------------------------代碼(附詳細註釋)
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";
}