Однако, когда вы создаете свои собственные пользовательские классы, стандартный метод 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
равны по обоим сравнениям, потому что они ссылаются на один и тот же объект.