我需要将我继承的实例变量设为私有;这有可能吗?
IE,超类“实体”有一个int实例变量“health”。
子类“Zombie”(扩展“实体”)如何从Entity继承健康变量,并将其保密?我不希望其他类能够直接访问健康变量,我想为它设置并获取方法。
告诉我,如果我不够具体;任何帮助表示感谢。
答案 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
中进行搜索。
但是等等..您是否看到SubClass
在JVM
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。子类可以使用这些方法。