问题:
在体现多态性时,用父类引用指向了子类对象。
Person p1 = new Man();
在编译时,p1只能调用Person类型的属性和方法。
但是在堆内存中实际上是有Man类型特有的属性和方法的(因为new过了)
如何让p1调用Man类型的属性和方法而不报错呢?
(书面语版本的这个问题)
有了对象多态性后,内存中实际上是加载了子类特有的属性和方法的。
但是由于变量声明为父类类型,导致编译时,
只能调用父类的变量和方法,
子类特有的属性和方法不能调用。
解决方法:对于编译器来讲,让p2转为子类类型。
使用强制类型转换符–向下转型
Man m1 = (Man)p1;
经过强制转换后,编译器方面可以通过。
但是运行时不一定通过,可能会出现ClassCastException。
Man m1 = (Man)p2;
m1.earnMoney();//可以通过运行
Woman m2 = (Woman)p2;
m2.goShopping();
//编译器没有报错
//运行时会报错
为了避免出现这种类型转换异常的问题,引入instanceof关键字。
a instanceof A:判断a是否是类a的一个实例
可使用如下形式代码块:
if(p2 instanceof Woman) //false
{
Woman m2 = (Woman)p2;
m2.goShopping();
System.out.println("转换成功!");
}
如果a instanceof A返回true,则a instanceof B一定返回true。
则B是A的父类。