Перейти к контенту

Полиморфизм в 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(). Поскольку это универсальный класс, поэтому мы не можем дать ему такую реализацию, как: Мяу, Гав, Хрю-хрю и т. д. Мы должны были дать универсальное сообщение.

public class Animal{
   ...
   public void sound(){
      System.out.println("Animal is making a 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

public class Animal{
   public void sound(){
      System.out.println("Animal is making a sound");   
   }
}

Horse.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();
    }
}

Вывод:

Neigh

Cat.java

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();
    }
}

Вывод:

Meow

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

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

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

Оцени статью

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

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

Или поделись статьей

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

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)