Java继承和类型转换

3

我正在研究一些OCAJP JAVA样例题,偶然遇到了以下问题。

请考虑下面的代码。

interface I{ } 
class A implements I{ }
class B extends A { }
class C extends B{ }

而以下声明:

A a = new A(); 
B b = new B();

哪个会编译并且没有错误地运行?
A. a = (B)(I)b;
B. b = (B)(I) a; 
C. a = (I) b; 
D. I i = (C) a;

问题的答案是A。这很有道理。但我不明白的是,B不是正确的答案。它说错误的原因是“这将在运行时失败,因为a没有指向类B的对象”。
现在,我实际上去Eclipse写下了整个代码。C显然无法编译,D在运行时失败了。至少在我的代码中,B没有任何问题地编译通过。我错过了什么吗?或者这本书实际上是错误的?
我在Eclipse中实际放入的代码如下:
public class Test{
public static void main (String[]args){
    A a = new A();
    B b = new B();

    a=(B)(I)b;
    b=(B)(I)a;  
    }
}

interface I{ } 
class A implements I{ }
class B extends A { }
class C extends B{ }
2个回答

6

问题在于顺序语句。

a=(B)(I)b;

b=(B)(I)a;

在第一条语句中,您已经将b分配给a。如果您独立执行这两个语句(不按顺序),则会看到所解释的行为。


1
你比我先做到了。 - Scary Wombat

0
如果你正在为OCP考试做准备,你必须阅读Jeanne Boyarsky和Scott Selikoff的学习指南。要理解对象之间的继承关系,你必须问这个问题:这个ObjectA是一个Object B吗?
例如:狗是动物吗?是的,所以狗从动物继承而来。记住,继承是一个概念,必须表示业务对象之间的一致性。
对于强制类型转换,请记住以下规则:
  1. 从子类向超类转换对象不需要显式转换。
  2. 从超类向子类转换对象需要显式转换。
  3. 编译器不允许将类型转换为不相关的类型。
  4. 即使代码没有问题编译,如果被转换的对象实际上不是该类的实例,运行时也可能抛出异常。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接