Vinay,
Use an abstract class when you want to implement some but not all of its behavior, and especially if your intent is that subclasses will define only a small subset of the behavior. If you just want to make a specification with no implementation, it's better to use an interface.
Concrete reason: When you use an abstract class, subclasses can't extend any other class, which puts a real restriction on architecture solutions.
Philosophical (and more important) reason: It's good design for subsystems to interact by programming to each other's interfaces, and the use of a
Java <code>interface</code> enforces this choice. It reduces coupling between subsystems.
jply