4


我刚刚注意到覆盖方法的行为确实与覆盖字段不同。考虑以下代码段:

public class Bar {
  int v =1;

  public void printAll(){
    System.out.println(v);
    printV();
  }

  public void printV(){
    System.out.println("v is " + v);
  }
}

public class Foo extends Bar {
  int v = 4;

  public static void main(String[] args) {
    Foo foo = new Foo();
    foo.printAll();
 }

 public void printV() {
   System.out.println("The value v is  " + v);
 }
}

它导致输出:
1
值 v 是 4

所以似乎 bar 中的 printV 方法被 foo.printV 覆盖,而 bar 中的字段 v 没有被覆盖。有谁知道这种差异的原因?

谢谢。

4

2 回答 2

9

我刚刚注意到覆盖方法的行为确实与覆盖字段不同。

没有“覆盖字段”之类的东西。您可以隐藏字段,但不能覆盖它们。字段不是多态的。有关更多详细信息,请参阅Java 语言规范的第 6.4.1 节

请注意,通常,无论如何,字段几乎总是应该是私有的,这意味着您首先不会意识到这一点。

于 2012-08-15T14:21:51.170 回答
0

当您调用 foo.printAll(); 它正在调用打印值 1 的基类的函数。然后您正在调用 printV。这次由于继承的类具有相同名称的函数,它被覆盖并调用 Foo 的 printV。

v 的值取决于您从哪个类打印该值。

于 2012-08-15T14:26:08.927 回答