现在的位置: 首页 > 综合 > 正文

第四章 初始化与清理

2018年01月25日 ⁄ 综合 ⁄ 共 1147字 ⁄ 字号 评论关闭

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 数组初始化

抱歉!评论已关闭.