【发布时间】:2012-04-10 21:10:39
【问题描述】:
给定以下 Java 代码:
class mainul {
public static void main(String[] args) {
/*block 1*/
B b1 = new B();
A a1 = b1;
a1.m1(b1);
/*block 2*/
B b2 = new B();
B a2 = b2;
b2.m1(a2);
}
}
class A {
public static void p(Object o) {
System.out.println(o.toString());
}
public void m1(A a) {
p("m1(A) in A");
}
}
class B extends A {
public void m1(B b) {
p("m1(B) in B");
}
}
有人能解释一下为什么这个程序的输出是
m1(A) in A
m1(B) in B
由于 a1 的动态类型是 B,人们会期望块 1 的输出为“m1(B) in B”。我注意到 A 和 B 中 m1 的函数签名不匹配(一个期望 A 类型的对象和 B 类型的另一个对象作为其参数),并且 A 中的方法似乎具有优先权,但不能真正将其链接到我的输出,因为它似乎与 block2 的输出不一致。
感谢您的宝贵时间
【问题讨论】:
标签: java inheritance compiler-construction polymorphism