应用多态性时:Person p1 = new Man();
堆中的对象是具有子类Man的所有结构(属性、方法)的,只是由于创建的对象p1声明为父类Person类型,导致编译时只能调用父类声明的属性和方法,无法调用子类特有的方法、属性。
多态性也称为向上转型:将子类转换成父类。
那么如何才能调用子类特有的属性和方法?
向下转型(强制类型转换):将父类转换成子类
Person p1 = new Man();
Man m1 = (Man)p1;
1.存在风险
基本数据类型的强制转换存在精度损失,那么向下转型有什么风险呢?
例如下面代码在运行时会出现ClassCastException类型转换错误。
Person p1 = new Man();
Woman w1 = (Woman)p1;
2.使用 instanceof 避免风险
a instanceof A
判断对象a是否是类A的实例。返回boolean类型。
如果a instanceof A
返回true,则a instanceof B
也返回true,其中B是A的父类。
3.向下转型的前提
A a1 = new B();
C c1 = (C)a1;
多态性:A可以是B的 父类 或 父类的父类。
向下转型:C是 类B 或 类B的父类 或 父类的父类。
例如
Object o1 = new Man();
Person p1 = (Person)o1;