Java继承-实例变量覆盖

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



米琪卡哇伊
浏览 620回答 3
3回答

慕工程0101907

因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在允许超类完成它的工作。

偶然的你

您可以隐藏字段,但不能覆盖它。隐藏意味着字段的值取决于所访问的类。子类中的字段将“隐藏”超类中的字段,但是两者都存在。隐藏字段是非常糟糕的做法,但是可以:public class HideField {&nbsp; &nbsp; public static class A&nbsp; &nbsp; {&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; String name = "a";&nbsp; &nbsp; &nbsp; &nbsp; public void doIt1() { System.out.println( name ); };&nbsp; &nbsp; &nbsp; &nbsp; public void doIt2() { System.out.println( name ); };&nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; public static class B extends A&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; String name = "b";&nbsp; &nbsp; &nbsp; &nbsp; public void doIt2() { System.out.println( name ); };&nbsp; &nbsp; }&nbsp; &nbsp; public static void main(String[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; A a = new A();&nbsp; &nbsp; &nbsp; &nbsp; B b = new B();&nbsp; &nbsp; &nbsp; &nbsp; a.doIt1(); // print a&nbsp; &nbsp; &nbsp; &nbsp; b.doIt1(); // print a&nbsp; &nbsp; &nbsp; &nbsp; a.doIt2(); // print a&nbsp; &nbsp; &nbsp; &nbsp; b.doIt2(); // print b <-- B.name hides A.name&nbsp; &nbsp; }}根据是否重写该方法,访问A或中的字段B。绝对不要那样做!那永远不是解决问题的方法,它会产生与继承相关的非常细微的错误。

浮云间

因为:可能会破坏parent class代码。例如考虑以下代码(obB.getInt();如果允许实例变量覆盖,则以下代码中的行的行为是什么):class A{&nbsp; &nbsp; int aInt;&nbsp; &nbsp; public int getInt()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return aInt;&nbsp; &nbsp; }}class B extends A{&nbsp; &nbsp; int aInt;&nbsp; &nbsp; public int getInt2()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return aInt;&nbsp; &nbsp; }&nbsp; &nbsp; public static void main(String[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B obB = new B();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//What would be behavior in following line if,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//instance variables overriding is allowed&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obB.getInt();&nbsp;&nbsp; &nbsp; }}这是不合乎逻辑的,因为child class应该有/反映所有行为的parent class。因此,您只能将继承的方法/变量隐藏在中,child class而不能override。以下是Oracle Java文档的摘录,其中指定了可以执行/期望执行的操作child class:您可以按原样使用继承的成员,替换它们,隐藏它们,或用新成员补充它们:继承的字段可以像其他任何字段一样直接使用。您可以在子类中声明一个与超类中的名称相同的字段,从而将其隐藏(不建议)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java