Ответ
Полиморфизм — это принцип ООП, позволяющий объектам разных типов обрабатываться через единый интерфейс или базовый класс. Это означает «одна форма, множество реализаций».
Основные виды полиморфизма в Java:
-
Полиморфизм во время выполнения (Runtime / Subtype Polymorphism). Достигается через переопределение методов (override) и наследование. Вызываемый метод определяется типом объекта во время выполнения.
class Animal { void makeSound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("Woof!"); } // Своя реализация } Animal myAnimal = new Dog(); // Ссылка типа Animal, объект типа Dog myAnimal.makeSound(); // Вывод: "Woof!" (вызывается метод Dog) -
Полиморфизм во время компиляции (Compile-time / Ad-hoc Polymorphism). Достигается через перегрузку методов (overload). Компилятор определяет, какой метод вызвать, на основе сигнатуры (имени и типов параметров).
class Printer { void print(int number) { System.out.println("Printing int: " + number); } void print(String text) { System.out.println("Printing String: " + text); } // Перегрузка } Printer p = new Printer(); p.print(10); // Вызывается print(int) p.print("Hi"); // Вызывается print(String)
Важно: Разные типы данных (например, int, String) сами по себе не являются полиморфизмом. Они становятся частью полиморфного поведения, когда используются в контексте перегрузки методов или единого интерфейса (например, Object).
Ответ 18+ 🔞
А, слушай, ну это ж классика, блядь! Полиморфизм, ёпта! Это как у тебя один пульт на всю бытовуху, а кнопка «включить» у телека делает одно, у чайника — другое, а у твоей тёщи — вообще пиздец. Одна форма, а реализаций — овердохуища!
Вот смотри, в Java эта хуйня бывает двух сортов, как водка — палёная и нормальная.
Первый сорт — полиморфизм на ходу (Runtime). Это когда ты вроде как общаешься с кем-то по телефону, думаешь — это батя, а он тебе: «Алло, это сантехник, у вас трубу прорвало». Тип определяешь только когда уже в говне по уши. Достигается через переопределение методов (override).
class Животное {
void издайЗвук() { System.out.println("Что-то невнятное"); }
}
class Пёс extends Животное {
@Override
void издайЗвук() { System.out.println("Гав!"); } // А вот тут уже конкретика, блядь!
}
Животное моёНечто = new Пёс(); // Говоришь «животное», а в руках-то пёс, хитрая жопа!
моёНечто.издайЗвук(); // А выдаст-то «Гав!», потому что объект-то ПЁС, ёпта!
Вот это и есть магия — ссылка одна, а поведение зависит от того, кто там на самом деле, под капотом, сука.
Второй сорт — полиморфизм на стадии сборки (Compile-time). Это уже поумнее. Ты как на складе: кричишь «Эй, мужик, подай!». Если ты с коробкой — он тебе скотч, если с бутылкой — он тебе пробку. Компилятор, этот дотошный зануда, ещё до запуска программы смотрит, что ты ему суёшь, и выбирает нужный метод. Это перегрузка (overload).
class Принтер {
void печать(int цифра) { System.out.println("Печатаю цифру: " + цифра); }
void печать(String текст) { System.out.println("Печатаю текст: " + текст); } // Та же кнопка, но для другого
}
Принтер п = new Принтер();
п.печать(10); // Сработает первая — print(int)
п.печать("Привет"); // А вот тут уже вторая — print(String)
Компилятор ещё на берегу решает, куда тебя послать. Удобно, блядь.
Важный момент, чтобы мозг не съехал: Сами по себе int и String — это не полиморфизм, это просто типы, как «мужской» и «женский». Полиморфизм начинается, когда ты через одну дверь (print) можешь пролезть и с цифрой, и со строкой, и компилятор или программа сама сориентируется, куда тебя толкнуть. Либо когда ты всех их, этих разных уродцев, можешь запихнуть в один ящик Object и потом доставать, а они всё равно себя как родные ведут. Вот это и есть красота, в рот меня чих-пых!