以下代码输出
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代替?
答案 0 :(得分:1)
多态性仅适用于方法。
因此:方法被覆盖,字段不是这样。换句话说:如果你从B运行一个方法,那么y就是2.含义:实际上有三个不同的y值,你的例子将使用y的B版本。
尝试将y更改为 protected 以更改它。
但是多态在这里很重要:因为在A中对m2的调用实际上调用了最终返回2的B m2()。
答案 1 :(得分:0)
你不是重写变量而是隐藏它。在Java中,覆盖只适用于实例方法。在您的情况下,JVM将它们视为3个不同的变量,例如它们具有不同的名称。