我的代码是:

class Foo {
  public int a=3;
  public void addFive() {
    a+=5;
    System.out.print("f ");
  }
}

class Bar extends Foo {
  public int a=8;
  public void addFive() {
    this.a += 5;
    System.out.print("b ");
  }
}

public class TestClass {
  public static void main(String[]args) {
    Foo f = new Bar();
    f.addFive();
    System.out.println(f.a);
  }
}

输出:
b 3

请向我解释一下,由于该方法已被覆盖,为什么此问题的输出为“b 3”而不是“b 13”?

最佳答案

您无法在Java中覆盖变量,因此实际上有两个a变量-一个在Foo中,一个在Bar中。另一方面,addFive()方法是多态的,因此它会修改Bar.a(尽管Bar.addFive()的静态类型为f,但仍会调用Foo)。

但是最后,您访问f.a,并且在编译期间使用已知类型的f(即Foo)解析了此引用。因此Foo.a从未被触及过。

Java中的BTW非最终变量应该永远不要公开。

09-25 16:48
查看更多