instanceof关键字的使用
- a instanceof A : 判断对象a是否是类A的实例。如果是,返回true。不是返回false。
通过if语句判断来确定是否执行
if(p2 instanceof Woman){
Woman w1 =(Woman)p2;
w1.goShopping();
}
通过判断p2是否是Woman类的实例来将p2强制转换
-
使用情景:为了避免在向下转型时出现
ClassCastException
的异常,在转型之前进行instancof
的判断,如果为true,进行向下转型。如果返回false,则不进行向下转型。 -
当B是A的父类的前提下,如果 a instanceof A 返回的是true,则 instanceof B也返回true
常见问题:
-
编译时通过,运行时不通过
例1
//Person是父类 Man Woman 为Person的子类
Person p3 = new Woman();
Man m3 = (Man)р3;
思考过程: p3是Woman
的对象含有Woman
的属性,此处定义为属于person
类中的实例。但是Woman
中的方法和属性与Man
类没有干系,因此无法强制转换。
例2
Person p4 = new Person();
Man m4 = (Man)p4;//报错
m4.earnMoney();//不通过
首先要认清强制转换的是类,让p4转换成Man
类,而仍居于Person
的属性和方法。如果通过后,那么Man
中的属性和方法也可以调用,又因为是Person()
的对象,只含有person()
中的方法属性,不含有Man
中的。因此不可强制转换。
记住多态的使用!:多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法,能调用的都是子父类共有的方法。Man
也不是Person
的父类!因此出错!
- 编译运行都通过
Object obj = new Woman();
Person p= (Person)obj;
- 编译直接不过
Man m5 = new Woman()//类型不匹配 不存在父子类