I think it's because eat(Animal) is overloaded, the method called is decided at compile time. The eat(Horse) in Horse class is just an override of the already overloaded method and not a new overloaded method (I think). What I do know is because "a" reference type is Animal, it's method in Animal class which is invoked.
You can see this if you add a new method to the Horse class which takes a different arguments and try and call it using the "a" reference. You won't be able to because its referring to the Animal class.
Hope I'm making sense, its kinda late!!!
