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

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

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没有被覆盖。 有谁知道这种差异的原因?

谢谢。

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

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

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

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

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