Java uses method overriding and dynamic method dispatch to achieve runtime polymorphism.
In Java, runtime polymorphism is achieved through method overriding, where a subclass provides a specific implementation of a method already defined in its superclass. The JVM determines the method to be executed at runtime based on the actual object, not the reference type. Consider a `Notification` class with a `send()` method overridden by `EmailNotification` and `SMSNotification` classes.