Chapter 6 Access Controll
访问控制(或隐藏具体实现)对于代码在开发者和用户共同使用的情况,也能保持更新改进至关重要。
- 面向对象设计中必须考虑的一个问题:如何把变动的事物与保持不变的事物区分开来。
- 对于libraray的使用者来说,必须确保类库改动后,他们不需要改写代码。
- 对于library的来发着来说,必须有权限进行修改和改进,并确保客户代码不会受到影响
- 为此Java提供了访问权限修饰词,以供类库开发人员向使用者说明哪些方法是可用的,哪些是不可用的,确保之后的改进和更新不会引起使用者的麻烦。
- 此外private能够修饰构造函数,实现一些范式。
6.1 Package
- package内的一组class在单一namespace下被组织在了一起。
- Java使用package来避免重名问题,以及提供一个包内级别的访问控制。
- 一个编译单元(.java文件)只能包含一个和文件同名的public类,其他类都只能包内可见。
- pacakge只能写在第一句(除注释),并且小写,同时使用操作系统的文件层次结构来对应.class文件包结构。
- 同样,Java解释器会根据CLASSPATH作为查找的根目录,在将包名转换为目录路径查找.class文件。
- 没有显示定义package的类会被分到默认包中。
6.2 Java 访问权限修饰词
访问权限修饰词包括public,protected和private三个,如果不提供任何访问权限修饰词,就表示为"包访问权限"。
类、域和方法,无论如何都会包含以上四种之一的访问权限。
包访问权限
- 如果不提供任何访问权限修饰词,就表示为"包访问权限"(friendly)。
- 在同一个包下的类自动可以访问,之外的不能访问。
- 一般类库的访问权限包就可以,一个包一般有类库开发者开发。
public 接口访问权限
- public就是所有地方都可以访问
- 一个编译单元只能有一个public class
private 类使用者无法访问
- private 除了包含该成员的类之外,其他任何类都无法访问。
- 修饰类时,只有内部类都用private修饰。
- 一般将一个类的内的助手方法或助手内部类设private,以防止包内其他地方误用到。
- private能够修饰构造函数,使得创建对象的方法得到限制。
protected 继承访问权限
- 当子类和父类不为一个包时,子类能够访问protected修饰的父类成员。
- protected>默认权限,同样能够访问包内。
6.3 接口和实现
- 把数据和方法包装金类中,以及具体实现的隐藏,称作是封装。
- 1.通过访问修饰符分离客户端程序员可以使用和不可以使用的界限
- 2.将接口和实现分离,类库程序员就可以随意更改不是public的东西,而不会破坏客户端代码。
- 建议将访问权限控制低的放在靠前的地方,使客户端程序员能够更快的阅读代码。
6.4 类的访问权限
- 每个编译单元(.java文件)都只能有一个public类,却必行同名。
- 类可以是包访问权限和public,只有内部类才能是private和protected的。
- 可以将类的构造器设为private,并提供静态public方法以限制的方法提供类的实例。
6.5 总结
- 类库的开发者和用户通过访问控制进行了代码界限的约定,使得双方都能更合理地进行工作。
- 访问修饰符也提供了代码的封装性,使得用户只需要关注他们能够使用的接口。