信息隐藏可以有效地解除组成系统的各模块之间的耦合关系,使这些模块可以独立地开发、测试、优化、使用、理解和修改。
Java程序设计语言提供了许多机制来协助信息隐藏。访问控制机制决定了类、接口和成员的可访问性。实体的可访问性是由该实体声明所在的位置,以及该实体声明中所出现的访问修饰符(private、protected和public)共同决定的。
- 尽可能地使每个类或者成员不被外界访问。
- 对于顶层(非嵌套的)类和接口,只有两种可能访问的级别:包级私有的(package-private)和公有的(public)。
如果一个包级私有的顶层类(或者接口)只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个类的私有嵌套类。
对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别:
-
私有的(private)——只有在声明该成员的顶层类内部才可以访问这个成员。
-
包级私有的(package-private)——声明该成员的包内部的任何类都可以访问这个成员。它被称为“缺省(default)访问级别”,如果没有为成员指定访问修饰符,就采用这个访问级别。
-
受保护的(protected)——声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。
-
公有的(public)——在任何地方都可以访问该成员。
有一条规则限制了降低方法的可访问性的能力。如果方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于超类中的访问级别。这样可以确保任何可使用超类的实例的地方都可以使用子类的实例。
如果一个类实现了一个接口,那么接口中所有的类方法在这个类中也都必须被声明为公有的,因为接口中的所有方法都隐含着公有访问级别。
实例域决不能是公有的。包含公有可变域的类并不是线程安全的。