Статическая / динамическая привязка в Java

У меня есть class Person, class Student и Student extends Person. Насколько я понял, со статической привязкой происходит следующее:

class Person {
   talk(Person p) {
      print("Hi by person.");
   } 
}

class Student extends Person {
   talk(Student s) {
      print("Hi by stud.");
   }
}

Теперь, если я создам экземпляр и вызову метод:

Person x = new Student();
talk(x);                      
// output: "Hi by person." because of static binding, am I right?

Мой вопрос: Что, если только у class Student есть метод talk(Student s). Сейчас звоню talk(x). Поскольку я обычно должен получить метод talk() от class Person, что произойдет, если такого метода нет?

Обновлено: Я попытался запустить его, и он выдает ошибку компиляции. Хорошо, но почему это происходит? Я узнал, что компилятор сначала перейдет к подклассу и будет искать метод, и если он там, то он будет выполнен?

Вы пробовали сделать эту программу?

Louis Wasserman 18.03.2018 21:43

На самом деле я не понял, что вы правы, но независимо от результата, меня также интересует правило, лежащее в основе этого.

Jush KillaB 18.03.2018 21:44

@JushKillaB "Почему?" какие?

lexicore 18.03.2018 21:45

"Что, если только у класса Student есть метод talk(Student s)" - пробовали? Подсказка: компилируется?

Boris the Spider 18.03.2018 21:46

Запустил, не компилируется, но я не понимаю. Почему он не ищет метод talk() в своем подклассе class Student?

Jush KillaB 18.03.2018 22:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
49
1

Ответы 1

Не существует динамической привязки для перегруженных методов ...

и Student - это человек, поэтому метод разговаривает с вызываемым человеком

Это далеко не ясно ... Например, "Student - это Person" на самом деле означает, что ссылка x является ссылкой на Person, а не на Student extends Person.

Boris the Spider 18.03.2018 21:55

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