0

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

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

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

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

4

4 回答 4

3

简单地说:你不能。

这将打破超类的合同。你的类,作为一个Entity,像它的超类一样,暴露了一个名为 的字段health。如果您有能力将其设为私有,则在实例Entity(包括实体子类的实例)中使用此字段的所有代码都会与您的类中断......

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

于 2012-10-06T11:51:02.667 回答
2

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

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

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

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

现在,在编译时,编译器看到该方法pubMethod()是 public in SuperClass,它将允许访问。请注意,它不会检查instance typeRHS 上的 ..

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

但是等等.. 你有没有看到当你去JVM搜索pubMethod时发生了什么......SubClassprivate

这就是为什么它是不允许的。。

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

JLS部分 - 8.4.8.3: -

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

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

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

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

于 2012-10-06T11:51:26.863 回答
2

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

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

于 2012-10-06T11:53:10.527 回答
1

您不能对子类中的实例变量添加限制,即 of healthis protectedinEnitity它不能private在其中Zombie(您可以 make it public)。

但是,您可以private在其中创建健康Entity并定义一个protectedgetter 和 setter。子类可以使用这些方法。

于 2012-10-06T11:54:12.250 回答