Java 中的公共、受保护、包私有和私有之间有什么区别?

在 Java 中,对于何时使用每个访问修饰符(即缺省(包私有)、和 、在进行继承和处理时,是否有明确的规则?publicprotectedprivateclassinterface


答案 1

官方教程可能对您有所帮助。


子类
(相同 pkg)
子类
(差异 pkg)
世界
public + + + + +
protected + + + +
无修饰符 + + +
private +

+ :可访问的
空白:不可访问


答案 2

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

私人

就像你想象的那样,只有声明它的才能看到它。

包私有

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

保护

包私有 + 可由子类或包成员查看。

公共

每个人都可以看到它。

发表

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

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

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

因此,经验法则是使事物仅像它们必须的那样可见。从私有开始,仅根据需要添加更多可见性。只公开用户知道的必要内容,你公开的每一个细节都会限制你重新设计系统的能力。

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

我只坚持“私人”和“公共”。许多OO语言都有这个。“受保护”可能很方便,但这是一种欺骗。一旦一个界面不仅仅是私有的,它就超出了你的控制范围,你必须去寻找其他人的代码来寻找用途。

这就是“发布”的想法的由来。更改接口(重构它)需要您找到使用它的所有代码,并进行更改。如果接口是私有的,那么没问题。如果它受到保护,你必须去找到你所有的子类。如果它是公开的,你必须去找到所有使用你的代码的代码。有时这是可能的,例如,如果您正在处理仅供内部使用的公司代码,那么接口是否是公共的并不重要。您可以从企业存储库中获取所有代码。但是,如果一个接口是“已发布的”,如果有代码在你的控制范围之外使用它,那么你就被束缚了。您必须支持该接口或冒着破坏代码的风险。即使是受保护的接口也可以被认为是已发布的(这就是为什么我不打扰受保护的接口)。

许多语言发现公共/受保护/私有的等级性质过于有限,不符合现实。为此,有一个特质类的概念,但这是另一个节目。


推荐