Java:这指向方法的呼叫者,但要用于变量的当前类.为什么



所以以下代码输出

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的y?

多态性仅适用于方法。

因此:方法被覆盖,字段并非如此。换句话说:如果您从b中运行方法,则y为2。含义:实际上有三个不同的y值,您的示例将使用y。

的b版本。

尝试将y更改为受保护以更改它。

但是多态性在这里很重要:作为对M2的调用,实际上调用了B M2((,最终返回2。

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

最新更新