访问控制(或隐藏具体实现)与“初的实现并不恰当”有关。
  所有的作者,包括那些编写软件的程序员,都清楚其著作的某些部分直至重新创作的时候才变得完美,有时甚至要反复重写多次。如果你把一个代码段放到了某个位置,等过一会儿回头再看时,有可能发现有更好的方式去实现相同的功能。
  这正是重构的原动力之一,重构即重写代码,以使得它更可读、更易理解,并因此而更具可维护性。
  但是,这种修改和完善代码的愿望之下,也存在着问题。通常总是会有一些消费者(客户端程序员)需要你的代码在某些方面保持不变。因此你想改变代码,而他们却想让代码保持不变。
  由此而产生了在面向对象设计时需要考虑的一个基本问题:“如何把变动的事物与保持不变的事物区分开来”
  这对类库(library)而言尤为重要。该类库的消费者必须依赖他所使用的那部分类库,并且能够知道如果类库出现了新版本,他们并不需要改写代码。从另一个方面来说,类库的开发都必须有权限进行修改和改进,并确保客户代码不会因为这些改动而受到影响。
  为了解决这一问题,Java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的。
  访问权限控制的等级,从大权限到小权限依次为:
  public protected 包访问权限(默认,没有关键词) private
  其中仍旧存在着如何将构件捆绑到一个内聚的类库单元中的问题。
  对于这一点,Java用关键字package加以控制。
  1 包:库单元
  包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
  代码组织
  当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。
  Java解释器负责这些文件的查找、装载和解释。
  类库实际上是一组类文件。其中每个文件都有一个public类,以及任意数量的非public类。因此每个文件都有一个构件。如果希望这些构件(每一个都有它们自己的独立的.java和.class文件)从属于同一个群组,可以使用关键字package.
  Java解释器的运行过程如下:
  首先,找出环境变量CLASSPATH。
  CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。
  从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CALSSPATH根中产生一个路径名称。
  得到的路径会与CLASSPATH中的各个不同的项相连接,解释器在这些目录中查找与你所要创建的类名称相关的.class文件。
  2 访问权限修饰词 包访问权限
  默认访问权限没有任何关键字,但通常是指包访问权限。
  这意味着当前的包中的所有其他类对那个成员都有访问权限,但是对于这个包之外的所有类,这个成员却是private.
  public:接口访问权限
  使用关键字public,意味着public之后紧跟着的成员声明自己对每个人都是可用的,尤其是使用类库的客户程序员更是如此。
  private:你无法访问
  关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
  protected:继承访问权限
  关键字protected处理的是继承的概念,通过继承可以利用一个现有类–我们称其为基类,然后将新成员添加到该现有类中而不必碰该现有类。还可以改变该类的现有成员的行为。
  3 接口的实现
  访问权限的控制常被称为是具体实现的隐藏。
  把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
  出于两个很重要的原因,访问权限控制将权限的边界划在了数据类型的内部。
  第一个原因是要设定客户端程序员可以使用和不可以使用的界限。
  第二个原因是将接口和具体实现进行分离。
  4 类的访问权限
  在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。
  每个编译单元(文件)都只能有一个public类。
  public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
  虽然不是很常用,但编译单元内不带public类也是可能的。这种情况下,可以随意对文件命名。
  5 总结
  控制对成员的访问权限有两个原因。
  第一是为了使用户不要碰那些他们不该碰触的部分,这些部分对于类内部的操作是必要的,但是它并不属于客户端程序员所需要的接口的一部分。
  第二个原因,也是重要的原因,是为了让类库设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。
  类的公共接口是用户真正能够看到的,所以这一部分是在分析和设计的过程中决定该类是否正确的重要部分。