繁体   English   中英

Java中的可见性问题

[英]Visibility issue in Java

我来自C ++,实际上我还没有真正在大学中使用过类继承,所以我正在自己学习。 我将以示例的形式表示怀疑:

假设我有一个叫做Entity的类。 该实体类包含两个表示某些X和Y坐标的整数(这无关紧要,可以是任何其他字段)。 然后,我有了我的班级玩家,扩展了Entity。 似乎通常,我希望Player也使用x和y字段,并且Entity类中的某些代码也引用了这些字段。

现在我怀疑。 x和y是公共的,私有的还是受保护的? 我觉得应该保护它们,因为public不是一个选择(其他类不应访问它),而private不允许我使用扩展(Player)类中的x和y字段。 但是我在其他地方读到,永远不要只对方法保护类字段。

除了想到将变量设置为protected以外,其他解决方案还包括使用超类的getter和setter(我认为这不仅是一种不好的做法,而且是完全多余和不必要的),或者在这些类中重新声明这些属性。新类,让我考虑是否必须两次键入所有字段声明才能从继承中获得任何回报。 实际上,我什至不知道这最后的方法是否可行,因为我不了解Java,也不知道Java如何处理这种可见性问题。

任何有关该主题的帮助将不胜感激。

谢谢。

[使用getter和setter] ...在我看来,这不仅是一种不好的做法,而且是完全多余且不必要的

实际上不,这通常被认为是最佳方法。 从可维护性到安全性, 有很多理由支持它。 您可以将字段设为private ,并在基类中声明方法以访问和更改它们。

如果要通过subclass访问变量,则需要对其进行protected 但是仍然可以从其他classes来访问这些package但可以使用相同的package 但是,那些继承者将受到保护,免受包外部类的侵害,除非那些继承了定义了变量的类的人。

是的,您应该定义setters来访问它们,而不是将变量本身设为私有。 这一点都不是坏习惯,实际上是所有面向对象编程中的最佳实践。

这实际上取决于Entity类的目的 如果它只是x和y的持有者-因为您的许多类都将使用它们,那么对它们进行保护就可以了。

如果有任何逻辑绑定到这些坐标-特别是验证,则某些事件会发生更改。 然后,您需要使用getters / setter方法将此逻辑封装在Entity类中。

只要其他开发人员不依赖它,什么都不会做,您可以始终对其进行修改。 如果您还有其他依赖于代码的内容,则必须更安全地进行设计。 但是不要过度设计。

在这种情况下,您不能不使用访问说明符吗? 使用protected (除非我误会了)允许所有子类(包括来自不同包的子类)进行访问。 在大多数(但不是全部)情况下,您只是为自己编写一个小程序,如果希望子类访问超类的变量,则可能没有访问说明符。

此图片应该为您提供有关所有不同访问说明符的信息。 “包”列是指同一包中的子类,而“子类”列是指与包无关的子类。 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM