Приведите пример полиморфизма java

Полиморфизм в Java

Полиморфизм в Java – это способность объекта принимать различные формы. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса.

Любой объект Java, который может пройти более одного теста IS-A, считается полиморфным. В Java все объекты являются полиморфными, поскольку любой объект будет проходить тест IS-A для своего собственного типа и для класса Object.

Важно знать, что единственный возможный способ получить доступ к объекту – через ссылочную переменную. Ссылочная переменная может быть только одного типа. После объявления тип ссылочной переменной не может быть изменен.

Ссылочная переменная может быть переназначена другим объектам при условии, что она не объявлена как финальная. Тип ссылочной переменной будет определять методы, которые она может вызывать для объекта.

Ссылочная переменная может ссылаться на любой объект своего объявленного типа или любой подтип своего объявленного типа. Может быть объявлена как класс или тип интерфейса.

Пример 1

Давайте посмотрим на пример.

public interface Vegetarian<> public class Animal<> public class Deer extends Animal implements Vegetarian<>

Теперь класс Deer считается полиморфным, поскольку он имеет несколько наследований. Следующее верно для приведенных выше примеров –

  • олень – это животное,
  • олень – это вегетарианец,
  • олень – это олень,
  • олень – это объект.

Когда мы применяем факты ссылочной переменной к ссылке на объект Deer, следующие объявления являются допустимыми:

Пример 2

Deer d = new Deer(); Animal a = d; Vegetarian v = d; Object o = d;

Все ссылочные переменные d, a, v, o ссылаются на один и тот же объект Deer в куче.

Еще примеры полиморфизма

Например, у нас есть класс Animal, у которого есть метод sound(). Поскольку это универсальный класс, поэтому мы не можем дать ему такую реализацию, как: Мяу, Гав, Хрю-хрю и т. д. Мы должны были дать универсальное сообщение.

Теперь допустим, что мы два подкласса класса Animal: Horse и Cat, который расширяет(см. наследование) класс Animal. Мы можем предоставить реализацию тому же методу, например так:

public class Horse extends Animal < . @Override public void sound()< System.out.println("Neigh"); >>
public class Cat extends Animal < . @Override public void sound()< System.out.println("Meow"); >>

Как вы можете видеть, хотя у нас было общее действие для всех подклассов sound(), но были разные способы сделать одно и то же действие. Это прекрасный пример полиморфизма(функция, которая позволяет нам выполнять одно действие разными способами).

Не имеет никакого смысла просто вызывать универсальный метод sound(), поскольку у каждого животного свой звук. Таким образом, мы можем сказать, что действие, которое выполняет этот метод, основано на типе объекта.

Другими словами, полиморфизм позволяет вам определять один интерфейс и иметь несколько реализаций. Как мы видели в приведенном выше примере, мы определили метод sound() и имеем несколько его реализаций в разных подклассах-2. Какой метод sound() будет вызван, определяется во время выполнения, поэтому приведенный выше пример является примером полиморфизма во время выполнения.

Пример

Пример времени выполнения: Animal.java

class Horse extends Animal < @Override public void sound()< System.out.println("Neigh"); >public static void main(String args[]) < Animal obj = new Horse(); obj.sound(); >>
public class Cat extends Animal < @Override public void sound()< System.out.println("Meow"); >public static void main(String args[]) < Animal obj = new Cat(); obj.sound(); >>

Пример времени компиляции

Перегрузка метода, с другой стороны, является примером полиморфизма во время компиляции.

class Overload < void demo(int a) < System.out.println("a: " + a); >void demo(int a, int b) < System.out.println("a and b: " + a + "," + b); >double demo(double a) < System.out.println("double a: " + a); return a*a; >> class MethodOverloading < public static void main(String args []) < Overload Obj = new Overload(); double result; Obj .demo(10); Obj .demo(10, 20); result = Obj .demo(5.5); System.out.println("O/P : " + result); >>

Здесь метод demo() перегружен 3 раза: первый метод имеет 1 параметр int, второй метод имеет 2 параметра int, а третий – двойной параметр. Какой метод должен быть вызван, определяется аргументами, которые мы передаем при вызове методов. Это происходит во время выполнения время компиляции, поэтому этот тип полиморфизма известен как полиморфизм времени компиляции.

a: 10 a and b: 10,20 double a: 5.5 O/P : 30.25

Средняя оценка 4.4 / 5. Количество голосов: 50

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Видим, что вы не нашли ответ на свой вопрос.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Источник

Что такое полиморфизм в Java

Привет! Это статья об одном из принципов ООП — полиморфизм.

Что такое полиморфизм

Определение полиморфизма звучит устрашающе 🙂

Полиморфизм — это возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования.

Слово «полиморфизм» может показаться сложным — но это не так. Нужно просто разбить данное определение на части и показать на примерах, что имеется в виду. Поверьте, уже в конце статьи данное определение полиморфизма покажется Вам понятным 🙂

Полиморфизм, если перевести, — это значит «много форм». Например, актер в театре может примерять на себя много ролей — или принимать «много форм».

Так же и наш код — благодаря полиморфизму он становится более гибким, чем в языках программирования, которые не используют принципы ООП.

Так о каких формах идет речь? Давайте сначала приведем примеры и покажем, как на практике проявляется полиморфизм, а потом снова вернемся к его определению.

Как проявляется полиморфизм

Дело в том, что если бы в Java не было принципа полиморфизма, компилятор бы интерпретировал это как ошибку:

Как видите, методы на картинке отличаются значениями, которые они принимают:

Однако, поскольку в Java используется принцип полиморфизма, компилятор не будет воспринимать это как ошибку, потому что такие методы будут считаться разными:

Называть методы одинаково — это очень удобно. Например, если у нас есть метод, который ищет корень квадратный из числа, гораздо легче запомнить одно название (например, sqrt()), чем по одному отдельному названию на этот же метод, написанный для каждого типа:

Как видите, мы не должны придумывать отдельное название для каждого метода — а главное их запоминать! Очень удобно.

Теперь Вы можете понять, почему часто этот принцип описывают фразой:

Один интерфейс — много методов

Это предполагает, что мы можем заполнить одно название (один интерфейс), по которому мы сможем обращаться к нескольким методам.

Перегрузка методов

То, что мы показывали выше — несколько методов с одним названием и разными параметрами — называется перегрузкой. Но это был пример перегрузки метода в одном классе. Но бывает еще один случай — переопределение методов родительского класса.

Переопределение методов родителя

Когда мы наследуем какой-либо класс, мы наследуем и все его методы. Но если нам хочется изменить какой-либо из методов, который мы наследуем, мы можем всего-навсего переопределить его. Мы не обязаны, например, создавать отдельный метод с похожим названием для наших нужд, а унаследованный метод будет «мертвым грузом» лежать в нашем классе.

Именно то, что мы можем создать в классе-наследнике класс с таким же названием, как и класс, который мы унаследовали от родителя, и называется переопределением.

Представим, что у нас есть такая структура:

Вверху иерархии классов стоит класс Animal. Его наследуют три класса — Cat, Dog и Cow.

У класса «Animal» есть метод «голос» (voice). Этот метод выводит на экран сообщение «Голос». Естественно, ни собака, ни кошка не говорят «Голос» 🙂 Они гавкают и мяукают. Соответственно, Вам нужно задать другой метод для классов Cat, Dog и Cow — чтобы кошка мяукала, собака гавкала, а корова говорила «Муу».

Поэтому, в классах-наследниках мы переопределяем метод voice(), чтобы мы в консоли получали «Мяу», «Гав» и «Муу».

  • Обратите внимание: перед методом, который мы переопределяем, пишем «@Override«. Это дает понять компилятору, что мы хотим переопределить метод.

Так что же такое полиморфизм

Тем не менее, полиморфизм — это принцип. Все реальные примеры, которые мы приведодили выше — это только способы реализации полиморфизма.

Давайте снова посмотрим на определение, которое мы давали в начале статьи:

Полиморфизм — возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования.

Выглядит понятнее, правда? Мы показали, как можно:

  • создавать «одноименные методы» в одном классе («перегрузка методов»)
  • или изменить поведение методов родительского класса («переопределение методов»).

Все это — проявления «повышенной гибкости» объектно-ориентированных языков благодаря полиморфизму.

Надеемся, наша статья была Вам полезна. Записаться на наши курсы по Java можно у нас на сайте.

Источник

Читайте также:  Попробуйте установить другую версию java например java 8 update 45 предварительно удалив
Оцените статью