Joe*_*Joe 3 java garbage-collection scjp ocpjp
class A{
A aob;
public static void main(String args[]){
A a=new A();
A b=new A();
A c=new A();
a.aob=b;
b.aob=a;
c.aob=a.aob;
A d=new A().aob=new A(); //tricky assignement
c=b; //one object eligible GC
c.aob=null;
System.gc();
}
}
Run Code Online (Sandbox Code Playgroud)
有两个对象有资格进行垃圾收集,但有一个很难理解.
A d=new A().aob=new A();
Run Code Online (Sandbox Code Playgroud)
1)这一行我会做到这一点
A d = new A().aob = new A();
^ ^
O1 O2
O1 --> O2 --> null
^
|
d ----|
Run Code Online (Sandbox Code Playgroud)
2)但真正做的是这个(所以一个符合条件的对象)为什么这样?
A d = new A().aob = new A();
^ ^
O1 O2
O1 --> O2 --> null
^
|
d -----------|
Run Code Online (Sandbox Code Playgroud)
因为这些分配从右到左是相关联的.
A d = ( new A().aob = new A() );
Run Code Online (Sandbox Code Playgroud)
有人能解释一下吗?谢谢
它从右到左开始.首先new A()执行并创建一个新对象.然后将其分配给aob另一个新对象的字段A.最后d是引用该属性aob.这意味着第二个对象A有资格进行垃圾回收.
它像是:
A firstA = new A();
A secondA = new A();
secondA.aob = firstA;
A d = secondA.aob;
Run Code Online (Sandbox Code Playgroud)
但是secondA对象是内联创建的,因此没有对它的引用,它有资格进行垃圾回收.