多態之向下轉型(強制轉型)


1.什么是向下轉型?

多態的一種表現,子類引用指向父類對象,稱為向下轉型。向下轉型是強制轉換,因為子類可能有自定義的屬性和方法,所以父類對象向子類類型轉換的時候,需要借助外力,即強制轉換。

我們在向上轉型的時候,舉了一個打印機的例子,因為是同一台打印機,只是打印的條件不同,調用的都是打印方法。但是我們生活中還有別的,條件不同,而導致結果不同的例子;

一個小朋友,養了一只貓貓,也養了一只狗狗,他想要和它們玩不同的游戲,,和貓貓玩貓捉老鼠的游戲,和狗狗呢,則玩扔接飛盤的游戲。這時候就不同於同一台打印機,而是分別需要貓貓和狗狗了。

2.向下轉型的實現

向下轉型的前提也是有繼承關系。

我們來看看這個要怎么實現:

Pet類:

package com.dh.polymorphic;

public class Pet {
}

Cat類:有一個自己獨有的貓抓老鼠游戲的方法

package com.dh.polymorphic;

public class Cat extends Pet {

    //貓抓老鼠游戲
    public void catchMouse(){
        System.out.println("貓抓老鼠");
    }
}

Dog類:有一個自己獨有的扔接飛盤游戲的方法

package com.dh.polymorphic;

public class Dog extends Pet {
    
    //狗扔接飛盤游戲
    public void catchDisk(){
        System.out.println("狗接飛盤");
    }
}

主人測試類:直接將子類類型引用指向父類類型的話,會報錯,提示讓你進行類型轉換

我們現在強制轉換,並執行一下:

可以發現拋出異常了,說Cat類不能向Pet類轉換,這是因為這是不安全的向下轉型,編譯不報錯但是運行會報錯。我們需要進行安全的向下轉型,安全的向下轉型是先把子類對象向上轉型為父類,再將該父類強制轉換為子類。

然后它們可以調用各自的方法

package com.dh.polymorphic;

public class Master {

    public static void main(String[] args) {

        Pet p1 = new Cat();
        Cat cat = (Cat) p1;

        Pet p2 = new Dog();
        Dog dog = (Dog) p2;

        cat.catchMouse();
        dog.catchDisk();
    }
}

不過這樣玩就沒意思了,還不如直接new子類對象呢,我們要的是通過Master主人來控制和誰玩游戲

我們在Master類中書寫一個控制的方法,父類Pet為參數(這一步實際上是父類為參數的向上轉型)

package com.dh.polymorphic;

public class Master {

    public void playGame(Pet pet){
        
        //通過instanceof來判斷
        //參數為貓類對象的向上轉型
        if(pet instanceof Cat){
            //再強制向下轉型為貓類
            Cat cat = new Cat();
            cat = (Cat) pet;
            cat.catchMouse();
        }
        //參數為狗類對象的向上轉型
        if(pet instanceof Dog){
            //再強制向下轉型為狗類
            Dog dog = (Dog) pet;
            dog.catchDisk();
        }
    }

    public static void main(String[] args) {

        //通過Master來控制
        Master master = new Master();
        
        //貓
        master.playGame(new Cat());
        
        //狗
        master.playGame(new Dog());
    }
}

這樣就實現了通過Master來控制是和貓貓玩貓抓老鼠的游戲還是和狗狗玩接飛盤的游戲了。


總結

  • 父類對象轉換為子類對象,為向下轉型,是強制轉換。
  • 強制向下轉型有兩種方式:
    • 不安全的向下轉型:如Cat cat = (Cat) new Pet();編譯通過,但運行會拋出異常;
    • 安全的向下轉型:先向上轉型,再向下轉型,如Pet pet = new Cat(); Cat cat = (Cat) pet;

本人水平有限,若有不足和錯誤,望補充和糾正~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM