JAVAのプログラミングの勉強中です。

周りに詳しい人がいないので質問します。ぜひお願いします。

ちなみに参考書の答案ではCの2つでした。
自分にはc1.go(c2)メソッドによってc2およびc3はnullが与えられていると思うのですが。
そうなると対象とされるオブジェクトは4つで、、、
どうもすっきりしないです。よろしくお願いします。

問題
「//その他の処理を実行する」に到達したとき、いくつのオブジェクトがガ-ベジコレクションの対象になりますか?

class CardBoard{
  Short story = 200;
  CardBoard go(CardBoard cb){
    cb = null;
    return cb;
  }
  public static void main(String[] args){
    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);
    c1 = null;
    //その他の処理を実行する
  }
}




A. 0
B. 1
C. 2
D.コンパイルに失敗する
E.それを知る方法はない
F.ランタイム例外が投げられる

回答の条件
  • 1人2回まで
  • 登録:2009/12/06 15:36:39
  • 終了:2009/12/06 20:24:53

ベストアンサー

id:kmdsbng No.3

kmdsbng回答回数5ベストアンサー獲得回数22009/12/06 20:06:44

ポイント45pt

c1, c2, c3のうち、ガベージコレクトの対象になるのがc1のみというのは

t-wataさんのおっしゃるとおりです。go()メソッドがガベージコレクトと

関係ないというのも、c3への代入でオブジェクトが構築されてない、という点も

正しいです。

ただこの問題のポイントは、

「いくつのCardBoardオブジェクトがガベージコレクトの対象になるか?」

ではなく、

「いくつのオブジェクトがガベージコレクトの対象になるか?」

という点みたいですね。すなわち、c1にnullが代入された時点で、

(正しくはc1に代入されていたオブジェクトがどこからも参照されなくなった時点で)

c1からのみ参照されているc1.storyもガベージコレクトの対象に

なってしまっています。(CardBoard.storyはプリミティブ型の

short型ではなくラッパ型のShort型なので、オブジェクトとして扱われます。)

クラス宣言部で

Short story = 200;

と代入されていますが、これは CardBoard のコンストラクタで

Short story = new Short(200);

と書かれているのと等価になります。すなわちShort型のオブジェクトが

構築されている。

よってc1とc1.storyがガベージコレクトの対象となり、

cの2個が正解となります。なかなか意地悪な問題ですね。

id:ink3638442

ありがとうございます。

完璧でした!

たしかに意地悪ですよね。

c1.storyが対象なことまでは把握してましたが

このc1.go(c2)メソッドが自分にとって曲者でした。

とても参考になりました!

2009/12/06 20:20:11

その他の回答(2件)

id:sirotugu40 No.1

sirotugu40回答回数449ベストアンサー獲得回数142009/12/06 17:08:30

ポイント5pt

ガ-ベジコレクションのタイミングは、わかりません。

id:ink3638442

ありがとうございます。

タイミングはたしかに誰にもわからないはずです。

しかしガーベジコレクションの対象となるオブジェクトはわかるはずなのです。

2009/12/06 19:55:41
id:t-wata No.2

t-wata回答回数82ベストアンサー獲得回数132009/12/06 18:56:14

ポイント30pt

答えはBの1つだと思うけど。

ガベージコレクションの対象になるのは、

CardBoard c1 = new CardBoard();

で作成されたCardBoardオブジェクトだけです。これがこの後nullを代入されているので、//その他の処理 の時点で到達不能になっています。

ほかに作成されたオブジェクトは、

CardBoard c2 = new CardBoard();

だけで、これは、参照は握ったままです。

(c1.go(c2) メソッドには、c2の参照のコピーがわたるだけなので、呼ばれた先で引数にnullを代入されても、呼び出し元のc2の参照はnullにはならず元のまま)

また、

  CardBoard go(CardBoard cb){

    cb = null;

    return cb;

  }

は、

  CardBoard go(CardBoard cb){

    return null;

  }

と同値です。処理的にも、ガベージコレクション的にも。

なので、

CardBoard c3 = c1.go(c2);

CardBoard c3 = null;

と一緒で、オブジェクトは作られないし、既存のオブジェクトの参照先を変更したりしていないので、GC対象が増えたり減ったりはしないです。

id:ink3638442

ありがとうございまいた。すっきりです。

cbはc2のコピーなのですね。

このコピーというものを間違って理解していたようです。

cbが変わればc2も変わるものだと勘違いしていました。

助かりました。

ちなみにc1.storyもオブジェクトの1つなので

これも対象となる ということのようです。

2009/12/06 20:11:45
id:kmdsbng No.3

kmdsbng回答回数5ベストアンサー獲得回数22009/12/06 20:06:44ここでベストアンサー

ポイント45pt

c1, c2, c3のうち、ガベージコレクトの対象になるのがc1のみというのは

t-wataさんのおっしゃるとおりです。go()メソッドがガベージコレクトと

関係ないというのも、c3への代入でオブジェクトが構築されてない、という点も

正しいです。

ただこの問題のポイントは、

「いくつのCardBoardオブジェクトがガベージコレクトの対象になるか?」

ではなく、

「いくつのオブジェクトがガベージコレクトの対象になるか?」

という点みたいですね。すなわち、c1にnullが代入された時点で、

(正しくはc1に代入されていたオブジェクトがどこからも参照されなくなった時点で)

c1からのみ参照されているc1.storyもガベージコレクトの対象に

なってしまっています。(CardBoard.storyはプリミティブ型の

short型ではなくラッパ型のShort型なので、オブジェクトとして扱われます。)

クラス宣言部で

Short story = 200;

と代入されていますが、これは CardBoard のコンストラクタで

Short story = new Short(200);

と書かれているのと等価になります。すなわちShort型のオブジェクトが

構築されている。

よってc1とc1.storyがガベージコレクトの対象となり、

cの2個が正解となります。なかなか意地悪な問題ですね。

id:ink3638442

ありがとうございます。

完璧でした!

たしかに意地悪ですよね。

c1.storyが対象なことまでは把握してましたが

このc1.go(c2)メソッドが自分にとって曲者でした。

とても参考になりました!

2009/12/06 20:20:11

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません