【问题标题】:Java inheritance and castingJava继承和强制转换
【发布时间】:2016-09-09 04:44:20
【问题描述】:

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

【问题讨论】:

    标签: java inheritance casting


    【解决方案1】:

    这里的问题是顺序语句。

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

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

    【讨论】:

    • 你打败了我。
    【解决方案2】:

    如果您正在准备 OCP 考试,则必须阅读 Jeanne Boyarsky 和 ​​Scott Selikoff 的学习指南。 要理解对象之间的继承关系,必须要问一个问题:这个ObjectA 是一个 Object B吗?

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

    对于投射,请记住一些规则:

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

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

    3. 编译器不允许强制转换为不相关的类型。
    4. 即使代码编译没有问题,如果出现以下情况,也可能在运行时引发异常 被强制转换的对象实际上不是该类的实例。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多