For a single type of class, you are not missing anything.
However, consider the following class where
Animal is an
Interface:
import java.util.ArrayList;
import java.util.List;
public class AnimalHospital
{
private final List<Animal> animals;
public AnimalHospital()
{
// Initially the hospital has no animals to treat.
this.animals = new ArrayList<Animal>();
}
void add(final Animal animal)
{
animals.add(animal);
}
void treatAllAnimals()
{
for(final Animal animal : animals)
animal.treat();
}
}
This
AnimalHospital can accept any kind of animal for treatment - provided the animal's class (e.g.
Cat,
Dog, etc.) implements the
Animal interface.
If, at a later date, someone creates a new animal class (such as a
DuckBilledPlatypus) that implements the
Animal interface then that animal can also be treated at the hospital
without any change to the hospital code. As long as it's an
Animal then the
AnimalHospital can handle it.
The same is also hold true if someone later extended the
Dog to create a
Doberman sub-class of dog.
That is power that interfaces bring to your code.