第六章 访问权限控制
访问控制(或隐藏具体实现)与 “最初的实现并不恰当有关”。重构即重写代码,以使得它更可读、更易理解,并因此而更具可维护性。
1.访问权限
- 访问权限控制的等级,从最大权限到最小权限依次为: public 、 protected 、 包访问权限(没有关键词)可以被称为 default 和 private 。
- 对于如何将构件捆绑到一个内聚的类库单元中的问题,java 用关键字 package 加以控制。
- 包内有一组类,他们在单一的名字空间之下被组织在了一起。
2. 关于包名
- 当编写一个 java 源代码文件的时候,这个文件通常被称为编译单元 ( 有时候也被称为转译单元 ) ,每个编译单元都必须有一个 .java 的后缀名,在编译单元内有一个 public 类,这个类的名称必须与文件名称相同,包括大小写,每个编译单元只能有一个 public 类,否则编译器不会接受。
- 当编译一个 .java 文件的时候,在 .java 文件中的每个类都会有一个输出文件,这个输出文件的名称与 .java 文件中每个类的名称相同,只是多了一个后缀名 .class 文件。
- 类库实际上是一组类文件,其中每个文件都有一个 public 类,以及任意数量的非 public 类 ,因此每个文件都有一个构件,如果希望这些构件从属于一个群组,就可以使用关键字 package
- 如果使用 package 语句,他必须是文件中除了注释以外的第一句程序代码。书写必须全部小写
- 按照惯例, package 名称的第一部分是类的创建者的反顺序的 Internet 域名,第二部分是把 package 名称分解为你机器上的一个目录。
- 当时用 import 导入包时,编译器就在执行到的时候,在 CLASSPATH 所指定的目录中查找,找到这个包后,从已经编译的文件中找出名称相符合的类进行调用。
- 无论什么时候使用包,都已经在给定包的名称的时候隐含地指定了目录结构,这个包必须位于其名称所指定的目录之中,这个目录必须是在以 CLASSPATH 开始的目录中可以查询到的
- 编译的代码通常放在与源代码的不同目录中,但是必须保证 JVN 使用 CLASSPATH 可以找到这个路径
3.关于这四个访问权限
1.包访问权限
- 默认的访问权限是包访问权限,没有任何关键字,也被称为(friendly),这意味着当前的包中的所有其他类对那个成员都有访问权限,但是对于这个包外的所有类,这个成员是 private 。 由于一个编译单元(一个文件)只能隶属于一个包。所以经由包访问权限,处于同一个编译单元的所有类彼此之间都是可以自动访问的。
包访问权限允许将包内所有相关的类组合起来,以使他们之间可以轻松地相互访问。类控制着哪些代码有权访问自己的成员。
-----------
想要取得对某个成员访问权限的几个途径:
- 使这个成员成为 public ,于是无论是谁,无论在哪里,都可以访问这个成员。
- 通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包访问权限,于是包内的其他类也就可以访问这个成员了。
- 通过继承而来的类既可以访问 public 成员也可以访问 protected 成员,但是不能访问 private 成员,当两个类都处于同一个包的时候,才可以访问包访问权限的成员。
- 提供访问器(accessor)和变异器(mutator)方法(也称为get/set方法)
2. 接口访问权限
- 使用关键字 public ,就意味着 public 之后紧跟着的成员声明自己对每个人都是可以访问的,尤其是使用类库的客户程序员更是如此。
3. private 你无法访问
- 关键字 private 的含义是,除了包含该成员的类之外,其他任何类都无法访问这个成员。因为除了处于同一个包内的其他类是无法访问 private 成员的,所以相当于隔离了自己。private 允许你随意改变该成员,而不用担心是否会影响到包内的其它类。
- 默认的包访问权限已经提供了很好的隐藏措施,使用类的客户端程序是无法访问包访问权限成员的。
4. protected 继承访问权限
- protected也提供包访问权限,也就是说同一个包内的其他类可以访问 protected 元素。
4. 接口和实现
访问权限的控制常常被称为是 具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
为了清楚起见,可能会采用一种将 public 成员置于开头,后面跟着 protected 、 包访问权限 和 private 成员的创建类的形式。
5. 类的访问权限
- 如果希望某个类可以为某个客户端程序员所用,就可以通过把关键字 public 作用于整个类的定义来达到目的。修饰词必须出现在 关键字 class 之前。
- 每个编译单元只能有一个 public 类
- public 类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
- 类既不可以是 private(这样会使除了这个类之外,其他类都不能访问他),也不能是 protected 。所以对于类的访问权限,只有两个选着,就是:包访问权限或者 public
- 单例模式,只能创建它的一个对象
由本人从 Thinking in java ( java 编程思想 ) 整理而来