I am really confused about dynamic binding and static binding. I have read that determining the type of an object at compile time is called static binding and determining it
Your example is dynamic binding, because at run time it is determined what the type of a is, and the appropriate method is called.
Now assume you have the following two methods as well:
public static void callEat(Animal animal) {
System.out.println("Animal is eating");
}
public static void callEat(Dog dog) {
System.out.println("Dog is eating");
}
Even if you change your main to
public static void main(String args[])
{
Animal a = new Dog();
callEat(a);
}
this will print Animal is eating, because the call to callEat uses static binding, and the compiler only knows that a is of type Animal.