1、子类型转换成父类型,称为向上机制/upcasting,或者称为自动类型转换
2、java语法:父类型引用指向子类型对象
3、java程序永远都分为编译阶段和运行阶段
4、先分析编译阶段,再分析运行阶段,编译无法通过,也无法运行
5、
Animal a2=new Cat();
a2.move();
编译阶段编译器检查a2这个引用数据类型为animal,由于animal.class字节码当中有move方法,所以编译通过,这个过程称为静态绑定,编译阶段绑定,只有静态绑定成功之后才会有后续的运行。。
在程序运行阶段,jvm堆内存当中真实创建的对象是cat对象,name在运行中移动会调用cat对象的move方法,此时发送了动态绑定,运行阶段绑定。
无论是cat类有没有重写move方法,运行阶段移动调用的是cat对象的move方法,因为底层真实对象是cat对象。
父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以成为多态语法机制
6、a2.catchMouse();
不能调用,因为a2类型是animal类型,由于animal.class字节码当中没有catchMouse方法,所以编译不通过,静态绑定失败
7、以上问题怎么办?
a2是无法直接调用,因为a2类型是animal类型,animal.class字节码当中没有catchMouse方法,但可以a2类型强制转换为cat类型
a2类型是animal父类,转换成cat类型,子类,成为向下转换/downcasting/强制类型转换
注意:向下转换也需要两种类型之间必须有继承关系
8、什么时候使用向下转型?
当调用的方法是子类型中特有的,在父类型当中不存在,必须进行向下转型
9、
Animal a3=new Bird();
Cat c3=(Cat)a3;
编译没有问题,a3类型是animal类型,animal和cat之间存在继承关系,并且animal是父类,cat是子类,向下转型,合法。
但是堆内存真实存在对象是bird类型,bird对象无法转换成cat对象,因为两者之间不存在任何继承,就会抛出异常 java.lang.classCastException
类型转换异常,这种异常总是在向下转型会发生
所以:
1、向上类型【父类型引用指向子类型】译通过,运行就会通过
2、向下类型【党文子类对象特有方法】编译通过,类型可能错误
3、如何避免?
使用instanceof运算符可以避免出现异常
语法:
(引用 instanceof 数据类型名)
结果:true/flase
运行结果:
(a instanceof Animal)
ture表示:
a引用对象是一个animal对象
false表示:
a引用对象不是一个animal类型
if(a3 instanceof Bird){
Bird b2=(Bird)a3;
b2.fly();}
else if (a3 instanceof Cat)
Cat c3=(Cat)a3;
c3.catMouse();
打断点
右键-debug
10、多态在实际开发中作用,以下以主人喂养宠物为例说明多态的作用:
1、分析 主人喂养宠物这个方静要实现进行类型的抽象:
-主人【类】
主人可以喂养宠物,所以主人有喂养这个动作
-宠物【类】
宠物可以吃东西,所以宠物有吃这个动作
2、面向对象编程核心,定义好类,然后将类化为对象,给一个环境驱使一下,让哥哥对象之间协作起来形成一个系统
3、作用:
降低程度的耦合度,提高程度的扩展力
能使用多态尽量多使用
父类型引用指向子类型对象
来源:CSDN
作者:haijuă̈n
链接:https://blog.csdn.net/weixin_43446514/article/details/104615480