java 异常继承树_Java继承下降ClassCastException

给定以下代码,我有一个问题:

class A{}

class B extends A {}

class C extends B{}

public class Test {

public static void main(String[] args) {

A a = new A();

A a1=new A();

B b = new B();

// a=b;// ok

// b=(B)a;// ClassCastException

// a=(A)a1; // ok

// a=a1; // ok

a=(B)a1; // compiles ok, ClassCastException

}

}

我的问题是粗体字.我的理解是,对于要编译的代码,只需要满足这些类在相同的层次结构中,并因此可以工作(在树上进行隐式强制转换,在树上进行显式强制转换)即可.

每当我遇到ClassCastException时,这是因为引用指向树上的一个对象,例如类型B的引用指向类型A的对象.

问题所在的行似乎是指向类型A的对象的类型A的引用.强制转换为(B)显然是导致ClassCastException的原因.有人可以解释一下如何做到这一点吗?

注意:如果a1指向B类型的对象,则它将起作用(刚刚对其进行了测试).因此,对于编译器,向下转换是合法的,并且如果引用指向正确类型的对象,则可以毫无例外地执行该向下转换.

通过将A ref a1强制转换为B并将其分配给a,看来A ref a不再期望引用类型A的对象,而是B?

谢谢,

肖恩.

PS我知道这有点不寻常,正在准备Java认证.通常情况下,我们会低调到左侧的类型,例如B =(B)一个; (并且我可以看到为什么给出了ClassCastException).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值