Java-使继承的变量PRIVATE



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

IE,超类"Entity"有一个int实例变量"health"。

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

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

简单地说:你不能。

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

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

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

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

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

假设你有public method的超级课。。并且,假设您被允许在子类中降低private的可见性。。

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

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

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

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

但是等等。。你看到JVM在你制作privateSubClass中搜索pubMethod时发生了什么吗BOoooooMMM--崩溃。。

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

所以,你不能把它保密。。

来自JLS第8.4.8.3节:-

重写或隐藏方法的访问修饰符(§6.6)必须提供至少与重写或隐藏方法一样多的访问权限,或者出现编译时错误。更详细地说:

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

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

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

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

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

最新更新