-
WebIDE で ~/project ディレクトリにいることを確認します。
-
~/project ディレクトリに Person.java という名前の新しいファイルを作成します。
-
Person.java を開き、Person クラスの次のコードを貼り付けます。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Default equals() method (inherited from Object) would only check reference equality
// We need to override it to check for logical equality based on name and age
@Override
public boolean equals(Object obj) {
// Step 1: Check if the objects are the same instance
if (this == obj) {
return true;
}
// Step 2: Check if the object is null or of a different class
if (obj == null || getClass() != obj.getClass()) {
return false;
}
// Step 3: Cast the object to the correct type
Person person = (Person) obj;
// Step 4: Compare the relevant attributes
return age == person.age &&
name.equals(person.name); // Use equals() for String comparison
}
}
この Person クラスでは:
- 2 つのプライベート属性
name(String 型)と age(int 型)があります。
- これらの属性を初期化するコンストラクタがあります。
- 属性にアクセスするためのゲッターメソッドがあります。
equals() メソッドをオーバーライドしています。オーバーライドされた equals() メソッド内のステップを見てみましょう。
if (this == obj):これは最適化です。2 つの参照がまったく同じオブジェクトを指している場合、それらは確かに等しいです。
if (obj == null || getClass() != obj.getClass()):これは、比較対象のオブジェクトが null であるか、Person クラスのインスタンスでないかをチェックします。どちらかが真であれば、それらは等しくないはずです。
Person person = (Person) obj;:汎用の Object を Person オブジェクトにキャストして、その name と age 属性にアクセスできるようにします。
return age == person.age && name.equals(person.name);:これが論理的な比較の核心です。age が同じであること(プリミティブ型の int には == を使用)、および name が同じであること(String オブジェクトには equals() を使用)をチェックします。
-
Person.java ファイルを保存します。
-
次に、オーバーライドした equals() メソッドをテストするために、PersonEqualityDemo.java という別のファイルを作成しましょう。このファイルを ~/project ディレクトリに作成します。
-
PersonEqualityDemo.java を開き、次のコードを貼り付けます。
public class PersonEqualityDemo {
public static void main(String[] args) {
Person person1 = new Person("Alice", 30);
Person person2 = new Person("Alice", 30);
Person person3 = new Person("Bob", 25);
Person person4 = person1;
System.out.println("Comparing Person objects:");
System.out.println("person1 == person2: " + (person1 == person2));
System.out.println("person1.equals(person2): " + person1.equals(person2));
System.out.println("person1 == person3: " + (person1 == person3));
System.out.println("person1.equals(person3): " + person1.equals(person3));
System.out.println("person1 == person4: " + (person1 == person4));
System.out.println("person1.equals(person4): " + person1.equals(person4));
}
}
このデモクラスでは、いくつかの Person オブジェクトを作成し、== とオーバーライドした equals() メソッドの両方を使用して比較します。
-
PersonEqualityDemo.java ファイルを保存します。
-
ターミナルを開きます。~/project ディレクトリにいることを確認します。
-
両方の Java ファイルをコンパイルします。一度に複数のファイルをコンパイルすることができます。
javac Person.java PersonEqualityDemo.java
これにより、Person.class と PersonEqualityDemo.class ファイルが作成されるはずです。
-
デモプログラムを実行します。
java PersonEqualityDemo
次のような出力が表示されるはずです。
Comparing Person objects:
person1 == person2: false
person1.equals(person2): true
person1 == person3: false
person1.equals(person3): false
person1 == person4: true
person1.equals(person4): true
予想通り、person1 == person2 は false です。なぜなら、それらは別々のオブジェクトだからです。しかし、person1.equals(person2) は true です。なぜなら、オーバーライドしたメソッドによると、それらの name と age が同じだからです。person1 と person3 はどちらの比較方法でも等しくありません。person1 と person4 は、同じオブジェクトを参照しているため、どちらの比較方法でも等しいです。