访问控制(或隐藏具体实现)与 “最初的实现并不恰当” 有关
如何理解:
1.不可能一次性编写出完美的代码 需要反复的修改 重构,这样才能写出更易理解更具维护性的代码
2.我们的代码在被他人使用时,他人希望我们的代码永远不要改动,保持原状最好
综上 所有我们就需要将代码中不变的与变的分离开来 使使用者不必因为创造者的改动而改变代码
解决 约定
开发者承诺不删除 使用者所使用的的任何方法 进行项目升级
问题:开发者并不知道哪些域(数据成员) 哪些 对象被 使用者所使用 ,如果对这些域,数据成员进行删减或者修改,并不能评估所造成的影响,如果开发者对某个方法的实现也并不满意,如果想要修改或者删除,那将造成更多问题,这就造成 开发者难以迭代代码
限制:访问权限修饰词,用来限制使用者对类的使用,将高度危险的代码隐藏起来 易于后期维护
访问全向依次为:public protected 包访问权限 private
6.1 包 : 库单元
包内包含有一组类,他们在单一的名字空间只下被组织在一起
不同包内的类无法直接引用,除非使用import进行导入或者将类全名指定
java.util.ArrayList list = new java.util.ArrayList( ) //看起来是相当的繁琐 会造成代码的臃肿
所以尽量用 import
java的导入机制也名字空间的管理机制,通过对命名空间进行控制为每一个类创建唯一的标识符组合可以避免类名冲突
. java 文件 被称为编译单位 每个.java文件中只允许有一个public 类 且类名与文件名一致
6.1.1 代码组织
A.java 编译后后生成一个 A.class 文件
package 语句用来 标识类所出的组(包) 必须放在类的最上面(除注释外)
6.1.2 创建独一无二的包名
不介绍了 我直接进入 权限修饰词
6.2 java访问权限修饰词
public protected private 使用:置于类中每个成员定义之前 无论是一个域还是一个方法 如果不提供任何权限,就意味着是包访问权限
6.2.1 包访问权限
默认访问权限 同一包内的类才能够访问该修饰词的修饰的 成员或者域,其他包内的类没有权限访问
作用:将包内所有类组织起来 让他们可以彼此访问
类控制着那些代码有权访问自己的成员。其他包内的类不能直接对类中 protected private 以及默认权限下的成员或域进行访问
访问的唯一途径就是:
1.使该成员成为 public
2.类中不添加权限修饰词(即使用默认权限修饰词),将访问类放入同一包中,通过包权限来访问
3. 使用继承技术,可以访问到类的public protected 修饰的成员 但不能访问 private修饰的成员 ,另外在同一包内才能访问 包权限修饰成员
4.提供构造器和变异器方法,即getter setter 方法来获取想要访问的成员 get set 的必要性: 可以方便类的创建者任意修改
限制权限下的成员 包括成员名 成员返回值 成员返的方式 这些修改并不会被使用者所察觉 因为他无需修改代码
private int k
public int getK(){ 原来 -------》修改后 public int getK(){
return k; return countK(k);
} // return i ; 甚至可以返回 其他变量值
// return K2 ; 可以任意修改k的标识符
}
6.2.2 public:接口访问权限
使用public关键字,意为着public之后声明的成员可以被任何人可用 尤其对客户端程序猿更是如此
6.2.3 private:你无法访问
关键字private 意味着 除了包含该成员的类外,其他任何类都无法访问成员。
private 将自己封闭在类内 允许你随意改变 而不用考虑对其他类的影响 这样很棒对于类的创建者来说很有利
最常见的单例模式 : 类的创建者不希望使用者 自己随意创建对象 将构建器使用private 修饰
6.2.4 protected : 继承访问权限
这里需要注意的是 protected 提供包继承权限 即在同一个包内的类 可以使用 protected修饰的成员变量
继承访问权限 继承可用
这里需要注意 A包内的类 继承B包中的 类,B包中 基类public 修饰的成员 A中子类是可以使用的,其次就是protected修饰的成员是可使用的 不受包权限的限制
我们来看一个结构:(基类与子类不同包...很少见 基本是要在同一个包中的)
所以我们要理解protected具有包访问权限 同时包访问权限修饰的方法 到底是正在那个包内 当Nigt在simpletoolbar时,dof()是在该包内使用 才有效,NigtSon继承了Nigt拥有在class内使用该类的权利了,但是由于基类不在A包中,所以NigtSon的对象如果在B包中调用 dof()是不成立的
6.3 接口和实现
封装:把数据和方法装进类中,以及具体实现的隐藏,共同被称作是封装。 隐藏:访问权限的控制常被称为具体实现的隐藏
封装的结果就是 使我们获得了一个带有特征和行为的数据类型(类)
访问权限控制 将权限控制的边界划在了数据类型(类)的内部 原因在于:
1.设定 客户端程序猿可以使用和不可使用的边界,不用担心客户端程序猿会将数据类型中的内部实现当做接口的一部分进行调用
2.接口与具体实现进行分离 客户端程序猿可以向接口发送消息(调用public 修饰的成员或域)除此之外什么也不能使用,那么对于创建端程序猿来说,实现是可以进行修改有跌代的,而不会破坏客户端程序猿的代码
这里作者介绍了一种类创建方式与阅读方式 权限递减
先把public修饰的成员变量放在上面 之后是 protected 默认权限(包访问权限) private
当客户端程序猿看到 private时即可停止阅读或者跳跃阅读
6.4 类的访问权限
java 中访问权限修饰词也可用来修饰 class 用来控制客户端程序猿是否可以创建该类的对象
不限制可以使用public 在class前进行修饰
额外限制:
1.每个编译单元都只能有一个public 类。意味着,每个编译单元都有单一的公共接口,用public类来表示。该接口可以按要求包含众多的支持包访问权限的类。
2.public类的名称必须与含有该编译单元的文件名称相匹配,包括大小写
3.虽然不常用,但是编译单元(.java文件)中,可以不含public 类,此时类名可以与编译单元文件名不相符,很容易造成别人的混淆
类不能使private 或者 protected 只能是public 或者 默认权限修饰(包访问权限修饰)
权限修饰符可以控制对象的创建 但是不能控制 static public 成员的调用