Extends is the most misused keyword in the Java lexicon.
In my constant and probably losing battle against poor design, I keep finding systems with a rather rich abundance of implementation inheritance. I’ve actually recently seen systems with seven or more levels of inheritance, where just about every object extends some class that (eventually) extends AbstractBaseObject extends BaseObject. All classes. No interfaces (unless some specification demands them), or sometimes, no interfaces with any methods declared.
I think if I had my way, I’d remove the extends keyword from Java and only leave implements. I guess it’s just a polemical fantasy of mine but there’s plenty or programmers out there still implementing the worst sort of bad juju with extension.
As this post rightly points out – the purpose (as opposed to a side-effect) of extension is not to enable re-use. Extension is a declaration of a classification system in your domain. Is-A as opposed to Has-A. A Canine is-a Mammal which has-a Placenta. It’s not called a type system for nothing, you know. You’re making a taxonomy.