Java is one of the few languages that have a native construct allowing this distinction. An interface designates a type. A type merely provides information about a specification that must be met. Well, it provides a level of abstraction. If there is one thing that you take away from this article, I hope that it is that abstraction is a good thing.
Abstraction introduces a buffering layer that insulates the caller from changes in the called.
They provide an easy way for methods to accept parameters with varying implementation, while still remaining representative of the type. These objects are related to each other only in that they both support Nameable behavior. Note that even though both Cow and Person implement the Nameable interface they are free to have radically different implementations. These areas can always be abstracted. Even something as historically hardcoded as an algorithm can be encapsulated with the Strategy Pattern .