教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

對象的類型轉(zhuǎn)換案例演示

更新時間:2021年08月11日15時49分 來源:傳智教育 瀏覽次數(shù):


在多態(tài)的學習中,涉及到將子類對象當做父類類型使用的情況,此種情況在Java的語言環(huán)境中稱為“向上轉(zhuǎn)型”,例如下面兩行代碼:

Animal an1 = new Cat(); // 將Cat類對象當做Animal類型來使用
Animal an2 = new Dog(); // 將Dog類對象當做Animal類型來使用
將子類對象當做父類使用時不需要任何顯式地聲明,需要注意的是,此時不能通過父類變量去調(diào)用子類特有的方法。

接下來通過一個案例來演示對象的類型轉(zhuǎn)換情況,如文件1所示。

文件1 Example16.java

     // 定義接口Animal
     interface Animal {
         void shout(); // 定義抽象shout()方法
     }
     // 定義Cat類實現(xiàn)Animal接口
     class Cat implements Animal {
         // 實現(xiàn)接口shout()方法
         public void shout() {
             System.out.println("喵喵……");
         }
         // 定義Cat類特有的抓老鼠catchMouse()方法
         public void catchMouse() {
             System.out.println("小貓抓老鼠……");
         }
     }
     // 定義測試類
     public class Example16 {
         public static void main(String[] args) {
             Animal an1 = new Cat(); 
             an1.shout();
             an1.catchMouse();
         }
     }

程序編譯報錯,如圖1所示。

對象類型轉(zhuǎn)換

圖1 運行結(jié)果

從圖1可以看出,程序編譯出現(xiàn)了“The method catchMouse() is undefined for the type Anima(在父類Animal中未定義catchMouse()方法)”的錯誤。原因在于,創(chuàng)建Cat對象時指向了Animal父類類型,這樣新創(chuàng)建的Cat對象會自動向上轉(zhuǎn)型為Animal類,然后通過父類對象an1分別調(diào)用了shout()方法和子類Cat特有的catchMouse()方法,而catchMouse()方法是Cat類特有的,所以通過父類對象調(diào)用時,在編譯期間就會報錯。

文件1中,由于通過“new Cat();”創(chuàng)建的對象本質(zhì)就是Cat類型,所以通過Cat類型的對象調(diào)用catchMouse()方法是可行的,因此要解決上面的問題,可以將父類類型的對象an1強轉(zhuǎn)為Cat類型。接下來對文件1中的main()方法進行修改,具體代碼如下:

// 定義測試類
public class Example16 {
    public static void main(String[] args) {
        Animal an1 = new Cat(); 
        Cat cat = (Cat) an1;
        cat.shout();
        cat.catchMouse();
    }
}

修改后再次編譯,程序沒有報錯,運行結(jié)果如圖2所示。

對象類型轉(zhuǎn)換

圖2 運行結(jié)果

從圖2可以看出,將本質(zhì)為Cat類型的an1對象由Animal類型向下轉(zhuǎn)型為Cat類型后,程序可以成功運行。需要注意的是,在進行對象向下類型轉(zhuǎn)換時,必須轉(zhuǎn)換為本質(zhì)類型,否則轉(zhuǎn)換時會出現(xiàn)錯誤,假如文件4-16中Animal類型引用指向的是一個Dog類型對象,這時進行強制類型轉(zhuǎn)換為Cat類時就會出現(xiàn)出錯,如文件2所示。

文件2 Example17.java

     // 定義接口Animal
     interface Animal {
         void shout(); // 定義抽象shout()方法
     }
     // 定義Cat類實現(xiàn)Animal接口
     class Cat implements Animal {
         // 實現(xiàn)接口shout()方法
         public void shout() {
             System.out.println("喵喵……");
         }
         // 定義Cat類特有的抓老鼠catchMouse()方法
         public void catchMouse() {
             System.out.println("小貓抓老鼠……");
         }
     }
     // 定義Dog類實現(xiàn)Animal接口
     class Dog implements Animal {
         // 實現(xiàn)接口shout()方法
         public void shout() {
             System.out.println("汪汪……");
         }
     }
     // 定義測試類
     public class Example17 {
         public static void main(String[] args) {
             Animal an1 = new Dog(); 
             Cat cat = (Cat) an1;
             cat.shout();
             cat.catchMouse();
         }
     }

運行結(jié)果如圖3所示。

對象類型轉(zhuǎn)換

圖3 運行結(jié)果

文件2編譯正常,但在運行時就會報錯,提示Dog類型不能轉(zhuǎn)換成Cat類型。出錯的原因是,創(chuàng)建的Animal對象本質(zhì)是一個Dog對象,在強制類型轉(zhuǎn)換時,Dog類型的對象顯然無法強轉(zhuǎn)為Cat類型。

為了避免上述這種異常情況的發(fā)生,Java提供了一個關(guān)鍵字instanceof,它可以判斷一個對象是否為某個類(或接口)的實例或者子類實例,語法格式如下:

對象(或者對象引用變量) instanceof 類(或接口)

接下來對文件2的測試類Example17進行修改,具體代碼如下:

// 定義測試類public class Example17 {
    public static void main(String[] args) {
        Animal an1 = new Dog(); 
        if(an1 instanceof Cat){ // 判斷an1本質(zhì)類型
            Cat cat = (Cat) an1;
            cat.shout();
            cat.catchMouse();
        }else{
            System.out.println("該類型的對象不是Cat類型!");
        }
    }
}

再次運行程序,結(jié)果如圖4所示。

對象類型轉(zhuǎn)換

圖4 運行結(jié)果

在對文件2修改的代碼中,使用instanceof關(guān)鍵字判斷對象an1本質(zhì)是否為Cat類型,如果是Cat類型就強制轉(zhuǎn)換為Cat類型,否則就打印“該類型的對象不是Cat類型!”。由于判斷的對象an1本質(zhì)為Dog類型并非Cat類型,因此出現(xiàn)圖4的運行結(jié)果。



猜你喜歡:

什么是多態(tài)?多態(tài)是怎樣運行的?

類的加載機制是什么?【Java面試題】

servlet的生命周期及servlet常用方法

傳智教育java開發(fā)培訓課程



0 分享到:
和我們在線交談!