我需要将继承的实例变量设为私有;这可能吗?
IE,超类“实体”有一个 int 实例变量“健康”。
子类“僵尸”(扩展“实体”)如何从实体继承健康变量,并将其私有化?我不希望其他类能够直接访问健康变量,我想要为其设置和获取方法。
如果我不够具体,请告诉我;任何帮助表示赞赏。
我需要将继承的实例变量设为私有;这可能吗?
IE,超类“实体”有一个 int 实例变量“健康”。
子类“僵尸”(扩展“实体”)如何从实体继承健康变量,并将其私有化?我不希望其他类能够直接访问健康变量,我想要为其设置和获取方法。
如果我不够具体,请告诉我;任何帮助表示赞赏。
简单地说:你不能。
这将打破超类的合同。你的类,作为一个Entity
,像它的超类一样,暴露了一个名为 的字段health
。如果您有能力将其设为私有,则在实例Entity
(包括实体子类的实例)中使用此字段的所有代码都会与您的类中断......
如果可以,请更改超类(即Entity
)以使该字段为私有。这是常见的做法。
您不能降低子类中超类的任何实例变量或方法的可见性。
假设您有一个带有public method
.. 的超级类,并且假设您被允许降低private
对子类的可见性..
然后看看当你创建这样的对象并访问超类的方法时会发生什么: -
SuperClass obj = new SubClass();
obj.pubMethod();
现在,在编译时,编译器看到该方法pubMethod()
是 public in SuperClass
,它将允许访问。请注意,它不会检查instance type
RHS 上的 ..
现在,在运行时,当 JVM 检查实例是否属于 时SubClass
,它将尝试调用的实际方法将在SubClass
..
但是等等.. 你有没有看到当你去JVM
搜索pubMethod
时发生了什么......SubClass
private
这就是为什么它是不允许的。。
因此,您不能将其设为私有..
从JLS部分 - 8.4.8.3: -
覆盖或隐藏方法的访问修饰符(第 6.6 节)必须提供至少与覆盖或隐藏方法一样多的访问权限,否则会发生编译时错误。更详细地说:
如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏的方法必须是公开的;否则,会发生编译时错误。
如果被覆盖或隐藏的方法是受保护的,那么覆盖或隐藏的方法必须是受保护的或公开的;否则,会发生编译时错误。
如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不能是私有的;否则,会发生编译时错误。
在超类中将变量设为私有,并让所有子类使用访问器方法。
第二种选择是将其设置为包私有,并将您想要拒绝访问的那些类安排在另一个包中。如果您的 Zombie 与 Entity 特别接近(共享许多内部结构),而其他类与其超类的耦合更松散,这将是有意义的。
您不能对子类中的实例变量添加限制,即 of health
is protected
inEnitity
它不能private
在其中Zombie
(您可以 make it public
)。
但是,您可以private
在其中创建健康Entity
并定义一个protected
getter 和 setter。子类可以使用这些方法。