An abstract class is a class, which has at least one method not implemented, or the keyword abstract. For example, an abstract method may look like this:
public abstract String myMethod(String input);
(note that the method ends with a semi-colon).
And a class may look like this:
public abstract class MyClass {
public abstract String myMethod(String input);
public String anotherMethod(String input) {
return intput + " additional text";
}
}
An abstract class cannot be instantiated. Abstract classes require a subclass to implement the missing behaviour so that it can be instantiated.
The main goal of an abstract class is to provide shared implementation of common behaviour - promoting the reuse of code.
In Java the same effect can be achieve by using a composition of classes instead of inheritance from broadly defined abstract classes. This allows more modular, function specific classes promoting code reuse, that in turn increase maintainability.
My advice would be to use abstract class only when strictly necessary, and in particular avoid using it as a trick bag full of all sorts of functionality.
In Scala one would use traits, which are an elegant way to solve this. It does however, require a lot of attention to get it right through.
Edit: Starting Java 8, default methods in interface are another way to add common behavior.