¿Por qué no existe herencia múltiple en Java, pero se permite implementar múltiples interfaces?

Resuelto abson asked hace 14 años • 21 respuestas

Java no permite herencia múltiple, pero permite implementar múltiples interfaces. ¿Por qué?

abson avatar Mar 25 '10 19:03 abson
Aceptado

Porque las interfaces especifican sólo lo que está haciendo la clase, no cómo lo está haciendo.

El problema con la herencia múltiple es que dos clases pueden definir formas diferentes de hacer lo mismo y la subclase no puede elegir cuál elegir.

Bozho avatar Mar 25 '2010 12:03 Bozho

Uno de mis profesores universitarios me lo explicó de esta manera:

Supongamos que tengo una clase, que es Tostadora, y otra clase, que es NuclearBomb. Es posible que ambos tengan una configuración de "oscuridad". Ambos tienen un método on(). (Uno tiene un off(), el otro no.) Si quiero crear una clase que sea una subclase de ambas... como puedes ver, este es un problema que realmente podría estallar en mi cara. .

Entonces, uno de los principales problemas es que si tienes dos clases principales, es posible que tengan diferentes implementaciones de la misma característica, o posiblemente dos características diferentes con el mismo nombre, como en el ejemplo de mi instructor. Luego tienes que decidir cuál va a utilizar tu subclase. Hay maneras de manejar esto, ciertamente (C++ lo hace), pero los diseñadores de Java sintieron que esto complicaría demasiado las cosas.

Sin embargo, con una interfaz estás describiendo algo que la clase es capaz de hacer, en lugar de tomar prestado el método de otra clase para hacer algo. Es mucho menos probable que varias interfaces causen conflictos complicados que deban resolverse que varias clases principales.

Syntactic avatar Mar 25 '2010 13:03 Syntactic

Porque la herencia se usa en exceso incluso cuando no puedes decir "oye, ese método parece útil, extenderé esa clase también".

public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter, 
             AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
Michael Borgwardt avatar Mar 25 '2010 12:03 Michael Borgwardt

La respuesta a esta pregunta radica en el funcionamiento interno del compilador de Java (encadenamiento de constructores). Si vemos el funcionamiento interno del compilador java:

public class Bank {
  public void printBankBalance(){
    System.out.println("10k");
  }
}
class SBI extends Bank{
 public void printBankBalance(){
    System.out.println("20k");
  }
}

Después de compilar esto se ve así:

public class Bank {
  public Bank(){
   super();
  }
  public void printBankBalance(){
    System.out.println("10k");
  }
}
class SBI extends Bank {
 SBI(){
   super();
 }
 public void printBankBalance(){
    System.out.println("20k");
  }
}

cuando extendemos la clase y creamos un objeto de ella, una cadena de constructores se ejecutará hasta Objectla clase.

El código anterior funcionará bien. pero si tenemos otra clase llamada Carque se extiende Banky una clase híbrida (herencia múltiple) llamada SBICar:

class Car extends Bank {
  Car() {
    super();
  }
  public void run(){
    System.out.println("99Km/h");
  }
}
class SBICar extends Bank, Car {
  SBICar() {
    super(); //NOTE: compile time ambiguity.
  }
  public void run() {
    System.out.println("99Km/h");
  }
  public void printBankBalance(){
    System.out.println("20k");
  }
}

En este caso (SBICar) no podrá crear la cadena de constructores ( ambigüedad en el tiempo de compilación ).

Para interfaces esto está permitido porque no podemos crear un objeto de ello.

Para conocer nuevos conceptos defaulty staticmétodos, consulte la interfaz predeterminada .

Espero que esto resuelva tu consulta. Gracias.

Prabal Srivastava avatar Mar 25 '2019 03:03 Prabal Srivastava

Puede encontrar una respuesta precisa para esta consulta en la página de documentación de Oracle sobre herencia múltiple .

  1. Herencia múltiple de estado: capacidad de heredar campos de múltiples clases

En este caso, cuando crea un objeto: heredará campos de todas las superclases. Causará dos problemas.

a. ¿Qué pasa si métodos o constructores de diferentes superclases crean instancias del mismo campo? b. ¿Qué método o constructor tendrá prioridad?

  1. Herencia múltiple de implementación: capacidad de heredar definiciones de métodos de múltiples clases

Este enfoque provoca conflictos de nombres y ambigüedad . Si una subclase y una superclase contienen el mismo nombre de método (y firma), el compilador no puede determinar qué versión invocar.

Java admite este tipo de herencia múltiple con métodos predeterminados , desde el lanzamiento de Java 8. El compilador de Java proporciona algunas reglas para determinar qué método predeterminado utiliza una clase en particular.

Consulte la publicación SE a continuación para obtener más detalles sobre cómo resolver el problema de los diamantes:

¿Cuáles son las diferencias entre clases abstractas e interfaces en Java 8?

  1. Herencia múltiple de tipo: Capacidad de una clase de implementar más de una interfaz.

Dado que la interfaz no contiene campos mutables, no necesita preocuparse por los problemas que resultan de la herencia múltiple de estado aquí.

Ravindra babu avatar Sep 17 '2016 17:09 Ravindra babu