Use an abstract class when your subclasses share state (fields) or need a common constructor. Use an interface when unrelated classes need to share a behavior contract.
Here's a practical guide:
If you need instance variables that subclasses inherit, use an abstract class.
If a class already extends another class, it can't extend yours. Offer an interface instead.
If multiple unrelated classes need the same capability (like being sortable), that's an interface.
If you want shared logic but need subclasses to fill in the rest, abstract classes with a mix of concrete and abstract methods work well.
Many real designs use both. An abstract class handles shared fields while also implementing interfaces.