Метод equals() вернет true при сравнении объектов разных классов с одинаковыми значениями полей?

«Метод equals() вернет true при сравнении объектов разных классов с одинаковыми значениями полей?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, стандартная реализация equals() (от класса Object) вернет false.

Причина: Контракт метода equals() в Java включает проверку на совпадение типов. Даже если состояния объектов идентичны, они принадлежат разным классам и, следовательно, не могут быть равными.

Пример, демонстрирующий проблему:

class Person {
    String name;
    // Конструктор, геттеры/сеттеры...
}

class Employee {
    String name;
    // Конструктор, геттеры/сеттеры...
}

Person p = new Person("Alice");
Employee e = new Employee("Alice");

System.out.println(p.equals(e)); // false (даже если не переопределен equals)

Правильная реализация equals() всегда включает проверку класса:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    // Критически важная проверка: объекты должны быть одного класса
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;
    return Objects.equals(name, person.name);
}

Важно: Сравнение объектов разных классов обычно является ошибкой логики. Если такая необходимость есть, нужно явно проектировать иерархию наследования и использовать instanceof с осторожностью, соблюдая симметричность контракта.