Java继承和转换

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)

San*_*eev 6

这里的问题是顺序语句.

a=(B)(I)b;

b=(B)(I)a;
Run Code Online (Sandbox Code Playgroud)

您已在第一个声明中指定ba.如果您独立执行两个语句(不按顺序),您将看到解释的行为.