Java---覆盖与多态(三)

接上篇Java—覆盖与多态(二)

在使用向下转型的过程中会有一定的风险!
比如:

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进行判断(在运行阶段会进行动态判断)

  1. instanceof 在运行阶段动态判断引用指向的对象的类型.
  2. 使用语法: 引用 instanceof 类型
  3. instanceof的运算结果只能是Boolean类型(true/false)
  4. 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();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值