Как метод equals ведет себя при перегрузке? - PullRequest
2 голосов
/ 06 июля 2019

Так у меня ниже Тестовый код Реализации

class Employee{
     String name;
     int age;

    @Override
public boolean equals(Object obj) return false;

public boolean equals(Employee obj) return true;     
}

А в основном методе у меня ниже код

public static void main(String[] args) {        
    Object E1 = new Employee();
    Employee E2 = new Employee();

    System.out.println(E1.equals(E2));

}

Таким образом, согласно моему пониманию, полиморфизм должен связывать E1 с методом equals(Employee obj), поскольку я передаю объект типа Employee, а экземпляр E1 также имеет тип Employee (хотя ссылка на базовый экземпляр Object имеет тип Employee). Тем не менее, я вижу, что он печатает false, что означает, что equals(Object obj) был вызван (То же самое было проверено с помощью оператора Sysout в методе обоих равно).

1 Ответ

3 голосов
/ 06 июля 2019

Ваше понимание того, как выполняется связывание, неверно.

В связывании есть два шага:

  1. Решите, какую перегрузку вызывать
  2. Определите, какая реализация дляcall.

Первый шаг выполняется во время компиляции и основан на типе переменной время компиляции .Второй шаг выполняется во время выполнения и зависит от типа объекта во время выполнения.Второй шаг - это то, что вы называете «полиморфизмом».

На первом шаге тип времени компиляции E1 равен Object, поэтому существует только одна перегрузка изequals на выбор - equals(Object).Следовательно, эта перегрузка выбрана.

На втором шаге можно выбрать из двух реализаций :

// In Employee class:
public boolean equals(Object obj) return false;

// In Object class
public boolean equals(Object obj) {
    return (this == obj);
}

С E1 * Тип времени выполнения равен Employee, как вы правильно определили, он выбирает реализацию в классе Employee, который все время возвращает false.

...