【问题标题】:Understanding hierarchy method calling [duplicate]了解层次结构方法调用[重复]
【发布时间】:2018-03-27 11:08:09
【问题描述】:

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

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 类中的方法。这是为什么呢?

非常感谢。

【问题讨论】:

  • 啊哈,严重的骗局.. 否决

标签: java class methods hierarchy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2013-12-25
    • 2019-02-03
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多