java - Java中的继承

标签 java inheritance

假设我有以下代码,运行时没有任何编译/运行时错误:

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

我有两个问题:

  1. 我应该在哪里放置 E ?它可以在 B/A/C 中的任何位置吗?

  2. 为什么当我设置 Object var = new A(); 然后尝试 ((C)var).someMethod(); 我得到运行时间错误提示A类不能转换为C类?根据我到目前为止的经验,我只能在 java 中进行向下转型(对吗?)。如果我尝试交换 AC,我会收到 A a1 = (C) b2; 编译错误,所以我猜 C 必须继承自 A

最佳答案

编辑:在图像中包含@Sweeper 的评论。

Where do I place E ? can it be anywhere in B / A / C ?

使用您提供的代码,可以实现以下任何层次结构。

enter image description here

I get run time error saying Class A can not be cast to class C

这是因为您可以将子类的实例区分为其父类型,但反之则不然。因此,您无法将 A 的实例强制转换为 C。以下几点可以说明原因:

  1. 子类包含父类的所有受保护或更可见(甚至包访问)的结构部分,但反之则不然。
  2. 由于这个原因,父类引用在指向子类实例时可以完全代表其自身。因此,编译器可以允许这样做。
  3. 当子类型引用指向父类实例时,父类中缺少引用(子类)的某些结构部分,因此,子类引用不能完全由所引用的对象表示。因此,编译器将不允许这样做。

关于java - Java中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129723/

相关文章:

java - 在实现检测输入是否为整数的系统时遇到困难

java - 从 native 查询和转换中检索数据

c# - 从一个基类继承两个类给出错误 3024

具有继承性的 Java 单例

c++ - 错误 LNK2001 : unresolved external symbol C++

Java从长值中删除毫秒精度

java - 为什么不将类序列化的定义放在共享包中会导致 `ClassNotFoundException` ?

java - 让我的 JObject 仅在按下鼠标时改变颜色?

c# - MVC View 继承

java - 如何调用祖父类的构造函数?