- ベストアンサー
インスタンスを同じ名前で作成することはできる?
- Javaの勉強を始めていますが、for文の中で同じ名前のインスタンスを作成することについて疑問があります。
- 同じ名前のインスタンスが複数作成されると、後々特定のインスタンスのメソッドを使う際に困ることがあるのではないかと思います。
- 誰かアドバイスいただけませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変数をインスタンスの「名前」というあたりに誤解があるように思います。 インスタンスには「リファレンス」といって、そのインスタンスがどこに置いてあるのかを示す、いわば「固有の番号」があります。newで新しいインスタンスが作られたら、新しい「番号」が付きます。 変数は、その「番号」を覚えているだけです。 リファレンスだけに注目すれば、こんなイメージです。 int Reference=1; ... int fusen = Reference ++ ; // 実際に「次」になるとは限りませんが int label = Reference ++ ; // 別の値になる、という意味では同等です。 > 後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合 そういう場合は、覚えておくようにプログラムを作ります。( Dodai fusen[][]→newで配列確保して、fusen[i][k]=new Dodai(); とか)
その他の回答 (2)
- shincha119
- ベストアンサー率42% (95/226)
名前が同じなので多少混乱するかもしれないですが、ループの中を一度出たものは破棄されて再度ループに入った時に作られるインスタンスは別になります。 分かり易く(かどうかは分かりませんが)いうと 一回目のループ for(1){ fusen[1] ←一回目のインスタンス } 二回目のループ for(2){ fusen[2] ←一回目のインスタンス } こんな感じです。 実際に[1]とかにはなりませんが、イメージ的にそんな感じで捉えればいいと思います。 Cみたいな明示的なデストラクタはないので、ループの最後にデストラクタがあるみたいな捉え方でもいいかもしれません。
- Tacosan
- ベストアンサー率23% (3656/15482)
まず「『変数』と『(その変数に代入した) インスタンス』とは別物である」という意識を持ってください. そして, 「変数は (直接囲む) ブロックが終わったときに消滅する」ことも認識してください. つまり, i=1, k=1 のときの変数fusen と i=1, k=2 のときの変数fusen とは「違う変数」です. プログラムの字面上同じ名前ですが, あくまで違う変数です. で確かに「後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合、 困る」んだけど, それは (今の場合) あくまで「変数が消滅する (その結果当該インスタンスにアクセスする方法がなくなる)」ことによる影響でしかありません. そして, そういう必要性があるならこんなプログラムは書きません. そもそも for の変数 k も同じ状況にあるんだけど, それは「気持ち悪い」とは思いませんでしたか?
補足
ありがとうございます。 kに関しては変数の中身が入れ替わっているという認識ですが、 付箋がデスクトップ上に複数表示されているので、fusenの中身は書き変わっていますよね。 fusenはオブジェクト型の変数なので、アドレスが入っているのだと思っているのですが、 あ、この文を書いていて気づいたのですが、一回目と二回目のfusenの中に入っているアドレスは違うモノが入っていて、forループの中の処理が実行される度にfusenの中に入るアドレスが書き換わっているのですね。 デスクトップ上に付箋は表示されたままですが、forループが終わるとfusenのスコープは終わって変数は消滅しているのですね? どうでしょうか、認識は正しいでしょうか?
お礼
fusen,labelは消滅して生成されてを繰り返しているのですね。 デスクトップ上に付箋は表示されたままですが、forループが終わるとfusenのスコープは終わって変数は消滅しているのですね? スコープの考え方が足りなかったのですね。 ありがとうございました。 デスクトップ上に付箋が残っているのは変数のスコープが終わっても 実行された内容はメモリ上に残っているからでしょうか? どうでしょうか、認識は正しいでしょうか?