Java - 继承变量PRIVATE

时间:2012-10-06 11:49:20

标签: java inheritance access-modifiers private-members

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

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

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

告诉我,如果我不够具体;任何帮助表示感谢。

4 个答案:

答案 0 :(得分:3)

简单地说:你不能。

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

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

答案 1 :(得分:2)

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

假设你有一个public method的超类..而且,假设你被允许在子类中降低private的可见度..

然后看看在创建这样的对象时会发生什么,并访问超类的方法: -

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

现在,在编译时,编译器看到方法pubMethod()SuperClass中是公共的,它将允许访问..注意它不会检查{{ 1}}在RHS ..

现在,在运行时,当JVM检查实例是instance type时,那么它将尝试调用的实际方法将在SubClass中进行搜索。

但是等等..您是否看到SubClassJVM pubMethod中搜索SubClass时发生了什么private .. BOoooooMMM - 崩溃..

这就是为什么不允许这样做..

所以,你不能把它私有化..

来自JLS部分 - 8.4.8.3: -

  

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

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

  •   
  • 如果被覆盖或隐藏的方法受到保护,则必须保护或隐藏覆盖或隐藏方法;除此以外,   发生编译时错误。

  •   
  • 如果重写或隐藏方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法;   否则,发生编译时错误。

  •   

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您不能在子类中为实例变量添加限制,即health protected Enitity private Zombie public private可以使它成为Entity

但是,您可以在protected中设置健康{{1}}并在那里定义{{1}} getter和setter。子类可以使用这些方法。