人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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.ランタイム例外が投げられる

●質問者: ink
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C3 CB Class Go Java
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● sirotugu40
●5ポイント

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

◎質問者からの返答

ありがとうございます。

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

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


2 ● t-wata
●30ポイント

答えは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対象が増えたり減ったりはしないです。

◎質問者からの返答

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

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

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

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

助かりました。

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

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


3 ● kmdsbng
●45ポイント ベストアンサー

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個が正解となります。なかなか意地悪な問題ですね。

◎質問者からの返答

ありがとうございます。

完璧でした!

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ