多态之向下转型(强制转型)

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;

本人水平有限,若有不足和错误,望补充和纠正~

posted @ 2021-01-22 15:53  deng-hui  阅读(7729)  评论(0编辑  收藏  举报