访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关
包
包是一个命名空间,包内包含有一组类
比如说java工具库中有一个ArrayList的类,使用这个类的一种方式就是用起全名java.util.ArrayList
java.util.ArrayList list = new java.util.ArrayList();
这样增加了编码量,也不方便阅读。为了解决这个问题java提供了import
import java.util.ArrayList;
这样就可以直接使用ArrayList类了,使用import java.util.*;
可以将java.util中的所有类都导入
默认包:
如果没有使用package
指定类所在的包的话,那么这些类在默认包中,也叫未命名包
代码组织
当编译一个.java文件时,.java文件中的每一个类都会有一个输出文件(.java与.class不是一一对应的关系)
类库实际上是一组类文件。其中每个文件都有一个public类,以及任意数量的非public类(非public类在包外的世界是无法看到的,因为它们存在的意义是给主public类提供支持)
package和import关键字允许你做的,是将单一的全局名字(比如说c语言)空间分割开,这样可以避免出现名称冲突问题
访问修饰权限词
java提供了3个访问权限修饰词,但是其实有四种访问权限。因为如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。
包访问权限
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”,意味着当前的包中的所有其他类对安个成员都有访问权限,但对于这个包之外的所有类,这个成员是private的。
取得对某成员的访问权的途径有:
- 该成员有public修饰
- 不加访问权限修饰词并将其他类放置于同一个包内给成员给予包访问权
- 继承,继承而来的类既可以访问public成员也可以访问protected成员
- 提供get/set方法(就oop而言,这是最优雅的方式)
public:接口访问权限
无论是谁,无论在哪里,都可以访问该成员。
private:你无法访问(用来隐藏实现)
除了包涵该成员的类之外,其他任何类都无法访问这个成员。
默认的包访问权限通常已经提供了充足的隐藏措施,因为使用的类的客户端程序员是无法访问包访问权限成员的。因此通常要考虑的是哪些成员是要声明为public以供客户端程序员使用,在这种情况下,可能会认为不太需要private关键字,因为没有它,照样可以工作。
然而private关键字是相当重要的,比如:可以控制如何创建对象,阻止别人直接访问某个构造函数(或全部构造函数);还有在多线程环境下非常重要。
protected:继承访问权限
基类的创建者有时会希望有某个特定成员,把它的访问权限赋予给派生类而不是所有的类,protected就是完成这一工作的。protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素
类的访问权限
对于类的访问权限,仅有两个选择包访问权限或者public。(一个内部类可以是private或是protected的,这是特例)
类需要包访问权限的情况:包访问权限只可用于该包中,这就可以用来隐藏特定实现细节,客户端程序员是看不到这些类的。