【Java】java.lang.Objectクラスのequals()メソッドをオーバーライドする

■java.lang.Objectクラスの継承

すべてのクラスは、継承(extends)を指定しなくても、自動的に「java.lang.Object」クラスを継承している。
また、「java.lang.Object」クラスのメソッドも自作のクラス同様にオーバーライド(※)することができる。

(※)オーバーライドの使い方の参照先

■equals()メソッドのオーバーライド

今回は「java.lang.Object」クラスのequals()メソッドをオーバーライドする。

▼equals()メソッドの使い方

equals()メソッドはオブジェクトと他のオブジェクトが等しいかどうかを判定するときに使用する。

以下にequals()メソッドのサンプルコードと実行結果を記載する。
なお、比較対象として演算子「 == 」の結果も記載する。

・サンプルコード

// メインクラス
public class Sample {
	public static void main(String[] args) {
		// 配列に同じ値を格納
		int[] num1 = {111, 222};
		int[] num2 = {111, 222};
		// num3はnum1の参照渡しをする
		int[] num3 = num1;
		
		// 演算子「 == 」で比較
		System.out.println("num1 == num2:" + (num1 == num2));
		System.out.println("num1 == num3:" + (num1 == num3));
		
		// equalsメソッド
		System.out.println("num1.equals(num2):" + num1.equals(num2));
		System.out.println("num1.equals(num3):" + num1.equals(num3));
	}
}

・実行結果

num1 == num2:false
num1 == num3:true
num1.equals(num2):false
num1.equals(num3):true

<補足説明>
num1とnum2の中身は同じ値であるが、異なるオブジェクトであるため「false」となる。
num1とnum3について、num3はnum1を参照している(同じオブジェクト)であるため、「true」となる。

配列num1、num2、num3のイメージ図

▼参照型についての参照先

▼equals()メソッドのオーバーライド

前述の通り、equals()メソッドはオブジェクトと他のオブジェクトが等しいかどうかを判定するときに使用するが、オーバーライドしたクラスの判定方法次第で、結果を変更することができる。

・今回作成するプログラムの仕様

今回作成するプログラムは、xとyの値を比較し、「true」もしく「false」を返す。
なお、equals()メソッドはオーバーライドし、オブジェクトの比較ではなく、xとyの値を比較するように変更する。

詳細なプログラムの仕様を以下に記載する。

equalsメソッドをオーバーライドするクラス

・メンバ変数(フィールド)
xの値
yの値

・Java.lang.Objectクラスのequals()メソッドをオーバライドするメソッド
①オブジェクトをクラスにキャストしてから、xとyの値を比較するように変更する。
②比較した結果を戻り値で返す。

・コンストラクタ
xの値の初期値をセット(引数の値)
yの値の初期値をセット(引数の値)

メインクラス

①「変数:point1」は、equalsメソッドをオーバーライドするクラスについてインスタンスする。(x=111, y=222)
「変数:point2」は、equalsメソッドをオーバーライドするクラスについてインスタンスする。(x=111, y=222)
「変数:point3」は、「変数:point1」を参照する。
④演算子「 == 」で「point1」と「point2」、「point1」と「point3」を比較する。
⑤オーバーライドしたequals()メソッドで「point1」と「point2」、「point1」と「point3」を比較する。

・サンプルコード

package JavaBasis02;

// equalsメソッドをオーバーライドするクラス
class isXYpoint{
	private int x_point;	// xの値
	private int y_point;	// yの値
	
	// Java.lang.Object.equalsメソッドをオーバライドするメソッド
	public boolean equals(Object obj) {
		// objを(isXYpoint)にキャストしてから比較
		// オブジェクトではなくxとyの値を比較するように変更
		return this.x_point == ((isXYpoint)obj).x_point 
				&& this.y_point == ((isXYpoint)obj).y_point;
	}
	
	// コンストラクタ
	public isXYpoint(int x, int y) {
		this.x_point = x;
		this.y_point = y;
	}
}

// メインクラス
public class Sample {
	public static void main(String[] args) {
		// 同じ値でisXYpointをインスタンスする
		isXYpoint point1 = new isXYpoint(111, 222);
		isXYpoint point2 = new isXYpoint(111, 222);
		
		// point3はpoint1を参照する
		isXYpoint point3 = point1;
		
		// 演算子「 == 」で比較
		System.out.println("point1 == point2:" + (point1 == point2));
		System.out.println("point1 == point3:" + (point1 == point3));
		
		// equalsメソッド(オーバライド)で比較
		System.out.println("point1.equals(point2):" + point1.equals(point2));
		System.out.println("point1.equals(point3):" + point1.equals(point3));
		
	}
}

・実行結果

point1 == point2:false
point1 == point3:true
point1.equals(point2):true
point1.equals(point3):true

<補足説明>
オーバーライドしたequals()メソッドについては、オブジェクトではなく、xとyの値を比較しているので、「point1」と「point2」の比較結果は、「true」となる。

オーバーライドしたequals()メソッドのイメージ図

コメント