多态之向下转型(强制转型)
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;
- 不安全的向下转型:如
本人水平有限,若有不足和错误,望补充和纠正~