Java中的finalize()方法

TerminationCondition类中并未出现finalize()这个字眼,但是该方法确实运行了,并产生了结果,这是为什么?

看到你这段代码之后就感觉特别熟悉,好像在哪里见过,后来翻书一看原来是Thinking in Java里的一段小例子。
finalize()一般是用不到的,除非JVM认为已经没有内存可以使用了,那时JVM才会消耗资源去清理垃圾,所以finalize()也不能作为通用的清理方法。而且finalize()有一个比较另类的用法,就是说finalize()并不依赖对它的直接调用,它有某些触发机制,比如说对象已经标明要被终结,这时会自动执行finalize()。并不需要去显式的调用,这也是为什么代码中没有显式调用finalize(),但它确实执行了的原因,因为它触发了finalize()的执行条件。
其实不必太在意finalize(),因为一般的程序中是使用不到finalize()的,所以那些开发Java的大牛们把finalize()的用法整的很隐晦,而且它们把垃圾回收机制做的比较自动化,一般不需要手工清理。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-07-31

  先占个位  等下看看能不能解答

补充:

看 main() 中的 System.gc() 这个是 运行垃圾回收器。

    API中的方法说明如下:

调用 gc 方法暗示着 Java 

虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。


调用这个方法后,垃圾回收器将回收 novel 引用所指向的对象(即 new Book()建立的对象) ,在试图回收时会先执行finalize() 方法;然后暂时停止回收,第二次回收时,才会执行清理对象回收空间的动作


finalize() 是Object中的方法,我们自己创建的类全都是默认继承自这个类。

    API说明如下:


当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。

finalize 的常规协定是:当 JavaTM 

虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。Object 类的 finalize 方法执行非特殊性操作;

它仅执行一些常规返回。Object 的子类可以重写此定义。Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 

finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。


抛出:

Throwable - 此方法抛出的 Exception

第2个回答  推荐于2018-02-28
回收integer,要调用integer的finalize()方法。你这里重写的是Gctest的finalize(),自然不会调用。自己定义个对象,重写它的finalize(),再试试。而且System.gc();只是通知jvm,回不回收完全看人家心情,就是调用了也未必会执行,要想看效果可加一下这句System.runFinalization()。本回答被网友采纳
第3个回答  2015-07-31
所有的类均直接或间接继承自Object类,你这个类没写继承,所以默认继承自Object类,Object类是有这个方法的,所以finalize是会执行的。你的Book类和TerminationCondition不存在继承关系
第4个回答  2015-07-31
所有的类,都默认是Object的子类。finalize()是Object的方法,这里其实就是调用了父类Object的finalize方法。目的是垃圾回收。

可以去看看Object的api
相似回答