所以我正在研究一些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.不是正确的答案。它说这是不正确的选择,因为“这将在运行时失败,因为它不指向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{ }
答案 0 :(得分:6)
这里的问题是顺序陈述。
a=(B)(I)b;
b=(B)(I)a;
您已在第一个语句中将b
分配给a
。如果您独立执行两个语句(不按顺序),您将看到解释的行为。
答案 1 :(得分:0)
如果您正准备参加OCP考试,您必须阅读Jeanne Boyarsky和Scott Selikoff的学习指南。 要理解对象之间的继承关系,您必须提出以下问题:此ObjectA 是对象B?
示例:狗是动物吗?是的,所以Dog继承自Animal。请记住,继承是一个必须表示业务对象之间一致性的概念。
对于施法,请记住一些规则:
将对象从子类强制转换为超类不需要显式强制转换。
将对象从超类转换为子类需要显式转换。
希望它有所帮助。