Animal anAnimal = new Dolphin():
anAnimal.eat();
We are told that the eat() method belongs to Dolphin but not Animal.
The apparent type of an object reference determines the class whose members can be invoked. In the example above, the apparent type of anAnimal is Animal and so we can call members of the Animal class. Given that the eat() method doesn't belong to the Animal class, we can not call it. If the Animal class were to have an eat() method, there would be no problem with the code above.
Now let's suppose that the Animal class *does* have an eat() method and that this method is overridden in the Dolphin class. It is the actual type of the object reference that determines which version of the eat() method is called. In the example above, the actual type of anAnimal is Dolphin and so, in this scenario, the second line of code above calls the eat() method in the Dolphin class.
Paul