I am talking about in practice, when writing production code? I still
think the only good point about abstract classes is ability to add some
implementation.
The main reason, as others have said, is to provide a partial
implementation. Even a majority implementation: rather than being a
mostly-abstract class with a few concrete methods, you sometimes have
classes with loads of concrete methods, and one or two key abstract ones.
A good example would be java.util.AbstractMap, which has just one abstract
method, entrySet(), and has implementations for all the other Map methods
which are built on top of that. That's also an example of the pattern
others have mentioned where you have a contract-defining interface, like
Map, backed up by an abstract base class, AbstractMap. You program to the
interface, and the base class is just there as a convenience for
implementations
However, i also like to use abstract classes in another situation: where i
want to communicate that a set of classes are part of a tightly-coupled
family. For example, if i was writing an XML processing library (one less
complicated than the W3C DOM, that is), rather than making Node an
interface and then having Element, Attribute etc be implementing classes,
i think i'd make Node an abstract class, even if it didn't have any
concrete methods which could be inherited by the children. This is a
matter of aesthetics and personal taste, though - i'm sure other people
would object to this.
tom