资讯专栏INFORMATION COLUMN

多态、向上转型和向下转型

iamyoung001 / 1914人阅读

摘要:多态访问成员变量的两种方式直接通过对象名称访问成员变量看等号左边是谁,优先用谁,没有则向上找。只用于成员方法,不适用于成员变量。

多态性:

是对对象来说的。extends或implements是多态性的前提。

经理类继承雇员类。小明是一个经理对象,这个对象既有经理形态,也有雇员形态。一个对象有多种形态,这就是对象的多态性。

多态性格式:父类引用指向子类对象

格式:父类名称 对象名 = new 子类名称();

或:接口名称 对象名 = new 实现类名称();

可以这样理解:子类被当做父类来看待(一个经理被当做雇员来看待,一直猫被当做动物来看待)。而对象只能引用父类特有的方法。

多态访问成员变量的两种方式:

直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。(编译看左边,运行还看左边)

Fu obj = new Zi();
System.out.println(obj.num);

间接通过成员方法访问成员变量:看该方法属于谁优先用谁,没有则向上找。(先看右边子类中有没有该方法,没有则向上找)

多态访问成员方法:

访问成员方法的规则:看new的是谁,则优先用谁,没有则向上找(编译看左边,运行看右边)。

先看左边父类中有没有该方法,没有则编译不通过报错,但运行时是看右边子类方法,没有则向上找。只用于成员方法,不适用于成员变量。

向上转型和向下转型

在Java中,对象变量是多态的。

Employee e;
e = new Employee(...);
e = new Manager(...);//Manager继承Employee

这里的Employee类变量可以引用Employee类对象和任何一个Employee类的子类。

在《JAVA核心技术卷一》P152的代码中

Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;

Employee boss = new Employee(...);
Manager[] staff = new Manager[3];
staff[0] = boss;//错误!

boss是Manager类对象,staff数组是Employee类对象,所以staff可以和boss指向同一对象,且编译器将staff[0]看成Employee对象。如果是下面这段代码会报错,因为不是所有的雇员都是经理(类比double转换int可能会损失精度)。

向上转型一定是安全的,从小范围转向了大范围(从小范围的经理转向大范围的雇员,从小范围的猫转向大范围的动物,类似于从小范围的int转向大范围的double不会损失精度)。
对象的向上转型其实就是多态写法:

//格式:父类名称  对象名  =  new  子类名称();
//右边创建了一个子类对象,把它当做父类看待使用
Employee  Manager  =  new  Manager()
//创建了一个经理对象,把它当做雇员来看待

向下转型是一个【还原】的动作,但要保证对象一开始创建的时候 ,就是经理,才能由雇员向下转型为经理。(用instanceof关键字判断前面的对象是不是后面的类型)

String c = (String)staff[1];
//会产生编译错误,因为String不是Employee的子类

只能在继承层次内进行类型转换

将超类转换成子类(向下转型)之前,应该使用instanceof进行检查

类型转换不是一种好的做法,多态的对象向下转型是为了使用子类特有的方法,这种情况下应该检查超类的设计是否合理,也许重新设计超类并添加相应方法才是正确做法。尽量少用类型转换和instanceof

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75233.html

相关文章

  • 1、接口 2、多态

    摘要:接口的概念接口的概念接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类。多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类。 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定...

    Magicer 评论0 收藏0
  • 多态

    摘要:父类型引用指向子类型对象多态以下程序编译是没有问题的,因为编译器检查到的数据类型是和之间存在继承关系,并且是父类型,是子类型,父类型转换成子类型叫做向下转型,语法合格。 package duotai;public class Animal { public void move() { System.out.pr...

    Magicer 评论0 收藏0
  • 面向对象接口多态

    摘要:多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。具体格式如下父类引用指向子类对象就是多态的定义格式。多态的转型分为向上转型与向下转型两种向上转型当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。 第3天 面向对象 今日内容介绍 接口 多态 笔记本案例今日学习目标 写出定义接口的格式 写出实现接口的格式...

    wangdai 评论0 收藏0
  • 9. java 多态

    摘要:概念所谓多态,就是指一个引用变量类型在不同的情况下的多种状态。需进行强制转换有风险,最好使用进行判断。继承在多态中必须存在有继承关系的子类和父类。在中有两种形式可以实现多态继承和接口。 概念 所谓多态,就是指一个引用变量(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。多态性是对象多种表现形式的体现 多态性严格来说有两种描述形式:...

    wanglu1209 评论0 收藏0
  • Java面向对象及其三大特征

    摘要:面向对象编程思想面向对象,简单来说就是由动作的执行者变为动作的操控者。面向对象是相对于面向过程的。面向对象三大特征面向对象有三大特征,即封装继承和多态。接口和抽象类接口接口名方法方法,默认修饰符为,不能用其他修饰符修饰接口。 面向对象编程思想 面向对象,简单来说就是由动作的执行者变为动作的操控者。结合具体例子来说就是使用某个人或者工具所具有的功能而不用去管功能的具体实现方式。例如现实中...

    William_Sang 评论0 收藏0

发表评论

0条评论

iamyoung001

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<