class A
{
    public void finalize()
{
System.out.println("终结对象A at " + System.nanoTime());
}
    public void F()
    {
     System.out.println("运行A.F()");
     Test.objA = this;
    }
}class B
{
public A ref;
public void finalize()
{
System.out.println("终结对象B at "  + System.nanoTime());
ref.F();
}
}public class Test { public static A objA;
public static B objB;

public static void main(String[] args) {
 
objA = new A();   //对象A
objB = new B();
objB.ref = objA;

objB = null;
objA = null;

System.gc();
}
}运行结果是:
终结对象B at 32044328474987
运行A.F()
终结对象A at 32044328850733finalize()执行的顺序是不一定的。
我看System.nanoTime()返回的时间,感觉先是执行B.finalize(),请问,执行的顺序是不是:
1、运行B.finalize()方法,显示"终结对象B at 32044328474987",然后执行ref.F()
2、显示"运行A.F()",执行Test.objA = this
3、objA又重新指向对象A如果对象A还有引用指向它的话,请问为什么还会执行A的finalize()方法,并显示"终结对象A at 32044328850733"呢?还是说,B和A的finalize()方法"几乎"同时执行,还没有执行到Test.objA = this;这行代码,A的finalize()就已经执行了?
Eclipse控制台显示的结果为什么会这样呢?非常感谢!!

解决方案 »

  1.   

    finalize()方法叫析构方法,可以把释放的资源代码放在此方法里。并建议垃圾回收器回收,但是否回收不由程序员来决定,是JVM自动控制的。所以其什么时候执行是不知道的。
    这也有不足为怪为什么其执行顺序不一样了。
      

  2.   

    如果根据运行结果,B.finalize()先执行会怎样呢?
    谢谢。
      

  3.   

    这个估计得看gc的运行流程了,我猜测,可能是gc将不用的内存管理起来,根据对象声明的顺序,逆序调用finalize,期间不管finalize是否又恢复了内存指针,仍然将开始管理的内存调用finalize方法
      

  4.   

    根据楼上朋友的猜测,那么就会执行A的finalize()方法,虽然执行了finalize但实际的对象还没有马上被回收,对象A还可以被重新引用,即"复活"还有没有高手帮忙解释一下呢?