子类和超类中finalize方法的行为

时间:2014-04-29 09:21:34

标签: java

我有以下一段代码。

class SuperClass
{
   public void finalize() throws Throwable
   {
      System.out.println("finalize() in SuperClass...");
   }
}

public class FinalizableObject extends SuperClass
{
   public static void main(String[] args) throws Exception
   {
      FinalizableObject obj = new FinalizableObject();
      Thread.sleep(1000);
      obj = null;
      System.gc();
   }

   public void finalize() throws Throwable
   {
      super.finalize();
      System.out.println("finalize() in FinalizableObject...");
   }
}

我获得了所有4种可能的输出

   1. finalize not called for sub/super class.
   2. finalize called for only sub class.
   3. finalize called for only super class.
   4. finalize called for both super and sub class.

...在程序的不同运行中。为什么会这样?

我的问题不在于GC'应该'在System.gc()调用上运行。当调用子类finalize()时,为什么不调用超类finalize,即使调用是显式的。

1 个答案:

答案 0 :(得分:0)

在垃圾收集器回收对象之前调用

finalize(),它是任何对象执行清理活动的最后机会,即释放所有系统资源,如果打开则关闭连接等。


java中的finalize方法的主要问题是它不能保证JLS它将被垃圾收集器调用或者它将被调用的时间,例如,一个对象在符合垃圾收集条件并且在它完成之前可能无限期地等待( )方法被调用。同样,即使在finalize被称为无法保证后,它也会被立即收集。


由于上述原因,使用finalize方法释放关键资源或在finalize中执行任何时间关键活动是没有意义的。它可以在一个JVM中进行开发,但可能在其他JVM中不起作用。