У меня есть 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, что произойдет, если такого метода нет?
Обновлено: Я попытался запустить его, и он выдает ошибку компиляции. Хорошо, но почему это происходит? Я узнал, что компилятор сначала перейдет к подклассу и будет искать метод, и если он там, то он будет выполнен?
На самом деле я не понял, что вы правы, но независимо от результата, меня также интересует правило, лежащее в основе этого.
@JushKillaB "Почему?" какие?
"Что, если только у класса Student есть метод talk(Student s)" - пробовали? Подсказка: компилируется?
Запустил, не компилируется, но я не понимаю. Почему он не ищет метод talk() в своем подклассе class Student?




Не существует динамической привязки для перегруженных методов ...
и Student - это человек, поэтому метод разговаривает с вызываемым человеком
Это далеко не ясно ... Например, "Student - это Person" на самом деле означает, что ссылка x является ссылкой на Person, а не на Student extends Person.
Вы пробовали сделать эту программу?