[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-oop-chto-takoe-polimorfizm":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},5,"chto-takoe-polimorfizm",1,"oop","ООП","🔷","Что такое полиморфизм?","**Полиморфизм** — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.\n\nКлючевая особенность: объект производного класса можно использовать вместо объекта базового. Потомки могут изменять родительское поведение, даже если обращение к ним идёт по ссылке родительского типа.\n\n### Виды полиморфизма\n\n- *Ad hoc* — функция ведёт себя по-разному для разных типов аргументов (например, `draw()` рисует разные фигуры по-разному).\n- *Параметрический* — функция ведёт себя одинаково для аргументов разных типов (например, `add()` одинаково кладёт в контейнер элементы разных типов).\n\n### Пример\n\nПользователь может звонить с любой модели телефона через единый метод:\n\n```java\npublic class User {\n    private String name;\n\n    public User(String name) {\n        this.name = name;\n    }\n\n    public void callAnotherUser(int number, AbstractPhone phone) {\n        \u002F\u002F полиморфизм — тип phone определяется в рантайме\n        phone.call(number);\n    }\n}\n```\n\nРазные реализации `AbstractPhone`:\n\n```java\npublic class ThomasEdisonPhone extends AbstractPhone {\n    @Override\n    public void call(int outputNumber) {\n        System.out.println(\"Вращайте ручку\");\n        System.out.println(\"Сообщите номер абонента, сэр\");\n    }\n}\n\npublic class VideoPhone extends AbstractPhone {\n    @Override\n    public void call(int outputNumber) {\n        System.out.println(\"Подключаю видеоканал для абонента \" + outputNumber);\n    }\n}\n```\n\n```java\nAbstractPhone firstPhone = new ThomasEdisonPhone(1879);\nAbstractPhone videoPhone = new VideoPhone(2018);\nUser user = new User(\"Андрей\");\n\nuser.callAnotherUser(224466, firstPhone);  \u002F\u002F Вращайте ручку...\nuser.callAnotherUser(224466, videoPhone);  \u002F\u002F Подключаю видеоканал...\n```\n\nОдин и тот же вызов `callAnotherUser` даёт разные результаты — конкретная реализация `call` выбирается динамически в зависимости от типа объекта. Это **переопределение методов** (*method overriding*): реализация метода базового класса заменяется в подклассе без изменения сигнатуры. Аннотация `@Override` заставляет компилятор проверить корректность сигнатуры.\n\n### Ключевое\n\n- Полиморфизм снижает сложность — один интерфейс для разных реализаций.\n- Выбор конкретного метода происходит в *runtime*, а не на этапе компиляции.\n- В Java переопределение работает через виртуальные вызовы методов (динамическое связывание).","","junior",[15,7,16,17],"наследование","полиморфизм","override",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":30,"featuredSnippetReady":31},"Что такое полиморфизм в Java — виды и пример — Gymterview","Полиморфизм — использование объектов с одинаковым интерфейсом без знания их типа. Ad hoc и параметрический полиморфизм, пример в Java.","Полиморфизм в Java — виды и пример с переопределением","Полиморфизм позволяет использовать объекты разных типов через единый интерфейс. Ad hoc и параметрический виды. Пример с AbstractPhone.",[26,27,28,29],"полиморфизм Java","что такое полиморфизм ООП","переопределение методов Java","ad hoc полиморфизм","Полиморфизм — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.",true]