Java supports single inheritance by allowing one class to extend another.  Java (weakly) supports multiple inheritance by allowing a class to implement one or more interfaces.

A class is the concrete specification of an abstract data type.  It includes both data and behavior (variables and methods).

An interface is a non-concrete specification of an abstract data type.  It includes only prototypes for methods and possibly some public final data.

If a class includes an abstract method (one whose header (prototype) is specified, but one whose body is omitted), then the class becomes abstract.  Thus, one may move back and forth, down an inheritance structure, with concrete classes becoming abstract, and then later abstract classes becoming concrete.  Anywhere along the descent, classes may implement interface(s).  As they do so, if they provide implementations for all the required methods, then the class is concrete.  If a class does not provide implementations for all the required methods, however, then the class becomes abstract.  An abstract class is similar to a concrete class every way but two:
1.	An abstract class cannot be instantiated.
2.	An abstract class fairly “begs” to be extended.
In all other respects – can contain methods, can contain variables, can contain static members, etc., abstract and concrete classes are fundamentally the same.

Java requires that every abstract class be headed with the abstract modifier.  It is a syntax error if you omit the modifier.

Here’s a table that shows the various things you can and cannot do with classes, abstract classes and interfaces:

	extend a class	extend an abstract class	extend an interface	implement an interface	be instantiated	
						
a class	CAN	CAN	CANNOT	CAN	CAN	
						
an abstract class	CAN	CAN	CANNOT	CAN	CANNOT	
						
an interface	CANNOT	CANNOT	CAN	CANNOT	CANNOT	

File:  ExtendImplement.rtf