「Object」クラスのメソッド「equals」の紹介と、その挙動について説明します。
オブジェクトの比較には、比較演算子ではなく、「equals」メソッドを使います。このequalsは、java.lang.Objectのメソッドです。
全てのクラスはObjectを継承しているために、全てのクラスでequalsが使えます。
自作クラスでは、extendsの指定をしていないケースが多いです。その際は、java.lang.Objectを直接継承していることになります。しかしjava.lang.Objectのequalsメソッドには注意が必要です。
java.lang.Objectのequalsメソッドでは、単に参照が同じか否かを比較演算子で比較しているだけです。オブジェクトの値などは一切考慮されていません。
public boolean equals(Object obj) {
return (this == obj);
}
そのため、自作クラスでequalsメソッドを使い、オブジェクトの値を比較させたい場合は、equalsメソッドをオーバーライドする必要があります。
「instanceof」は、オブジェクトに対して使える比較演算子です。基本型には使用できません。
instanceofは、左辺にオブジェクトを、右辺にクラスやインターフェースを書きます。そして、右辺が自身のクラスか、祖先のクラスやインターフェースならばtrueと判定されます。
| オブジェクト instanceof 自身のクラス | true |
| オブジェクト instanceof 祖先のクラス | true |
| オブジェクト instanceof 祖先のインターフェース | true |
| オブジェクト instanceof それ以外 | false |
以下、自作クラスにequalsの処理を実装する例を示します。
package sample;
public class MyClass {
public int n = 0;
// equalsのオーバーライド
@Override
public boolean equals(Object obj) {
if (obj instanceof MyClass) {
MyClass mc = (MyClass)obj;
return this.n == mc.n;
}
return false;
}
}