Java继承和转换
因此,我在研究一些OCAJPJava示例问题,偶然发现了以下问题 考虑以下代码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; 这个问题的答
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
狗是一种动物?是的,所以狗是从动物身上继承的。请记住,继承是一个必须表示业务对象之间一致性的概念
对于铸造,请记住一些规则:
希望能有帮助。你比我快。