讨论一个关于终止函数finalizer 和 构造函数的问题,没分的!!请各位大虾进来逛逛,留几句~~
小弟最近在看thinking in java
看到第四章的源代码
因为觉得太长,所以自己改了一下执行,结果就问题出来了
具体代码如下
class Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
Chair() {
i = ++created;
System.out.println(i);
if(created == 47) {
System.out.println("Created 47");System.out.println(i);}
}
protected 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) {
//if(args.length == 0) {
// System.err.println("Usage: \n" +
// "java Garbage before\n or:\n" +
// "java Garbage after");
// return;
//}
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[0].equals("before")) {
System.out.println("gc():");
System.gc();
System.out.println("runFinalization():");
System.runFinalization();
//}
System.out.println("bye!");
// if(args[0].equals("after"))
// System.runFinalizersOnExit(true);
}
} ///:~
这个是为了表示清除的作用,但经过我的改动后,终止函数的调用就很莫名其妙了.
首先我在构造函数里加了一个打印
Chair() {
i = ++created;
System.out.println(i);
if(created == 47) {
System.out.println("Created 47");System.out.println(i);}
}
结果就打印了一大堆的数字,足足打印了48280
很奇怪为什么构造函数会执行那么多次.
因为我个人觉得代码里的while 只可能执行47次
后来接着发现,只要每次把里边添加一项就多出很多次的构造函数,
有没有大虾帮忙解释一下java 的构造和终止函数的具体运行结果.