java理解层次结构方法调用
我在理解类之间调用方法的层次结构时遇到了一个问题。我这里有这个代码:
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类的方法。为什么呢
非常感谢
# 1 楼答案
x
的静态(编译时)类型是X
。因此,对于x.proc(z)
,编译器只能从X
类(或X
的超类)中声明的方法中进行选择。因此,只有public void proc(X p)
是适用的(类Z
的proc(Z p)
不适用,因为类X
没有具有这种签名的方法)现在,由于
x
引用的实例的运行时类型是Z
,并且proc(X p)
被类Y
覆盖,类Y
是类Z
的超类,因此在运行时执行Y
的proc(X p)
方法。这就是方法重写的行为