Java:这指向方法的调用者,但指向变量的当前类。为什么呢?

时间:2017-04-28 02:54:06

标签: java inheritance super

以下代码输出

In B m  
In A m  
In B m2  
2

代码:

class A {
  int y = 1;

  int m() {
    System.out.println("In A m");
    return this.m2();
  }

  int m2() {
    System.out.println("In A m2");
    return y;
  }
}

class B extends A {
  int y = 2;

  int m() {
    System.out.println("In B m");
    return super.m();
  }

  int m2() {
    System.out.println("In B m2");
    return y;
    }
}

class C extends B {
  int y = 3;

  int m() {
    return super.m();
  }

  public static void main(String args[]) {
    System.out.println(new C().m());
  }
}

这对我来说相当混乱。

据我所知,B的m2()是被调用的m2函数。这是有道理的,因为this.m2()指的是来电者的m2,C的m2是B的m2。

但是,m2不使用C的y变量,它使用B的y变量。

这不应该指向C的y吗?为什么它使用B代替?

2 个答案:

答案 0 :(得分:1)

多态性仅适用于方法。

因此:方法被覆盖,字段不是这样。换句话说:如果你从B运行一个方法,那么y就是2.含义:实际上有三个不同的y值,你的例子将使用y的B版本。

尝试将y更改为 protected 以更改它。

但是多态在这里很重要:因为在A中对m2的调用实际上调用了最终返回2的B m2()。

答案 1 :(得分:0)

你不是重写变量而是隐藏它。在Java中,覆盖只适用于实例方法。在您的情况下,JVM将它们视为3个不同的变量,例如它们具有不同的名称。