有多少个符合垃圾收集器的对象

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)

有人能解释一下吗?谢谢

Pet*_*hev 6

它从右到左开始.首先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对象是内联创建的,因此没有对它的引用,它有资格进行垃圾回收.