Java类型转换问询:将Tree向下转为Redwood会抛出ClassCastException吗?
代码运行时的异常分析
咱们一步步拆解这段代码的执行过程,看看会发生什么:
- 程序启动后,
main方法里创建Redwood实例并调用go()方法。 go()方法会先后两次调用go2():- 第一次调用
go2(new Tree(), new Redwood()):
进入go2方法后,执行Redwood r2 = (Redwood)t1;这行代码。这里t1的实际类型是Tree(父类),而我们试图把它强制转换成子类Redwood。Java里父类对象不能直接转成子类类型(除非这个父类对象实际就是子类的实例),所以这一步会直接抛出**ClassCastException**异常,程序终止。 - 第二次调用根本不会执行:因为第一次调用已经抛出异常,程序流程被中断了。不过就算能走到第二次调用,
go2((Redwood) new Tree(), new Redwood())里的(Redwood) new Tree()在运行时同样会抛出ClassCastException,原因和上面一样——实际对象是Tree,没法转成Redwood。
- 第一次调用
补充个小知识点:这种父转子的强制转换,编译阶段编译器只会检查类型间的继承关系(因为Redwood继承自Tree,所以编译能通过),但运行时会检查对象的实际类型,不匹配就抛异常。
内容的提问来源于stack exchange,提问作者Cian Barrett
相关产品推荐
相关产品推荐

