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