我有2个班级:
public class Increase {
public int a=3;
public void add(){
a+=5;
System.out.println("f");
}
}
class SubIncrease extends Increase{
public int a=8;
public void add(){
a+=5;
System.out.println("b" + a);
}
}
但是当我跑步时
Increase f=new SubIncrease();
System.out.println(f.a);
f.add();
System.out.println(f.a);
我得到了这个输出:
3
b13
3
有谁能帮我理解为什么会这样?在方法add中更改了a属性的值,如第二个outpuy行所示...为什么它会恢复到原始值?
答案 0 :(得分:5)
在Java中,字段不会被覆盖,它们是隐藏的。这意味着Increase.a
和SubIncrease.a
是单独的字段,可以单独更改和查询。由于变量f
的类型为Increase
,因此表达式f.a
将返回超类字段的值。但是add()
方法被覆盖,f.add()
调用子类方法,这会修改子类字段。
隐藏一个领域很少有意义,所以你应该避免它。如果要在子类中使用具有不同默认值的字段,请仅在超类中定义它,并在子类构造函数中为其指定值。