Polimorfizm pozwala traktować różne obiekty przez ten sam interfejs lub klasę bazową. Wywołując metodę nadpisaną na referencji typu bazowego, Java wybiera implementację w czasie działania (dynamic dispatch); przeciążanie metod daje polimorfizm czasu kompilacji.
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound(); // Output: Dog barks
}
}