我有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
谁能帮助我了解为什么会这样?a属性的值在方法add中更改,如第二行输出所示…为什么它返回到原始值?
在Java中,字段不会被覆盖,而是被隐藏。这意味着Increase.a和SubIncrease.a是 独立的 ,可以被改变并且分别查询字段。因为您的变量的类型f为Increase,所以表达式f.a返回超类字段的值。但是该add()方法 被 覆盖并f.add()调用子类方法,该方法将修改子类字段。
Increase.a
SubIncrease.a
f
Increase
f.a
add()
f.add()
隐藏字段很少有意义,因此应避免使用它。如果要在子类中拥有一个具有不同默认值的字段,请仅在超类中对其进行定义,并在子类构造函数中为其分配一个值。