给定以下 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 的输出是“b 中的 m1(B)”。我注意到 m1 的 A 和 B 中的函数签名不匹配(需要一个对象A 类型和 B 类型的另一个作为其参数),并且 A 中的方法似乎获得优先权,但不能真正将其链接到我的输出,因为它似乎与 block2 的输出不一致。
谢谢你的时间