天天看點

Java向上轉型與向下轉型的問題

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,類型轉換異常,這樣寫在文法上并沒有報錯,但是運作卻出現異常,其實這也比較好了解,倘若沒有向上轉型,就好比突然有個陌生的小孩和你說,我是你的孩子,帶我回家吧,這時你肯定不會盲目帶他回家,因為你并不确定他究竟是不是你的後代。

而向上轉型操作就好比是父親認孩子的過程,先聲明好父子關系,再進行向下轉型操作就不會有異常出現。

繼續閱讀