instanceof
解决多态下子类特有的方法不能调用的问题
在使用多态时,当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法(虚拟方法调用),而不能调用子类所特有的方法、属性。
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
如何才能调用子类特有的属性和方法?
答:向下转型:使用强制类型转换符。
但是使用强转时,可能出现ClassCastException的异常,如何解决呢?
答:使用instanceof关键字
什么是instanceof关键字呢?
a instanceof A:判断对象a是否是类A的实例。
如果是,返回true;如果不是,返回false
instanceof关键字怎么用呢?
当对象a声明为类A时,a instanceof A以及a instanceof A的父类都为真
instanceof关键字在什么情况下用呢?
答:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
可以举例嘛?
Person p2 = new Man();
if(p2 instanceof Man){//如果p2为Man类型
Man m2 = (Man)p2;//则强转
m2.earnMoney();//调用Man类特有的方法
}