Java面试问题之二十二
请分析一下finalize()方法和finally代码块之间在作用上面的异同。
答:在Object类中提供了finalize()方法,它的初衷是用于在对象被垃圾回收之前,释放所占用的相关资源,这和try ... catch ... finally语句的finally代码块的用途比较相似。但是由于垃圾回收器是否执行finalize()方法以及何时才执行这个方法都是不确定的,因此在程序中不能使用finalize()方法来完成同时具有下面两个特点资源的释放操作:
(1)必须执行的释放操作。
(2)必须在某个确定的时刻执行的释放操作。
具有上述两个特点的资源释放操作放在finally语句块中更加合适。在多数情况下,应该避免使用finalize()方法,因为它会导致程序运行结果的不确定性。在某些情况下,finalize()方法可用来充当第二层安全保护网,当用户忘记显式释放相关资源的时候,finalize()方法可以完成这一收尾工作。尽管finalize()方法不一定会被执行,但是可能会释放的资源,总比永远不会释放资源还是要更安全一些。综上所述,就是一般使用finally代码块来进行显式地主动释放资源的操作,finalize()方法只是作为释放资源的第二层保护操作,千万不能依靠finalize()方法来释放一些重要的资源,否则将不能如愿以偿。