【发布时间】:2015-12-25 14:32:31
【问题描述】:
我正在准备考试,我需要一些帮助来理解以下代码片段中发生了什么。
class A {
public void method1(A X) {
System.out.println("A");
}
}
class B extends A {
public void method2() {
System.out.println("B");
}
}
class C extends B {
public void method1(A x) {
System.out.println("C");
}
}
class D extends C {
public void method1(D x) {
System.out.println("D");
}
}
public class test {
public static void main(String[] args) {
C c = new D();
B b = c;
c.method1(c); // prints C
b.method1(b); // prints C
}
}
好吧,这就是我的想法:c.method1(c) 调用 C 中的 method1 而不是 D 中的 method1,因为 c 被清除为 C,因此 D 中的 method1 不可见。但是 b.method1(b) 更难。 B 没有method1,我假设将使用超类中的method1,但事实并非如此。为什么它使用C中的方法?我在 b 中放了一个新的 D,但 D 的专业化没有任何可见性,因为 b 来自 B 类型。
【问题讨论】:
-
今日谜题 ;)
-
两个语句作为答案的补充:1) 重载在 编译时 完全解决,而重写方法的方法解析是 运行时行为 . 2) 要覆盖方法,您必须使用相同的方法签名。请记住,返回类型不是签名的一部分(至少在 Java 中)。
标签: java inheritance methods invoke