¿Qué es la herencia múltiple en Java?

Por g.s. jackson
¿Qué es la herencia múltiple en Java?
Medioimages/Photodisc/Photodisc/Getty Images

Los desarrolladores diseñaron Java desde el principio para que fuera un lenguaje de programación completo y orientado a objetos. Debido a esto, los conceptos integrales de la programación orientada a objetos son cada vez más importantes en la funcionalidad básica de Java. En particular, los conceptos de herencia de clase (y los problemas que surgen a partir de ella) son preocupaciones fundamentales de los programadores Java. Uno de estos problemas, la herencia múltiple, se puede atajar entendiendo cómo funciona la herencia y cómo usa Java las interfaces.

POO y herencia

El uso de la programación orientada a objetos usa el concepto de herencia para extender la funcionalidad de los objetos. Piensa en cuando un programador crea un objeto. Más tarde puede ver que necesita crear un objeto muy parecido con sólo ligeras diferencias (tal vez extender la funcionalidad de un objeto anterior en un nuevo contexto). Aquí es donde aparece la herencia. Un objeto que un programador "deriva" de otro objeto "base" hereda los métodos y variables de la clase, y después puede añadirle más funcionalidad (como en el siguiente ejemplo de Java):

public class Sphere{ public int radius; }

public class Ball extends Sphere{ public string color; // Ball añade la variable "color", pero también usa la variable "radius" }

Herencia múltiple

En algún momento, un programador puede estar tentado a derivar una clase única de varias clases. Esto se conoce como "herencia múltiple" y aunque parece útil, puede provocar problemas, como el importante "problema del diamante". Este problema ocurre cuando dos clases heredan de la misma clase (como la clase B y C derivan de la clase A), mientras que otra clase (D) deriva de B y C. Cuando se crea un objeto D, el sistema lo trata como un tipo de clase base (clase "Ball" o bola y "Sphere" o esfera, por ejemplo). En el problema del diamante, el sistema no puede determinar de forma decisiva qué clase D (¿es tipo A-B-D o tipo A-C-D?) es la que causa problemas.

Java y la herencia múltiple

Debido a los problemas con la herencia múltiple, Java no la permite. Pero en realidad las clases derivadas de varias clases base pueden conseguirse de una forma segura usando "interfaces". Una interfaz es parecida a una clase, pero no sólo define la estructura de la clase, sino también su código real. Una clase base que implementa una interfaz no "hereda" necesariamente la funcionalidad de la interfaz: sólo promete el uso de su estructura. Puesto que una clase que implementa una interfaz no hereda de otra clase (y no es un tipo de la clase base), un programador puede implementar varias interfaces usando la misma clase.

Ejemplo: herencia e interfaces

El siguiente ejemplo muestra la diferencia entre la herencia de objetos y una interfaz. Una clase que hereda de otra consigue acceso a la clase base porque se convierte básicamente en un tipo de esa clase (como en las clases "Ball" y "Sphere"). Una clase que implementa una interfaz sólo promete implementar la estructura de su interfaz: no es un tipo de esa interfaz:

interface Basic{ int doubleA(); // nota: no se define código real en la interfaz }

public class B implements Basic{

public int a;

public int doubleA() //la clase B debe definir el método "doubleA()" para implementar "Basic" {return a * 2;} }