You should use an abstract class when you:
- need to have some concrete method implementations within the superclass itself, and a few abstract methods which would be implemented by the concrete subclasses.
- are absolutely sure that the abstract class' subclasses will not need to extend any other class. Remember,
Java allows you to extend only one class.
When you use an interface, you:
- cannot provide an implementation for any method you create. In other words, all the methods that are defined are implicitly abstract.
- can implement the interface in another class and also, extend another class and implement many more interfaces as needed.
Bottomline - Interfaces allow you to implement as many interfaces as you want, and you are also allowed to extend one class. But the trade off is that you must implement ALL of the interface's methods in the first concrete (non-abstract) implementing class.
The K&B book has numerous examples of this.