- 摘要:
- 面向对象设计中需要考虑的一个基本问题:“如何把变动的事物和保持不变的事物区分开来”
- 如类库,类库的消费者必须依赖于所使用的那部分类库,并且能够知道如果类库出现了新版本,他们并不需要改写代码。
- 解决办法:java提供了访问权限的修饰词,以供类库开发人员向客户端程序员(调用类库的程序员)指明哪些是可用的,哪些是不可用的。
- 作为一名类库设计者,你会尽可能将一切方法都定义为private,而仅向客户端程序员公开你愿意让他们使用的方法,这样做是完全正确的。
6.1 包:库单元
包内含有一组类,他们在单一的名字空间之下被组织在一起。
编译单元:
当编写一个java源代码文件时,此文件通常被称为编译单元(有时候也被称为转译单元)每个编译单元都必须有一个后缀名.java
每个编译单元只能有一个public类,否则编译器不会接受,如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们只要用来为主public类提供支持
6.1.1 代码组织
关键字package(将从属与一个群组的文件放在一起,创建独一无二的包名)
关键字import(可以使代码更加简洁)
- 冲突
- 可以使用单个类导入的方式来防止冲突(减少使用类似 inport java.util.*的方式引入类库)
6.1.5 对使用包的忠告
如果告知无法找到特定的类:
哪怕是这个类就位于同一个目录中,如果你收到类似的信息,就用注释掉package语句的方法试一下,如果这样程序就能运行的话,你就可以知道问题出在哪里了。
6.2 java包访问权限修饰词
-
6.2.1默认访问权限:包访问权限
-
6.2.2 public :包访问权限
-
默认包:没有创建包(包如创建的com.fjnx.history包)
同处于相同的目录并且没有设定任何包的名称,java将这样的文件自动的看做是隶属于该目录的默认包之中,于是他们为该目录中所有其他的文件都提供包访问权限。
6.3 接口和实现
封装的定义
访问权限的控制通常被称为具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称为是封装。
- 创建类的习惯和建议
将public成语置于开头,后面protected、包访问权限和private成员创建类的形式
接口的定义
java接口:java语言中存在的结构,有特定的语法和结构
接口:一个类所具有他方法的特征集合是一种逻辑上的抽象
6.4 类的访问权限
单例模式
class Soup2{
private static Soup2 ps1=new Soup2();
public static Soup2 access(){
return ps1;
}
public void f(){}
}
总结:
控制对成员的访问权限有两个原因:
1、第一是为了使用户不要碰触那些他们不该碰触的部分,这些部分对于类内部的操作是必要的,但是他并不属于客户端程序员所需接口的一部分。因此将方法和域指定为private,对客户端程序员而言是一种服务。
2、第二个原因也是最重要的原因,是未了让类库设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。
访问权限的控制可以确保不会有任何客户端程序员依赖于某个类的底层实现的任何部分。
注意,访问权限控制专注于类库创建者和该类库的外部使用者之间的关系,这种关系也是一种通信方式。