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

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

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

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

Q&A

解決済

1回答

1584閲覧

Java で equalsメソッドのオーバーロードについて質問です。

pi_

総合スコア1

Java

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

0グッド

0クリップ

投稿2020/06/03 04:43

Java Silver の資格を目指し勉強中です。

下記のソースを実行したときの結果
B
C
A
とコンソールに出力されます。
参考書にはequalsメソッドがtrueを戻すため「同じ」ものとして削除する為とあります。

<わからない事>
Itemはコンストラクタである為、インスタンスのタイミングで実行されるのはわかりますが、equalsメソッドがどのタイミングでが呼ばれているのかわかりません。
長文で申し訳ありませんが、回答していただけると助かります。

public class Item { private String name; private int price; public Item(String name, int price) { this.name = name; this.price = price; } public boolean equals(Object obj) { if (obj instanceof Item) { Item tmp = (Item) obj; if (tmp.name.equals(this.name)) { return true; } } return false; } public String getname() { return name; } }
import java.util.ArrayList; public class hosotest { public static void main(String[] str) { ArrayList<Item> list = new ArrayList<>(); list.add(new Item("A", 1)); list.add(new Item("B", 2)); list.add(new Item("C", 3)); list.add(new Item("A", 1)); list.remove(new Item("A", 5)); for (Item item : list) System.out.println(item.getname()); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

equalsメソッドがどのタイミングでが呼ばれているのかわかりません。

このコードにおいては、

java

1 list.remove(new Item("A", 5));

の中で呼ばれます。removeの引数にオブジェクトが渡された場合、引数に「等しい」最初のものが削除されますが、その「等しい」判定にequalsが使われます。

蛇足ですが、その前の質問文がしっちゃかめっちゃかです。

Itemはコンストラクタである為、

Itemはコンストラクタではなくクラスです。

インスタンスのタイミングで実行されるのはわかりますが、

「インスタンスのタイミング」って何を指しているのですか?

それと、質問タイトルで「オーバーロード」は「オーバーライド」の間違いですね。

投稿2020/06/03 04:47

編集2020/06/03 04:48
swordone

総合スコア20651

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

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

pi_

2020/06/03 05:08 編集

list.remove(new Item("A", 5)); ここでなぜコンストラクタでないequalsが実行されるのか教えてください
swordone

2020/06/03 05:10

一緒くたに考えないでください。 やってることはこういうことです。 Item x = new Item("A", 5); list.remove(x);
BluOxy

2020/06/03 05:12

> removeの引数にオブジェクトが渡された場合、引数に「等しい」最初のものが削除されますが、その「等しい」判定にequalsが使われます。 と説明されています。
pi_

2020/06/03 05:12

Item x = new Item("A", 5); ここで実行されるのは public Item(String name, int price) {} このコンストラクタが実行する認識です
pi_

2020/06/03 05:22

list.remove(x); なぜここで呼ばれていない public boolean equals(Object obj) {} が実行されるのでしょうか?
q_sane_q

2020/06/03 05:23

恐らく質問者の方が迷っているのは 「ソースコード上にequals呼び出しが書かれていない」 のに 「equalsが呼び出されているらしい」 ところですよね。 equalsはListのremoveメソッドの中で実行されています。 Listの中身を順番に引数で渡されたオブジェクトとequalsで比較しています。
pi_

2020/06/03 05:28

Listのremoveメソッドの中にequalsを呼び出すコードが書かれている という認識であっていますでしょうか?
pi_

2020/06/03 05:32

removeメソッドをしらべたらequalsを呼び出していました。 回答者の皆様ありがとうございました。
q_sane_q

2020/06/03 05:32

そうですね より正確に言えばListはインタフェースなので実際の処理はArrayListの方に書いてありますが
pi_

2020/06/03 05:36

解決しました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問