-
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
は、同じオブジェクトを参照しているため、どちらの比較方法でも等しいです。