假设我们有一个课程:
public class test{
public String member;
public test()
{
member = new String("internal object");
}
};
如果我写了这个:
String refToUnreferencedClassMember = new test().member;
这有问题吗?未引用对象new test()
没有指向其自身的引用,但是存在指向其成员对象String member
的引用。如果未引用的对象是垃圾回收,则refToUnreferencedClassMember
将无效。
感谢您的帮助。我不知道在这种情况下是否会进行垃圾收集。
答案 0 :(得分:3)
在这种情况下,
new test().member;
将指向Java堆空间中的String
对象。
现在将其分配给
refToUnreferencedClassMember
然后,String
对象将具有两个引用,即一个通过匿名new test()
对象,另一个通过 refToUnreferencedClassMember
。。 >
请注意,测试对象将有资格使用GC。而且,当匿名new test()
对象被GC'd时,您的字符串对象仍将剩下一个引用,即refToUnreferencedClassMember
,因此不允许对其进行GC'd。
答案 1 :(得分:0)
这有问题吗?
否。
未引用的对象new test()没有指向自身的引用,但是有指向其成员对象
String
成员的引用。
正确。
如果未引用的对象被垃圾回收,则
refToUnreferencedClassMember
将无效。
否,除非未引用,否则不会。正如您的示例中所引用的那样,问题消失了。
答案 2 :(得分:0)
该字段不了解该封闭对象。
因此,封闭对象可以立即进行垃圾收集。
该字符串一直存在,直到对其的引用消失为止。
但是请注意:从面向对象的角度来看,您确实要避免公开类的可变字段。不允许其他类操纵成员的内部状态是不可以的!