3 Java中的析构方法finalize
在C++程序设计中有构造与析构的概念,并且是内存管理技术中相当重要的一部分,而在Java语言中只有构造的概念,却没有析构的概念。这是因为理论上JVM负责对象的析构工作也就是之前讲到的垃圾回收的概念,其实Java语言中的finalize 方法类似于C++语言中的析构函数。finalize 方法是Java语言根基类Object类的一个方法,这个方法是保护类性质的方法(protected),由于在Java应用中开发的所有类都为Object的子类,因此用户类都从Object对象中继承了该方法。因此我们在子类中可以调用父类中的finalize 方法,由于finalize 方法没有自动实现递归调用,我们必须手动实现,因此finalize函数的最后一个语句通常是super.finalize()。通过这种方式,我们可以实现从下到上finalize 的调用,即先释放用户类自身的资源,然后再释放父类的资源。通常我们可以在finalize 方法中释放一些不容易控制、并且非常重要的资源,例如:一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键的。
由于GC调用finalize的时间是不确定的,有时我们需要通过其他的手段来释放程序中所占用的系统资源,比如自己在类中声明一个destroy()方法,在这个方法中添加释放系统资源的处理代码,当你使用完该对象后可以通过调用这个destroy()方法来释放该对象内部成员占用的系统资源。并且最好在类的finalize 方法中添加资源释放代码,这样做更为保险、安全。在类深度继承的情况下,这种方法显得就更为有效,我们可以通过递归调用destroy的方法在子类被销毁的时候释放父类所占用的资源,例如下面的代码: