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.