父类到子类的转换和instanceof运算符
主讲教师:王少华 QQ群号:483773664
学习目标:
1) 父类与子类转换:向下转换
2) 掌握instanceof运算符的使用
一、 问题:实现主人与宠物的玩耍功能
(一) 需求:
和狗玩接飞船游戏,狗的健康值减少10,与主人亲密度增加5
和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5
(二) 实现思路
1) 给Dog类添加catchingFlyDisc方法,实现接飞盘功能;
2) 给Penguin类添加swimming方法,实现游泳功能;
3) 给主人添加play(Pet pet)方法,如果pet代表Dog就玩接飞盘游戏,如果pet代表Penguin就玩游泳游戏。
4) 创建测试类,其中创建主人、狗和企鹅对象,调用相应的方法实现主人和宠物玩耍功能。
(三) 具体实现
下面按照步骤逐步完成该任务。
1. Dog
/**
* 实现接飞盘方法
*/
public void catchingFlyDisc() {
System.out.println("狗狗" + this.getName() + "正在接飞盘。");
this.setHealth(this.getHealth()-10);
this.setLove(this.getLove()+5);
}
2. Penguin
/**
* 实现游泳方法
*/
public void swimming() {
System.out.println("企鹅" + this.getName() + "正在游泳。");
this.setHealth(this.getHealth()-10);
this.setLove(this.getLove()+5);
}
3. Master
public void Play(Pet pet){
//1 判断Pet是什么对象
//2 将Pet转化为具体对象,因为父对象没有办法调用子对象的特有的方法
}
二、 父类到子类的转换(向下转型)
将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。
(一) 需求
如果把Dog对象赋给Pet类型引用变量后,又希望和Dog玩接飞盘游戏,应该怎么办呢?
(二) 实现
public class Test {
public static void main(String[] args) {
Pet pet = new Dog("欧欧", "雪娜瑞");
//强制类型转换成狗对象
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}
}
(三) 注意事项
强制类型转换不可以任意转换,
1) 转换的类型必须具有继承关系
2) 转换为父类指向的真实子类类型
Pet pet = new Dog("欧欧", "雪娜瑞");
Dog dog = (Dog) pet; //正确
Penguin penguin = (Penguin) pet; //错误,运行时会出现异常
三、 instanceof 运算符
从前面的示例中,我们知道,进行向下转型时,如果没有转换为真实子类类型,就会出类型转换异常。那怎么有效的避免这种异常呢?
Java提供了instanceof运算符来进行类型的判断
(一) 语法
对象 instanceof 类或接口
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或fasle
(二) 测试
利用instanceof运算符来避免强制类型转换的错误
public class Test {
public static void main(String[] args) {
Pet pet = new Dog("欧欧", "雪娜瑞");
if(pet instanceof Dog){
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}else if(pet instanceof Penguin) {
Penguin penguin = (Penguin) pet;
penguin.swimming();
}
}
(三) 注意事项
1) 使用instanceof运算符时,对象的类型必须和instanceof 的第二个参数所指定的类或接口有直接或间接的继承关系,否则会出现编译错误。如下所示:
2) instanceof 通常和强制类型转换结合使用。
总结:
向下转型父类转换为子类,结合instanceof运算符进行强制类型转换