《Java编程思想第四版》读后感——Java中的finalize() 与c++的析构函数的区别

一、什么是析构函数

来自百度百科——析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

二、什么是finalize()方法

1.finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法;

2.一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象;所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),因此产生问题。 

3.执行时机不可预知 ——当一个对象变得不可触及时,即没有被任何变量引用或间接引用的时候,垃圾回收器(GC)在某个时期会回收此对象;当回收对象之前会调用finalize()方法,这类似于人类临终之前必须做一件事情:写遗言;因为GC是不确定性的(这跟JVM相关),所以finalize方法的执行具有不可预知性。

4.finalize()代码中若出现异常,异常会被忽略。

三、总结

finalize()方法:

1.对象不一定会被回收。2.java的垃圾回收不等同于析构函数。3.垃圾回收只与内存有关,即垃圾回收和finalize()方法都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

析构函数:

与 Java 不同,C++ 支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持,C++ 也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。

在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。结果,Java 的设计者觉得不需要析构函数(象 C++ 中所实现的)。

取而代之,Java 定义了一个特殊的方法叫做finalize() ,它提供了 C++ 析构函数的一些功能。但是,finalize() 并不完全与 C++ 的析构函数一样,并可以假设它会导致一系列的问题。finalize() 方法作用的一个关键元素是 Java 的垃圾回收器。

 

 

你可能感兴趣的:(《Java编程思想第四版》读后感——Java中的finalize() 与c++的析构函数的区别)