java多型向上、向下轉型問題
阿新 • • 發佈:2018-12-31
向上轉型
假定父類為動物,子類為狗,父類有一個方法發聲(),狗繼承並覆蓋了一個發聲方法。 在子類重寫該方法 則:動物 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型別例項中的“叫”方法。
假定父類為動物,子類為狗,父類有一個方法發聲(),狗繼承並覆蓋了一個發聲方法。 在子類重寫該方法 則:動物 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型別例項中的“叫”方法。