こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JAVAのequalsメゾットに関して

public class Sample{
private int num;
public Sample(int num){
this.num=num;

public boolean equals(Sample obj){
if(obj==null){
return false;
}
return this.num==obj.num;

}
}

ここでのequalsメゾットは、object同一性を比較するものか、それともobejectの同値性を比較するものでしょうか?
また、オブジェクトクラスの中のequalsメゾットをみたら

return(this==obj);

と書かれていますが、これを見る限り同一性を比較するものだと思いますが、「objectクラスのequalsメゾットは同値性を比較するメゾット」と書かれているサイトも多くて、一体どっちが正しいでしょうか?
ご回答いただければ幸いです。よろしくお願いいたします。

※OKWAVEより補足:「Webシステム開発」についての質問です。

投稿日時 - 2019-05-14 15:00:48

QNo.9616520

困ってます

質問者が選んだベストアンサー

質問内容のboolean equals(Sample obj)メソッドは確かに同値性を比較するメソッドです。
何故ならあなたがそのように実装したメソッドだからです。

しかし、スーパークラスのboolean equals(Object obj)の処理は"引数が異なるため"上書きされないため、boolean equals(Object obj)は同一性を比較するメソッドとしてそのまま残っています。

したがって、次のようにboolean equals(Object obj)メソッドをオーバーライドして実装すべきかと思います。

public class Sample {
private int num;

public Sample(int num) {
this.num = num;
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if ((obj instanceof Sample) == false) {
return false;
}
return this.num == ((Sample) obj).num;

}

public static void main(String[] args) {
Sample s1 = new Sample(1);
Sample s2 = new Sample(1);
System.out.println(s1.equals(s2));
}
}

オーバーライドする理由の参考になるかもしれないので、次のコードを載せておきます。
Objectクラスのequalsが実行されます。
public class Sample {
private int num;

public Sample(int num) {
this.num = num;
}

public boolean equals(Sample obj) {
if (obj == null) {
return false;
}
if ((obj instanceof Sample) == false) {
return false;
}
return this.num == obj.num;

}

public static void main(String[] args) {
Sample s1 = new Sample(1);
Sample s2 = new Sample(1);
System.out.println(s1.equals((Object) s2));
}
}

Objectクラスで元々実装されているequalsは同一性を比較するメソッドなので、これをオーバーライドして同値性を比較するようにする、というのが定番の流れかな思います。

投稿日時 - 2019-05-14 17:03:20

お礼

ありがとうございます!

投稿日時 - 2019-05-15 14:02:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)