第六章 访问权限控制
这一章其实并没有将太多东西,这里我简要概述一下
1.包:库元素:
1.1 代码组织
每个.java文件中的每个类都会有一个输出文件,而该输出文件的每个类和.java中相同,只是多了个后缀.class。
“Java可运行程序是一组可以打包并压缩为一个JAR的.class文件。Java解释器负责这些文件的查找、装载和解释”。
而注释中:Java中并不强求必须要使用解释器。因为存在用来生成一个单一的可执行文件的本地代码Java编译器。实际上提到了JVM(虚拟机)的两种执行方式:
a.解释执行,将字节码视为脚本,Java解释器解释成本地方法。
b.由JIT编译成本地机器码执行。
如果使用package语句,它必须是文件中除注释外的第一句程序代码。
请注意,Java包的命名规则全部使用小写字母,包括中间的字也是如此。
1.2 创建独一无二的包名
特定包的所有.class文件都置于一个目录下
CLASSPATH环境变量包含一个或多个目录,用作查找.class文件的根目录。
必须在CLASSPATH路径中将JAR文件的实际名称写清楚,而不仅是指明它所在的位置目录。
实际编译器运行过程:
a.首先,找出环境变量CLASSPATH,用作查找.class文件的根目录。
b.然后,从根目录开始,解释器获取包的名称并将句点替换成反斜杠,以从CLASSPATH根中获取一个相对路径。
c.将CLASSPATH根目录与上面获取的相对路径相连接得到一个绝对路径,用来查找.class文件。
1.3 定制库工具
作者从这开始写了属于自己的打印方法
1.4 用import改变行为
Java去掉了C的条件编译功能,因为它大多数时候是用于解决跨平台问题的。而Java本身可以自动跨平台。
2 Java访问权限的修饰词
protected也提供包访问权限。
不要误认为Java总是将当前目录视作是查找行为的起点之一。如果你的CLASSPATH之中缺少“.”作为路径之一的话,Java就不会查找那里。
private:
a.控制如何创建对象,阻止别人直接访问某个构造函数。
b.阻碍对此类的继承(如果所有构造函数都是private)。
3 接口和实现
有两个重要的原因,将权限的边界划在了数据类型的内部:
第一个原因是要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,不必担心客户端程序员会偶然的将内部机制当作是他们可以使用的接口的一部分。
第二个原因是接口和具体实现进行分离。如果结构是用于一组程序之中,而客户端程序员除了可向接口发送信息之外什么也不可以做,那么代码编写者就可以随意更改不是public的代码,而不会破坏客户端代码。
4.类的访问权限
同一个.java文件,只能有一个与文件同名的public类,可以有其它非public类。
同一个package内的不同文件中的类,可以互相访问。
不同package中的类,如需访问,需要使用全限定名。
类中的成员变量,不声明访问修饰符时,为“包访问权限”,有时也表示friendly,同一个文件的不同类之间可以互相访问。
如果没能为类访问权限指定一个访问修饰符,它将会默认得到包访问权限。
编译单元内(一个java文件内)可以完全不带public的类。在这种情况下可以随意对文件进行命名。
除内部类以外,类既不可以是private的也不可以是protected。所以对于类的访问权限仅有两个选择包访问权限或public。