繁体   English   中英

最终 class 中的受保护与私有包

[英]Protected vs package-private in final class

我将以我相信我了解访问级别修饰符在 Java 中的工作方式作为开头。 我的问题与在最终 class 中使用时受保护和包私有(无修饰符)之间的区别有关。

据我了解:

  • 如果您将 class 声明为 final,您将无法扩展它,这意味着它不会有任何子类

  • 如果您不向方法(包私有)添加修饰符,则它仅在其自己的 package 中可见

  • 如果您声明一个受保护的方法,它只能在其自己的 package (与 package-private 一样)中访问,此外,在另一个 ZEFE90A8E604A7C840E88D03A67F6B7 中的 class 的子类中可以访问它

我的问题是,如果您的 class 是最终的 class,包私有和受保护之间有什么区别吗? final 修饰符使它不能有任何子类,因此在另一个 package 中似乎没有子类。 这意味着无论哪种情况,它都只会在自己的 package 中可见。

在最终的 class 中,两者之间有区别吗?

如果没有区别,应该使用一个而不是另一个,还是没关系?

如果我们将最终限制(防止继承)应用于访问修饰符的经典表,我们会得到:

经典访问修饰符表

因此,从逻辑的角度来看(如果我们将其研究为卡诺 map两个修饰符packageprotected是等效的(如果应用了最终限制)。

在第二个思考中,我们可以质疑哪个性能更好,哪个更接近良好的设计原则。 考虑到erickson的答案,如果应用了 final 修饰符,两种情况在运行时应该具有相同的性能。 但是从形式上来说把它声明为protected,如果不能继承,就没有意义了。 因此, package (也称为默认不带修饰符应该正确选择

除非涉及子类化,否则protectedno modifier之间没有区别。 由于您将使用final来限制子类化,因此使用protected是没有意义的,即使这样做是正确的。

在此处输入图像描述

如果不能有任何子类,那么protected默认值没有任何优势。

但是, protected的成员和构造函数将出现在 API 文档中。 这可能不是故意的。 有趣的事实: java.net.URL曾经有一个protected的方法,当被另一个替换时被弃用。 现在两者都已被删除。

通常,将成员设为public (不是字段)或private

暂无
暂无

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

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