Сегодня у меня был экзамен в Java, и экзаменатор спросил меня, могу ли я привести какие-либо примеры использования полиморфизма в моем проекте Spring Boot.
Поскольку я сначала ничего не мог придумать, он указал, что я переопределил toString () в моих моделях и что это динамический / динамический полиморфизм.
Однако я не уверен, что понимаю его точку зрения, потому что, насколько я понимаю поведение считается полиморфным c, когда у нас есть ссылка на родительский класс, указывающая на объект подкласса (с акцентом на динамический c полиморфизм).
Затем во время выполнения фактический объект , на который указывает родительская переменная класса, извлекается и вызывается ее метод, как хорошо объяснено здесь .
Однако я не использую апкастинг в своем проекте (т.е. инициализирую мой POJO классы с переменной класса Object).
Таким образом, мой вопрос - переопределяет toString () считается полиморфизмом, хотя родительский класс (Obj ect) никогда не используется в качестве ссылочной переменной?
Все примеры полиморфизма времени выполнения, которые я нахожу на Stackoverflow, включая те, которые здесь и это один с toString, проиллюстрируйте ситуацию, когда у нас есть переменная родительского класса, указывающая на объект подкласса, например:
Object object = new User("petar");
String name = object.toString(); // assign to variable for clarity`s sake
System.out.println(name);
// prints petar
Где мой класс User:
public class User {
String name;
public User(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
Однако в моем проекте я просто создайте пользователей и другие классы POJO с их собственными ссылочными переменными, например:
User user = new User("petar");
String name = user.toString();
System.out.println(name);
// prints petar, as toString is overriden
Является ли рассмотренный выше полиморфизм, хотя в него не включена восходящая / родительская ссылочная переменная?
Мой одноклассник утверждает, что это так, потому что для неконечные методы экземпляра компилятор не знает, какой метод вызывать - он только гарантирует, что такой метод существует в суперклассе, поэтому он продлевает это решение вплоть до времени выполнения ( позднее связывание ) путем вставки инструкции в скомпилированный код, который затем проверяется, и фактического объекта, для которого переменная iable указывает на, извлекается и вызывается его метод ( source ).
Однако в этой статье указано, что:
Переопределение метода является примером полиморфизма во время выполнения. Когда ссылка на родительский класс указывает на дочерний объект класса, то вызов переопределенного метода определяется во время выполнения , потому что во время вызова метода какой метод (родительский класс или дочерний класс) должен быть выполнен, определяется тип объекта. Этот процесс, в котором вызов переопределенного метода разрешается во время выполнения, называется динамическим диспетчеризацией c метода.
Итак: достаточно ли переопределения метода для полиморфизма, или это требование, которое есть ссылка родительского класса на объект подкласса? Могу ли я сказать на собеседовании, что простое переопределение toString () является примером полиморфизма?