【问题标题】:Java - Making inherited variables PRIVATEJava - 将继承的变量设为私有
【发布时间】:2012-09-27 09:25:29
【问题描述】:

我需要将我继承的实例变量设为私有;这可能吗?

IE,超类“实体”有一个 int 实例变量“健康”。

子类“Zombie”(扩展“Entity”)如何从 Entity 继承健康变量,并将其私有化?我不希望其他类能够直接访问健康变量,我想要为其设置和获取方法。

如果我不够具体,请告诉我;任何帮助表示赞赏。

【问题讨论】:

  • 当你重写一个方法时,不可能降低一个方法的可见性。 Public -> Private 你正在降低知名度。

标签: java inheritance access-modifiers private-members


【解决方案1】:

简单地说:你不能。

这会破坏超类的合同。作为Entity 的类,像它的超类一样公开了一个名为health 的字段。如果您能够将其设为私有,那么在 Entity 实例(包括 Entity 子类的实例)中使用此字段的所有代码都将与您的类中断...

如果可以,请更改超类(即Entity)以使该字段为私有。这是常见的做法。

【讨论】:

    【解决方案2】:

    在超类中将变量设为私有,让所有子类使用访问器方法。

    第二个选择是将其设为包私有,并将您想要拒绝访问的那些类安排在另一个包中。如果您的 Zombie 与 Entity 特别接近(共享许多内部结构),而其他类与其超类的耦合更松散,这将是有意义的。

    【讨论】:

      【解决方案3】:

      您不能降低子类中任何超类的实例变量或方法的可见性..

      假设您有一个带有public method 的超类。并且,假设您被允许在子类中降低对private 的可见性..

      然后看看当你像这样创建对象并访问超类的那个方法时会发生什么:-

      SuperClass obj = new SubClass();
      obj.pubMethod();
      

      现在,在编译时,编译器发现 pubMethod() 方法在 SuperClass 中是公开的,它将允许访问。请注意,它不会检查 RHS 上的 instance type ..

      现在,在运行时,当 JVM 检查实例是否属于 SubClass 时,它将尝试调用的实际方法将在 SubClass.. 中搜索。

      但是等等.. 你看到JVMSubClass 中搜索pubMethod 时发生了什么吗? /p>

      这就是不允许的原因..

      因此,您不能将其设为私有..

      来自JLS 部分 - 8.4.8.3: -

      覆盖或隐藏方法的访问修饰符(第 6.6 节)必须 提供至少与覆盖或隐藏方法一样多的访问权限,或 发生编译时错误。更详细:

      • 如果被覆盖或隐藏的方法是公共的,那么覆盖或隐藏的方法必须是公共的;否则,编译时错误 发生。

      • 如果覆盖或隐藏的方法是受保护的,那么覆盖或隐藏的方法必须是受保护的或公开的;否则, 发生编译时错误。

      • 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不能是私有的; 否则,会发生编译时错误。

      【讨论】:

        【解决方案4】:

        您不能在子类中对实例变量添加限制,即healthEnitity 中是protected,在Zombie 中不能是private(可以设为public)。

        但是,您可以在Entity 中创建健康private 并在那里定义protected getter 和setter。子类可以使用这些方法。

        【讨论】:

        • 完美,这就是我一直在寻找的答案。谢谢!
        猜你喜欢
        • 2018-09-19
        • 2015-09-14
        • 2014-11-17
        • 2014-04-06
        • 2017-12-01
        • 2013-03-11
        • 1970-01-01
        • 2012-12-03
        • 2012-10-31
        相关资源
        最近更新 更多