在大学里,我们被赋予了一个Java程序,并任务是理解输出的方式。该程序如下:
interface A {
public void f(A x);
}
interface AA extends A {
public void f(B x);
}
class B implements A {
public void f (A x) {System.out.println("1");}
public void f (B x) {System.out.println("2");}
public void f (C x) {System.out.println("3");}
}
class C implements A,AA {
public void f(A x) {System.out.println("4");}
public void f(B x) {System.out.println("5");}
public void f(C x) {System.out.println("6");}
}
public class Task7 {
public static void main(String[] args) {
B b = new B(); C c = new C();
A ac = c; A ab = b;
AA aac = c;
b.f(b); c.f(c);
ac.f(b); ab.f(b);
aac.f(b); aac.f(c);
}
}
输出结果为“264154”。我不太明白最后4个数字的含义,有人能帮忙解释一下吗?
编辑:进一步解释我的问题: 'b.f(b)' 显然会打印出2,因为你将一个B对象的引用给了一个B引用,而 'c.f(c)' 出于同样的原因将打印6。
'ab.f(b)' 将调用 'b.f(b)',因为它的动态类型是B。现在,我不明白为什么之前被同一个类视为'B'的参数 'b' 现在被理解为'A',以至于打印出了 "1" 而不是 "2"。对于其他方法调用也是同样的情况,我只是不明白为什么相同的参数和相同的基础对象会被不同地解释。