Java多型向上 向下轉型問題

2021-07-14 22:30:09 字數 1604 閱讀 7468

推薦資源站:

向上轉型假定父類為動物,子類為狗,父類有乙個方法發聲(),狗繼承並覆蓋了乙個發聲方法。

在子類重寫該方法  則:動物 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型別例項中的「叫」方法。使向上轉型,方法的行為也表現為覆蓋後的行為。這也是多型的一種體現。向上轉型更多的用來體現一種程式設計上的「約定」。

Java 多型部分 向上轉型 向下轉型

我記得我剛學的時候,老師講的我似懂非懂,於是我就上網上查,我查到了乙個是這麼說的,向上轉型就是兒子當爹用,向下轉型就是爹當兒子用,我當時覺得有道理,但是後來我發現,兒子是兒子,爹是爹,上面說的完全都不對!於是我就開始琢磨,能不能聯絡實際點,這樣也好幫我自己分析理解 就在這時,隔壁寢室來叫我打球,我豁...

Java多型,向上轉型與向下轉型

多型意味著乙個物件有著多重特徵,可以在特定情況下,表現出不同的狀態,從而對應不同的屬性和方法。具體來說就是指在繼承過程中父類和子類中可以有多個同名但意義或者實現方式不同的屬性或方法,也就是過載和覆蓋。在實際應用中,還有兩種特殊情形 向上轉型和向下轉型。public class user public...

多型向上向下轉型!

public abstract class animal public class cat extends animal void catchmouse 特有方法!public class dog extends animal void watchhouse 其實前面已經有所涉及,具體來說 以動物為...