I studied polymorphism and understand that it can do dynamic method binding like below.
Assuming that class Animal is abstract class.
public class An
If you're declaring an ArrayList, I wouldn't ever use ArrayList as the type on the left side. Instead, program to the interface, be it List or Collection.
Note that if you declare a method as taking a Collection, it can be passed a List or Set.
As a side note, consider using Generics.
Edit: Having said that, Generics also introduces some Gotchas.
List could store an ArrayList, but not an ArrayList. You'd need List extends Animal> to store an ArrayList.