需要Java代码片段输出解释

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我的代码是:

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.aBar.addFive()被调用时,尽管静态类型的f存在Foo)。

但最终你访问f.a这个参考使用已知类型的编译过程中解决了f,这是Foo。因此Foo.a从未被感动过。

永远不会公开Java中的BTW非最终变量。

用户回答回答于

F是类型的引用Foo,和变量不是多态的,从而f.a指的是从可变Foo这是3

如何验证它?

要测试这个你可以从中删除a变量 Foo,它会给你编译时错误

注意:使成员变量private并使用访问器来访问它们

扫码关注云+社区