需要 Java 代码片段输出说明

2022-09-02 23:15:43

我的代码是:

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”,因为该方法已被覆盖?


答案 1

F是类型的引用,并且变量不是多态的,因此引用变量Foof.aFoo3

如何验证?

要对此进行测试,您可以从中删除变量,它将为您提供编译时错误aFoo

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


另请参见


答案 2

您无法在 Java 中覆盖变量,因此您实际上有两个变量 - 一个在 中,一个在 .另一方面,方法是多态的,因此它修饰(被称为,尽管存在静态类型)。aFooBaraddFive()Bar.aBar.addFive()fFoo

但最终,您访问并使用此引用在编译期间使用已知类型的 解析,即 。因此从未被触动过。f.afFooFoo.a

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


推荐