Обработка ссылки на подкласс как объекта

Это вопрос, связанный с полиморфизмом, возникающий в процессе изучения 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)
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Далее: AA имеет только один equals метод, унаследованный от Object: equals(Object).

Далее: BB переопределяет этот метод с помощью equals(Object), так что вызывается реализация.

(Это одна из многих причин, по которой почти никогда не бывает хорошей идеей определять какой-либо equals-метод, отличный от equals(Object).)

Другие вопросы по теме