父类到子类的转换和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运算符进行强制类型转换