日期:2014-05-20  浏览次数:20707 次

关于java垃圾回收机制的一个疑问请教高手进来帮我解答一下,谢谢了.
class   Aa
{
static   int   x;
int   index;
Aa()
{
x++;
System.out.println( "第   "   +   x   +   "次产生对象 ");
setId(x);
}
void   setId(int   id)
{
index=id;
}
protected   void   finalize()
{
System.out.println( "第   "   +   index   +   "个对象被回收 ");
}
public   static   void   main(String   args[])
{
new   Aa();
new   Aa();
new   Aa();
System.gc();
}
}
/*结果为:
            第1次产生对象;            
    第3次产生对象;
    第3次产生对象;
    第1个对象被回收.
    第2个对象被回收.
    第3个对象被回收.
   
我有一点不明白的是在main方法中执行了三次new   Aa()之后,再执行System.gc()之后gc()方法三次调用
finalize()这也能说的过去,可是那个index变量怎么会保存(1,2,3)的值呢?请教调用能简要说明一下这个
程序的执行过程.不胜感激!
*/


------解决方案--------------------
Aa()
{
x++;
System.out.println( "第 " + x + "次产生对象 ");
setId(x);
}
中setId(x)就把x的值放入到index变量中去了,这个是对象的属性,所以在最后调用的时候能依次显示1,2,3的值

产生第一个对象,执行构造函数,x=1,index=x;
产生第2个对象,执行构造函数,x=2,index=x;
产生第3个对象,执行构造函数,x=3,index=x;
最后再依次销毁
------解决方案--------------------
第 1次产生对象
第 2次产生对象
第 3次产生对象
第 3个对象被回收
第 2个对象被回收
第 1个对象被回收

楼主的运行结果有问题...

index变量怎么会保存(1, 2, 3)?
index本来就是实例变量, 每个对象都有自己的index, 在Aa()方法里, 使用setId对index进行赋值, 分别赋予了1, 2, 3...
------解决方案--------------------
System.out.println( "第 " + index + "个对象被回收 ");
这里并不是
System.out.println( "第 " + x + "个对象被回收 ");

x 是静态的,输出 x 的话,就会输出 三个 3
但例子中输出的是 index
index 是对象各自的属性,分别是 1, 2, 3
------解决方案--------------------
根本没有必要定义finalize