Java 访问修饰符优先级

Java access modifier priority

Java 访问修饰符隐式地给予包访问优先于 sub类 因为 default 修饰符给予包访问权限而不是 sub类, protected 允许访问两者,但是没有允许访问 sub类 但不允许访问包的修饰符。这对我来说一直感觉很奇怪,因为我自然倾向于将 sub类 "closer" 考虑到父级(即使因为它们毕竟是它们自己的变量)然后是同一个包中的 类 ,而且我经常发现自己处于这样一种情况,我希望为 sub 而不是为 package 使用修饰符。 这可能意味着我以 "wrong" 的方式使用包,但有人能解释一下这个决定背后的逻辑吗?

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

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

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

在这种情况下,MainModuleClass 通常具有 HelperAHelperB 类型的字段,开发该模块的团队创建了所有 3 个 classes - 因此,"they know what they are doing"。此外,所有这 3 classes 都具有高度相关的职责 - 它们构成了模块的核心。由于这两个原因,它是使用 "package access" 的好地方,因为您可以非常安全地访问彼此 class 的成员。

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

现在,如果其他开发人员决定通过扩展其中一个 class 来添加一些功能,那么根据定义,该程序员就是 "other" 程序员。他不了解代码,也不了解创建原始组件的第一个团队。因此,一些字段被标记为 "protected",只允许 "outsiders" 想要扩展代码并感到安全的人访问。

总结一下:

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

当您使用 protected 修饰符时,您将无限制地访问 class。即使 class 不适合 subclassing,也可以随时扩展它。当您使用 protected 修饰符时,您实际上是在说 class 将(在可预见的未来)始终适用于 subclassing。这可能不是您想要的;例如,如果你有一个 class 应该为一个项目扩展几次,之后就不再扩展了。

当您没有修饰符 (default-access/package-private) 时,您授予对 class 的有限访问权限。没有人,甚至你也不能访问包外的那个 class,如果你正在做类似上述情况的事情,这是你想要的,其中 class 特定于你的项目并将其扩展到任何其他任意项目都是不合适的。这是从最高访问权限到最低访问权限的列表:

  • public:无限制访问所有人和所有内容
  • protected:无限制访问但限制更多
  • default-access:有限访问有限数量的其他 classes
  • private: 极其有限的访问:任何东西都无法访问

protected 和 default-access 之间添加第五个访问修饰符,这样每个 class 任何希望扩展它的地方都应该可以访问它,但如果他们不这样做则没有访问权限想扩展它是多余的,因为它已经以 public abstract.

的形式存在