finalize方法注意事项(防止子类没有显示调用super.finalize())
父类中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())相关推荐
- Java中为什么在重写finalize()方法时首选调用super.finalize()?
我收到SonarQube错误:" 强制建议在此方法实现结束时调用super.finalize(),以防父实现必须也处置一些系统资源." 但我发现Object类没有finalize方 ...
- java finalize方法的使用
<JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...
- C#中Finalize方法的问题
C#中Finalize方法的问题 ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archi ...
- Java中finalize方法
前沿:在面试过程中我们可能会被问到final.finally.finalize的区别?本篇文章将介绍finalize的简单用法. Finalize()是Object类的方法. 在GC准备释放对象所占用 ...
- java中finalize()方法
finalize 垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点: 当对象不再被程序所使用的时候,垃圾回收器将会将其回收 垃圾回收是在后台运行的,我们无法命令 ...
- java手动调用finalize,Java中的垃圾收集与finalize方法
大家都知道使用new运算符在内存中创建了一个对象.构造函数用于初始化该对象的属性.当不再需要某个对象时,必须将其从内存中删除,以便该内存可以重用于其他对象.从内存中删除不需要的对象或放弃的对象称为垃圾 ...
- .net内存回收与Dispose﹐Close﹐Finalize方法
.net内存回收与Dispose﹐Close﹐Finalize方法 一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量 ...
- 转.net内存回收与Dispose﹐Close﹐Finalize方法
一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ Fi ...
- 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救
说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 即使在可达性分析算法中不可达的对象,也并非是"非死不可"的,这时候它们暂时处于& ...
最新文章
- linux Vi搜索和替换字符串
- 用c语言批量删除指定文件夹,C语言删除文件夹下所有代码的注释for Mac
- 【转】D3DLOCK详解
- pycharm使用import numpy报错
- mysql数据库已连接数据库_001. 【已解决】Java连接MYSQL 数据库的连接步骤
- SAP License:SAP 系统参数设置
- docker 私服搭建以及镜像部署
- centos mysql压缩文件直接恢复_CentOS下利用mysqlbinlog恢复MySQL数据库
- 使用PDF Converter OCR for Mac如何区分扫描的PDF和普通文件?
- Internet校验和
- 趣味俄罗斯方块代码分享(C语言)
- jic标准_JIC螺纹技术资料.doc
- 程控电源测试使用小记
- 多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)
- 【Element-UI】在vue中将组件调整为英文(国际化)
- 143_iOS干货50_认识几个概念:跨域问题和内网穿透
- Mysql 最全教程
- 使用腾讯云托管部署前端项目
- java js css 压缩工具_JS/CSS压缩工具(YUI Compressor)使用方法
- 寻找心灵深处的菩提树
热门文章
- 使用VisualStudio或VisualStudio Code作为代码比较工具
- Git 学习笔记(二)分支管理
- JVM笔记(一)数字在JVM中的表示
- MySQL-based databases CVE-2016-6664 本地提权
- U-Boot移植(8)u-boot的流程
- mysql 单块读 多块读_求指点:STM32F103VC的SDIO读SD卡单块读成功,多块读却不行?...
- oracle进程用户,关于oracle用户进程,服务进程,后…
- (39)Verilog HDL参数:localparam
- php 序列化 java_JAVA之序列化
- python 博弈论 社会网络_【 统计应用 】 社会网络分析SNA报告-学习