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