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

求解对象及其垃圾回收问题
public class Eggs {

/**
* @param args
*/
public static void main(String[] args) {

Dozens[] da=new Dozens[3];
da[0]=new Dozens();
Dozens d=new Dozens();
da[1]=d;
d=null;
da[1]=null;
}

}

class Dozens{
int []dz={1,2,3,4,5};
}
问总共创建了几个对象?有几个对象有GC资格?

------解决方案--------------------
不好意思
Java code

Dozens[] da=new Dozens[3]; // 只是在栈区,开辟了一个Dozens类型的数组。
da[0]=new Dozens();   //真正实例化一个对象,因为new在堆区开辟资源。
Dozens d=new Dozens();   //实例化对象d
da[1]=d;   //把d的引用赋值给da[1],在堆区没有发生任何变化。
d=null;   //资源回收
da[1]=null; // 不会进行资源回收,只是把数组的值进行更改。

------解决方案--------------------
如果你想知道一共New了多少对象实例的话,你可以在类中定义一个静态变量count,初始化为0,然后在构造方法中写上一句count = count+1;最后这个count的值就是你New了多少对象实例,
当然你想知道程序中还有多少有效的对象实例(既没有回收的对象实例),你可以在finalize()方法中写上count = count-1;这样就可以知道你的有效对象实例的个数了。这个finalize()方法是Object类中的,你自己可以看看API文档,相信你可以弄明白。
------解决方案--------------------
一共创建了5个对象
1. Dozens[] da=new Dozens[3]; 创建了一个Dozens类型数组,切记,数组就是一个对象。 
累计一个对象,继续..
2. da[0]=new Dozens(); 只要有new就创建了一个对象,这里是创建了一个Dozens对象,但是看下面代码,Dozens类中包含一个int类型的数组,这就是说,当Dozens对象创建的同时,附带创建了一个int数组对象。
累计三个对象,继续..
3. Dozens d=new Dozens(); 这里又new了一个Dozens对象,同样再加上两个对象。
一共五个对象被创建。

一共有两个对象符合垃圾回收,哪两个呢,是d对象和d中的数组对象
da[1]=d;这是让da[1]引用d,所以当d=null时,d还有个活的引用对象,而不符合垃圾回收机制,但是da[1]=null后,d就没有任何活线程能够访问到,符合垃圾回收机制了,同时d对象附带的那个数组,也符合,
所以答案是两个。

这是scjp考试指南中的题目,当时我看的时候也是困惑,静下心来想了想,想通了。答案留在这里,供大家参考。