Java继承和转换

时间:2016-09-09 04:44:21

标签: java inheritance casting

所以我正在研究一些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{ }

2 个答案:

答案 0 :(得分:6)

这里的问题是顺序陈述。

a=(B)(I)b;

b=(B)(I)a;

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

答案 1 :(得分:0)

如果您正准备参加OCP考试,您必须阅读Jeanne Boyarsky和Scott Selikoff的学习指南。 要理解对象之间的继承关系,您必须提出以下问题:此ObjectA 对象B?

示例:狗是动物吗?是的,所以Dog继承自Animal。请记住,继承是一个必须表示业务对象之间一致性的概念。

对于施法,请记住一些规则:

  1. 将对象从子类强制转换为超类不需要显式强制转换。

  2. 将对象从超类转换为子类需要显式转换。

  3. 编译器不允许转换为不相关的类型。
  4. 即使代码编译没有问题,也可能在运行时抛出异常 被强制转换的对象实际上并不是该类的实例。
  5. 希望它有所帮助。