学习第五章的笔记如下:
五.第五章 隐藏实施过程
讲一下自己的一些体会理解:
(1)其实这一章主要讲的是怎样才能把发生变化的东西与保持不变的东西分隔开。
(2)每个源码文件内只能有一个public类,而且这个类名要跟文件名相同,剩下的类在那个包外是不能访问的
,通常是一些辅助类。
//Test.java
public class Test{
public static void main(String[] args){
}
}
(3)可以把一系列的 .class 文件封装和压缩到一个JAR文件里,可以使用JAR工具。Java解释器负责对这些文
件的寻找、装载和解释。
(4)package:Java包封装的约定,名字内的所有字母应该要小写
(5)package和import允许我们做的事情那个就是分割单个全局命名空间,保证我们不会遇到名字冲突。
(6)编译器强迫package名的第一部分是类创建者的域名。比如我们的域名是 “oypj.com” 要创建的库名为“util”
最后得到的包名为 :
package com.oypj.util;
用这个包名作为下面这个文件的命名空间:
//Test.java
package com.oypj.util;
public class Test{
public void foo(){
System.out.println("oyoj");
}
}
然后把这个文件放在 c:\javaTest\com\oypj\util 目录下。此时我们会发现包名 "com.oypj.util",前面的部分是
由classpath环境变量决定的。我们可以在另外的文件夹中写个程序调用这个包,在这里就不做测试了。
(7)自动编译:为导入的类首次创建一个对象时,编译器会在适当的目录里面找同名的 .class 文件。若在相同目
录中还发现了一个同名的.java文件,编译器会比较两个文件的日期,如果.java文件比.class新,就会自动编译.java
生成一个最新的.class。
(8)自定义工具库,可以减少或者消除重复代码,我已经在写自己的库了,感觉很舒服。不过要注意一下这个库
的包名跟存放的位置参考(6)。
(9)类路径的每个地方,每个名字都仅存在一个类。
(10)利用导入改变行为:类似c的“条件编译”,可以用在调试代码。
package com.oypj.test.debug;
public class Assert{
private static void perr(String msg){
System.out.println(msg);
}
public final static void is_true(boolean exp){
if(!exp) perr("Assertion faild");
}
}
package com.oypj.test;
public class Assert{
private static void perr(String msg){}
public final static void is_true(boolean exp){}
}
如果我们在使用的时候导入的是
import com.oypj.test.debug
那么调用Assert中的方法就会打印出调试的信息。
如果用的是
import com.oypj.test
那么原来的代码不需要改动,就可以把代码从调试版本变成最终版本。
(11)“友好的”:如果没有指定访问指示符,就会默认是“友好的”,那么在同一个包内,其他所有类都可以
访问“友好的”成员。友好元素拥有“包访问权限”。
(12)private:只有自己类内部的方法才能访问那个成员,可以防止别人对这个内部实现的修改。在涉及多线程
处理的时候就非常有用。把默认构建器设置为private,可以防止这个类被继承,实例化只能通过这个类提供的统
一方法。类soup的对象被创建成static private 成员,可以通过 public 方法访问。
(13)protected:当一个类继承了另一个包的类,则在这个类内不能访问到另一个包的类的友好的成员。如果要
访问的话,就在另一个包的类的成员加上protected。
(14)本章主要讲的内容的逻辑是,先讲怎么把一组类封装到一个库里,其次我们怎么控制对自己成员的访问,从
而来达到隐藏实施过程的目的。