С точки зрения Java, когда кто-то спрашивает:
что такое полиморфизм?
Будет ли перегрузка или перегрузка приемлемым ответом?
Я думаю, что это немного больше, чем это.
Если у вас есть абстрактный базовый класс, который определил метод без реализации, и вы определили этот метод в подклассе, это все еще переопределяет?
Я думаю, что перегрузка не правильный ответ наверняка.
java
oop
polymorphism
overloading
overriding
Брайан Дж.
источник
источник
Ответы:
Самый простой способ выразить полиморфизм - это абстрактный базовый класс (или интерфейс)
Этот класс является абстрактным, потому что
goPee()
метод не определим для людей. Это определимо только для подклассов мужского и женского пола. Кроме того, Человек - это абстрактное понятие - вы не можете создать человека, который не является ни мужчиной, ни женщиной. Это должен быть один или другой.Поэтому мы откладываем реализацию, используя абстрактный класс.
и
Теперь мы можем сказать всю комнату, полную людей, чтобы пописать.
Запуск этого даст:
источник
goPee
не принимает гравитационное поле в качестве входа. Эта зависимость от глобального состояния усложняет юнит-тестированиеCatheterizedIntersexAstronaut
и показывает, что подклассы не всегда могут быть лучшим методом для составления признаков.Полиморфизм - это способность экземпляра класса вести себя так, как если бы он был экземпляром другого класса в своем дереве наследования, чаще всего одного из его классов-предков. Например, в Java все классы наследуются от Object. Следовательно, вы можете создать переменную типа Object и присвоить ей экземпляр любого класса.
переопределениеэто тип функции, которая встречается в классе, который наследуется от другого класса. Функция переопределения «заменяет» функцию, унаследованную от базового класса, но делает это таким образом, что она вызывается, даже когда экземпляр своего класса притворяется, что это другой тип в результате полиморфизма. Ссылаясь на предыдущий пример, вы можете определить свой собственный класс и переопределить функцию toString (). Поскольку эта функция унаследована от Object, она все равно будет доступна, если вы скопируете экземпляр этого класса в переменную Object-type. Обычно, если вы вызываете toString () в своем классе, когда он притворяется объектом Object, то версия toString, которая фактически будет запускать, является той, которая определена для самого Object. Однако, поскольку функция является переопределением, определение toString () из вашего класса используется, даже когда экземпляр класса '
Перегрузка - это действие определения нескольких методов с одинаковыми именами, но с разными параметрами. Это не связано ни с переопределением, ни с полиморфизмом.
источник
Ad hoc polymorphism
является то , что вы описали в вашем перегружать разделе и является случай полиморфизма.Полиморфизм означает более чем одну форму, один и тот же объект выполняет различные операции в соответствии с требованием.
Полиморфизм может быть достигнут двумя способами:
Перегрузка методов означает написание двух или более методов в одном и том же классе с использованием одного и того же имени метода, но передаваемые параметры отличаются.
Переопределение метода означает, что мы используем имена методов в разных классах, это означает, что метод родительского класса используется в дочернем классе.
В Java для достижения полиморфизма ссылочная переменная суперкласса может содержать объект подкласса.
Для достижения полиморфизма каждый разработчик должен использовать одинаковые имена методов в проекте.
источник
Вот пример полиморфизма в псевдо-C # / Java:
Функция Main не знает тип животного и зависит от поведения конкретной реализации метода MakeNoise ().
Изменить: Похоже, Брайан избил меня до удара. Забавно, мы использовали один и тот же пример. Но приведенный выше код должен помочь прояснить концепции.
источник
Как переопределение, так и перегрузка используются для достижения полиморфизма.
Вы можете иметь метод в классе, который переопределяется в одном или нескольких подклассах. Метод делает разные вещи в зависимости от того, какой класс использовался для создания объекта.
Вы также можете иметь метод, который перегружен двумя или более наборами аргументов. Метод делает разные вещи в зависимости от типа (ов) переданного аргумента (ов).
источник
Вы правы, что перегрузка не является ответом.
Ни один не переопределяет. Переопределение - это средство, с помощью которого вы получаете полиморфизм. Полиморфизм - это способность объекта изменять поведение в зависимости от его типа. Это лучше всего демонстрируется, когда вызывающий объект, который проявляет полиморфизм, не знает, какой конкретно тип объекта.
источник
Конкретное высказывание о перегрузке или переопределении не дает полной картины. Полиморфизм - это просто способность объекта специализировать свое поведение в зависимости от его типа.
Я был бы не согласен с некоторыми ответами здесь в том, что перегрузка является формой полиморфизма (параметрического полиморфизма) в случае, когда метод с тем же именем может вести себя по-разному, давая различные типы параметров. Хорошим примером является перегрузка операторов. Вы можете определить «+», чтобы принимать различные типы параметров - например, строки или целые числа - и на основе этих типов «+» будет вести себя по-разному.
Полиморфизм также включает методы наследования и переопределения, хотя они могут быть абстрактными или виртуальными в базовом типе. В терминах полиморфизма, основанного на наследовании, Java поддерживает только наследование одного класса, ограничивая его полиморфное поведение поведением одной цепочки базовых типов. Java поддерживает реализацию нескольких интерфейсов, что является еще одной формой полиморфного поведения.
источник
Полиморфизм просто означает «много форм».
Это НЕ ТРЕБУЕТ наследования для достижения ... поскольку реализация интерфейса, которая вообще не является наследованием, служит полиморфным потребностям. Возможно, реализация интерфейса удовлетворяет полиморфные потребности «лучше», чем наследование.
Например, вы бы создали суперкласс, чтобы описать все, что может летать? Я должен думать нет. Вам лучше всего создать интерфейс, описывающий полет, и оставить все как есть.
Таким образом, поскольку интерфейсы описывают поведение, а имена методов описывают поведение (для программиста), не слишком сложно рассматривать перегрузку методов как меньшую форму полиморфизма.
источник
Классический пример, собаки и кошки - животные, у животных есть метод makeNoise. Я могу перебрать массив животных, вызывающих на них makeNoise, и ожидать, что они выполнят соответствующую реализацию.
Код вызова не должен знать, что это за конкретное животное.
Вот что я считаю полиморфизмом.
источник
Полиморфизм - это способность объекта появляться в нескольких формах. Это предполагает использование наследования и виртуальных функций для создания семейства объектов, которые можно взаимозаменять. Базовый класс содержит прототипы виртуальных функций, возможно, не реализованные или с реализациями по умолчанию, как диктует приложение, и каждый из производных классов реализует их по-разному, чтобы влиять на различные поведения.
источник
Ни:
Перегрузка - это когда у вас одно и то же имя функции, которое принимает разные параметры.
Переопределение - это когда дочерний класс заменяет метод родителя своим собственным (это само по себе не означает полиморфизм).
Полиморфизм является поздним связыванием, например, методы базового класса (родительского) вызываются, но только во время выполнения приложение узнает, что является фактическим объектом - это может быть дочерний класс, методы которого отличаются. Это потому, что любой дочерний класс может использоваться там, где определен базовый класс.
В Java вы часто видите полиморфизм с библиотекой коллекций:
List является базовым классом, компилятор не имеет понятия, подсчитывает ли он связанный список, вектор, массив или пользовательскую реализацию списка, если он действует как List:
Если бы вы были перегружены, вы бы получили:
и правильная версия countStuff () будет выбрана компилятором для соответствия параметрам.
источник
Хотя Полиморфизм уже подробно описан в этом посте, но я бы хотел больше подчеркнуть, почему его часть.
Давайте попробуем создать простое приложение для телевизора с наследованием / полиморфизмом и без него. Размещая каждую версию приложения, мы делаем небольшую ретроспективу.
Предположим, вы инженер по программному обеспечению в телевизионной компании, и вас попросили написать программное обеспечение для контроллеров громкости, яркости и цвета для увеличения и уменьшения их значений по команде пользователя.
Вы начинаете с написания классов для каждой из этих функций, добавляя
Теперь у вас есть первая версия рабочего приложения, готовая к развертыванию. Время проанализировать проделанную работу.
Вы решаете жить с этим, пока ваше приложение работает, как ожидалось.
Вы начинаете писать новый класс (ResetFunctionV2) для новой функциональности и сопоставляете код отображения пользовательского ввода для этой новой функции.
Итак, ваше приложение готово с функцией сброса. Но теперь вы начинаете понимать, что
Теперь вы начинаете думать, что эта новая функция, которая будет добавлена, напоминает функцию «Сброс», и «Проблемы приложения» (V2) будут умножены, если вы не пересчитаете свое приложение.
Вы начинаете думать об использовании наследования, чтобы воспользоваться преимуществами полиморфной способности JAVA, и добавляете новый абстрактный класс (ControllerV3) в
Благодаря этим улучшениям у вас есть готовая версия 3 вашего телевизионного приложения.
Хотя большинство проблем, перечисленных в списке проблем V2, были решены, за исключением
Опять же, вы думаете о решении этой проблемы, так как теперь у вас есть еще одна функция (обновление драйвера при запуске), которая также будет реализована. Если вы не исправите это, он также будет перенесен на новые функции.
Таким образом, вы разделяете контракт, определенный в абстрактном классе, и пишете 2 интерфейса для
И пусть ваш первый конкретный класс реализует их, как показано ниже
Надеюсь это поможет :-)
источник
Термин «перегрузка» означает наличие нескольких версий одного и того же имени, обычно это методы с разными списками параметров.
Таким образом, эти функции могут делать то же самое, но у вас есть возможность вызвать его с помощью идентификатора или имени. Не имеет ничего общего с наследованием, абстрактными классами и т. Д.
Переопределение обычно относится к полиморфизму, как вы описали в своем вопросе
источник
перегрузка - это когда вы определяете 2 метода с одинаковым именем, но разными параметрами
Переопределение - это когда вы изменяете поведение базового класса с помощью функции с тем же именем в подклассе.
Таким образом, полиморфизм связан с переопределением, но не с перегрузкой.
Однако, если бы кто-то дал мне простой ответ «переопределения» на вопрос «Что такое полиморфизм?» Я бы попросил дальнейших объяснений.
источник
Переопределение больше похоже на сокрытие унаследованного метода, объявляя метод с тем же именем и сигнатурой, что и метод верхнего уровня (супер метод), это добавляет полиморфное поведение к классу. другими словами, решение о выборе метода уровня, который будет вызываться, будет приниматься во время выполнения, а не во время компиляции. это приводит к концепции интерфейса и реализации.
источник
Из Java- учебник
Словарное определение полиморфизма относится к принципу в биологии, в котором организм или вид может иметь много различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и, тем не менее, совместно использовать некоторые из тех же функций родительского класса.
Рассматривая примеры и определения, следует переопределить ответ.
По поводу вашего второго запроса:
Это следует назвать переопределением.
Посмотрите на этот пример, чтобы понять различные типы переопределения.
super.methodName()
первый операторфрагмент кода:
вывод:
источник
Я думаю, ребята, вы смешиваете понятия. Полиморфизм - это способность объекта вести себя по-разному во время выполнения. Для достижения этого вам необходимо два условия:
Сказав, что перегрузка означает нечто отличное от переопределения в зависимости от языка, который вы используете. Например, в Java не существует переопределения, но перегрузки . Перегруженные методы с другой сигнатурой в своем базовом классе доступны в подклассе. В противном случае они будут переопределены (пожалуйста, обратите внимание, что я имею в виду тот факт, что нет способа вызвать метод базового класса извне объекта).
Однако в C ++ это не так. Любой перегруженный метод, независимо от того, является ли подпись одинаковой или нет (разная сумма, другой тип), также переопределяется . То есть сегодня метод базового класса больше не доступен в подклассе, когда он вызывается извне объекта подкласса, очевидно.
Таким образом, ответ на вопрос о перегрузке использования Java . В любом другом языке может отличаться, как это происходит в C ++
источник
Полиморфизм является более вероятным, поскольку это означает , что ... переопределение в Java
Все дело в разном поведении одного и того же объекта в разных ситуациях (в программировании ... вы можете вызывать разные аргументы)
Я думаю, что пример ниже поможет вам понять ... Хотя это не чистый код Java ...
Но если мы изменим АРГУМЕНТ ... ПОВЕДЕНИЕ будет изменено ...
Человек (здесь «Объект») такой же ...
источник
Полиморфизм - это множественные реализации объекта, или вы можете сказать несколько форм объекта. Допустим, у вас есть класс
Animals
в качестве абстрактного базового класса, и у него есть метод,movement()
который определяет способ перемещения животного. Теперь в действительности у нас есть разные виды животных, и они двигаются по-разному, а некоторые из них с двумя ногами, другие с четырьмя, а некоторые без ног и т. Д. Чтобы определить разные видыmovement()
животных на земле, нам нужно применить полиморфизм. Однако вам нужно определить больше классов, то есть классаDogs
Cats
Fish
и т. Д. Затем вам нужно расширить эти классы из базового классаAnimals
и переопределить его методmovement()
новыми функциональными возможностями движения, основанными на каждом имеющемся у вас животном. Вы также можете использоватьInterfaces
чтобы достичь этого. Ключевое слово здесь переопределено, перегрузка отличается и не рассматривается как полиморфизм. с перегрузкой вы можете определить несколько методов «с одинаковым именем», но с разными параметрами для одного и того же объекта или класса.источник
Полиморфизм относится к способности языка одинаково обрабатывать различные объекты с использованием единого интерфейса; как таковой, он связан с переопределением, поэтому интерфейс (или базовый класс) является полиморфным, а разработчик - это объект, который переопределяет (две грани одной медали)
в любом случае разницу между этими двумя терминами лучше объяснить с помощью других языков, таких как c ++: полиморфный объект в c ++ ведет себя как java-аналог, если базовая функция виртуальная, но если метод не виртуальный, переход кода разрешается статически , и истинный тип не проверяется во время выполнения, поэтому полиморфизм включает способность объекта вести себя по-разному в зависимости от интерфейса, используемого для доступа к нему; позвольте мне привести пример в псевдокоде:
(предположим, что makeRumor НЕ является виртуальным)
Java действительно не предлагает этот уровень полиморфизма (называемый также разрезанием объектов).
животное а = новая собака (); собака б = новая собака ();
в обоих случаях он будет печатать только woff. Так как a и b ссылаются на классную собаку
источник
источник