Это вопрос, связанный с полиморфизмом, возникающий в процессе изучения Java.
Пример имеет два класса: AA как родительский и BB как дочерний. Мы создаем две ссылки на дочерний объект — одну в переменной родительского класса и вторую в переменной дочернего класса:
AA aa = new BB();
BB bb = new BB();
Если мы вызываем дочерний метод через родительскую ссылку и передаем переменную дочернего типа, он обрабатывается как Object.
aa.equals(bb); //call BB.equals (Object ob)
Почему? Почему тип переменной, которая вызывает метод, влияет на идентификацию типа параметра?
Вот полный код:
public class AA
{
}
public class BB extends AA
{
public boolean equals (Object ob){
.............
}
public boolean equals (AA ob){
.............
}
public boolean equals (BB ob){
.............
}
}
public class Main
{
public static void main(String[] params) {
{
AA aa = new BB();
BB bb = new BB();
System.out.println(aa.equals(bb)); //call BB.equals (Object ob) Why?
System.out.println(bb.equals(bb)); //call BB.equals (BB ob)
}
}
}




Во-первых: когда вы назначаете ссылку на более широкий тип, например. когда вы пишете AA aa = new BB();, вы говорите компилятору забыть, что aa — это BB(). Для компилятора это просто AA, потому что вы сказали компилятору рассматривать его как AA.
Далее: AA имеет только один equals метод, унаследованный от Object: equals(Object).
Далее: BB переопределяет этот метод с помощью equals(Object), так что вызывается реализация.
(Это одна из многих причин, по которой почти никогда не бывает хорошей идеей определять какой-либо equals-метод, отличный от equals(Object).)