2012-03-07 10 views
3
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(); 
    } 
} 

ガベージコレクションの対象となるオブジェクトは2つありますが、1つは理解しづらいものです。ガベージコレクタの対象オブジェクトの数

A d=new A().aob=new A(); 

1)それがこの

A d = new A().aob = new A(); 
     ^   ^
      O1   O2 

     O1 --> O2 --> null 
    ^
     | 
d ----| 

2になるだろうというこのラインIの事)しかし、何が本当にやっていることはとても1つの適格なオブジェクト(この場合)は、なぜこのようなものですか?

A d = new A().aob = new A(); 
     ^   ^
      O1   O2 

     O1 --> O2 --> null 
      ^
      | 
d -----------| 

アサインメントは右から左に連想するためです。

A d = (new A().aob = new A()); 

他に誰かがそれを説明できますか? ありがとう

+0

2点:まず、2番目の図には「O2 - > O1-> null」が必要です。第2に、gcに適格な他のオブジェクトは、「A c = new A();」の中の「c」に割り当てられた「A」の元のインスタンスである。おそらくあなたはこれを知っていたが、言及されていないので、私はそれを言及すると思った。 :) –

答えて

6

右から左に向かっています。最初にnew A()が実行され、新しいオブジェクトが作成されます。その後、別の新規オブジェクトAの項目aobに割り当てられます。最後にdがプロパティaobを参照しています。これは、2番目のオブジェクトAがガベージコレクションに適格であることを意味します。

それは次のようである:

A firstA = new A(); 
A secondA = new A(); 
secondA.aob = firstA; 
A d = secondA.aob; 

しかしsecondAオブジェクトは、それへの参照がないインラインように作成され、それがガベージコレクションの対象です。

+0

A d =新しいA()。aob =新しいA(); ----は、 と同じになります。A d = new A(); 新しいA()。aob = d; – Joe

0

この例では、何を期待していますか?

A a = new A(); 
A b = new A(); 
a.aob = b; 
A d = a.aob; 

dインスタンスaまたはインスタンスbでしょうか?

オブジェクトをインラインで作成しているという理由だけで異なると思われますか?

この例では、確かにdはオブジェクトbである必要があります。したがって、オブジェクトaは参照されず、ガベージコレクションされます。

0
A d = new A().aob = new A(); 

Javaでは、代入演算子は右結合であり、つまり右から左に評価されます。しかし、彼らは最優先オペレーターグループに属しています。

したがって、2番目の新しい演算子(2番目の等価の右辺)が最初に評価され、新しいAオブジェクトが取得されます。 「a」とします。今私たちは持っています:

new A().aob = a; 

ここでのトリックは、演算子の優先順位を認識することです。ここをクリックしてください:http://pages.cs.wisc.edu/~willb/cs302/spring-07/java-operator-precedence.pdf

'new'演算子と '。'演算子は、メソッド呼び出し演算子は同じ優先順位を持ちますが、それらの連想品質は逆になります。 'new'は右結合で '。'左結合である。

したがって、コンパイラは最初に 'A()'(次のオペランドが配置される前)の '右オペランド'にnew演算子を適用します。新しいオブジェクトをbと呼ぶことにしましょう。

A d = b.aob = a; 

コンパイラで '。'を適用する必要があります。 ( '。'は '='演算子より優先度が高いため)。のは、Cとして「b.aob」によって参照されるオブジェクトを呼ぶことにしましょう:

A d = c = a; 

は最後に残されているすべての代入演算子は、彼らは(右から左から評価)右結合されています。だから、は最初C(b.aob)に割り当てられ、その後CDに割り当てられます。

関連する問題