Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Полиморфизм в Java: концепции, примеры и лучшие практики

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

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

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

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


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

class Polygon { // метод для отрисовки фигуры public void render() { System.out.println("Rendering Polygon..."); } } class Square extends Polygon { // отрисовка квадрата public void render() { System.out.println("Rendering Square..."); } } class Circle extends Polygon { // отрисовка круга public void render() { System.out.println("Rendering Circle..."); } } class Main { public static void main(String[] args) { // создание объекта Square Square s1 = new Square(); s1.render(); // создание объекта Circle Circle c1 = new Circle(); c1.render(); } }

Вывод:

Rendering Square... Rendering Circle...

В примере выше мы создаем суперкласс: Polygon и два подкласса: Square и Circle. Метод render() наследуется обоими подклассами, но каждый переопределяет его для предоставления логики отрисовки, специфичной для фигуры.

Ключевой момент: render() ведет себя по-разному в зависимости от фактического типа объекта, что является сутью полиморфизма.


Зачем нужен полиморфизм?

Полиморфизм позволяет разработчикам писать чистый, согласованный код. Вместо определения отдельных методов вроде renderSquare() или renderCircle(), единственный метод render() адаптируется к каждой фигуре, уменьшая избыточность и улучшая поддерживаемость.

Хотя отдельные методы работали бы, они быстро приводят к дублированию кода и фрагментированному API. Полиморфизм объединяет поведение под общим контрактом, гарантируя, что любую новую фигуру можно интегрировать, просто переопределив render().

Примечание: Метод print() также демонстрирует полиморфизм — он может выводить char, int, String и многое другое без необходимости множественных перегрузок.

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

  1. Переопределение методов (Method Overriding)
  2. Перегрузка методов (Method Overloading)
  3. Перегрузка операторов (Operator Overloading)

Переопределение методов в 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) { // создание объекта класса Java Java j1 = new Java(); j1.displayInfo(); // создание объекта класса Language Language l1 = new Language(); l1.displayInfo(); } }

Вывод:

Java Programming Language Common English Language

Здесь Language служит базовым классом, а Java — подклассом. Метод displayInfo() определен в обоих классах, но каждая реализация предоставляет контекстно-уместную информацию.

Метод, который выполняется, определяется во время выполнения, поэтому этот паттерн называется полиморфизмом времени выполнения (runtime polymorphism).

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

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

Перегрузка методов позволяет классу иметь несколько методов с одинаковым именем, но разными списками параметров. Компилятор разрешает, какой метод вызвать, на основе предоставленных аргументов.

void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }

Эта техника позволяет одной и той же логической операции принимать разнообразные входные данные.

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

class Pattern { // метод без параметра public void display() { for (int i = 0; i < 10; i++) { System.out.print("*"); } } // метод с одним параметром 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(); // вызов метода без аргументов d1.display(); System.out.println("\n"); // вызов метода с одним аргументом d1.display('#'); } }

Вывод:

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

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

Поскольку компилятор выбирает метод во время компиляции, эту форму полиморфизма часто называют полиморфизмом времени компиляции (compile-time polymorphism).

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

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

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

Ниже приведены иллюстративные фрагменты, показывающие, как + адаптируется к своим операндам.

1. С числами:

int a = 5; int b = 6; // + с числами int sum = a + b; // Output = 11

2. Со строками:

String first = "Java "; String second = "Programming"; // + со строками String name = first + second; // Output = Java Programming

Таким образом, + перегружен в Java для выполнения как сложения, так и конкатенации.

Примечание: В то время как языки вроде C++ позволяют пользовательскую перегрузку операторов, Java ограничивает перегрузку операторов только встроенными операторами.

Полиморфные переменные

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

Пример: Полиморфные переменные

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) { // объявление объектной переменной ProgrammingLanguage pl; // создание объекта ProgrammingLanguage pl = new ProgrammingLanguage(); pl.display(); // создание объекта класса Java pl = new Java(); pl.display(); } }

Вывод:

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

В этом примере ссылка pl объявлена с базовым типом ProgrammingLanguage, но назначаются объекты и базового класса, и его подкласса. Это демонстрирует апкастинг (upcasting) и полиморфизм времени выполнения.

java

  1. Освоение операторов Java: типы, синтаксис и практические примеры
  2. Интерфейсы в Java: концепции, реализация и лучшие практики
  3. Try-with-resources в Java: автоматическое управление ресурсами
  4. Аннотации в Java: типы, размещение и практические примеры
  5. Типы аннотаций в Java: предопределенные, кастомные и мета-аннотации
  6. Метод String.length() в Java: как получить длину строки (пример)
  7. Освоение String.indexOf() в Java: поиск подстрок и практические примеры
  8. Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
  9. Освоение String.endsWith() в Java: проверка суффиксов строки с примерами
  10. Замена строк в Java: replace(), replaceAll() и replaceFirst() подробно