Java—使继承的变量私有化

Java—使继承的变量私有化,java,inheritance,access-modifiers,private-members,Java,Inheritance,Access Modifiers,Private Members,我需要将继承的实例变量设置为私有;这可能吗 也就是说,超类实体有一个int实例变量health 子类Zombie Extends Entity如何从Entity继承健康变量,并使其私有?我不希望其他类能够直接访问health变量,我希望使用set和get方法 如果我不够具体,请告诉我;感谢您的帮助。简单地说:您不能 这将打破超类的契约。您的类作为一个实体,像它的超类一样公开一个名为health的字段。如果您能够将其私有化,那么在实体实例(包括实体子类的实例)中使用此字段的所有代码都将与您的类中断

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

也就是说,超类实体有一个int实例变量health

子类Zombie Extends Entity如何从Entity继承健康变量,并使其私有?我不希望其他类能够直接访问health变量,我希望使用set和get方法

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

简单地说:您不能

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


如果可以,请更改超类ie实体以使字段私有。这是常见的做法。

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

支持使用公共方法创建超类。。并且,假设您被允许在子类中降低对private的可见性

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

SuperClass obj = new SubClass();
obj.pubMethod();
现在,在编译时,编译器看到方法pubMethod在超类中是公共的,它将允许访问。。注意,它不检查RHS上的实例类型

现在,在运行时,当JVM检查实例是否属于子类时,将在子类中搜索它试图调用的实际方法

但是等等。。您看到JVM在您设置为私有的子类中搜索pubMethod时发生了什么吗。。呜呜,呜呜,一声撞击

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

所以,你不能让它成为私人的

第8.4.8.3节:-

覆盖或隐藏方法的访问修饰符§6.6必须 提供至少与重写或隐藏方法相同的访问权限,或 发生编译时错误。更详细地说:

如果重写或隐藏的方法是public,那么重写或隐藏的方法必须是public;否则,将出现编译时错误 发生

如果重写或隐藏方法受保护,则重写或隐藏方法必须受保护或公开;否则 发生编译时错误

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


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


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

您不能向子类中的实例变量添加限制,即健康状态在Entity中受保护,它在Zombie中不能是私有的,您可以将其公开


不过,您可以在实体中将健康设置为私有,并在其中定义受保护的getter和setter。子类可以使用这些方法。

重写方法时,不可能降低方法的可见性。公共->私人你正在降低能见度。太好了,这就是我想要的答案。谢谢