4

このサンプルコードを検討してください。

1.  public class GC {
2.      private Object o;
3.      private void doSomethingElse(Object obj) { o = obj; }
4.      public void doSomething() {
5.          Object o = new Object();
6.          doSomethingElse(o);
7.          o = new Object();
8.          doSomethingElse(null);
9.          o = null;
10.     }
11. }

doSomethingメソッドが呼び出されると、5行目で作成されたオブジェクトがガベージコレクションに使用できるようになりますか?

A.5行目

B.6行目

C.7行目

D.8行目

E.9行目

F.10行目

回答:D

なぜ?確かに、Line 6が実行されると、Line5で作成されたオブジェクトはインスタンスvaroとローカルvaroによって参照され、Line 8が実行されると、オブジェクトはローカルrefvaroによってのみ参照されるようになります。 Dは何ですか?9行目が実行された後はどうなりますか?ありがとう。

4

2 に答える 2

9

この質問がIMOを混乱させる主な理由は、という名前の2つの変数があることですo。1つはインスタンス変数で、もう1つはメソッド内oのローカル変数です。odoSomething()

Time            instance var o    local var o
Before Line 5:            null               
Line 5:                   null       Object#1
Line 6:               Object#1       Object#1
Line 7:               Object#1       Object#2
Line 8:                   null       Object#2   <- No more references to Object#1

したがって、8行目(または実行後)では、Object#1が収集の対象になります。

于 2012-08-29T16:37:34.713 に答える
1

2番目の参照をクリアするためにオブジェクトが適格であるのは3行目が2回目に呼び出された後なので、質問は少し混乱しますo

于 2012-08-29T16:38:17.240 に答える