【发布时间】:2018-04-21 01:18:59
【问题描述】:
鉴于此 Java 代码:
class A {
public void foo (Object o) { System.out.println("A"); }
}
class B {
public void foo (String o) { System.out.println("B"); }
}
class C extends A {
public void foo (String s) { System.out.println("C"); }
}
class D extends B {
public void foo (Object o) { System.out.println("D"); }
}
class Main {
public static void main(String[] args) {
A a = new C(); a.foo("Java");
C c = new C(); c.foo("Java");
B b = new D(); b.foo("Java");
D d = new D(); d.foo("Java");
}
}
为什么结果是ACBB?
我将尝试解释我的想法,如果有人让我知道我的差距在哪里,我将不胜感激。
所以我对前两个电话的想法是:
a具有静态类型A,但动态类型为C,因此 Java 应动态调度方法调用并在 C 打印“C”中调用foo()。-
c有静态和动态类型C,所以既然我们继承自A,就必须选择最具体的方法,即public void foo(String s),从而打印“C” -
李>b具有静态类型B但动态类型D因此在这种情况下它也应该动态调度并在D中调用foo()并打印“D”。 -
d有静态和动态类型D,所以既然我们继承自B,就必须选择最具体的方法,即public void foo(String o),从而打印“B”
我在这里给出的这个解释有什么问题?
【问题讨论】:
标签: java methods dynamic static overloading