为什么超类的实例变量在继承中不被覆盖?
因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。
字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。
你可以隐藏字段,但不能覆盖它。
隐藏意味着字段的值取决于所访问的类。子类中的字段将“隐藏”超类中的字段,但是两者都存在。
隐藏字段是非常糟糕的做法,但是可以:
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 } }
根据是否重写该方法,访问A或中的字段B。
绝对不要那样做!那永远不是解决问题的方法,它会产生与继承相关的非常细微的错误。