Полиморфизм Java (с примерами)

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

Полиморфизм - важное понятие объектно-ориентированного программирования. Это просто означает более одной формы.

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

Пример: полиморфизм Java

 class Polygon ( // method to render a shape public void render() ( System.out.println("Rendering Polygon… "); ) ) class Square extends Polygon ( // renders Square public void render() ( System.out.println("Rendering Square… "); ) ) class Circle extends Polygon ( // renders circle public void render() ( System.out.println("Rendering Circle… "); ) ) class Main ( public static void main(String() args) ( // create an object of Square Square s1 = new Square(); s1.render(); // create an object of Circle Circle c1 = new Circle(); c1.render(); ) )

Вывод

 Отображение квадрата… Отображение круга… 

В приведенном выше примере мы создали суперкласс: Polygon и два подкласса: Square и Circle. Обратите внимание на использование render()метода.

Основная цель render()метода - визуализация формы. Однако процесс визуализации квадрата отличается от процесса визуализации круга.

Следовательно, render()метод ведет себя по-разному в разных классах. Или, можно сказать render(), полиморфен.

Почему полиморфизм?

Полиморфизм позволяет нам создавать согласованный код. В предыдущем примере мы также можем создать разные методы: renderSquare()и renderCircle()для рендеринга Square и Circle соответственно.

Это будет отлично работать. Однако для каждой формы нам нужно создавать разные методы. Это сделает наш код непоследовательным.

Чтобы решить эту проблему, полиморфизм в Java позволяет нам создать один метод, render()который будет вести себя по-разному для разных фигур.

Примечание : print()метод также является примером полиморфизма. Он используется для печати значений различных типов , такие как char, int, stringи т.д.

Мы можем добиться полиморфизма в Java следующими способами:

  1. Переопределение метода
  2. Перегрузка метода
  3. Перегрузка оператора

Переопределение метода Java

Во время наследования в Java, если один и тот же метод присутствует и в суперклассе, и в подклассе. Затем метод в подклассе переопределяет тот же метод в суперклассе. Это называется переопределением метода.

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

Пример 1: полиморфизм с использованием переопределения метода

 class Language ( public void displayInfo() ( System.out.println("Common English Language"); ) ) class Java extends Language ( @Override public void displayInfo() ( System.out.println("Java Programming Language"); ) ) class Main ( public static void main(String() args) ( // create an object of Java class Java j1 = new Java(); j1.displayInfo(); // create an object of Language class Language l1 = new Language(); l1.displayInfo(); ) )

Выход :

 Язык программирования Java Общий английский язык

В приведенном выше примере мы создали суперкласс с именем Language и подкласс с именем Java. Здесь метод displayInfo()присутствует как на языке, так и на Java.

Использование displayInfo()для печати информации. Однако он печатает разную информацию на языке и Java.

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

Работа полиморфизма Java

Примечание : вызываемый метод определяется во время выполнения программы. Следовательно, переопределение метода - это полиморфизм времени выполнения .

2. Перегрузка метода Java

В классе Java мы можем создавать методы с одинаковыми именами, если они отличаются по параметрам. Например,

 void func() (… ) void func(int a) (… ) float func(double a) (… ) float func(int a, float b) (… )

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

Пример 3: полиморфизм с использованием перегрузки метода

 class Pattern ( // method without parameter public void display() ( for (int i = 0; i < 10; i++) ( System.out.print("*"); ) ) // method with single parameter public void display(char symbol) ( for (int i = 0; i < 10; i++) ( System.out.print(symbol); ) ) ) class Main ( public static void main(String() args) ( Pattern d1 = new Pattern(); // call method without any argument d1.display(); System.out.println(""); // call method with a single argument d1.display('#'); ) )

Выход :

 ********** ##########

В приведенном выше примере мы создали класс с именем Pattern. Класс содержит метод с именем, display()который является перегруженным.

 // method with no arguments display() (… ) // method with a single char type argument display(char symbol) (… )

Здесь основная функция display()- распечатать выкройку. Однако в зависимости от переданных аргументов метод выполняет разные операции:

  • печатает образец *, если аргумент не передан, или
  • печатает образец параметра, если charпередан аргумент одного типа.

Примечание . Вызываемый метод определяется компилятором. Следовательно, он также известен как полиморфизм времени компиляции.

3. Перегрузка оператора Java

Некоторые операторы в Java по-разному работают с разными операндами. Например,

  • + operator is overloaded to perform numeric addition as well as string concatenation, and
  • operators like &, |, and ! are overloaded for logical and bitwise operations.

Let's see how we can achieve polymorphism using operator overloading.

The + operator is used to add two entities. However, in Java, the + operator performs two operations.

1. When + is used with numbers (integers and floating-point numbers), it performs mathematical addition. For example,

 int a = 5; int b = 6; // + with numbers int sum = a + b; // Output = 11

2. When we use the + operator with strings, it will perform string concatenation (join two strings). For example,

 String first = "Java "; String second = "Programming"; // + with strings name = first + second; // Output = Java Programming

Here, we can see that the + operator is overloaded in Java to perform two operations: addition and concatenation.

Note: In languages like C++, we can define operators to work differently for different operands. However, Java doesn't support user-defined operator overloading.

Polymorphic Variables

A variable is called polymorphic if it refers to different values under different conditions.

Object variables (instance variables) represent the behavior of polymorphic variables in Java. It is because object variables of a class can refer to objects of its class as well as objects of its subclasses.

Example: Polymorphic Variables

 class ProgrammingLanguage ( public void display() ( System.out.println("I am Programming Language."); ) ) class Java extends ProgrammingLanguage ( @Override public void display() ( System.out.println("I am Object-Oriented Programming Language."); ) ) class Main ( public static void main(String() args) ( // declare an object variable ProgrammingLanguage pl; // create object of ProgrammingLanguage pl = new ProgrammingLanguage(); pl.display(); // create object of Java class pl = new Java(); pl.display(); ) )

Output:

 I am Programming Language. I am Object-Oriented Programming Language.

В приведенном выше примере мы создали объектную переменную pl класса ProgrammingLanguage. Здесь pl - полиморфная переменная. Это потому что,

  • В операторе pl = new ProgrammingLanguage()pl ссылаются на объект класса ProgrammingLanguage.
  • И в заявлении pl = new Java()pl ссылаются на объект класса Java.

Это пример апкастинга на Java.

Интересные статьи...