为了账号安全,请及时绑定邮箱和手机立即绑定

Java继承-实例变量覆盖

Java继承-实例变量覆盖

米琪卡哇伊 2019-11-02 10:20:33
为什么超类的实例变量在继承中不被覆盖?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。

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


查看完整回答
反对 回复 2019-11-02
?
偶然的你

TA贡献1841条经验 获得超3个赞

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


隐藏意味着字段的值取决于所访问的类。子类中的字段将“隐藏”超类中的字段,但是两者都存在。


隐藏字段是非常糟糕的做法,但是可以:


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。


绝对不要那样做!那永远不是解决问题的方法,它会产生与继承相关的非常细微的错误。


查看完整回答
反对 回复 2019-11-02
?
浮云间

TA贡献1829条经验 获得超4个赞

因为:


可能会破坏parent class代码。例如考虑以下代码(obB.getInt();如果允许实例变量覆盖,则以下代码中的行的行为是什么):


class A

{

    int aInt;


    public int getInt()

    {

        return aInt;

    }

}


class B extends A

{

    int aInt;


    public int getInt2()

    {

        return aInt;

    }


    public static void main(String[] args)

    {

         B obB = new B();


         //What would be behavior in following line if, 

         //instance variables overriding is allowed

         obB.getInt(); 

    }

}

这是不合乎逻辑的,因为child class应该有/反映所有行为的parent class。


因此,您只能将继承的方法/变量隐藏在中,child class而不能override。


以下是Oracle Java文档的摘录,其中指定了可以执行/期望执行的操作child class:


您可以按原样使用继承的成员,替换它们,隐藏它们,或用新成员补充它们:


继承的字段可以像其他任何字段一样直接使用。

您可以在子类中声明一个与超类中的名称相同的字段,从而将其隐藏(不建议)。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 619 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信