有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

  1. # 1 楼答案

    x的静态(编译时)类型是X。因此,对于x.proc(z),编译器只能从X类(或X的超类)中声明的方法中进行选择。因此,只有public void proc(X p)是适用的(类Zproc(Z p)不适用,因为类X没有具有这种签名的方法)

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