Полиморфизм в 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.