Se puede crear nuevas clases extender clases ya existentes (en caso que no sean finales). Las nuevas clases se suelen llamar sub-clases o clases extendidas.
Una sub-clase heredere todas las propriedades de la clase súperior, aún se tiene solamente acceso directo a las partes de la super-clase declaradas por lo menos protected.
No se puede extender al mismo tiempo de más de una clase súperior (diferencia a C++ donde se puede derivar de más de una clase).
Se puede sobre-escribir métodos de la super-clase. Si se ha sobre-escrito una cierta función, automáticamente todas las funciones con el mismo nombre aún otras signaturas ya no están accesibles de modo directo.
Si se quiere ejecutar dentro de un método sobre-escrito el código de la super-clase, se puede acceder el método original con la referencia super.
Se puede como mucho extender la accesibilidad de métodos sobre-escritos. Se puede cambiar los modificadores del método. También se puede cambiar si los parámetros del método son finales o no, es decir, final no forma parte de la signatura.
Los tipos de las excepciones que lanza un método sobre-escrito tienen que ser un subconjunto de los tipos de las excepciones que lanza el método de la super-clase. Dicho subconjunto puede ser el conjunto vacio.
Se se llama a un método dentro de una jerarquía de clases, se ejecuta siempre la versión del método que corresponde al objeto creado (y no necesariamente al tipo de referencia dado) respetando su accesibilidad. Está técnica se llama polimorfismo.