4.1 用构造器确保初始化
4.2 方法重载
在static内部不能调用非静态方法(除非把对某个对象的引用传递到static方法里,然后通过这个引用来调用非静态方法)
4.3 清理:终结处理和垃圾回收
Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况,假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放该对象的这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以钥匙你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
1)对象可能不被垃圾回收
2)垃圾回收不等于“析构”
3)垃圾回收只与内存有关
看来之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的语法,而非Java中的通用做法。这种情况主要发生在使用“本地方法”的情况下,本地方法市一种在Java中调用非Java代码的方式。
finalize()还有一个有趣的用法,它并不依赖于每次都要对finalize()进行调用,这就是对象“终结条件”的验证。
Java的垃圾回收机制:“停止——复制” “标记——清扫”
4.4 成员初始化
总结一下对象的创建过程。假设有个名为Dog的类:
1)当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态字段首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
2)然后载入Dog.class(后面会学到,这将创建一个Class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3)当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
4)这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了缺省值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
5)执行所有出现于字段定义处的初始化动作。
6)执行构造器。正如将在第6章所看到的,这可能会牵涉到很多动作,尤其是涉及继承的时候。
class Spoon{
static int i;
static {
i=47;
}
......
}
尽管上面的代码看起来像个方法,但它实际只是一段跟在static关键字后面的代码。与其他静态初始化动作一样,这段代码仅执行一次;当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类的对象)。
4.5 数组初始化