Java向上轉型與向下轉型的問題
"is-a"規則表明了每個子類的對象也是父類的對象,就好比一隻猴子是一隻動物,但并不是一隻動物就是猴子。
Java的多态為我們帶來了諸多好處,向上轉型的意義在于為了統一操作的參數,這就為我們的代碼帶來了較高的可維護性能,而向下轉型是為了操作子類定義的某一特殊功能,這就提高了代碼的可擴充性。
先觀察向上轉型:
class Animal{
public void eat(){
System.out.println("吃飯");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("貓愛吃魚");
}
}
public class Demo4 {
public static void main(String[] args) {
Animal animal = new Cat(); //向上轉型
animal.eat();
}
}
輸出:
貓愛吃魚
多态的産生要建立在繼承的基礎之上,貓類屬于動物類的派生類,擁有動物類的所有特性,而又有着自己行為的獨特性。需要注意的是,如果發生了向上轉型,那麼所調用的方法一定是被子類覆寫過的方法。
下面觀察向下轉型:
class Animal{
public void eat(){
System.out.println("吃飯");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("貓愛吃魚");
}
public void castMouse(){
System.out.println("貓捉老鼠");
}
}
public class Demo4 {
public static void main(String[] args) {
Animal animal = new Cat(); //向上轉型
animal.eat();
Cat cat = (Cat) animal; //向下轉型
cat.castMouse();
}
}
輸出:
貓愛吃魚
貓捉老鼠
倘若不進行向下轉型,直接利用Animal類對象animal是無法直接調用子類獨有的方法castMouse()的,因為該方法是定義在子類的,想要使用子類獨有的方法,要建立子類執行個體,那麼需要進行向下轉型操作。
另外還有必須要注意的是,在進行對象的向下轉型之前,必須首先發生對象的向上轉型操作,否則将出現對象轉換異常,觀察如下範例:
public class Demo4 {
public static void main(String[] args) {
Animal animal = new Animal();
Cat cat = (Cat) animal; //隻有向下轉型
cat.castMouse();
}
}
動物類與Cat類不變,主方法中作如上改變,将向上轉型改為Animal animal = new Animal();此時會抛出異常: java.lang.ClassCastException,類型轉換異常,這樣寫在文法上并沒有報錯,但是運作卻出現異常,其實這也比較好了解,倘若沒有向上轉型,就好比突然有個陌生的小孩和你說,我是你的孩子,帶我回家吧,這時你肯定不會盲目帶他回家,因為你并不确定他究竟是不是你的後代。
而向上轉型操作就好比是父親認孩子的過程,先聲明好父子關系,再進行向下轉型操作就不會有異常出現。