[学习笔记][Java编程思想]第6章:访问权限控制

  • 重构即重写代码,以使得它更可读、更易理解,并因此而更具有可维护性。
  • Java提供了访问权限修饰词,把变动的事物与保持不变的事物区分开来。
  • 访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)和private。

1 包:库单元

  • 包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
  • 可以通过使用类完整的名称来使用类,也可以通过关键字import包名来使类的名称可用。
  • 未为文件指定包名时,文件位于未命名包(或称默认包)。
  • 当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。
  • 编译单元内可以有一个public类,该类的名称必须与文件的名称相同。其它额外的类,包之外无法看到这些类,它们主要为主public类提供支持。
  • 每个编译单元只能有一个public类,否则编译器就不会接受。

1.1 代码组织

  • 当编译一个.java文件时,在.java文件中的每个类都会有一个后缀名.class输出文件。
  • Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Java的jar文档生成器)的.class文件。
  • Java解释器负责这些文件的查找、装载和解释。Java中并不强求必须要使用解释器,因为存在用来生成一个单一的可执行文件的本地代码Java编译器。
  • 类库实际上是一组类文件,其中每个文件都有一个public类,以及任意数量的非public类。
  • 如果使用package语句,它必须是文件中除注释以外的第一句程序代码。
  • package和import关键字允许你做的,是将单一的全局名字空间分割开。

1.2 创建独一无二的包名

  • 一个包从未真正将被打包的东西包装成单一的文件,并且一个包可以由许多.class文件构造,可以利用操作系统的层次化的文件结构来解决这一问题。
  • package名称的第一部分是类的创建者的反顺序的Internet域名。
  • Java解释器,找出环境变量CLASSPATH,用作查找.class文件的根目录,将包名转换成子目录,在所有路径中查找与你所要创建的类名称相关的.class文件。
  • 使用JAR文件时,必须在类路径中将JAR文件的实际名称写清楚,而不仅是指明它所在位置的目录。
  • 导入两个包中具有相同的类名时,会产生冲突,需使用类完整的名称。

1.3 定制工具类

  • 可以创建自己的工具库来减少或消除重复的程序代码。

1.4 用import改变行为

  • Java没有C的条件编译功能。
  • import static静态导包,具体到类的静态方法,可以不加类名,直接通过方法名调用。

1.5 对使用包的忠告

  • 无论何时创建包,都已经在给定包的名称的时候隐含地指定了目录结构。
  • 编译过的代码通常放置在与源代码的不同目录中,但是必须保证JVN使用CLASSPATH可以找到该路径。

2 Java访问权限修饰词

  • 每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
  • 如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。

2.1 包访问权限

  • 包访问权限(friendly),当前的包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员是private。
  • 包访问权限允许将包内所有相关的类组合起来,以使它们彼此之间可以轻松地相互作用。
  • 类控制着哪些代码有权访问自己的成员。
  • 取得对某成员的访问权的途径:
    • 使该成员成为public。
    • 通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包访问权。
    • 继承技术,继承而来的类既可以访问public成员也可以访问protected成员。
    • 提供访问器(accessor)和变易器(mutator)方法(也称作get/set方法),以读取和改变数值。

2.2 public:接口访问权限

  • 使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的。
  • 不要错误地认为Java总是将当前目录视作是查找行为的起点之一。

2.3 private:你无法访问

  • 关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
  • private可用于控制如何创建对象,并阻止别人直接访问某个特定的构造器。
  • 任何可以肯定只是该类的一个“助手”方法的方法,都可以把它指定为private。

2.4 protected:继承访问权限

  • 关键字protected处理的是继承的概念。
  • 如果创建了一个新包,并自另一个包中继承类,那么唯一可以访问的成员就是源包的public成员。
  • protected也提供包访问权限。

3 接口和实现

  • 访问权限的控制常被称为是具体实现的隐藏。
  • 把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
  • 访问权限控制将权限的边界划在了数据类型的内部,将接口和具体实现进行分离。
  • 建议采用一种将public成员置于开头,后面跟着protected、包访问权限和private成员的创建类的形式。

4 类的访问权限

  • 访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。
  • 每个编译单元(文件)都只能有一个public类。
  • public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
  • 编译单元内完全不带public类也是可能的。
  • 在创建一个包访问权的类时,将该类的域声明为private时才有意义。
  • 类既不可以是private的也不可以是protected的(内部类除外)。
  • 类的访问权限,只有两个选择:包访问权限或public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private。
  • 如果没有明确地至少创建一个构造器,就会帮你创建一个默认构造器(不带任何参数的构造器)。如果我们自己编写了默认的构造器,那么就不会自动创建它了。
  • 相同目录下的所有不具有明确package声明的文件,都被视作是该目录下默认包的一部分。

5 总结

  • 访问权限控制专注于类库创建者和该类库的外部使用者之间的关系,这种关系也是一种通信方式。

疑问和解决

1. 四个访问权限的总结

权限 同一个类 同一个包 不同包子类 不同包非子类
public
protected
default
private

你可能感兴趣的:(java)