小弟是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
请各位大虾帮忙
小弟感激不尽!

解决方案 »

  1.   

    呵呵,看来是我没把问题说清楚
    在if(i==47)中我把i换成是created
    程序执行结果就不是预期那样的了
      

  2.   

    java中,一个对象如果有终结方法:finalize(),这个方法是垃圾收集器在释放对象前必须运行,记住一点:是垃圾收集器运行对象的终结方法。
    在lz的代码中:因为i的不是static的,当jvm要回收内存前,会调用该对象的finalize()方法,该对象对应一个i就是47。因为created是static的,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。
    如果把i换成是created:当调用某个对象的finalize()时,由于created值很大 if(created==47)这句不会走的,所以结果不一样,不知道我说明白没有~~