Однако, когда вы создаете свои собственные пользовательские классы, стандартный метод equals(), унаследованный от Object, просто использует оператор ==, то есть он проверяет только равенство ссылок. Чтобы сравнивать объекты вашего пользовательского класса на основе их атрибутов (логическое равенство), вам нужно переопределить метод equals() самостоятельно.
-
Убедитесь, что вы находитесь в директории ~/project в WebIDE.
-
Создайте новый файл с именем Person.java в директории ~/project.
-
Откройте файл 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:
- У нас есть два приватных атрибута:
name (тип String) и age (тип int).
- У нас есть конструктор для инициализации этих атрибутов.
- У нас есть методы-геттеры для доступа к атрибутам.
- Мы переопределили метод
equals(). Рассмотрим шаги внутри переопределенного метода equals():
if (this == obj): Это оптимизация. Если две ссылки указывают на один и тот же объект, они определенно равны.
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 (используя equals() для объектов типа String).
-
Сохраните файл Person.java.
-
Теперь создадим еще один файл, PersonEqualityDemo.java, чтобы протестировать наш переопределенный метод equals(). Создайте этот файл в директории ~/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 равны по обоим сравнениям, потому что они ссылаются на один и тот же объект.