Java访问修饰符优先级

时间:2016-07-15 17:05:20

标签: java architecture modifiers

Java访问修饰符隐式地为子类提供对包的访问优先级,因为默认修饰符可以访问包而不是子类, protected 允许访问两者,但是没有允许访问子类但不允许访问包的修饰符。这对我来说总是让人觉得奇怪,因为我自然倾向于考虑子类"更接近"到了父级(即使因为它们毕竟是他们自己的变量)然后是同一个包中的类,而且我经常发现自己处于我想要修改子而不是包的修饰符的情况。 这可能意味着我在"错误"方式,但有人可以解释这个决定背后的逻辑吗?

2 个答案:

答案 0 :(得分:1)

当您使用protected修饰符时,您可以无限制地访问该类。即使该类不适合子类化,也可以随时扩展它。当你使用protected修饰符时,你基本上会说类(对于可预见的未来)总是适合子类化。这可能不是你想要的东西;例如,如果你有一个应该为项目扩展几次的类,那么之后就没有了。

如果没有修饰符(default-access / package-private),则表示您对该类的访问权限有限。没有人,甚至不是你,都可以在包之外访问该类,如果您正在执行类似上述情况的操作,那么这是您想要的,其中类是特定于您的项目并将其扩展到任何其他类任意项目都不合适。以下是从最高访问权限到最低访问权限的列表:

  • public:无限制访问所有人和所有内容
  • protected:无限制访问但限制性更强
  • default-access :对有限数量的其他类的有限访问
  • private:极其有限的访问权限:无法通过任何方式访问

要在protected和默认访问权限之间设置第五个访问修饰符,以便希望扩展它的任何地方的每个类都应该有权访问它,但如果他们不想扩展它,则无法访问它是多余的,因为它已经以public abstract

的形式存在

答案 1 :(得分:0)

应用程序需要模块化,这是事实。此外,模块需要具有彼此通信的手段。这两个用例是默认包和受保护包的用途。

通常,与您正在构建的模块相关的文件位于同一个包中。例如:

--my_module
 |-- MainModuleClass
 |-- HelperA
 |-- HelperB

在这种情况下,MainModuleClass通常包含HelperAHelperB类型的字段,开发模块的团队创建了所有3个类 - 因此,“他们知道他们在做什么”。此外,所有这三个类都有很高的相关责任 - 它们构成了模块的核心。由于这两个原因,它是一个使用“包访问”的好地方,因为您可以非常安全地访问每个其他班级的成员。

此外,该模块的测试与模块本身在同一个包中(尽管目的不同,但这并不重要)。因此,模块的作者可以访问模块类的“默认”访问字段来读取其内部状态,并查看内部行为是否正确。

现在,如果其他开发人员决定通过扩展其中一个类来添加一些功能,那么程序员根据定义就是“其他”程序员。他不知道代码以及创建原始组件的第一个团队。因此,某些字段被标记为“受保护”,只允许访问希望扩展代码并感到安全的“局外人”。

总结:

  1. 如果您正在构建模块并希望某些字段仅可由模块中的类使用 - 默认可见性是可行的方法。
  2. 如果某些字段要由其他可能想要重复使用模块的团队进行扩展或使用 - 那些字段将受到保护。