第六章 访问权限控制
6.1 包:库单元
包内含有一组类,它们在单一的名字空间之下被组织在了一起。
当编写一个Java源代码文件时,此文件通常被称为编译单元。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件名称相同,包括大小写,但不包括后缀名.java。每个编译单元必须只能有一个public类,否则编译器就不会接受。如果在该编译单元之外还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要为主public类提供支持。
如果希望这些构件从属同一个群组,可以使用关键字package,且必须在除注释外的第一行。如果想在其它地方使用群组中的任意public类,需要import导入。
package和import要做的就是将单一的全局名字分割开,无论多少人使用都不会出现名称冲突。
6.2 Java访问权限修饰词
6.2.1 包访问权限
默认访问权限没有任何关键字(有时也表示为friendly),但通常是指包访问权限。当前包内所有类对该成员都有访问权限,但包外的类看来,该成员是private。
取得对某成员的访问唯一途径是:
- 使该成员成为public
- 通过不加访问权限修饰词并放置于同一包内。
- 通过继承而来的类,可以访问public和protected成员,但private不行。(protected和包权限在同一包中相同,但在包外继承时只有关键字protected和public才能访问)
- 提供访问器和变异器(也称get/set方法),对OOP而言,这是最优雅的方式,也是JavaBean的原理。
6.2.2 public:接口访问权限
6.2.3 private:你无法访问
6.2.4 protected:继承访问权限
- 父类的protected成员包内可见,并且对子类可见。
- 若子类与父类不在同一包中,那么在子类中,子类实例可访问从父类继承的protected方法,而不能访问父类实例调用的protected方法。
类内部 本包 子类 外部包public √ √ √ √protected √ √ √ ×default √ √ × ×private √ × × ×
6.3 类的访问权限
- 每个编译单元(文件)都只能有一个public类。
- public类的名称必须完全与含有该编译单元的文件名相同。
- 虽然不常用,但编译单元内完全不带public类也是可能的。
- 所以对于类的访问权限,仅有两个选择:包访问权限或public。