父类中finalize如果有关闭资源的逻辑,当子类中finalize没有显示调用super.finalize()时父类的finalize不会被执行,所以父类的资源无法关闭。解决办法是让父类关闭资源的逻辑不依赖子类的finalize,脱离子类。所以可以父类中定义一个对象,在此对像的finalize中关闭父类中的资源。代码示例如下:

 1 /**
 2  * T1为子类
 3  **/
 4 public class T1 extends T2 {
 5     @Override
 6     protected void finalize() throws Throwable {
 7         // 当子类忘记显示调用父类finalize
 8 //                super.finalize();
 9
10         System.out.println("T1资源被清理");
11
12     }
13
14 }

 1 /**
 2  * T2为父类
 3  **/
 4 public class T2 {
 5
 6     // 假设是需要清理的资源
 7     private Integer i = new Integer(0);
 8
 9     // 在T2中定义一个对象,仅仅用来除法T2中的finalize
10     private final Object finalizer = new Object() {
11         @Override
12         protected void finalize() throws Throwable {
13             // 在此处清理外层类的资源
14             i = null;
15             System.out.println("T2资源被清理");
16         }
17     };
18 }

 1 public class TEST {
 2
 3     public static void main(String[] args) throws InterruptedException {
 4
 5         T1 t1 = new T1();
 6
 7         t1 = null;
 8
 9         System.gc();
10
11         Thread.sleep(30000);
12
13     }
14
15 }

程序执行结果如下:

转载于:https://www.cnblogs.com/yhcjhun/p/11344991.html

finalize方法注意事项(防止子类没有显示调用super.finalize())相关推荐

  1. Java中为什么在重写finalize()方法时首选调用super.finalize()?

    我收到SonarQube错误:" 强制建议在此方法实现结束时调用super.finalize(),以防父实现必须也处置一些系统资源." 但我发现Object类没有finalize方 ...

  2. java finalize方法的使用

    <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...

  3. C#中Finalize方法的问题

    C#中Finalize方法的问题 ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archi ...

  4. Java中finalize方法

    前沿:在面试过程中我们可能会被问到final.finally.finalize的区别?本篇文章将介绍finalize的简单用法. Finalize()是Object类的方法. 在GC准备释放对象所占用 ...

  5. java中finalize()方法

    finalize 垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点: 当对象不再被程序所使用的时候,垃圾回收器将会将其回收 垃圾回收是在后台运行的,我们无法命令 ...

  6. java手动调用finalize,Java中的垃圾收集与finalize方法

    大家都知道使用new运算符在内存中创建了一个对象.构造函数用于初始化该对象的属性.当不再需要某个对象时,必须将其从内存中删除,以便该内存可以重用于其他对象.从内存中删除不需要的对象或放弃的对象称为垃圾 ...

  7. .net内存回收与Dispose﹐Close﹐Finalize方法

    .net内存回收与Dispose﹐Close﹐Finalize方法 一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量 ...

  8. 转.net内存回收与Dispose﹐Close﹐Finalize方法

    一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ Fi ...

  9. 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 即使在可达性分析算法中不可达的对象,也并非是"非死不可"的,这时候它们暂时处于& ...

最新文章

  1. linux Vi搜索和替换字符串
  2. 用c语言批量删除指定文件夹,C语言删除文件夹下所有代码的注释for Mac
  3. 【转】D3DLOCK详解
  4. pycharm使用import numpy报错
  5. mysql数据库已连接数据库_001. 【已解决】Java连接MYSQL 数据库的连接步骤
  6. SAP License:SAP 系统参数设置
  7. docker 私服搭建以及镜像部署
  8. centos mysql压缩文件直接恢复_CentOS下利用mysqlbinlog恢复MySQL数据库
  9. 使用PDF Converter OCR for Mac如何区分扫描的PDF和普通文件?
  10. Internet校验和
  11. 趣味俄罗斯方块代码分享(C语言)
  12. jic标准_JIC螺纹技术资料.doc
  13. 程控电源测试使用小记
  14. 多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)
  15. 【Element-UI】在vue中将组件调整为英文(国际化)
  16. 143_iOS干货50_认识几个概念:跨域问题和内网穿透
  17. Mysql 最全教程
  18. 使用腾讯云托管部署前端项目
  19. java js css 压缩工具_JS/CSS压缩工具(YUI Compressor)使用方法
  20. 寻找心灵深处的菩提树

热门文章

  1. 使用VisualStudio或VisualStudio Code作为代码比较工具
  2. Git 学习笔记(二)分支管理
  3. JVM笔记(一)数字在JVM中的表示
  4. MySQL-based databases CVE-2016-6664 本地提权
  5. U-Boot移植(8)u-boot的流程
  6. mysql 单块读 多块读_求指点:STM32F103VC的SDIO读SD卡单块读成功,多块读却不行?...
  7. oracle进程用户,关于oracle用户进程,服务进程,后…
  8. (39)Verilog HDL参数:localparam
  9. php 序列化 java_JAVA之序列化
  10. python 博弈论 社会网络_【 统计应用 】 社会网络分析SNA报告-学习