小编典典

属性和多态

java

我有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中更改,如第二行输出所示…为什么它返回到原始值?


阅读 247

收藏
2020-11-30

共1个答案

小编典典

在Java中,字段不会被覆盖,而是被隐藏。这意味着Increase.aSubIncrease.a独立的
,可以被改变并且分别查询字段。因为您的变量的类型fIncrease,所以表达式f.a返回超类字段的值。但是该add()方法
覆盖并f.add()调用子类方法,该方法将修改子类字段。

隐藏字段很少有意义,因此应避免使用它。如果要在子类中拥有一个具有不同默认值的字段,请仅在超类中对其进行定义,并在子类构造函数中为其分配一个值。

2020-11-30