类型转换时ClassCastException

时间:2013-08-29 09:37:32

标签: inheritance parent-child classcastexception

我知道这似乎很简单,但我想知道背后的深层原因。

我有以下代码,其中有一个ClassCastException

Parent parent = newParent();
Child child = (Child)parent;   //ClassCastException: 
                               Parent cannot be cast to Child.

我已使用以下代码对其进行了修改并成功执行。

Parent parent = new Parent();
Child child = new Child();
parent = child;
System.out.println(parent.color); 
child=(Child)parent; 
System.out.println(child.color);

**output:** 
       Parent_color
       Child_color

我只是想知道在这里区分结果的主要区别是什么?以及如何证明这一点?

1 个答案:

答案 0 :(得分:1)

如果有可能在运行时成功,则允许在Java中进行向下转换。

儿童=(儿童)父母;

编译器将允许这样做,因为在运行时“父”可能引用“Child”的实例。但它在运行时失败了,因为“父”并不是指“Child”的实例,而是指的是“Parent”的实例。

让我们看看如果没有ClassCastException会发生什么:

假设您已按如下方式定义了类:

class Parent {

void aMethod(){
}

}

class Child {

void bMethod(){
}

}

假设我们定义了这些陈述,

1. Parent parent = new Parent();
2. Child child = (Child)parent;
3. child.bMethod();// we should be able to do this, because there should not be any issue executing methods defined in "Child" type with a reference variable of "Child" type.

但最后一行是非法的,因为我们的Parent类中没有名为“bMethod”的方法,我们正在尝试执行一个甚至不存在的方法。希望这证明了“ClassCastException”。

现在,让我们检查你的修改后的代码:

   1. Parent parent = new Parent();
   2  Child child = new Child();
   3. parent = child;
   4. System.out.println(parent.color); 
   5. child=(Child)parent; 
   6. System.out.println(child.color);

这里的演员

child=(Child)parent; // works as you expected, parent is now referring to an instance of "Child" according to the assignment "parent = child" at line no 3.

工作正常,因为“parent”现在指的是“Child”类的实例。因此,“child”引用变量现在仅引用“Child”的实例,运行时环境对此感到满意。