在使用向下转型的过程中会有一定的风险!
比如:
public class Test {
public static void main(){
Animal a4 = new Bird();//对象是一只猫
Dog d2 = (Dog)a4;
d2.catchInsect();
}
}
编译能通过: a4这个引用是Animal类型. 而Dog继承了Animal, 能向下转型
运行报错: 在运行时, 堆内存中创建的是一个Bird对象, 而Bird与Dog之间没有继承关系, 不能进行类型转换
错误提示: java.lang.ClassCastException 类型转换异常
如何避免该错误?
最好能在执行向下转型语句之前进行判断, 如果判断结果符合转型的对象, 则继续执行, 否则跳过
怎么做?
使用instanceof进行判断(在运行阶段会进行动态判断)
- instanceof 在运行阶段动态判断引用指向的对象的类型.
- 使用语法: 引用 instanceof 类型
- instanceof的运算结果只能是Boolean类型(true/false)
- d2是一个引用, d2变量保存了内存地址指向堆中的对象
d2 instanceof Dog为真表示指向的堆内存中的对象是一个Dog
d2 instanceof Dog为假表示指向的堆内存中的对象不是一个Dog
建议:
以后要使用向下转型时最好使用instanceof进行判断
public class Test {
public static void main(){
Animal a4 = new Bird();//对象是一只猫
//instanceof判断
if(a4 instanceof Dog){
Dog d2 = (Dog)a4;
d2.catchInsect();
}
}
}