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

Java: this points to caller for methods, but to current class for variables. Why?

所以下面的代码输出

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变量。

this.y 不应该指向 C 的 y 吗?为什么它改用 B 的 y?

多态性仅适用于方法。

因此:方法会被覆盖,字段不会。换句话说:如果您 运行 来自 B 的方法,则 y 为 2。意思是:y 实际上有三个不同的值,您的示例将使用 y 的 B 版本。

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

但多态性在这里很重要:因为 A 中对 m2 的调用实际上调用了 B m2(),最终 returns 2.

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