Java 属性和多态性

Java 属性和多态性,java,inheritance,polymorphism,overriding,Java,Inheritance,Polymorphism,Overriding,我有两门课: 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); } }

我有两门课:

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方法中被更改,如第二个outpuy行所示……为什么它会返回到其原始值?

在Java中,字段不会被覆盖,而是被隐藏。这意味着
Increase.a
SubIncrease.a
是可以单独更改和查询的单独字段。由于变量
f
的类型是
Increase
,因此表达式
f.a
返回超类字段的值。但是
add()
方法被重写,并且
f.add()
调用subclass方法,该方法修改subclass字段


隐藏字段很少有意义,因此您应该避免它。如果希望在子类中有一个具有不同默认值的字段,请仅在超类中定义该字段,并在子类构造函数中为其赋值。

在Java中,字段不会被覆盖,而是被隐藏。这意味着
Increase.a
SubIncrease.a
是可以单独更改和查询的单独字段。由于变量
f
的类型是
Increase
,因此表达式
f.a
返回超类字段的值。但是
add()
方法被重写,并且
f.add()
调用subclass方法,该方法修改subclass字段

隐藏字段很少有意义,因此您应该避免它。如果希望在子类中有一个具有不同默认值的字段,请仅在超类中定义该字段,并在子类构造函数中为其赋值