
最近Javaの勉強を始めました。
入門書に従って進めているのですが、
例題に下記のようなプログラムが載っていました。
for文の中でインスタンスを作ってループさせているのですが、
下記のプログラムだと"fusen" "label"という同名のインスタンスが複数できることになると思います。
結果は複数の付箋がデスクトップに表示されるので参考書通りといえばそうなのですが、
同名のインスタンスが複数作成されてしまうというのは例えば同じ名前の変数が複数、しかも同じブロック内で作成されてしまうというのと同じような気がします。
後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合、
困るのではないかと思いますし、そもそも同じ名前のインスタンスを複数作れるというのは
有りなのでしょうか?
上手く説明できないのですが、何だか気持ち悪くてしょうがありません。
どなたかアドバイス頂けないでしょうか?
(注)
"Dodai"クラスは入門書付属の拡張ライブラリなのですが、
デスクトップに付箋を表示するためのクラスです。
"JLabel"クラスは"Java Platform Standard Edition 6"のものを使用しています。
-----------------------------------------------------------
public static void main(String[] args){
//外側の繰り返し
for( int i = 1; i <= 9; i++ ){
//内側の繰り返し
for( int k = 1; k <= 9; k++ ){
Dodai fusen = new Dodai();
JLabel label = new JLabel();
label.setText(i + "x" + k + "=" + ( i*k ));
fusen.add(label);
fusen.setSize(50, 30);
fusen.setLocation(i * 60, k * 40);
fusen.setVisible(true);
}
}
}
No.3ベストアンサー
- 回答日時:
変数をインスタンスの「名前」というあたりに誤解があるように思います。
インスタンスには「リファレンス」といって、そのインスタンスがどこに置いてあるのかを示す、いわば「固有の番号」があります。newで新しいインスタンスが作られたら、新しい「番号」が付きます。
変数は、その「番号」を覚えているだけです。
リファレンスだけに注目すれば、こんなイメージです。
int Reference=1;
...
int fusen = Reference ++ ; // 実際に「次」になるとは限りませんが
int label = Reference ++ ; // 別の値になる、という意味では同等です。
> 後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合
そういう場合は、覚えておくようにプログラムを作ります。( Dodai fusen[][]→newで配列確保して、fusen[i][k]=new Dodai(); とか)
No.2
- 回答日時:
名前が同じなので多少混乱するかもしれないですが、ループの中を一度出たものは破棄されて再度ループに入った時に作られるインスタンスは別になります。
分かり易く(かどうかは分かりませんが)いうと
一回目のループ
for(1){
fusen[1] ←一回目のインスタンス
}
二回目のループ
for(2){
fusen[2] ←一回目のインスタンス
}
こんな感じです。
実際に[1]とかにはなりませんが、イメージ的にそんな感じで捉えればいいと思います。
Cみたいな明示的なデストラクタはないので、ループの最後にデストラクタがあるみたいな捉え方でもいいかもしれません。
fusen,labelは消滅して生成されてを繰り返しているのですね。
デスクトップ上に付箋は表示されたままですが、forループが終わるとfusenのスコープは終わって変数は消滅しているのですね?
スコープの考え方が足りなかったのですね。
ありがとうございました。
デスクトップ上に付箋が残っているのは変数のスコープが終わっても
実行された内容はメモリ上に残っているからでしょうか?
どうでしょうか、認識は正しいでしょうか?
No.1
- 回答日時:
まず「『変数』と『(その変数に代入した) インスタンス』とは別物である」という意識を持ってください. そして, 「変数は (直接囲む) ブロックが終わったときに消滅する」ことも認識してください. つまり, i=1, k=1 のときの変数fusen と i=1, k=2 のときの変数fusen とは「違う変数」です. プログラムの字面上同じ名前ですが, あくまで違う変数です.
で確かに「後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合、
困る」んだけど, それは (今の場合) あくまで「変数が消滅する (その結果当該インスタンスにアクセスする方法がなくなる)」ことによる影響でしかありません. そして, そういう必要性があるならこんなプログラムは書きません.
そもそも for の変数 k も同じ状況にあるんだけど, それは「気持ち悪い」とは思いませんでしたか?
この回答への補足
ありがとうございます。
kに関しては変数の中身が入れ替わっているという認識ですが、
付箋がデスクトップ上に複数表示されているので、fusenの中身は書き変わっていますよね。
fusenはオブジェクト型の変数なので、アドレスが入っているのだと思っているのですが、
あ、この文を書いていて気づいたのですが、一回目と二回目のfusenの中に入っているアドレスは違うモノが入っていて、forループの中の処理が実行される度にfusenの中に入るアドレスが書き換わっているのですね。
デスクトップ上に付箋は表示されたままですが、forループが終わるとfusenのスコープは終わって変数は消滅しているのですね?
どうでしょうか、認識は正しいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語 3 2022/10/04 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数の参照でエラーが出てしま...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
非staticフィールドを参照でき...
-
[Visual C#] 優先される処理に...
-
C# インスタンスの破棄
-
オブジェクト参照がオブジェク...
-
VB.NET getとsetの概念がわかり...
-
生成したインスタンスを削除す...
-
「インスタンス」の意味をわか...
-
JavaのSingletonパターンのpriv...
-
newしないインスタンス?実体化...
-
マルチスレッド間でデータ交換...
-
C#において、同じインスタンス...
-
下記の様に、Employeeの(クラ...
-
エクセル(複数インスタンス)...
-
インスタンスとスレッドの違い
-
インスタンスを同じ名前で作成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
オブジェクト参照がオブジェク...
-
生成したインスタンスを削除す...
-
VB.NET getとsetの概念がわかり...
-
javaのクラスの作り方、エラー...
-
変数の参照でエラーが出てしま...
-
「インスタンス」の意味をわか...
-
インスタンスを同じ名前で作成...
-
newしないインスタンス?実体化...
-
フォームの存在をチェックする方法
-
String a = "a"; と String b =...
-
C#のメモリ解放についてご教授...
-
vb.netでFAXを送信する方法
-
他のファイルの変数参照
-
Delphiでインスタンスが作成さ...
おすすめ情報