In Java, the dynamic binding mechanism determines which method will be called at runtime, rather than at compile time. The main difference from static binding is that private, static, final methods, and methods that are not overridden at runtime are statically bound (binding occurs at compile time), while ordinary instance methods (including overridden ones) are dynamically bound. This enables polymorphism.
Example:
class Animal { void makeSound() { System.out.println("Some sound"); } } class Dog extends Animal { void makeSound() { System.out.println("Bark"); } } public class Test { public static void main(String[] args) { Animal a = new Dog(); a.makeSound(); // Outputs: Bark (dynamic binding) } }
Here, the makeSound() method is dynamically bound – the JVM determines which version to call only at runtime.
Question: "If you declare a variable of an interface or abstract class type and assign it an instance of a subclass, which method will be called when accessing the overridden method? How does the compiler determine this?"
Common Mistake: Many believe that the method is called based on the reference type at compile time, but this is done by the JVM at runtime.
Correct Answer: The JVM uses the type of the actual object to call the method (dynamic binding), not the reference type.
Shape s = new Circle(); s.draw(); // draw() from Circle will be called, not from Shape
Story
In a large banking project, one developer overridden the methods toString() and equals() thinking that if they declared a variable through an interface, the method from the interface would be called. Because of this, object comparison was incorrect — references were compared, not values, leading to faulty logic in comparing clients when searching for duplicates.
Story
In an e-commerce project, a developer created a base class Product and a subclass ElectronicProduct. An array Product[] stored objects of both types. When printing a product through a method overridden in ElectronicProduct, only the information of the base class was shown, as the static method was called! The error was noticed before publication.
Story
In a transportation modeling project, the Factory pattern was used. The developer did not notice they were working with fields instead of methods: accessing a field from the derived class returned the value of the base class, not the overridden one, as fields are not polymorphic! The system incorrectly calculated routes, showing all objects as type "Transport".