【发布时间】:2021-05-18 16:10:12
【问题描述】:
考虑 Java 中的多级继承层次结构:
public class First {public String name() { return "First"; }}
public class Second extends First {
public void m1() {
System.out.print(super.name() + " rules");
System.out.prinln(" but " + name() + " is even better.");
}
public String name() { return "Second"; }}
public class Third extends Second {public String name() { return "Third"; }}
第三个类没有覆盖 m1 方法——它只是继承了它。所以如果你运行下面的代码:
Third varThird = new Third();
varThird.m1();
你得到:
First rules but Third is even better.
这似乎违反了在运行时使用对象的实际类型来确定运行该方法的哪个实现的规则。 Second 类中的方法似乎是运行的方法。如何协调 Java 继承的规则(公共方法由子类继承)与多态性的规则(在运行时,Java 使用对象的实际类型来确定实现哪个版本的方法)。子类中没有被覆盖的方法真的被“继承”了吗?
【问题讨论】:
-
搜索从方法的子类型开始。然后 JVM 依次向上继承层次结构寻找具体的方法。编辑:如果我没记错的话,它被称为动态绑定。
-
你对什么感到困惑?第三个中没有 m1() 方法,如果第二个中没有 m1(),您希望执行哪个方法?
-
虚拟方法总是在整个链条中查看它们是否被覆盖。 Java 中的所有方法都是虚方法,因此
name()是虚方法。 -
是的,它确实打印:第三个更好。所以它确实调用了由第三类实现的名称。
-
您提供了 SCCE 和实际输出,这很好,但我看不出您在哪里说明了您期望程序输出的内容。请您补充一下,这样我们就不必猜测了?
标签: java inheritance super multi-level