隐式地赋予包访问优先级于子类,因为默认修饰符允许访问包而不是子类,受保护允许访问两者,但没有修饰符允许访问子类但不允许访问包。这对我来说一直感觉很奇怪,因为我自然倾向于认为子类"更接近"父类(即使因为它们毕竟是它们自己的变量),然后是同一个包中的类,而且我经常发现自己处于我希望有 sub 的修饰符而不是包的情况。这可能意味着我以"错误"的方式使用包,但有人可以解释一下这个决定背后的逻辑吗?
当您使用 protected
修饰符时,您将无限制地访问该类。即使您愿意,也可以随时扩展它,即使该类不适合子类化。当你使用 protected
修饰符时,你基本上是说该类(在可预见的未来)将始终适合于子类化。这可能不是您想要的;例如,如果你有一个类应该为一个项目扩展几次,之后就没有了。
当您没有修饰符(默认访问/包私有)时,您将授予对类的有限访问权限。 没有人,甚至你,可以访问包之外的该类,如果你正在做类似上述情况的事情,这是你想要的,其中类特定于你的项目,并且将其扩展到任何其他任意项目都是不合适的。以下是从最高访问权限到最低访问权限的列表:
-
public
: 无限制地访问每个人和一切 -
protected
: 无限制访问,但限制更多 - 默认访问:对有限数量的其他类的有限访问
- 极其有限:无法通过任何方式访问
private
: 访问在 protected
和默认访问之间有第五个访问修饰符,以便任何地方希望扩展它的每个类都应该可以访问它,但如果他们不想扩展它,则无法访问它是多余的,因为它已经以 public abstract
的形式存在。
应用程序需要模块化,这是事实。此外,模块需要具有相互通信的方法。这两个用例是默认和受保护包的用途。
通常,与您正在构建的模块相关的文件位于同一包中。例如:
--my_module
|-- MainModuleClass
|-- HelperA
|-- HelperB
在这种情况下,MainModuleClass
通常具有类型为 HelperA
和 HelperB
的字段,开发模块的团队创建了所有 3 个类 - 因此,"他们知道自己在做什么"。此外,所有这 3 个类都有高度相关的职责 - 它们构成了模块的核心。出于这两个原因,它是使用"包访问"的好地方,因为您可以非常安全地访问其他类的成员。
此外,该模块的测试与模块本身位于同一包中(虽然目录不同,但这无关紧要)。因此,模块的作者可以访问模块类的"默认"访问字段,以读取其内部状态并查看内部行为是否正确。
现在,如果其他开发人员决定通过扩展其中一个类来添加一些功能,那么根据定义,该程序员就是"其他"程序员。他不了解代码,也不了解创建原始组件的第一个团队。因此,某些字段被标记为"受保护",以便仅向想要扩展代码并感到安全的"外部人员"提供访问权限。
总结一下:
- 如果您正在构建模块并希望某些字段只能由模块中的类使用,则默认可见性是要走的路。
- 如果某些字段要由可能想要重用您的模块的其他团队扩展或使用 - 这些字段将受到保护。