我需要将继承的实例变量设为私有变量;这可能吗?
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
在你制作private
的SubClass
中搜索pubMethod
时发生了什么吗BOoooooMMM--崩溃。。
这就是为什么它是不被允许的。。
所以,你不能把它保密。。
来自JLS第8.4.8.3节:-
重写或隐藏方法的访问修饰符(§6.6)必须提供至少与重写或隐藏方法一样多的访问权限,或者出现编译时错误。更详细地说:
如果重写或隐藏的方法是公共的,则重写或隐藏方法必须是公共的;否则,编译时错误发生。
如果覆盖或隐藏的方法是受保护的,那么覆盖或隐藏方法必须是受保护或公共的;否则出现编译时错误。
如果重写或隐藏的方法具有默认(包)访问权限,则重写或隐藏方法不得为私有方法;否则,将发生编译时错误。
您不能向子类中的实例变量添加限制,即health
在Enitity
中是protected
,在Zombie
中不能是private
(您可以将其设为public
)。
但是,您可以在Entity
中创建healthprivate
,并在那里定义一个protected
getter和setter。子类可以使用这些方法。