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 个不同的变量,就像它们具有不同的名称一样。
所以下面的代码输出
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 个不同的变量,就像它们具有不同的名称一样。