1. 程式人生 > >java多型向上、向下轉型問題

java多型向上、向下轉型問題

向上轉型
 假定父類為動物,子類為狗,父類有一個方法發聲(),狗繼承並覆蓋了一個發聲方法。          在子類重寫該方法  則:動物 a=new 狗();//這就為向上轉型a.發聲();
 在呼叫 a.發聲();時呼叫的是狗的發聲()也可調動物類其他方法 但不能呼叫狗類方法
 向上轉型都會成功,是安全的。 就像說狗是動物沒問題。
向下轉型
 若修改為動物 a=new 狗();
 狗b=(狗)a;//這裡向下轉型
 這時b可呼叫動物類未被重寫的方法和狗類所有方法(包括重寫動物類的方法)
 動物 a=new 動物();
 a.發聲();//調動物類方法
 狗 b=(狗)a;//這也是向下轉型 但下面通過b若呼叫 動物 或 狗類中任意方法都報異常 
 也就是說向下轉型可能會出錯 不能說動物是狗

例項:

dog是animal的子類,animal裡只有一個“吃”的方法,dog類裡有“吃”和“叫”兩個方法。當向上轉型時,
Animal a = new Cat();  
問題1:這個過程叫做父類引用指向子類物件?為什麼不叫做子類引用指向父類物件呢?

答:引用a的型別是Animal,是Cat的父類。所以是“父類引用指向子類物件”。如果是“子類引用指
向父類物件”,那應該寫成 Cat a = new Animal();但這顯然是不和邏輯的。
問題2:子類繼承父類可以使子類的功能更強大。而向上轉型後,父類也只能呼叫父類已經有的方法,
而不能呼叫子類新增加的功能啊,多型還有什麼用呢?這一點也好理解,子類知道哪個是他的父類,
但父類不會知道哪個類是他的子類,所以不能呼叫父類中沒有的方法。
對於我上面的問題,可不可以這麼來解釋:因為子類可以重寫父類中的方法,向上轉型時,父類可以
呼叫子類中重寫過的方法,這樣 間接的也擴充了父類的功能。我這麼理解對嗎?
答:“向上轉型後,父類也只能呼叫父類已經有的方法”。但是子類如果覆蓋了父類的方法,那麼即

時候,使得你也不必關係具體的實現細節,只要知道“這個型別中的某個方法能幫我完成工作”就可以了。

問題3:向下轉型就是Animal a = new Cat(); Cat c = (Cat) a;     可不可以理解為:父類的對

象強制轉換成子類的型別(Cat型),然後賦給子類的物件,完成向下轉型。這樣的話子類物件(c)既可

以呼叫"吃"的功能,又能呼叫“叫”的功能。這樣也擴充了父類的功能。

答:向下轉型,是“引用的型別”的變化,不是物件例項型別的變化。new什麼,就是什麼。不會因為

向上或者向下轉型而改變自己的型別。

問題4:向下轉型時,子類物件c呼叫的方法是父類的還是子類的呢??
答:不管向上還是向下轉型,呼叫的都是實際型別中的那個方法。比如,Animal a = new Cat(); a.

叫()。那這個叫就是Cat型別例項中的“叫”方法。