Polymorphism ("nhiều hình thức") cho phép object mang nhiều hình dạng khác nhau.
- Compile-time (Static): method overloading — cùng tên nhưng khác tham số, compiler quyết định lúc biên dịch.
- Runtime (Dynamic): method overriding — subclass implement khác method của parent, JVM quyết định lúc chạy dựa trên kiểu thực của object.
- Runtime polymorphism cho phép thiết kế linh hoạt: biến reference kiểu parent có thể giữ object child, tự động gọi đúng phiên bản method.