Java 继承 - 实例变量重写
2022-09-04 23:48:44
为什么超类的实例变量在继承中没有被覆盖?
您可以隐藏字段,但不能覆盖它。
隐藏意味着字段将具有不同的值,具体取决于从哪个类访问该字段。子类中的字段将“隐藏”超类中的字段,但两者都存在。
隐藏字段是一种非常糟糕的做法,但有效:
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
永远不要那样做!这绝不是你的问题的解决方案,并且会产生与继承相关的非常微妙的错误。
因为继承旨在修改行为。行为通过方法暴露出来,这就是为什么它们可以被覆盖。
字段不是行为,而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在允许超类完成它的工作。