父类中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 }
程序执行结果如下: