我有一个简单的场景,其中一个对象在其他对象内初始化。我想了解如果外部对象是垃圾收集,那么内部对象也是垃圾收集?
例如:
Class A {
private String id;
private B b = new B(); //Note Here
public void doOperationOnB(){
//operations on object B
}
//NO getter/setter to object B
//setter/getter for id
}
Class B {
private String id;
//setter/getter for id
}
public static void main(){
A a = new A(); //initialization
a.doOperationOnB();
a = null;
}
如果a是垃圾收集,那么b也是垃圾收集?
答案 0 :(得分:0)
如果对象A和对象B未被其他对象(连接到GC根对象)引用,则两者都不会被攻击。
建议您阅读此article
答案 1 :(得分:0)
...如果外部对象是垃圾收集那么内部对象也是垃圾收集?
如果没有任何不符合GC要求的对象有参考,则该对象符合GC条件。因此,在您的情况下,如果没有其他内容可以引用b
所持有的对象,是的,它有资格获得GC。
然而,假设您在A
上有这个吸气剂:
public B getB() {
return this.b;
}
你的代码是:
A a = new A();
a.doOperationOnB();
B newReference = a.getB(); // Getting a reference to A's `b`
a = null;
现在,虽然a
过去引用的对象符合GC的条件,但a.b
过去引用的对象不,因为其中包含'在newReference
中对它的一个杰出的参考。 (当然,如果这个位于main
并且main
即将返回,则该引用不会持续很长时间,但是......)
答案 2 :(得分:0)
将a
分配给null
不保证垃圾回收。
如果其他对象未使用b
中a
的实例引用,则可能 b
将a
进行垃圾回收是的。
答案 3 :(得分:-1)
如果外部引用它只是对该对象的引用,则内部对象将被垃圾收集。如果你有B的getter / setter,或者传入这个B,那么可能会有另一个对象的引用。