Java访问修饰符在子类中明确授予接入优先级的包,因为默认修改可以访问的包而不是子类,保护允许同时访问,但没有修饰符允许访问子类而不是包。这对我来说总觉得很奇怪,因为我自然倾向于认为子类与父类“更接近”(即使因为它们是他们自己的变量),然后是同一个包中的类,并且我经常发现自己处于I想要修饰符为sub,但不是为包。 这可能意味着我以“错误”的方式使用软件包,但是有人可以向我解释这个决定背后的逻辑吗?Java访问修饰符优先
回答
当您使用protected
修饰符时,您可以无限制地访问该类。只要你愿意,即使这个类不适合继承子类,也可以扩展它。当您使用protected
修饰符时,您基本上认为该类(对于可预见的将来)始终适合子类化。这可能不是你想要的;例如,如果您有一个班级应该为某个项目延长几次,并且在此之后不再进行。
如果您没有修饰符(默认访问/包私有),您可以限制对该类的访问。没有人,甚至连你都不能访问该包之外的那个类,如果你正在做类似上述情况的事情,那么这是你想要的东西,其中类是特定于你的项目的,并将它扩展到任何其他任意项目会不合适。这里是最高的访问到最低的访问列表:
public
:无限制访问每个人和每件事protected
:无限制访问,但更严格的- 默认访问:有限的访问量有限极其有限的访问:不能访问任何通过任何
private
的210 要在protected
与默认访问之间有第五个访问修饰符,以便希望扩展它的任何类都可以访问它,但如果不想扩展它们则无法访问是多余的,因为它已经存在形式为public abstract
。
I find myself in the situation where I would like to have the modifier for sub but not for the package
为什么?如果你向包成员公开某些东西,那么如果不必要的话,不要使用它们就取决于你。软件包背后的思想优先于继承,它允许您将功能封装在多个类的组合中,而无需将其嵌套到另一个类中。
考虑你正在开一辆车。你有同样的包装中的汽车类和轮班。你想为每个人展示一些轮子的方法(getRadius(),getColor(),geAngularSpeed()),但你也想保留一些方法隐藏一切,但汽车类(setAngularSpeed())。
应用程序需要模块化,这是事实。另外,这些模块需要有相互通信的手段。这两个用例是默认和受保护的软件包的用途。
通常,与您正在构建的模块相关的文件位于同一个包中。例如:
--my_module
|-- MainModuleClass
|-- HelperA
|-- HelperB
在这种情况下,MainModuleClass
通常有HelperA
类型和HelperB
和开发团队创建的所有3类模块的领域 - 因此,“他们知道自己在做什么”。而且,所有这三个类都具有高度相关的责任 - 它们是你模块的核心。由于这两个原因,使用“包访问”是一个很好的地方,因为您可以非常安全地访问其他类的成员。
此外,这个模块的测试与模块本身在同一个包中(尽管不同的目录,但没关系)。因此,模块的作者可以访问模块类的“默认”访问字段来读取它们的内部状态并查看内部行为是否正确。
现在,如果其他开发人员决定通过扩展其中一个类来添加某些功能,则该程序员根据定义是“其他”程序员。他不知道代码以及创建原始组件的第一个团队。因此,有些字段被标记为“受保护”,只允许访问想要扩展代码并感到安全的“外部人员”。
总结:
- 如果你正在建设一个模块,并希望某些字段只能通过你的模块中的类是可用的 - 默认可见性是要走的路。
- 如果某些字段需要扩展或由其他可能想要重用模块的团队使用 - 那些字段将被保护。
- 1. Java默认访问修饰符
- 2. 在java中访问'final'修饰符类
- 3. 关于java最终访问修饰符
- 4. 通过访问修饰符
- 5. 保护访问修饰符
- 6. 包访问(protected修饰符)
- 7. 类访问修饰符
- 8. EventInfo访问修饰符
- 9. Java访问修饰符的访问范围
- 10. 访问修饰符C# - 内部修饰符
- 11. 应该先修改哪个修饰符?
- 12. Java设计问题 - 类,函数,访问修饰符
- 13. 类和访问修饰符在.NET
- 14. 类成员访问修饰符
- 15. 了解默认访问修饰符
- 16. 什么是访问修饰符
- 17. 没有访问修饰符的方法
- 18. 访问修饰符的正确应用
- 19. 公共和私人访问修饰符
- 20. C++继承与访问修饰符
- 21. Doxygen与C#内部访问修饰符
- 22. C#内部访问修饰符
- 23. python - 嵌套类访问修饰符
- 24. 检查方法的访问修饰符
- 25. c#winform控件访问修饰符
- 26. C#访问修饰符与传承
- 27. javascript中的类和访问修饰符
- 28. 属性的不同访问修饰符?
- 29. 自动重构访问修饰符
- 30. 函数的SQL Server访问修饰符
这些子类自然不会在同一个包中? – Gendarme
@Gendarme就像你的每一个摇摆应用程序最终在javax.swing包中? –
@CoderinoJavarino仅仅因为有人在申请应用程序并不意味着它是一个供外部使用的公共图书馆。 OP很可能会制作一个私人项目,其中所有的子类都将与jar一起打包。 –