一:向下转型
我们首先来看为什么要用instanceof关键字
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类的属性和方法。子类特有的属性和方法不能调用。所以就有了向下转型,通过使用强制类型进行转换。
public class InstanceofTest {
public static void main(String[] args) {
Person p1 = new Man();
Woman w1 = (Woman)p1;
}
}
class Person{
}
class Man extends Person{
public void earnMondy(){
}
}
class Woman extends Person{
public void goshopping(){
}
}
最后会报异常ClassCastException
为了使其不会错误的转换类型,由此引入instanceof
二:instanceof的使用情景
为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
if(p2 instanceof Woman){
Woman w1 = (Woman)p2;
w1.goShopping();
}
if(p2 instanceof Man){
Man m2 = (Man)p2;
m2.earnMoney();
}
如果a instanceof A返回true,则a instanceof B 也返回true,其中,类B是类A的父类
三:向下转型的几个常见问题:
3.1问题一
//编译时通过,运行时不通过
Person p3 = new Person();
Man m3 = (Man)p3;
Man类和Woman类并没有直接关系
//编译时通过,运行时不通过
Person p4 = new Person();
Man m4 = (Man)p4;
以上代码均会报ClassCastException
本身就是Person对象,无法转换成子类。
3.2 问题二:
//编译时通过,运行时也通过
Object obj = new Woman();
Person p = (Person)obj;
问题三:
//编译不通过
Man m5 = new Woman();