Этот вопрос помогает понять два типа полиморфизма в Java — статический (на этапе компиляции) и динамический (на этапе выполнения).
Статический полиморфизм достигается через перегрузку методов, где компилятор выбирает метод, основываясь на аргументах. Динамический полиморфизм реализуется через переопределение методов, где решение о вызове метода принимается во время выполнения.
Статический полиморфизм (compile-time):
Это поведение, когда выбор метода определяется компилятором.
- Реализация: Перегрузка методов (method overloading).
- Пример:
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}Здесь компилятор решает, какую версию add вызывать, основываясь на типе аргументов.
Динамический полиморфизм (runtime):
Это поведение, при котором метод, вызванный у объекта, определяется во время выполнения.
- Реализация: Переопределение методов (method overriding) и использование позднего связывания.
- Пример:
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sound(); // Вывод: Dog barks
}
}Здесь JVM во время выполнения вызывает метод sound класса Dog.
Когда использовать:
- Статический полиморфизм полезен для увеличения читаемости кода через перегрузку.
- Динамический полиморфизм применяется в случаях, когда важна гибкость и возможность замены объектов в зависимости от их типов во время выполнения.