假设我有以下代码,运行时没有任何编译/运行时错误:
B b1 = new A();
B b2 = new C();
A a1 = (C) b2;
D d1 = new C();
B b3 = new B();
D d2 = new A();
D d3 = new B();
E e1 = new E();
D e2 = new E();
B e3 = new E();
C c1 = new C();
我需要弄清楚类之间的关系。 据我所知:
(head) D <- B <- A <- C
我有两个问题:
我应该在哪里放置
E
?它可以在B/A/C
中的任何位置吗?为什么当我设置
Object var = new A();
然后尝试((C)var).someMethod();
我得到运行时间错误提示A类不能转换为C类
?根据我到目前为止的经验,我只能在 java 中进行向下转型(对吗?)。如果我尝试交换A
和C
,我会收到A a1 = (C) b2;
编译错误,所以我猜C
必须继承自A
?
最佳答案
编辑:在图像中包含@Sweeper 的评论。
Where do I place E ? can it be anywhere in B / A / C ?
使用您提供的代码,可以实现以下任何层次结构。
I get run time error saying
Class A can not be cast to class C
这是因为您可以将子类的实例区分为其父类型,但反之则不然。因此,您无法将 A
的实例强制转换为 C
。以下几点可以说明原因:
- 子类包含父类的所有受
保护
或更可见(甚至包访问)的结构部分,但反之则不然。 - 由于这个原因,父类引用在指向子类实例时可以完全代表其自身。因此,编译器可以允许这样做。
- 当子类型引用指向父类实例时,父类中缺少引用(子类)的某些结构部分,因此,子类引用不能完全由所引用的对象表示。因此,编译器将不允许这样做。
关于java - Java中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129723/