2012-01-05 4 views
-1
for(int i = 0; i < 3; i++){ 

Object obj = new Object(); 

} 

3つのオブジェクトが作成されるか、3回再インスタンス化されるオブジェクトは1つだけですか? フードの下ではどうなりますか?forループを使用するときにいくつのオブジェクトが作成されますか?

+0

ループの実行が終了した後に、作成されるオブジェクトの数、またはメモリに格納されるオブジェクトの数を意味しますか? – StuperUser

答えて

7

new Object()が3回呼び出されるため、3つのオブジェクトが作成されます。

「再インスタンス化された」オブジェクトという概念はありません。あなたには、いくつかの方法でループの各反復で再初期化される唯一の変数 が、そこだと主張することができるように

は今、同じスタック空間はよく、コンストラクタから返された参照を格納するために使用することができます。 ..しかし、変数とオブジェクトは非常に異なっており、あなたの心の中で2つの概念を分離することが重要です。そこに他の方法で


本当に3つの別々の変数なので、あまりにも遠く、これを服用しないでください。

+1

エスケープ解析では、何もせずに使用されないため、オブジェクトが作成されないことがあります。私はJRockitの最適化がこのコードを排除できると信じています。 –

+0

ループの2番目の反復の開始時に 'obj'によって参照されるメモリ内のオブジェクトは、2回目の割り当てが行われるとどうなりますか?ループのすべての反復の実行が終了した後、または2回目の反復の終了時に収集されますか?または方法の終わり?それは問題ですか? – StuperUser

+1

@StuperUser:オブジェクトそのものを意味していますか? *ガベージコレクションの対象となりますが、すぐにまたは後で収集することができます。保証はありません。 –

1

オブジェクトを「再インスタンス化」することはできません。 newキーワードを呼び出すたびに、新しいオブジェクトが作成されるため、3が作成されます。

1

"new"キーワードを使用すると、いつでも新しいオブジェクトが作成されます。参照はローカルスコープにあるため、オブジェクトはループ条件の後にスコープから外れ、ガベージコレクションの候補になります。

0

ヒープメモリに3つの異なるオブジェクトを作成していますが、ループの後には、作成した最後のオブジェクトでのみアクセスできます。

編集: "できる"の意味は、そのポインタを介してを意味する最後のオブジェクトにのみアクセスできます。

+0

実際には、宣言された変数のスコープを考えると、 – Perception

+0

ああ、あなたはまったく正しいですが、私は、範囲が「正しい」別の状況では、彼はアクセスすることができます作成された「最後の」オブジェクトで – DonCallisto

0

単語newが使用されるたびに、新しいオブジェクトが作成されるため、3つのオブジェクトが作成されます。宣言された変数のスコープが与えられているにもかかわらず、ループが終了するとオブジェクトは使用できません。

関連する問題