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

父类中finalize如果有关闭资源的逻辑,当子类中finalize没有显示调用super.finalize()时父类的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 }

程序执行结果如下:

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

 

上一篇:注解


下一篇:JVM之垃圾回收算法