Suppose I have two classes: Animal and Dog. Dog is a subclass of Animal. I do the following code:
Animal a = new Dog();
Now I can call methods
In Java, the concepts of polymorphism and inheritance are "welded together"; in general, it does not have to be that way:
There are languages where inheritance is decoupled from polymorphism:
virtual
)Going back to Java, the reason to use polymorphism is decoupling your code from the details of the implementation of its counter-parties: for example, if you can write a method Feed(Animal animal)
that works for all sorts of animals, the method would remain applicable when you add more subclasses or implementations of the Animal
. This is in contrast to a Feed(Dog dog)
method, that would be tightly coupled to dogs.
As far as the
Dog d = new Dog();
declaration goes, there is no general reason to avoid this if you know that the rest of your method deals specifically with dogs. However, in many cases the later is not the case: for example, your class or your methods would often be insensitive to the exact implementation, for example
List numbers = new ArrayList();
In cases like that, you can replace new ArrayList
with new LinkedList
, and know that your code is going to compile. In contrast, had your numbers
list been declared as ArrayList
, such switchover may not have been a certainty.
This is called "programming to an interface". There is a very good answer on Stack Overflow explaining it.