Java继承 - 实例变量重写

sgo*_*les 11 java

为什么在继承中不覆盖超类的实例变量?

ewe*_*nli 28

您可以隐藏字段,但不能覆盖它.

隐藏意味着字段将具有不同的值,具体取决于它所访问的类.子类中的字段将"隐藏"超类中的字段,但两者都存在.

隐藏字段是一种非常糟糕的做法,但有效:

public class HideField {

    public static class A
    {   
        String name = "a";

        public void doIt1() { System.out.println( name ); };
        public void doIt2() { System.out.println( name ); };   
    }

    public static class B extends A
    {
        String name = "b";

        public void doIt2() { System.out.println( name ); };
    }

    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();

        a.doIt1(); // print a
        b.doIt1(); // print a
        a.doIt2(); // print a
        b.doIt2(); // print b <-- B.name hides A.name
    }
}
Run Code Online (Sandbox Code Playgroud)

根据方法是否被覆盖,可以访问AB访问字段.

永远不要那样做!这永远不是你的问题的解决方案,并创建与继承相关的非常微妙的错误.


ext*_*eon 25

因为继承旨在修改行为.通过方法暴露行为,这就是为什么它们可以被覆盖的原因.

字段不是行为而是状态.您不需要修改它,也不需要修改超类使用的私有方法.它们旨在允许超类做它的工作.