关于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)这句不会走的,所以结果不一样,不知道我说明白没有~~