Этот вопрос помогает понять два типа полиморфизма в Java — статический (на этапе компиляции) и динамический (на этапе выполнения).
Статический полиморфизм достигается через перегрузку методов, где компилятор выбирает метод, основываясь на аргументах. Динамический полиморфизм реализуется через переопределение методов, где решение о вызове метода принимается во время выполнения.
Это поведение, когда выбор метода определяется компилятором.
Реализация: Перегрузка методов (method overloading).
Пример:
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}Здесь компилятор решает, какую версию add вызывать, основываясь на типе аргументов.
Это поведение, при котором метод, вызванный у объекта, определяется во время выполнения.
- Реализация: Переопределение методов (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.
Статический полиморфизм полезен для увеличения читаемости кода через перегрузку.
Динамический полиморфизм применяется в случаях, когда важна гибкость и возможность замены объектов в зависимости от их типов во время выполнения.