第七章 封装
- 重构概念:
- 重构就是重写可工作的代码,使之更加可读,易懂,因而更易维护。
- 重构时遇到的问题:
- 要避免修改客户端程序员依赖引用的代码,可在实现代码前通过权限修饰符指明哪些类对于客户端程序员是可用的,哪些是不可用的。
7.1 包的概念
- 包内包含一组类,它们被组织在一个单独的命名空间(namespace)下
- package 包名 这行代码必须是文件中非注释的第一行代码。
- 举例:使用java.util包中的ArrayList类时有两种方法:
public class FullQualification {
public static void main(String[] args) {
java.util.ArrayList list = new java.util.ArrayList(); //包名.类名
}
}
--------------------------------------------------------------
import java.util.ArrayList; //先导包
public class Singleimport {
public static void main(String[] args) {
ArrayList list = new ArrayList(); //直接用类名创建
}
}
7.1.1 代码组织
- .java 编译后得到 .class
- 在 Java 中,可运行程序是一组 .class 文件,它们可以打包压缩成一个 Java文档文件(JAR,使用 jar 文档生成器)。Java 解释器负责查找、加载和解释这些文件。
- package 和 import 这两个关键字将单一的全局命名空间分隔开,从而避免名称冲突。
7.1.2 创建独一无二的包名
- 按照惯例,package 名称反顺序的 Internet域名。例如域名为 xxit.com ,则包名则为com.xxit.。
7.1.3 冲突
import com.mindviewinc.simple.*;
import java.util.*;
- 如果上面导入的两个包中都有一个Vector类,则存在类名冲突。
- 要想使用这个Vector类则必须是包名.类名的形式。
7.1.4 定制工具库
7.1.5 使用import改变行为
7.1.6 使用包的忠告
7.2 访问权限修饰符
- public protected 空(包权限) private
| 修饰符 | 本类中 | 同一个包中 | 不同包(子类) | 不同包(无关类) |
|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| 空 | √ | √ | × | × |
| private | √ | × | × | × |
7.2.1 包访问权限
7.2.2 public:接口访问权限
7.2.3 默认包
7.2.4 private:你无法访问
7.2.5 protected:继承访问权限
7.2.6 包访问权限 Vs Pulic构造器
- 在一个具有包访问权限的类中定义一个 public 的构造器并不能真的使这个构造器成为 public,在声明的时候就应该标记为编译时错误。
package hiding.packageaccess;
class PublicConstructor {
public PublicConstructor() {}
}
7.3 类访问权限
7.3.1 接口和实现
- 访问控制通常被称为隐藏实现(implementation hiding)。将数据和方法包装进类中并把具体实现隐藏被称作是封装(encapsulation)。其结果就是一个同时带有特征和行为的数据类型。
7.4 类访问权限
7.5 本章小结
- 控制成员访问权限有两个原因。
- 第一个原因是使用户不要接触他们不该接触的部分
- 第二个是为了让类库设计者更改类内部而不用担心会影响到客户端程序员。比如最初以某种方式创建一个类,随后发现如果更改代码结构可以极大地提高运行速度。如果接口与实现被明确地隔离和保护,你可以实现这一目的,而不必强制客户端程序员重新编写代码。访问权限控制确保客户端程序员不会依赖某个类的底层实现的任何部分。