Qu'est-ce que l'héritage multiple en Java?

Les développeurs ont dès le début conçu Java comme un langage de programmation complet et orienté objet.

POO et héritage

L'utilisation de la programmation orientée objet utilise le concept d'héritage pour étendre les fonctionnalités des objets. Pensez à lorsqu'un programmeur crée un objet. Plus tard, vous pourrez voir que vous devez créer un objet très similaire avec seulement de légères différences (peut-être étendre les fonctionnalités d'un objet précédent dans un nouveau contexte). C'est là que l'héritage apparaît. Un objet qu'un programmeur "dérive" d'un autre objet "base" hérite des méthodes et des variables de la classe et peut ensuite ajouter davantage de fonctionnalités (comme dans l'exemple Java suivant):

classe publique Sphere {public int radius; }

public class Ball étend Sphere {public string color; // Ball ajoute la variable "color", mais utilise également la variable "radius"}

Héritage multiple

À un moment donné, un programmeur peut être tenté de dériver une classe unique de plusieurs classes. C'est ce qu'on appelle "l'héritage multiple" et bien que cela semble utile, cela peut poser des problèmes, tels que l'important "problème des diamants". Ce problème se produit lorsque deux classes héritent de la même classe (les classes B et C dérivant de la classe A), tandis qu'une autre classe (D) dérive des classes B et C. Lorsqu'un objet D est créé, le système le traite comme un type de classe de base (classe "Ball" ou boule et "Sphère" ou sphère, par exemple). Dans le problème des losanges, le système ne peut pas déterminer de manière décisive quelle classe D (est-ce le type ABD ou le type ACD?) Est celle qui pose des problèmes.

Java et héritage multiple

En raison de problèmes d'héritage multiple, Java ne le permet pas. Mais en réalité, les classes dérivées de plusieurs classes de base peuvent être obtenues de manière sécurisée en utilisant des "interfaces". Une interface est similaire à une classe, mais elle définit non seulement la structure de la classe, mais également son code réel. Une classe de base qui implémente une interface n'hérite pas nécessairement de la fonctionnalité de l'interface: elle ne fait que promettre l'utilisation de sa structure. Puisqu'une classe qui implémente une interface n'hérite pas d'une autre classe (et n'est pas un type de la classe de base), un programmeur peut implémenter plusieurs interfaces en utilisant la même classe.

Exemple: héritage et interfaces

L'exemple suivant montre la différence entre l'héritage d'objets et une interface. Une classe qui hérite d'une autre obtient l'accès à la classe de base car elle devient fondamentalement un type de cette classe (comme dans les classes "Ball" et "Sphere"). Une classe qui implémente une interface ne promet que d’implémenter la structure de son interface: ce n’est pas un type de cette interface:

interface Basic {int doubleA (); // note: aucun code réel n'est défini dans l'interface}

La classe publique B implémente Basic {

public int a;

public int doubleA () // la classe B doit définir la méthode "doubleA ()" pour implémenter "Basic" {return a * 2;}}