Относиться ли перегрузка метода к полиморфизму в языке Java? Как я знаю только переопределение метода относиться к полиморфизму в языке Java, а перегрузка нет
Понятие полиморфизма ввёл в компьютерные науки Кристофер Стрэчи в статье 1967-го года. Вначале он рассматривал математические операторы, которые умеют работать с данными разных типов, например, оператор плюс. От операторов он перешёл к функциям, которые также могут обрабатывать данные разных типов.
Если следовать этому — классическому — определению, то перегрузка как раз и позволяет создавать полиморфную функцию, с единственным именем, но разными типами параметров.
Этот вид полиморфизма технически отличается от виртуальных функций, но только технически. По сути это тот же полиморфизм, по крайней мере, в терминологии Стрэчи. Виртуальная функция в первом параметре неявно получает ссылку на объект (this
). Страустрап описывает этот механизм в своей книге по C++. Он же (механизм) применяется и в JVM, и в .NET. Получается, что виртуальный метод полиморфен потому, что может работать с разными типами своего неявного первого параметра.
Перегрузка относится к так называемому ad hoc полиморфизму. Это название означает, что нам нужно писать разные версии функции для разных типов.
Другой вид полиморфизма — параметрический, характерный для обобщённого программирования (generic programming). Метод List<T>.add
умеет добавлять в список данные разных типов, и его код вы пишите всего один раз.
Итого, получается, что в Java полиморфизм, описанный Стрэчи доступен посредством:
Первые два способа — ad hoc полиморфизм, последний — параметрический полиморфизм.
UPDATE
Поискал старую статью Стрэчи в интернете, не нашёл. Есть поздняя статья 2000-го года за его же авторством: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.332.3161&rep=rep1&type=pdf
Нет. Не относится. Перегрузка осуществляется в рамках одного класса путём определения разного количества аргументов и разного типа аргументов.
Хотя, как отметили в другом ответе, с чисто теоретической точки зрения перегрузку можно отнести к некоторой разновидности полиморфизма, в практическом программировании перегрузка полиморфизмом не является. В языках, допускающих перегрузку, реальное имя функции состоит из двух частей - собственно имени, которое задает пользователь, и части, которую генерирует компилятор, и которая описывает параметры функции. Так что перегруженные функции - это совершенно разные функции с разными именами.
Единственное отличие перегруженных функций от обычных - это то, что может возникнуть неоднозначность при вызове, когда аргументы могут приводиться к параметрам нескольких функций. Но это все же не полиморфизм, потому что такие неоднозначности разрешаются на этапе компиляции, а полиморфизм относится прежде всего к этапу выполнения.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня в приложении при определённых обстоятельствах вылезает поле toast с подсказкамиДопустим, поле toast ещё отображается, а приложение закрыли...
Как идентифицировать пользователя приложения? К примеру: Марка телефона + IP не являются уникальнымиКак это делает Firebase? Как они идентифицируют...