Pourquoi N'y a-t-il pas d'héritage multiple en Java, mais l'implémentation d'interfaces multiples est autorisée?

Java ne permet pas l'héritage multiple, mais il permet l'implémentation d'interfaces multiples. Pourquoi?

131
demandé sur Ravindra babu 2010-03-25 15:40:41

15 réponses

parce que les interfaces spécifient seulement ce que fait la classe, pas comment il le fait.

le problème avec l'héritage multiple est que deux classes peuvent définir différentes façons de faire la même chose, et la sous-classe ne peut pas choisir lequel choisir.

189
répondu Bozho 2010-03-25 12:43:02

un de mes professeurs de Collège Me l'a expliqué de cette façon:

supposons que j'ai une classe, qui est un grille-pain, et une autre classe, qui est Nucléarbombe. Ils ont une "obscurité". Ils ont tous les deux une sur (). (On a une off " (éteint), l'autre n'a pas.) Si je veux créer une classe qui est une sous-classe de ces deux...comme vous pouvez le voir, c'est un problème qui pourrait vraiment m'exploser au visage ici.

Donc, l'un des principaux problèmes est que si vous avez deux classes de parents, ils peuvent avoir des implémentations différentes de la même fonctionnalité - ou peut-être deux fonctionnalités différentes avec le même nom, comme dans l'exemple de mon instructeur. Ensuite, vous devez décider lequel de vos sous-classes va utiliser. Il y a des façons de gérer cela, certainement - C++ le fait - mais les concepteurs de Java ont pensé que cela rendrait les choses trop compliquées.

avec une interface, vous êtes décrire quelque chose que la classe est capable de faire, plutôt que d'emprunter la méthode de faire quelque chose d'une autre classe. Les interfaces multiples sont beaucoup moins susceptibles de causer des conflits délicats qui doivent être résolus que les classes mères multiples.

84
répondu Syntactic 2010-03-25 13:04:37

parce que l'héritage est surutilisé même quand vous ne peut pas dire "hey, cette méthode semble utile, je vais étendre cette classe aussi bien".

public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter, 
             AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
22
répondu Michael Borgwardt 2010-03-25 12:50:45

implémenter des interfaces multiples est très utile et ne cause pas beaucoup de problèmes aux développeurs de langage ni aux programmeurs. Donc c'est autorisé. L'héritage Multiple tout en étant utile, peut causer de graves problèmes aux utilisateurs (redouté diamant de la mort ). Et la plupart des choses que vous faites avec l'héritage multiple peuvent aussi être faites par la composition ou en utilisant les classes intérieures. Donc l'héritage multiple est interdit comme apportant plus de problèmes que de gains.

6
répondu Tadeusz Kopec 2010-03-25 13:00:09

pour la même raison, C# n'autorise pas les héritages multiples mais vous permet d'implémenter plusieurs interfaces.

La leçon de C++ w/ l'héritage multiple est qu'il entraîner plus de problèmes qu'elle n'en valait la peine.

une interface est un contrat de choses que votre classe doit mettre en œuvre. Vous ne gagnez aucune fonctionnalité de l'interface. Héritence vous permet d'hériter la fonctionnalité d'une classe parent (et dans héritence multiple), qui peut devenir extrêmement déroutant).

permettant des interfaces multiples vous permet d'utiliser des modèles de conception (comme adaptateur) pour résoudre les mêmes types de problèmes que vous pouvez résoudre en utilisant l'héritage multiple, mais d'une manière beaucoup plus fiable et prévisible.

3
répondu Justin Niessner 2010-03-25 12:47:46

Java prend en charge l'héritage multiple par le biais d'interfaces seulement. Une classe peut implémenter n'importe quel nombre d'interfaces mais ne peut étendre qu'une seule classe.

l'héritage Multiple n'est pas supporté parce qu'il conduit à un problème de diamant mortel. Cependant, il peut être résolu, mais il conduit à un système complexe si l'héritage multiple a été abandonné par les fondateurs de Java.

dans un livre blanc intitulé "Java: an Overview" par James Gosling en février 1995 ( link ) donne une idée de la raison pour laquelle l'héritage multiple n'est pas pris en charge en Java.

selon Gosling:

"JAVA omet de nombreux rarement utilisé, mal compris, confondant les caractéristiques de C++ qui dans notre expérience apporte plus de chagrin que de bénéfice. Ce se compose principalement de surcharge de l'opérateur (bien qu'il ait méthode de surcharge), héritage multiple, et vaste automatique coercition."

3
répondu Praveen Kumar 2016-09-28 07:33:23

il est dit que l'état d'objets est référé en ce qui concerne les domaines dans lui et il deviendrait ambigu si trop de classes ont été héritées. Voici le lien

http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html

2
répondu Karthik GVD 2014-02-13 15:29:02

vous pouvez trouver la réponse exacte à cette requête dans la page de documentation d'oracle à propos de héritage multiple

  1. héritage Multiple de l'état: capacité d'hériter des champs de plusieurs classes

    une raison pour laquelle le langage de programmation Java ne vous permet pas d'étendre plus d'une classe est d'éviter les problèmes de l'héritage multiple d'état, qui est la capacité d'hériter des champs de plusieurs classes

    si l'héritage multiple est autorisé et que vous créez un objet en instanciant cette classe, cet objet héritera des champs de toutes les superclasses de la classe. Il sera la cause de deux problèmes.

    1. et si des méthodes ou des constructeurs de différentes super-classes instanciaient le même champ?
    2. Quelle méthode ou constructeur aura préséance?
  2. héritage Multiple de la mise en œuvre: capacité d'hériter des définitions de méthode de classes multiples

    Problèmes avec cette approche: nom conflic ts et ambiguïté . Si une sous-classe et une superclasse contiennent le même nom de méthode( et la même signature), le compilateur ne peut pas déterminer la version de l'invoquer.

    mais java supporte ce type d'héritage multiple avec méthodes par défaut , qui ont été introduites depuis la version Java 8. Le compilateur Java fournit quelques règles pour déterminer quelle méthode par défaut une classe particulière utilise.

    voir ci-dessous SE post pour plus de détails sur la résolution du problème de diamant:

    quelles sont les différences entre les classes abstraites et les interfaces en Java 8?

  3. héritage Multiple de type: capacité d'une classe d'implémenter plus d'une interface.

    Depuis l'interface ne contient pas de champs mutables, vous n'avez pas à vous soucier des problèmes qui résultent de l'héritage multiple d'état ici.

2
répondu Ravindra babu 2017-05-23 10:31:17

comme ce sujet n'est pas clos, je vais poster cette réponse, j'espère que cela aidera quelqu'un à comprendre pourquoi java ne permet pas l'héritage multiple.

considérer la classe suivante:

public class Abc{

    public void doSomething(){

    }

}

dans ce cas la classe Abc ne étend rien droit? Pas si vite, cette classe étend implicitement L'objet de classe, classe de base qui permet à tout fonctionne en java. Tout est un objet.

Si vous essayez d'utiliser la classe ci-dessus vous verrez que votre IDE vous permet d'utiliser des méthodes telles que: equals(Object o) , toString() , etc, mais vous n'avez pas déclaré Ces méthodes, elles viennent de la classe de base Object

Vous pouvez essayer:

public class Abc extends String{

    public void doSomething(){

    }

}

c'est très bien, parce que votre classe ne prolongera pas implicitement Object mais prolongera String parce que vous l'avez dit. Considérons le changement suivant:

public class Abc{

    public void doSomething(){

    }

    @Override
    public String toString(){
        return "hello";
    }

}

maintenant votre classe va toujours retourner "Bonjour" si vous appelez toString().

imaginez maintenant la classe suivante:

public class Flyer{

    public void makeFly(){

    }

}

public class Bird extends Abc, Flyer{

    public void doAnotherThing(){

    }

}

encore une fois Classe Flyer extension implicite objet qui a la méthode toString() , toute classe aura cette méthode car ils tous s'étendent Object indirectement, donc , si vous appelez toString() de Bird , qui toString() java devrait utiliser? De Abc ou Flyer ? Cela se produira avec n'importe quelle classe qui essaie de étend deux ou plusieurs classes , pour éviter ce genre de "collision de méthode" ils ont construit l'idée de interface , fondamentalement, vous pourriez les penser comme une classe abstraite qui ne étend pas l'objet indirectement . Puisqu'ils sont abstract ils devront être implémentés par une classe, qui est un objet (vous ne pouvez pas instancier une interface seule, ils doivent être implémentés par une classe), donc tout sera continuer à bien fonctionner.

pour distinguer les classes des interfaces, le mot-clé implements était réservé uniquement aux interfaces.

vous pouvez implémenter n'importe quelle interface que vous aimez dans la même classe puisqu'ils ne étendent rien par défaut (mais vous pouvez créer une interface qui étend une autre interface, mais encore, l'interface "père" ne prolongerait pas L'objet"), donc une interface est juste une interface et ils ne seront pas souffrez de " méthodes colissions de signature ", s'ils le font le compilateur vous lancera un avertissement et vous aurez juste à changer la signature de la méthode pour la corriger (signature = nom de la méthode + params + type de retour).

public interface Flyer{

    public void makeFly(); // <- method without implementation

}

public class Bird extends Abc implements Flyer{

    public void doAnotherThing(){

    }

    @Override
    public void makeFly(){ // <- implementation of Flyer interface

    }

    // Flyer does not have toString() method or any method from class Object, 
    // no method signature collision will happen here

}
1
répondu Murillo Henrique 2016-06-11 05:20:59

parce qu'une interface n'est qu'un contrat. Et une classe est en fait un conteneur de données.

0
répondu Snake 2010-03-25 12:42:31

prendre par exemple le cas où la Classe A a une méthode getSomething et la Classe B a une méthode getSomething et la Classe C étend A et B. Que se passerait-il si quelqu'un appelé C. getSomething? Il n'y a aucun moyen de déterminer quelle méthode appeler.

Les Interfaces

spécifient simplement les méthodes qu'une classe d'implémentation doit contenir. Une classe qui implémente plusieurs interfaces signifie simplement que la classe doit implémenter les méthodes de l'ensemble de ces interfaces. Whci serait ne soulèvent aucun problème, tel que décrit ci-dessus.

0
répondu John Kane 2013-05-20 19:10:34

envisager un scénario où les tests 1, 2 et 3 sont de trois classes. La classe Test3 hérite des classes Test2 et Test1. Si les classes Test1 et Test2 ont la même méthode et que vous l'appelez de l'objet de classe enfant, il y aura ambiguïté pour appeler la méthode de la classe Test1 ou Test2 mais il n'y a pas d'ambiguïté pour l'interface car dans l'interface il n'y a pas d'implémentation.

0
répondu Nikhil Kumar 2015-04-21 09:41:57

Java ne supporte pas les héritages multiples, les héritages multiples et les héritages hybrides en raison de l'ambiguïté problème:

 Scenario for multiple inheritance: Let us take class A , class B , class C. class A has alphabet(); method , class B has also alphabet(); method. Now class C extends A, B and we are creating object to the subclass i.e., class C , so  C ob = new C(); Then if you want call those methods ob.alphabet(); which class method takes ? is class A method or class B method ?  So in the JVM level ambiguity problem occurred. Thus Java does not support multiple inheritance.

succession multiple

lien de référence: https://plus.google.com/u/0/communities/102217496457095083679

0
répondu 2017-01-23 14:21:59

par exemple deux classes A,B ayant la même méthode m1(). Et la Classe C étend à la fois A, B.

 class C extends A, B // for explaining purpose.

maintenant, la Classe C va rechercher la définition de m1. D'abord, il cherchera dans la classe s'il n'a pas trouvé puis il vérifiera à la classe des parents. Tous les deux A, B ayant la définition donc ici l'ambiguïté se produisent quelle définition devrait choisir. Donc JAVA ne supporte pas les héritages multiples.

0
répondu Pooja Khatri 2018-05-13 06:57:40

* C'est une réponse simple, depuis que je suis un débutant en Java *

Considèrent qu'il existe trois classes de X , Y et Z .

donc nous héritons comme X extends Y, Z Et les deux Y et Z a une méthode alphabet() avec le même type de retour et arguments. Cette méthode alphabet() dans Y dit à premier alphabet d'affichage et méthode alphabet dans Z dit affichage dernier alphabet . Il y a donc ambiguïté lorsque alphabet() est appelé par X . Est-ce qu'il est dit d'afficher premier ou dernier alphabet??? Donc java ne supporte pas l'héritage multiple. Dans le cas d'Interfaces, considérer Y et Z comme des interfaces. Donc les deux contiendront la déclaration de méthode alphabet() mais pas la définition. Il ne dira pas si d'afficher le premier alphabet ou le dernier alphabet ou n'importe quoi mais déclarera juste une méthode alphabet() . Il n'y a donc aucune raison de soulever cette ambiguïté. Nous pouvons définir la méthode avec tout ce que nous voulons dans la classe X .

ainsi dans un mot, dans la définition des Interfaces est fait après la mise en œuvre de sorte qu'aucune confusion.

-1
répondu AJavaLover 2018-01-05 08:27:07