# Полиморфизм

Рассмотрим ещё одного из китов объектно-ориентированного программирования – полиморфизм. Что это такое, и как его применять на практике.

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

В двух словах полиморфизм – это различная реализация однотипных действий через единый интерфейс, при условии, что данный интерфейс наследуется всеми видами реализации.

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

Приведу наглядный пример. Все садовые деревья плодоносят, независимо от сорта дерева. Отсюда вытекает, что единым интерфейсом является объект «дерево» с методом «созревание плодов». А вот как, и каким способом созревает плод, является индивидуальной реализацией каждого сорта отдельно. Перенесем выше сказанное на программный язык.

Создадим класс GardenTree, в котором реализуем только один метод «maturation»:

```
package my.polimorfism;

public class GardenTree {
    public void maturation() {
        System.out.println("Parent class: maturation.");
    }
}
```

Далее создадим два класса наследующих класс GardenTree, и переопределяющих метод maturation родительского класса:

```
package my.polimorfism;

public class Apple extends GardenTree {
    public void maturation() {
        System.out.println("Maturation apple.");
    }
}

package my.polimorfism;

public class Cherry extends GardenTree {
    public void maturation() {
        System.out.println("Maturation cherry.");
    }
}
```

Ну и собственно создаем класс, в котором реализуется идеология полиморфизма:

```
package my.polimorfism;

public class App {
    public static void ripening_fruit(GardenTree i) {
        i.maturation();
    }

    public static void main( String[] args ) {
        GardenTree apple = new Apple();
        GardenTree cherry = new Cherry();

        ripening_fruit(apple);
        ripening_fruit(cherry);
    }
}
```

Вопрос 1

```
Назовите преимущества такого подхода.
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://comaqa.gitbook.io/java-automation/oop-v-java/polimorfizm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
