码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-01 13:47:28      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:多态性   sys   ext   父类   经理   out   manager   oss   code   

一、多态性:

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

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

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

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

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

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

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

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

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

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

三、多态访问成员方法:

  访问成员方法的规则:看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  Employee()
//创建了一个经理对象,把它当做雇员来看待

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

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

 

  • 只能在继承层次内进行类型转换
  • 将超类转换成子类(向下转型)之前,应该使用instanceof进行检查
  • 类型转换不是一种好的做法,多态的对象向下转型是为了使用子类特有的方法,这种情况下应该检查超类的设计是否合理,也许重新设计超类并添加相应方法才是正确做法。尽量少用类型转换和instanceof

 

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

标签:多态性   sys   ext   父类   经理   out   manager   oss   code   

原文地址:https://www.cnblogs.com/betterluo/p/10959239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!