讨论一个关于终止函数finalizer 和 构造函数的问题,没分的!!请各位大虾进来逛逛,留几句~~

overgame 2005-01-04 10:33:33
小弟最近在看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 的构造和终止函数的具体运行结果.
...全文
46 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
overgame 2005-01-05
  • 打赏
  • 举报
回复
自己顶上去

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧