读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]

文章目录

  • 第七章 封装
    • 1. 包的概念
    • 2. 访问权限修饰符
    • 3. 接口和实现
    • 4. 类访问权限
    • 5. 本章小结

第七章 封装

访问控制(或者隐藏实现)与"最初的实现不恰当"有关。

Java 提供了访问修饰符供类库开发者指明哪些对于客户端程序员是可用的,哪些 是不可用的。访问控制权限的等级,从"最大权限"到"最小权限"依次是:publicprotected,包访问权限(没有关键字)和 private

1. 包的概念

包内包含一组类,它们被组织在一个单独的命名空间下。

所有类名之间都是相互隔离的。类 A 中的方法 f() 不会与类 B 中具有相同签名的方法 f() 冲突。

—PS:每个包都是一个房间

一个 Java 源代码文件称为一个编译单元(有时也称翻译单元)。每个编译单元的文件名后缀必须是 .java。在编译单元中可以有一个 public 类,它的类名必须与文件名相同(包括大小写,但不包括后缀名 .java)。每个编译单元中只能有一个 public 类,否则编译器不接受。如果这个编译单元中还有其他类,那么在包之外是无法访问到这些类的,因为它们不是 public 类,此时它们支持主 public 类。

代码组织

当编译一个 .java 文件时,.java 文件的每个类都会有一个输出文件。每个输出的文件名和 .java 文件中每个类的类名相同,只是后缀名是 .class。因此,在编译少量的 .java 文件后,会得到大量的 .class 文件。

类库是一组类文件。每个源文件通常都含有一个 public 类和任意数量的非 public 类,因此每个文件都有一个构件。如果把这些组件集中在一起,就需要使用关键字 package

—PS:包啦

package hiding;

这个编译单元是一个名为 hiding 类库的一部分。换句话说,你正在声明的编译单元中的 public 类名称位于名为 hiding 的保护伞下。任何人想要使用该名称,必须指明完整的类名或者使用 import 关键字导入 hiding。(注意,Java 包名按惯例一律小写,即使中间的单词也需要小写,与驼峰命名不同)。

packageimport 这两个关键字将单一的全局命名空间分隔开,从而避免名称冲突。

创建独一无二的包名

按照惯例,package 名称是类的创建者的反顺序的 Internet 域名。如果你遵循惯例,因为 Internet 域名是独一 无二的,所以你的 package 名称也应该是独一无二的,不会发生名称冲突。如果你没有自己的域名, 你就得构造一组不大可能与他人重复的组合(比如你的姓名),来创建独一无二的 package 名称。如果你打算发布 Java 程序代码,那么花些力气去获取一个域名是值得的。

此技巧的第二部分是把 package 名称分解成你机器上的一个目录,所以当 Java 解释器必须要加载一个 .class 文件时,它能定位到 .class 文件所在的位置。首先,它找出环境变量 CLASSPATH(通过操作系统设置,有时也能通过 Java 的安装程序或基于 Java 的工具设置)。CLASSPATH 包含一个或多个目 录,用作查找 .class 文件的根目录。从根目录开始,Java 解释器获取包名并将每个句点替换成反斜杠, 生成一个基于根目录的路径名(包名 foo.bar.baz 变成 foo\bar\baz 或 foo/bar/baz 或其它,取决于你的操作系统)。然后这个路径与 CLASSPATH 的不同项连接,解释器就在这些目录中查找与你所创建的类名称相关的 .class 文件(解释器还会查找某些涉及 Java 解释器所在位置的标准目录)。

—PS:CLASSPATH 可以包含多个目录,用 ; 隔开,这些目录就是为了查找 .class 文件的

冲突

只要不在同一个程序中使用有冲突的名字(若使用了有冲突的名字,必须明确指明全名)。

—PS:引入的两个类,类名一样,就是冲突

2. 访问权限修饰符

Java 访问权限修饰符 publicprotectedprivate 位于定义的类名,属性名和方法名之前。每个访问权限修饰符只能控制它所修饰的对象。

包访问权限

默认访问权限没有关键字,通常被称为包访问权限(有时也称为 friendly)。这意味着当前包中的所有其他类都可以访问那个成员。对于这个包之外的类,这个成员看上去是 private 的。

取得对类成员的访问权的方式是:

  1. 使成员成为 public。那么无论是谁,无论在哪,都可以访问它。

  2. 赋予成员默认包访问权限,不用加任何访问修饰符,然后将其他类放在相同的包内。这样,其他类就可以访问该成员。

  3. 在"复用"这一章你将看到,继承的类既可以访问 public 成员,也可以访问 protected 成员(但不能 访问 private 成员)。只有当两个类处于同一个包内,它才可以访问包访问权限的成员。但现在不用担心继承和 protected

  4. 提供访问器(accessor)和修改器(mutator)方法(有时也称为"get/set" 方法),从而读取和改变值。

public: 接口访问权限

当你使用关键字 public,就意味着紧随 public 后声明的成员对于每个人都是可用的,尤其是使用类库的客户端程序员更是如此。

默认包

两个类在相同的目录中且没有给自己设定明确的包名。Java 把这样的文件看作是隶属于该目录的默认包中,因此它们为该目录中所有的其他文件都提供了包访问权限。

—PS:默认都到一起去

private: 你无法访问

关键字 private 意味着除了包含该成员的类,其他任何类都无法访问这个成员。同一包中的其他类无法访问 private 成员,因此这等于说是自己隔离自己。

protected: 继承访问权限

如果你创建了一个新包,并从另一个包继承类,那么唯一能访问的就是被继承类的 public 成员。(如果在同一个包中继承,就可以操作所有的包访问权限的成员。)有时,基类的创建者会希望某个特定成员能被继承类访问,但不能被其他类访问。这时就需要使用 protectedprotected 也提供包访问权限,也就是说,相同包内的其他类可以访问 protected 元素。

—PS:protected 来自祖宗的庇佑

包访问权限 Vs Public 构造器

在一个具有包访问权限的类中定义一个 public 的构造器并不能真的使这个构造器成为 public,在声明的时候就应该标记为编译时错误。

—PS:一个类没有使用 public 修饰,那么即使它的构造器是 public 修饰的,也不能在其他包中访问

读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]_第1张图片

3. 接口和实现

访问控制通常被称为实现的隐藏。将数据和方法包装进类中并把具体实现隐藏被称作是封装。其结果就是一个同时带有特征和行为的数据类型。

出于两个重要的原因,访问控制在数据类型内部划定了边界。第一个原因是确立客户端程序员可以使用和不能使用的边界。第二个原因:将接口与实现分离。

—PS:朕赐给你(public),才是你的;朕不给(private),你不能抢。

读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]_第2张图片

为了清晰起见,你可以采用一种创建类的风格:public 成员放在类的开头,接着是 protected 成员,包访问权限成员,最后是 private 成员。

—PS:CV战神也要有点强迫症

4. 类访问权限

访问权限修饰符也可以用于确定类库中的哪些类对于类库的使用者是可用的。如果希望某个类可以被客户端程序员使用,就把关键字 public 作用于整个类的定义。这甚至控制着客户端程序员能否创建类的对象。

为了控制一个类的访问权限,修饰符必须出现在关键字 class 之前:

public class Widget {

这里有一些额外的限制:

  1. 每个编译单元(即每个文件)中只能有一个 public 类。这表示,每个编译单元有一个公共的接口用 public 类表示。该接口可以包含许多支持包访问权限的类。一旦一个编译单元中出现一个以上的 public 类,编译就会报错。

  2. public 类的名称必须与含有该编译单元的文件名相同,包括大小写。

  3. 虽然不是很常见,但是编译单元内没有 public 类也是可能的。

—PS:一个源码文件( .java )可以包含多个类,但是只能有一个类可以用 public 修饰,并且这个类名必须与 .java 文件名一样

读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]_第3张图片

5. 本章小结

无论在什么样的关系中,划定一些供各成员共同遵守的界限是很重要的。当你创建了一个类库,也就与该类库的使用者产生了联系,他们是类库的客户端程序员,需要使用你的类库创建应用或更大的类库。

在 Java 中,关键字 package,包命名模式和关键字 import 给了你对于名称的完全控制权,因此可以轻易地避免名称冲突的问题。

类的 public 接口是用户真正看到的,所以在分析和设计阶段决定这部分接口是最重要的部分。

自我学习总结:

  1. 将数据和方法包装进类中并把具体实现隐藏被称作是封装

  2. 封装由访问控制修饰符实现

  3. 访问控制划定了客户端(类使用方)使用的边界,分离了接口与实现,方便类创建者去维护代码

  4. 封装关键词:package import public protected 默认(friendly) private

  5. 一个类可以包含多个类,但能用 public 修饰的只能有一个,并且该类名与 .java 文件名完全一样

  6. public protected 默认(friendly) private 权限大小如下表:

    本类 同包类 子类 任何类
    private
    friendly
    protected
    public

你可能感兴趣的:(读书笔记,java)