我在理解调用类之间的方法的层次结构时遇到了问题。我在这里有这个代码:
class X {
protected int v = 0;
public X() {
v = v + 10;
}
public void proc(X p) {
System.out.println(43);
}
}
class Y extends X {
public Y() {
v = v + 5;
}
public void proc(X p) {
System.out.println(57);
}
public int getV() {
return v;
}
}
class Z extends Y {
public Z() {
v = v + 9;
}
public void proc(Z p) {
System.out.println(39);
}
}
class Main {
public static void main(String argv[]) {
X x = new Z();
Y y = new Z();
Z z = new Z();
x.proc(z);
System.out.println(y.getV());
}
}
代码打印的数据为57 24
。所以,在这种情况下,方法proc
在X引用的对象上调用,但是在Z实例上调用,所以我认为将调用X类中的方法,但显然它会调用Y中的方法。类。那是为什么?
非常感谢。
答案 0 :(得分:1)
x
的静态(编译时)类型为X
。因此,对于x.proc(z)
,编译器只能选择X
类(或X
的超类)中声明的方法。因此,只有public void proc(X p)
适用proc(Z p)
类Z
不适用,因为类X
没有具有此类签名的方法。)
现在,由于x
引用的实例的运行时类型为Z
,并且proc(X p)
被类Y
覆盖,因为类Z
是类的超类proc(X p)
,在运行时执行Y
的{{1}}方法。这就是方法覆盖的行为。