代码如下:class Beta{}
class Alpha{
static Beta b1;
Beta b2;
}public class p11 {
public static void main(String[] args){
Beta b1 = new Beta();
Beta b2 = new Beta();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
a1.b1 = b1;
a1.b2 = b1;
a2.b2 = b2;
a1 = null;
b1 = null;
b2 = null;
}
}问题是,上述代码运行完之后,有几个对象符合垃圾回收的条件。分别是哪几个对象。
class Alpha{
static Beta b1;
Beta b2;
}public class p11 {
public static void main(String[] args){
Beta b1 = new Beta();
Beta b2 = new Beta();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
a1.b1 = b1;
a1.b2 = b1;
a2.b2 = b2;
a1 = null;
b1 = null;
b2 = null;
}
}问题是,上述代码运行完之后,有几个对象符合垃圾回收的条件。分别是哪几个对象。
class Alpha{
static Beta b1;
Beta b2;
}public class p11 {
public static void main(String[] args){
Beta b1 = new Beta();
Beta b2 = new Beta();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
a1.b1 = b1;
a1.b2 = b1;
a2.b2 = b2;
a1 = null;
b1 = null;
b2 = null;
//test line
}
}
}运行到test line 那一行时有几个对象符合垃圾回收的条件。分别是哪几个对象。
注意,是符合垃圾回收的条件
Beta b1 = new Beta(); 这里建立了一个对象,叫它A,用b1指向.
Beta b2 = new Beta(); 这里建立了一个对象,叫它B,用b2指向.
Alpha a1 = new Alpha(); 这里建立了一个对象,叫它C,用a1指向.
Alpha a2 = new Alpha(); 这里建立了一个对象,叫它D,用a2指向.
a1.b1 = b1; 对象C中的属性a1.b1指向了对象A 注意a1.b1是静态的.
a1.b2 = b1; 对象C中的属性a1.b2指向了对象A
a2.b2 = b2; 对象D中的属性a2.b2指向了对象B
a1 = null; 对象C的引用指向了空,所以C没有引用指向了.
b1 = null; b1为空了,但b1原来指向的A还有其它引用指向(就是Alpha类的static属性b1).
b2 = null; b2为空了,但b2原来指向的B还有其它引用指向(就是a2)现在只有对象C是没有引用指向的对象,所以只有它符合垃圾回收的条件.
Beta b2 = new Beta(); // b2 -> @000002
Alpha a1 = new Alpha(); // a1 -> @000003
Alpha a2 = new Alpha(); // a2 -> @000004
a1.b1 = b1; // a1.b1 -> @000001
a1.b2 = b1; // a1.b2 -> @000001
a2.b2 = b2; // a2.b2 -> @000002
a1 = null; // a1.b1 -> null (@000001 这时还不符合,因为b1不为null,b1 -> @000001)
// a1.b2 -> null (@000002 这时还不符合,因为b2不为null,b2 -> @000002)
// a1 -> null
b1 = null; // b1 -> null
b2 = null; // b2 -> null
//test line 在这时候,@000001 @000002 @000003 地址中所存的对象符合垃圾回收的条件
Beta b1 = new Beta(); // b1 -> @000001(假想的内存地址,下同)
Beta b2 = new Beta(); // b2 -> @000002
Alpha a1 = new Alpha(); // a1 -> @000003
Alpha a2 = new Alpha(); // a2 -> @000004
a1.b1 = b1; // a1.b1 -> @000001
a1.b2 = b1; // a1.b2 -> @000001
a2.b2 = b2; // a2.b2 -> @000002
a1 = null; // a1.b1 -> null (@000001 这时还不符合,因为b1不为null,b1 -> @000001)
// a1.b2 -> null (@000002 这时还不符合,因为b2不为null,b2 -> @000002,a2.b2 -> @000002)
// a1 -> null
b1 = null; // b1 -> null
b2 = null; // b2 -> null
//test line 在这时候,@000001 @000003 地址中所存的对象符合垃圾回收的条件
Beta b1 = new Beta(); // b1 -> @000001(假想的内存地址,下同)
Beta b2 = new Beta(); // b2 -> @000002
Alpha a1 = new Alpha(); // a1 -> @000003
Alpha a2 = new Alpha(); // a2 -> @000004
a1.b1 = b1; // a1.b1 -> @000001
a1.b2 = b1; // a1.b2 -> @000001
a2.b2 = b2; // a2.b2 -> @000002
a1 = null; // a1.b1 -> null
// a1.b2 -> null (@000001 这时还不符合,因为b1不为null,b1 -> @000001)
// a1 -> null
b1 = null; // b1 -> null
b2 = null; // b2 -> null
//test line 在这时候,@000001 @000003 地址中所存的对象符合垃圾回收的条件
这位哥哥真是可爱
没错,test line是被注释掉的
意思是这边会写其他一些的代码
但是已经无关紧要我们讨论的是程序运行到那个位置垃圾回收的状况而已
不过,还是谢谢回复