Java继承和转换

Java继承和转换,java,inheritance,casting,Java,Inheritance,Casting,因此,我在研究一些OCAJPJava示例问题,偶然发现了以下问题 考虑以下代码 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; 这个问题的答

因此,我在研究一些OCAJPJava示例问题,偶然发现了以下问题

考虑以下代码

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{ }

这里的问题是顺序语句

a=(B)(I)b;

b=(B)(I)a;

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

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

狗是一种动物?是的,所以狗是从动物身上继承的。请记住,继承是一个必须表示业务对象之间一致性的概念

对于铸造,请记住一些规则:

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

  • 将对象从超类强制转换为子类需要显式强制转换

  • 编译器不允许对不相关的类型进行强制转换
  • 即使代码编译时没有问题,如果 正在强制转换的对象实际上不是该类的实例

  • 希望能有帮助。

    你比我快。