A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海洋 中级黑马   /  2013-3-23 14:24  /  2055 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海洋 于 2013-3-23 19:36 编辑

Object类(或者其子类)的finalize()方法在什么情况下被调用?

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢  发表于 2013-3-23 15:58

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

4 个回复

倒序浏览
这主要是用于垃圾回收,当你需要虚拟机在做垃圾回收的时候再做你所需要他做的事,就重写此方法,例如关闭流之类的,有点类似于C++中的析构函数
回复 使用道具 举报
java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。露,有可能导致程序崩
finalize()主要用于一些特殊对象的垃圾回收~~这些特殊的对象
一般而言,Java有垃圾回收器来回收无用对象占据的内存资源,但有的对象并非使用new获得的内存区域。
由于垃圾回收器只知道释放那些由new分配的内存,所以它不知道该如何释放该对象的这种特殊的对象。在这种情况下,Java允许你在类中定义一个名为finalize( )的方法,用于这些特殊对象的回收,但是有时即使finalize()方法以及运行,也不一定能保证对象能被回收,所以一般不推荐用finalize()方法,将内存交给系统托管省心~~



评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
    任何Java类都可以覆盖Object类的finalize方法,在该方法中清理该对象占用的资源,如果程序终止之前始终没有进行垃圾回收,则不会调用失去引用对象的finalize方法。只有当程序需要更多额外内存时,垃圾回收机制才会进行垃圾回收。但是:某个失去引用对象只占用了少量的内存,而且系统没有产生严重的内存需要,那么该对象的finalize方法不会得到调用。
      特点1,永远不要主动调用某个对象的finalize方法,该方法应该交给垃圾回收机制调用。
            2,finalize方法何时被调用是否被调用是不确定的,不要把finalize方法当作一定会执行的方法。
            3,由于finalize方法不一定会被执行,如果想保住某个类里打开的资源被清理什么的,不要放在finalize方法中进行清理。
           4,执行finalize方法出现异常时,垃圾回收机制不会报告异常,程序继续执行。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
在当前对象销毁之前,该 Finalize 方法用于执行当前对象占用的非托管资源上的清理操作。
在应用程序域的关闭期间,Finalize 将自动在没有免于终止的对象,甚至是那些仍可以访问的对象上调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马