日期:2014-05-20  浏览次数:20885 次

关于finalize()
小弟是JAVA初学者,在学习初始化和清理这一章中时,遇到一道例题:
class   Chair   {
    static   boolean   gcrun=false;
    static   boolean   f=false;
    static   int   created=0;
    static   int   finalized=0;
    int   i;
    Chair()   {
        i=++created;
        if(created==47)
            System.out.println( "Created   47 ");
    }
    public   void   finalize()   {
        if(!gcrun)   {
        gcrun=true;
        System.out.println( "Beginning   to   finalize   after   "+created+ "   Chairs   have   been   created ");
    }
    if(i==47)   {
        System.out.println( "Finalizing   Chair   #47,   Setting   flag   to   stop   Chair   creation ");
        f=true;
    }
    finalized++;
    if(finalized> =created)
        System.out.println( "All   "+finalized+ "   finalized ");
    }
}
public   class   Garbage   {
    public   static   void   main(String   args[])   {
        while(!Chair.f)   {
        new   Chair();
        new   String( "To   take   up   space ");
    }
    System.out.println( "After   all   Chairs   have   been   created:\n   total   created   = "+Chair.created+ ",   total   finalized=   "+Chair.finalized);
    if(args.length> 0)   {
        if(args[0].equals( "gc ")||args[0].equals( "all "))   {
        System.out.println( "gc() ");
        System.gc();
    }
    if(args[0].equals( "finalize ")||args[0].equals( "all "))   {
        System.out.println( "runFinalization() ");
        System.runFinalization();
    }
    }
    System.out.println( "bye! ");
    }
}
其中有两个int变量
created
i
我想知道在finalize的if(i==47)语句中为什么不能使用created
请各位大虾帮忙
小弟感激不尽!

------解决方案--------------------
这就是逻辑上的一个规定,当内存中存在这个类的对象数量达到47后,就不能再新建该类的对象了,除非你执行了清理。


当然你可以随便定义这个数量,比如改为48、49、333等等
------解决方案--------------------
mark
关注
------解决方案--------------------
java中,一个对象如果有终结方法:finalize(),这个方法是垃圾收集器在释放对象前必须运行,记住一点:是垃圾收集器运行对象的终结方法。
在lz的代码中:因为i的不是static的,当jvm要回收内存前,会调用该对象的finalize()方法,该对象对应一个i就是47。

因为created是static的,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。
如果把i换成是created:当调用某个对象的finalize()时,由于created值很大 if(created==47)这句不会走的,所以结果不一样,不知道我说明白没有~~