我只是注意到重写方法的行为与覆盖字段的行为不同。
考虑以下代码段:
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没有被覆盖。有谁知道这种差异的原因?
感谢。
答案 0 :(得分:9)
我只是注意到覆盖方法的行为与覆盖字段不同。
没有“覆盖领域”这样的东西。您可以 shadow 字段,但不能覆盖它们。字段不是多态的。有关详细信息,请参阅section 6.4.1 of the Java Language Specification。
请注意,通常情况下,字段始终始终是私有的,这意味着您首先不会意识到这一点。
答案 1 :(得分:0)
当你打电话的时候 foo.printAll(); 它调用打印值1的基类的函数。 然后你调用printV.This时间,因为继承的类具有相同名称的函数,它被覆盖并且调用Foo的printV。
v的值取决于您打印值的类。