在Java中,是否有关于何时使用每个访问修饰符的明确规则,即默认(包私有)、 public
、 protected
和 private
、 class
和 interface
并处理继承?
原文由 intrepion 发布,翻译遵循 CC BY-SA 4.0 许可协议
在Java中,是否有关于何时使用每个访问修饰符的明确规则,即默认(包私有)、 public
、 protected
和 private
、 class
和 interface
并处理继承?
原文由 intrepion 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
官方教程 可能对你有些用处。
班级包裹子类
(相同的包装)子类
(差异包装)世界
public
+ + + + +protected
+ + + +没有修饰符+ + +private
++ : 可访问
空白:不可访问