Ваше понимание того, как выполняется связывание, неверно.
В связывании есть два шага:
- Решите, какую перегрузку вызывать
- Определите, какая реализация для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.