Java 中的 public、protected、package-private 和 private 有什么区别?

新手上路,请多包涵

在Java中,是否有关于何时使用每个访问修饰符的明确规则,即默认(包私有)、 publicprotectedprivateclassinterface 并处理继承?

原文由 intrepion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 658
2 个回答

官方教程 可能对你有些用处。


班级包裹子类

(相同的包装)子类

(差异包装)世界public + + + + +protected + + + +没有修饰符+ + +private +

+ : 可访问

空白:不可访问

原文由 David Segonds 发布,翻译遵循 CC BY-SA 4.0 许可协议

(警告:我不是 Java 程序员,我是 Perl 程序员。Perl 没有正式的保护,这也许就是为什么我如此理解这个问题的原因:))

私人的

正如您所想,只有声明它的 才能看到它。

包私有

它只能被声明它的 看到和使用。这是 Java 中的默认设置(有些人认为这是错误的)。

受保护

Package Private + 可以被子类或包成员看到。

民众

每个人都可以看到它。

发表

在我控制的代码之外可见。 (虽然不是 Java 语法,但对于本次讨论很重要)。

C++ 定义了一个称为“朋友”的附加级别,您对此了解得越少越好。

你应该什么时候使用什么?整个想法是封装以隐藏信息。您希望尽可能地向用户隐藏某事如何完成的细节。为什么?因为这样您以后就可以更改它们而不会破坏任何人的代码。这使您可以优化、重构、重新设计和修复错误,而不必担心有人在使用您刚刚大修过的代码。

因此,经验法则是让事物只在它们必须呈现时才可见。从 private 开始,只在需要时增加可见性。只公开用户需要知道的内容,你公开的每一个细节都会限制你重新设计系统的能力。

如果您希望用户能够自定义行为,而不是将内部结构公开以便他们可以覆盖它们,那么将这些内脏塞入一个对象并公开该接口通常是一个更好的主意。这样他们就可以简单地插入一个新对象。例如,如果您正在编写一个 CD 播放器并希望“查找有关此 CD 的信息”位可自定义,而不是将这些方法公开,您可以将所有功能放入其对象中并只公开您的对象 getter/setter。通过这种方式,在暴露你的胆量方面吝啬鼓励良好的组合和关注点分离

我只坚持“私人”和“公共”。许多面向对象的语言都有。 “Protected”可以派上用场,但它是一种欺骗。一旦一个接口不仅仅是私有的,它就在你的控制之外,你必须去寻找其他人的代码来找到用途。

这就是“已发布”概念的用武之地。更改接口(重构它)要求您找到所有使用它的代码并对其进行更改。如果接口是私有的,那没问题。如果它受到保护,你必须去寻找你所有的子类。如果它是公开的,你必须找到所有使用你的代码的代码。有时这是可能的,例如,如果您正在处理仅供内部使用的公司代码,则接口是否公开并不重要。您可以从公司存储库中获取所有代码。但是,如果一个接口是“已发布”的,如果有代码在您的控制范围之外使用它,那么您就完蛋了。您必须支持该接口或冒破坏代码的风险。甚至受保护的接口也可以被认为是已发布的(这就是为什么我不理会受保护的原因)。

许多语言发现 public/protected/private 的等级性质过于局限,不符合现实。为此,有一个 trait class 的概念,但那是另一个节目。

原文由 Schwern 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题