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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值