了解层次结构方法调用

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 Zproc(Z p) 不适用,因为 class X 没有具有此类签名的方法)。

现在,由于 x 引用的实例的运行时类型是 Z,并且由于 proc(X p) 被 class Y 覆盖,这是classZ的超class,在运行时执行Yproc(X p)方法。这就是方法覆盖的行为。