Полиморфизм в Java и перегрузка

217
21 декабря 2019, 03:40

Относиться ли перегрузка метода к полиморфизму в языке Java? Как я знаю только переопределение метода относиться к полиморфизму в языке Java, а перегрузка нет

Answer 1

Понятие полиморфизма ввёл в компьютерные науки Кристофер Стрэчи в статье 1967-го года. Вначале он рассматривал математические операторы, которые умеют работать с данными разных типов, например, оператор плюс. От операторов он перешёл к функциям, которые также могут обрабатывать данные разных типов.

Если следовать этому — классическому — определению, то перегрузка как раз и позволяет создавать полиморфную функцию, с единственным именем, но разными типами параметров.

Этот вид полиморфизма технически отличается от виртуальных функций, но только технически. По сути это тот же полиморфизм, по крайней мере, в терминологии Стрэчи. Виртуальная функция в первом параметре неявно получает ссылку на объект (this). Страустрап описывает этот механизм в своей книге по C++. Он же (механизм) применяется и в JVM, и в .NET. Получается, что виртуальный метод полиморфен потому, что может работать с разными типами своего неявного первого параметра.

Перегрузка относится к так называемому ad hoc полиморфизму. Это название означает, что нам нужно писать разные версии функции для разных типов.

Другой вид полиморфизма — параметрический, характерный для обобщённого программирования (generic programming). Метод List<T>.add умеет добавлять в список данные разных типов, и его код вы пишите всего один раз.

Итого, получается, что в Java полиморфизм, описанный Стрэчи доступен посредством:

  1. Виртуальных функций.
  2. Перегрузки функций.
  3. Обобщённых функций.

Первые два способа — ad hoc полиморфизм, последний — параметрический полиморфизм.

UPDATE

Поискал старую статью Стрэчи в интернете, не нашёл. Есть поздняя статья 2000-го года за его же авторством: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.332.3161&rep=rep1&type=pdf

Answer 2

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

Answer 3

Хотя, как отметили в другом ответе, с чисто теоретической точки зрения перегрузку можно отнести к некоторой разновидности полиморфизма, в практическом программировании перегрузка полиморфизмом не является. В языках, допускающих перегрузку, реальное имя функции состоит из двух частей - собственно имени, которое задает пользователь, и части, которую генерирует компилятор, и которая описывает параметры функции. Так что перегруженные функции - это совершенно разные функции с разными именами.

Единственное отличие перегруженных функций от обычных - это то, что может возникнуть неоднозначность при вызове, когда аргументы могут приводиться к параметрам нескольких функций. Но это все же не полиморфизм, потому что такие неоднозначности разрешаются на этапе компиляции, а полиморфизм относится прежде всего к этапу выполнения.

READ ALSO
Как закрыть все поля Toast при закрытии приложения?

Как закрыть все поля Toast при закрытии приложения?

У меня в приложении при определённых обстоятельствах вылезает поле toast с подсказкамиДопустим, поле toast ещё отображается, а приложение закрыли...

133
Идентификация клиента приложения

Идентификация клиента приложения

Как идентифицировать пользователя приложения? К примеру: Марка телефона + IP не являются уникальнымиКак это делает Firebase? Как они идентифицируют...

145