了解层次方法调用

时间:2018-03-27 11:08:10

标签: java class methods hierarchy

我在理解调用类之间的方法的层次结构时遇到了问题。我在这里有这个代码:

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 个答案:

答案 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}}方法。这就是方法覆盖的行为。