SER*_*ich 3 java inheritance casting
所以我正在研究一些OCAJP JAVA样本问题,我偶然发现了以下问题.
考虑以下代码.
interface I{ }
class A implements I{ }
class B extends A { }
class C extends B{ }
Run Code Online (Sandbox Code Playgroud)
以下声明:
A a = new A();
B b = new B();
Run Code Online (Sandbox Code Playgroud)
哪个编译运行没有错误?
A. a = (B)(I)b;
B. b = (B)(I) a;
C. a = (I) b;
D. I i = (C) a;
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是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{ }
Run Code Online (Sandbox Code Playgroud)
这里的问题是顺序语句.
a=(B)(I)b;
b=(B)(I)a;
Run Code Online (Sandbox Code Playgroud)
您已在第一个声明中指定b了a.如果您独立执行两个语句(不按顺序),您将看到解释的行为.