在java中,“垃圾回收”不保证一定会发生。如果java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
finalize()的有趣用法
用于查看某些类对象的状态。因为,fianlize()会在垃圾回收之前进行,所以我们可以在这个方法中写一下我们想要了解的某些对象的状态是什么,那么当java虚拟机面临内存耗尽的时候我们可以知道:我们是不是对某个对象遗漏了某些操作。
例如,对象代表了一个已经打开了的文件(文件资源不属于垃圾回收器的回收范围),在对象被销毁之前,我们应该关闭文件,但是因为某些原因我们忘记了,同时虚拟机还没有面临内存耗尽,那么我们可能很难发现这个缺陷。但是,如果在finalize方法中判断一下这个对象的状态是否是关闭的,当进行垃圾回收的时候我们还是有可能发现这个问题,并解决的。
让finalize()一定会执行的一段代码
1 | public class TestFile { |
输出:finalize
例子:写一个Tank(油箱)类,此类有两个状态,空的和满的;其清理条件是:当油箱为空的时候才清理该对象。请编写finalize()以检验清理条件是否成立。在main方法中测试Tank可能发生的几种使用方式。
1 | public class Tank { |
输出:error:油箱不为空,不能清理
总结
所以,finalize()可以用于验证某个对象的清理条件。