There is a reduced need for abstract classes as some things that previously you needed them for can now be done by interfaces.
However abstract classes still can do things that interfaces cannot. For example containing member variables.
A simple example would be an interface that specifies listeners (addListener
, removeListener
, notifyListeners
). The interface cannot provide a default implementation of those methods, however you can provide an abstract class which does.
You can also define things like protected methods in an abstract class which the people using the abstract class have to implement but which are not published as part of the public API.