質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

12554閲覧

一度生成したインスタンスに対して、またNewするとどうなるのか

cat_bera

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2017/02/03 08:55

編集2017/02/03 09:00

■あるJava教本に以下のような記述がありました。

List<TestClass> list = new ArrayList<TestClass>();
TestClass ts = new TestClass();

ts.name = "tarou";
list.add(ts);
System.out.println("要素数は" + list.size());

ts = new TestClass(); ←←←←←←←←①
ts.name = "tarou";
list.remove(ts);

System.out.println("要素数は" + list.size());

■equals()メソッドのオーバーライドがないと、思うようなremove()がされませんよ、という内容のソースなのですが、「①」の箇所でインスタンスに対してまたNewしているのですが、これがなにをしているのかよくわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

これは「変数」に対し、「新しいインスタンス」を「new」して格納している、というのが正しい表現です。
インスタンスに対しnewするというのは誤った認識です。

最初に生成したtsの中身のnameはtarou、後から作ったtsの中身のnameもtarou、一見そっくりさんに見えますが、あくまで別人です。Listのremoveは完全に一致したものを取り除く処理なので、①のremoveが正しく動作しないのです。もしこれを取り除きたいのであれば、TestClassの「equals」メソッドをオーバーライドして、「同一人物かどうかを確認するのはnameだけでよい」とすれば、無事後から作ったtarouさんは同一人物とみなされ、removeが正しく動作します。以下はTestClassのequals実装例です。

Java

1public boolean equals(Object o) { 2 if(o instanceof TestClass) { 3 return this.name.equals(((TestClass)o).name); 4 } 5 else { 6 return false; 7 } 8}

投稿2017/02/03 09:03

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cat_bera

2017/02/03 09:12

質問への回答、ありがとうございます。 いただいた回答の中で、 1:「変数」に対し、「新しいインスタンス」を「new」して格納している 2:一見そっくりさんに見えますが、あくまで別人 1の「変数」とはクラスが持つ変数(フィールド)という意味でしょうか? 2のそっくりさんだけど別人、というのはインスタンスが格納されているアドレスが別だから「別人」という意味でしょうか?理解が追い付いておらず見当違いの質問でしたら、すみません(*‘ω‘ *) 重ねて、equalsメソッドのオーバーライド方法についても教えていただき、ありがとうございました。
suna9123

2017/02/04 11:07

ここで書かれている変数は、フィールドというよりメソッドの中にあるローカル変数(オブジェクト)でしょう。インスタンスが格納されているアドレスが別だから「別人」という意味で良いと思います。Javaの世界ではアドレスというより参照という言い方をしますが。
masaya_ohashi

2017/02/06 00:01

1はローカル変数「ts」のことを指しています。 2はそういうことです。newした時点でまったく別の参照を持ったオブジェクトなので、たとえnameが一緒だとしても別人、ということなのです。
guest

0

tsはインスタンスと呼びません。
tsはインスタンスを保持する変数です。

イメージとしては、
new TestClass()で(メモリ上に)インスタンスを生成、

それにtsとラベル貼ってます。

二回目のts~はもう一個インスタンスを生成してラベル貼り直した感じです。

投稿2017/02/03 09:51

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cat_bera

2017/02/03 10:02

回答ありがとうございました。 インスタンス、として理解していました。 そこがそもそも勘違いのスタートだったんですね。 ちょっと、混乱してきましたが・・・
guest

0

クラスは「料理のレシピ」
インスタンスは「レシピから作った料理という物体」
と考えてみてください.
料理のレシピは一つでも,そのレシピからたくさんの料理を作れます.これがインスタンスです.

上の例では,1度料理を作ってリストに入れていますね.
そして,もうひとつ,料理を作って,これと同じ料理をリストから削除しています.

リストに入っている料理から料理を削除するのに,「何をもって同一」だから削除するのかという話になります.
現実世界としても,最初に作った料理と後から作った料理は同じように見えますが,物理的に別のものですよね?
プログラム上も同じです.
最初のリストから削除するには,最初の料理と後から作った料理を同じと見なす必要があります.
たとえば,最初に作った料理の名前と後に作った料理の名前が同じなら,最初に作った料理をリストから削除する.という具合です.

もうちょっと具体的に見てみましょう.

とある食品メーカーが発売しているカレー粉は,クラス(レシピ)からインスタンス(カレー粉)作られています.
それらは大量に市場に流通しています(リストに格納)
ところが,一部製品に問題があって,自主回収することになりました(リストから削除)
工場作られたインスタンスの何を持って市場から排除するか.
商品名なのか,作られた工場名なのか,賞味期限なのか.それを equals メソッドで定義することで,リスト(市場)から問題のあったインスタンス(カレー粉)だけを削除できるようになります.

投稿2017/02/03 09:28

編集2017/02/03 09:33
tetsukay

総合スコア232

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cat_bera

2017/02/03 09:44

クラスとインスタンス、そしてリストからのRemoveについて丁寧な回答、ありがとうございます('◇')ゞ じつは、質問の意図は、 ts = new TestClass(); が「何をしてるのかよくわからない」ということなんです、質問が分かりにくくてすみません。 一度生成したインスタンス(ts)に対して、new しているのが どういう状態なのかな?という質問でした。
tetsukay

2017/02/03 10:03

これも現実世界になぞらえてみますね. レシピを元に作った料理ですが,最初の料理をテーブルに置いて,そのテーブルにtsと名札を張りました(変数への代入) 新しくレシピを元に料理を作っています(① の部分) この料理は別のテーブルに置きましたが,最初の料理を置いたテーブルの名札を剥がして,こっちのテーブルに貼り直しました.(再代入) こんな状態です.
guest

0

TestClass ts = new TestClass();

で作られた(tsという名前でラベル貼りされた)インスタンス(変数)のtsと

ts = new TestClass();

で作られたインスタンス(変数)のtsは名前は一緒だけど別物、ということなんですね。
(BAはどなたも最適かと思ったんですが、最初に回答くださった方とさせていただきました、ありがとうございました)

投稿2017/02/03 10:20

編集2017/02/03 10:22
cat_bera

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問