属性和多态性

use*_*480 1 java polymorphism inheritance overriding

我有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);

    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我跑步的时候

    Increase f=new SubIncrease();
    System.out.println(f.a);
    f.add();
    System.out.println(f.a);
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

3
b13
3
Run Code Online (Sandbox Code Playgroud)

谁能帮我理解为什么会这样?在方法add中更改了a属性的值,如第二个outpuy行所示...为什么它会恢复到原始值?

Mic*_*rdt 5

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

隐藏一个领域很少有意义,所以你应该避免它.如果要在子类中使用具有不同默认值的字段,请仅在超类中定义它,并在子类构造函数中为其指定值.