Java is similar to a safe version of C++ with all objects in the heap. Variables directly denote objects in the heap; there are no pointers. For safety, Java programs are statically type checked, and storage is managed by a garbage collector.
Java allows new types to be defined by both interfaces and classes [Sun95a]. An interface contains just the names and signatures of methods, but no implementations. A class defines methods and constructors, as well as fields and implementations.
An interface can extend one or more other interfaces, which means that the type defined by those interfaces are supertypes of the one being declared. Similarly, a class can extend another class (but just one), in which case it defines a subtype of the other class and also inherits its implementation.
Now we will discuss our extensions to support parameterized types.