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

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

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

Полиморфизм позволяет классу действовать по-разному в разных контекстах. Мы можем связать полиморфизм с одним интерфейсом, имеющим несколько реализаций. Хотя контракт, определенный интерфейсом, остается тем же самым, каждый класс реализует контракт по-разному и, таким образом, демонстрирует разное поведение. Это полиморфное поведение.

Например, полиморфизм также ссылается на экземпляр подкласса с помощью ссылочной переменной суперкласса.

Object o = new Object(); //o can hold the reference of any subtypeObject o = new String();Object o = new Integer();

Здесь классы String и Integer являются подклассами класса Object.

2. Типы полиморфизма

В языке Java полиморфизм по существу рассматривается в двух формах:

  • Полиморфизм времени компиляции(статическое связывание или перегрузка методов )
  • Полиморфизм времени выполнения(динамическое связывание или переопределение методов)

Здесь важно понимать, что эти подразделения специфичны для Java. В контексте разработки программного обеспечения существуют и другие формы полиморфизма, также применимые к разным языкам, но для Java в основном рассматриваются эти две.

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

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

При перегрузке методов объект может иметь два или более методов с одинаковым именем, но параметры методов будут разными, например:

  • количество параметров отличается
  • типы параметров метода различны

Например, в классе Calculator у нас может быть несколько методов с разными типами аргументов:

public class Calculator {public Integer sum(Integer a, Integer b) {return a + b;}public Float sum(Float a, Float b) {return a + b;}public Double sum(Double a, Double b) {return a + b;}}

С приведенным выше определением класса, когда мы вызываем метод sum() в программе, на основе типов аргументов компилятор решает, какой метод вызвать, только во время компиляции и генерирует байт-код соответственно. Это называется полиморфизмом во время компиляции.

Calculator calc = new Calculator();Integer sum1 = calc.sum(1 ,2);Float sum2 = calc.sum(1f ,2f);Double sum3 = calc.sum(1d ,2d);

2.2 Полиморфизм времени выполнения

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

Простой пример из реального мира — животные. Приложение может иметь класс Animal и его специализированные подклассы, такие как Cat и Dog. Эти подклассы переопределят поведение по умолчанию, предоставляемое классом Animal, и, кроме того, некоторые из его собственных специфических поведений.

class Animal {public void makeNoise() {System.out.println("Some sound");}}class Dog extends Animal {public void makeNoise() {System.out.println("Bark");}}class Cat extends Animal {public void makeNoise() {System.out.println("Meawoo");}}

Теперь, когда мы вызываем метод makeNoise(), вызываемый метод зависит от типа фактического экземпляра, созданного во время выполнения.

Animal cat = new Cat();cat.makeNoise(); //Prints MeowooAnimal dog = new Dog();dog.makeNoise(); //Prints Bark

3. Заключение

  • Полиморфизм — это возможность создания переменной, функции или объекта с более чем одной формой.
  • В Java полиморфизм делится на перегрузку методов и переопределение методов.
  • Другой термин, перегрузка операторов, также присутствует. Например, оператор «+» может использоваться для сложения двух целых чисел, а также для конкатенации двух подстрок. Что ж, это единственная доступная поддержка перегрузки операторов в Java, и вы не можете иметь собственную пользовательскую перегрузку операторов в Java.
Прокрутить вверх