第三节 父类到子类的转换和instance of运算符

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

来自为知笔记(Wiz)

时间: 2024-11-12 07:33:34

第三节 父类到子类的转换和instance of运算符的相关文章

跟王老师学多态(三) 父类到子类的转换和instance of运算符

父类到子类的转换和instanceof运算符 主讲教师:王少华 QQ群号:483773664 学习目标: 1)   父类与子类转换:向下转换 2)   掌握instanceof运算符的使用 一.  问题:实现主人与宠物的玩耍功能 (一)   需求: 和狗玩接飞船游戏,狗的健康值减少10,与主人亲密度增加5 和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5 (二)   实现思路 1)   给Dog类添加catchingFlyDisc方法,实现接飞盘功能: 2)   给Penguin类添加

父类到子类的转换和instance of运算符

父类到子类的转换和instanceof运算符 主讲教师:王少华 QQ群号:483773664 学习目标: 1)   父类与子类转换:向下转换 2)   掌握instanceof运算符的使用 一.  问题:实现主人与宠物的玩耍功能 (一)   需求: 和狗玩接飞船游戏,狗的健康值减少10,与主人亲密度增加5 和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5 (二)   实现思路 1)   给Dog类添加catchingFlyDisc方法,实现接飞盘功能: 2)   给Penguin类添加

父类与子类的转换as,is

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 子类与父类的相互转换 { class Program { static void Main(string[] args) { //try catch finally 与 continue //如果在try中遇到continue,则忽略try中con

继承 父类与子类的转换

using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication3 { class shengwu { public void shengming() { Console.WriteLine("生物都有生命"); } public virtual void huxi() { Console.WriteLine("生物都呼吸!"); } } }

final,static静态和非静态,初始化和代码块的区别、父类和子类中都有static变量时的初始化顺序、重写equals()、 instanceof强制转换

final:类不能被继承,方法不能被重写,属性值不能被修改(常量): 可以调用: static静态常量----- 不需要创建对象,可以直接调用类里面的属性,方法: 示例如下: 加了static说明它是属于整个类的,每个对象值都一样,如下图所示:size是静态的,所以当在下面t1对象中改变size的值时,整个类中的size值都变了:然后作为普通属性的length,当在t1对象中改变其值,并不会改变原始值: 静态方法不能调用非静态的方法和非静态的属性,也不能打印非静态的方法和非静态的属性:可以在静态

子类指针转换成父类指针时,指针值会变化

指针转换在C++中再正常不过了,特别是子类向父类的转换,一般情况下转换后指针值是不会变的.但是某些特殊情况,子类指针转换成父类指针,指针值会产生一定的偏移量,至于为什么就不清楚了.要确保指针值不变,可以先将指针转成void*,再根据实际情况强制转换成需要的类型就可以了. 本文地址:http://www.cnblogs.com/vcpp123/p/5902866.html 参考文章: C++多重继承下的指针类型转换 http://www.veryhuo.com/a/view/52953.html

父类和子类可以相互转化吗?

理论上说你可以在任何类型中转换,前题是你自己必须清楚你自己在做什么,准确一点说是知道编译器将会怎么做.父类和子类可以视做两个不同的数据类型,所以没有什么可以阻碍你强制转化的.从子类到父类,是由大变小,所以无妨;而从父类到子类,是从小变大,有的东西就不存在了,所以你自己必须清楚,基于这原则,编译器往往设定一些方法来警告你甚至阻止你. 从弗雷转到子类时,子类中的成员变量为0 p,li { white-space: pre-wrap } class Base { public: Base() {cat

1212面向对象--引用类型与值类型、命名空间与类库、继承(父类与子类)

五.引用类型与值类型 .NET将变量的类型分为值类型与引用类型.例如int和float之类的变量属于值类型,而“类“类型的变量属于引用类型. 值类型与引用类型的变量在使用上是有区别的. 值类型的变量在一定义之后就可以马上使用. 引用类型的变量定义之后,还必须用new关键字创建对象后才可以使用. 如上图,创建两个新的对象时,直接比较两个对象是否相等,返回的bool值为false.因为两个对象都是新开辟的一个空间变量,彼此没有任何关系,所有是不相等的. 如图2:1)创建的第一个新的对象ss1,给ss

20141214--C#父类,子类

首要: 子类 包含父类的所有的属性方法 所有子类都可以直接转化成父类类型 当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型. 父类与子类的装换: Ren r = new Ren(); r = (Ren)m;//Man子类转换为Ren父类 Ren m1 = new Ren(); m1 = (Man)r;//转换成父类后再转换为子类时,只能转换成原先的子类, 不能转换成其他子类 需要使用强制装换. private与protected: private 只可在当前类中作为成员变量使