小弟是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
请各位大虾帮忙
小弟感激不尽!
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
请各位大虾帮忙
小弟感激不尽!
在if(i==47)中我把i换成是created
程序执行结果就不是预期那样的了
在lz的代码中:因为i的不是static的,当jvm要回收内存前,会调用该对象的finalize()方法,该对象对应一个i就是47。因为created是static的,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。
如果把i换成是created:当调用某个对象的finalize()时,由于created值很大 if(created==47)这句不会走的,所以结果不一样,不知道我说明白没有~~