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

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

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;

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

🌸 相关推荐 🌸

包含“表”的成语:
bt365体育在线官网

包含“表”的成语:

📅 07-17 👀 4852
yy创建频道教程
外勤365下载安装版本

yy创建频道教程

📅 07-10 👀 2441
Mac电脑连接投影仪教程
365bet足球论坛

Mac电脑连接投影仪教程

📅 08-04 👀 2430