覆盖方法和字段的不同行为

时间:2012-08-15 14:20:02

标签: java


我只是注意到重写方法的行为与覆盖字段的行为不同。 考虑以下代码段:

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

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

感谢。

2 个答案:

答案 0 :(得分:9)

  

我只是注意到覆盖方法的行为与覆盖字段不同。

没有“覆盖领域”这样的东西。您可以 shadow 字段,但不能覆盖它们。字段不是多态的。有关详细信息,请参阅section 6.4.1 of the Java Language Specification

请注意,通常情况下,字段始终始终是私有的,这意味着您首先不会意识到这一点。

答案 1 :(得分:0)

当你打电话的时候 foo.printAll(); 它调用打印值1的基类的函数。 然后你调用printV.This时间,因为继承的类具有相同名称的函数,它被覆盖并且调用Foo的printV。

v的值取决于您打印值的类。