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