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)しかし、実際に行っているのはこれ (1 つの適格なオブジェクト)です。

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

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

代入は右から左に連想されるためです。

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

そうでなければ、誰かがそれを説明できますか?ありがとう

4

3 に答える 3

6

右から左に始まります。Firstnew A()が実行され、新しいオブジェクトが作成されます。aob次に、別の新しいオブジェクトのフィールドに割り当てられますA。最後dにプロパティを参照していますaob。これは、2 番目のオブジェクトAがガベージ コレクションの対象となることを意味します。

それは次のようなものです:

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

ただし、secondAオブジェクトはインラインで作成されるため、オブジェクトへの参照はなく、ガベージ コレクションの対象となります。

于 2012-03-07T20:41:59.817 に答える
0
A d = new A().aob = new A();

Java では、代入演算子は右結合です。つまり、右から左に評価されます。しかし、それらは最も優先度の低い演算子グループにも属しています。

したがって、2 番目の new 演算子 (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;

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

A d = c = a;

最後に残っているのは代入演算子だけで、それらは右結合です (右から左に評価されます)。したがって、最初にac (b.aob) に割り当てられ、次にcdに割り当てられます。

于 2012-03-07T21:30:38.027 に答える
0

この例では、何が期待できますか?

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

インスタンスまたはインスタンスdですか?ab

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

この例では確実dに object でなければならないbため、 objectaは参照されず、ガベージ コレクトされる可能性があります。

于 2012-03-07T20:43:14.903 に答える