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