La herencia es un mecanismo exigido a cualquier lenguaje que pretenda
ser orientado a objetos. Consideraremos la herencia como la transmisión de
los métodos y atributos de una clase a otra. Gracias a la herencia se pueden
establecer jerarquías entre clases. Establecer una jerarquía es un
proceso subjetivo, que depende del programador y de los matices de
apreciación de cada uno.
La herencia nos permite definir una jerarquía en la que existirán clases
padre y clases hijo, pudiéndo ser una clase padre de otra clase,
e hijo de otra clase a la vez. No deben definirse jerarquías de herencia en
la que una clase sea padre e hijo de la misma clase. Existen 2 tipos de
herencia: La herencia simple y la herencia múltiple. En la
herencia simple una clase sólo puede tener una clase padre, en la herencia
múltiple, una clase puede tener más de una clase padre. Por ejemplo:
En la siguiente figura se muestra una jerarquía de clases, con herencia
simple de 2 clases vertebrado e invertebrado,
que heredan de la clase serVivo.

En la siguiente figura se muestra una jerarquía de clases, con herencia
múltiple de 1 clase hispano-argentino,
que hereda de las clases español y argentino.
Cuando una clase hereda de otra, la clase padre "transmite" todos sus
atributos y métodos a la clase hija.
Clase abstracta
Al construir una jerarquía de herencia puede darse el caso de que ciertas
operaciones de la clase padre no pueden ser completadas por diferentes
motivos, o que dichas operaciones se hagan de una forma diferente en cada
clase hija. Por ejemplo, en una clase serVivo existirá
un método comer, pero ese método será
diferente en una clase hija perro (los
perros comen con la boca), y en una clase hija pájaro,
ya que los pájaros comen con el pico (salvo una mutación extraña...). Por lo
tanto, una clase será abstracta si tiene algún método diferido, es
decir, declarado pero no definido. No podrá instanciarse ningún objeto de
una clase abstracta.
Redefinición de métodos
Una clase hija de una clase abstracta puede redefinir los métodos
diferidos de su clase padre abstracta.
Nota: Una
clase hija de una clase abstracta no tiene porqué redefinir los métodos
diferidos de la clase padre, podría ser una clase nieta de la clase
abstracta la que hiciera la redefinición. Lo que es obligatorio es redefinir
un método diferido en alguna clase descendiente de una clase abstracta.
El método debe redefinirse con los mismos parámetros que el método diferido,
de lo contrario se estaría definiendo otro método (sobrecarga). Es aquí
donde aparece el concepto de super. Esta palabra
reservada hace referencia a un método perteneciente a la clase padre de
la clase del objeto en cuestión.