On m'a posé cette question dans un examen de fin de module à livre ouvert aujourd'hui et je me suis retrouvé perdu. Je lisais Head first Java
et les deux définitions semblaient être exactement les mêmes. Je me demandais simplement quelle était la différence PRINCIPALE pour ma propre tranquillité d'esprit. Je sais qu'il y a un certain nombre de questions similaires à cela, mais je n'en ai vu aucune qui apporte une réponse définitive.
java
oop
inheritance
polymorphism
Darren Burgess
la source
la source
Réponses:
L'héritage se produit lorsqu'une «classe» dérive d'une «classe» existante. Donc, si vous avez une
Person
classe, alors vous avez uneStudent
classe qui s'étendPerson
,Student
hérite de tout ce quiPerson
a. Il y a quelques détails sur les modificateurs d'accès que vous mettez sur les champs / méthodes dans Person, mais c'est l'idée de base. Par exemple, si vous avez un champ privé activéPerson
,Student
ne le verra pas car ses champs privé et privé ne sont pas visibles pour les sous-classes.Le polymorphisme traite de la manière dont le programme décide des méthodes qu'il doit utiliser, en fonction du type d'objet dont il dispose. Si vous avez un
Person
, qui a uneread
méthode, et vous avez unStudent
qui s'étendPerson
, qui a sa propre implémentation deread
, quelle méthode est appelée est déterminée pour vous par le runtime, selon que vous avez unPerson
ou unStudent
. Cela devient un peu délicat, mais si vous faites quelque chose commela méthode read sur Student est appelée. C'est le polymorphisme en action. Vous pouvez faire cette affectation car a
Student
est aPerson
, mais le runtime est suffisamment intelligent pour savoir que le type réel dep
est Student .Notez que les détails diffèrent selon les langues. Vous pouvez faire de l'héritage en javascript par exemple, mais c'est complètement différent de la façon dont cela fonctionne en Java.
la source
Person
laread
méthode utilise le modificateur d'accès public, lesStudent
objets ne pourront-ils pas y accéder? et alorsStudent s = new Student();
ce ne sera pas plus facile? Je ne profite toujours pas vraiment des avantages du polymporphisme.Person p = new Student();
place deStudent p = new Student();
?L'héritage fait référence à l' utilisation de la structure et du comportement d'une super-classe dans une sous-classe.
Le polymorphisme fait référence à la modification du comportement d'une super-classe dans la sous-classe.
la source
m
(à la foisstatic
etinstance
) de la superclasse pour lesquelles ..." (suivi de détails sur l'héritage). Cela ressemble à une «réutilisation du code» pour moi.import static
pour éliminer cette mauvaise utilisation des interfaces.) Pour le polymorphisme pur en Java, l'outil à utiliser est les interfaces, pas l'héritage de classe.Polymorphisme : capacité à traiter des objets de différents types de manière similaire. Exemple: la girafe et le crocodile sont tous les deux des animaux, et les animaux le peuvent
Move
. Si vous avez une instance d'unAnimal
vous pouvez appelerMove
sans savoir ni vous soucier de quel type d'animal il s'agit.Héritage : c'est une façon de réaliser à la fois le polymorphisme et la réutilisation du code.
Autres formes de polymorphisme : il existe d'autres moyens de réaliser le polymorphisme, comme les interfaces, qui ne fournissent que du polymorphisme mais pas de réutilisation du code (parfois le code est assez différent, comme
Move
pour un Snake serait assez différent de celuiMove
d'un Chien, auquel cas une Interface serait le meilleur choix polymorphe dans ce cas.Dans d'autres langages dynamiques, le polymorphisme peut être réalisé avec Duck Typing, c'est-à-dire que les classes n'ont même pas besoin de partager la même classe ou interface de base, elles ont juste besoin d'une méthode avec le même nom. Ou encore plus dynamique comme Javascript, vous n'avez même pas besoin de classes du tout, juste un objet avec le même nom de méthode peut être utilisé de manière polymorphe.
la source
La principale différence est que le polymorphisme est un résultat spécifique de l'héritage. Le polymorphisme est l'endroit où la méthode à invoquer est déterminée à l'exécution en fonction du type de l'objet. Il s'agit d'une situation qui se produit lorsqu'une classe hérite d'une autre et remplace une méthode particulière. Cependant, dans une arborescence d'héritage normale, vous ne devez remplacer aucune méthode et donc tous les appels de méthode ne doivent pas nécessairement être polymorphes. Cela a-t-il du sens? C'est un problème similaire à tous les véhicules Ford sont des automobiles, mais toutes les automobiles ne sont pas des Ford (mais pas tout à fait ....).
De plus, le polymorphisme traite de l'invocation de méthode tandis que l'héritage décrit également les membres de données, etc.
la source
En Java, les deux sont étroitement liés. Cela est dû au fait que Java utilise une technique d'invocation de méthode appelée «répartition dynamique». Si j'ai
Ensuite, nous voyons que B hérite
spin
de A. Cependant, lorsque nous essayons de manipuler l'objet comme s'il s'agissait d'un type A, nous obtenons toujours le comportement de B pourdraw
. Ledraw
comportement est polymorphe.Dans certaines langues, le polymorphisme et l'héritage ne sont pas aussi étroitement liés. En C ++, par exemple, les fonctions non déclarées virtuelles sont héritées, mais ne seront pas distribuées dynamiquement, donc vous n'obtiendrez pas ce comportement polymorphe même lorsque vous utilisez l'héritage.
En javascript, chaque appel de fonction est distribué dynamiquement et vous avez un typage faible. Cela signifie que vous pourriez avoir un tas d'objets non liés, chacun avec le leur
draw
, avoir une fonction itérer sur eux et appeler la fonction, et chacun se comporterait très bien. Vous auriez votre propre tirage polymorphe sans avoir besoin d'héritage.la source
Polymorphisme: Supposons que vous travaillez pour une entreprise qui vend des stylos. Vous créez donc une très belle classe appelée "Pen" qui gère tout ce que vous devez savoir sur un stylo. Vous écrivez toutes sortes de classes pour la facturation, l'expédition, la création de factures, le tout en utilisant la classe Pen. Un patron de jour arrive et dit: "Excellente nouvelle! La société se développe et nous vendons des livres et des CD maintenant!" Ce n'est pas une bonne nouvelle car maintenant vous devez changer chaque classe qui utilise Pen pour utiliser également Book & CD. Mais que se passerait-il si vous aviez initialement créé une interface appelée "SellableProduct" et que Pen implémentait cette interface. Ensuite, vous pourriez avoir écrit toutes vos classes d'expédition, de facturation, etc. pour utiliser cette interface au lieu de Pen. Il ne vous reste plus qu'à créer une nouvelle classe appelée Book & CompactDisc qui implémente l'interface SellableProduct. En raison du polymorphisme, toutes les autres classes pourraient continuer à fonctionner sans changement! Faire du sens?
Donc, cela signifie utiliser l'héritage qui est l'un des moyens d'atteindre le polymorphisme.
Le polymorphisme peut être possible dans une classe / interface mais l'héritage toujours entre 2 OU plusieurs classes / interfaces. L'héritage est toujours conforme à la relation «est-une» alors qu'elle ne l'est pas toujours avec le polymorphisme (qui peut conformer à la fois la relation «est-un» / «a-une».
la source
L'héritage est plus une chose statique (une classe en étend une autre) tandis que le polymorphisme est une chose dynamique / d'exécution (un objet se comporte selon son type dynamique / d'exécution et non selon son type statique / déclaration).
Par exemple
-> Bien que le type statique / déclaration de a soit A, le type dynamique / d'exécution réel est B et donc a.foo () exécutera foo comme défini dans B pas dans A.
la source
Le polymorphisme est une approche permettant d'exprimer un comportement commun entre des types d'objets qui ont des traits similaires. Cela permet également de créer des variations de ces traits par substitution. L'héritage est un moyen d'atteindre le polymorphisme à travers une hiérarchie d'objets où les objets expriment des relations et des comportements abstraits. Ce n'est cependant pas le seul moyen d'atteindre le polymorphisme. Le prototype est une autre façon d'exprimer le polymorphisme qui est différent de l'héritage. JavaScript est un exemple de langage qui utilise un prototype. J'imagine qu'il existe également d'autres moyens.
la source
L'héritage est un concept lié à la réutilisation du code. Par exemple, si j'ai une classe parent dire
Animal
et qu'elle contient certains attributs et méthodes (pour cet exemple, ditesmakeNoise()
etsleep()
) et que je crée deux classes enfants appeléesDog
etCat
. Puisque les chiens et les chats s'endorment de la même manière (je suppose), il n'est pas nécessaire d'ajouter plus de fonctionnalités à lasleep()
méthode dans les sousDog
-Cat
classes et fournies par la classe parenteAnimal
. Cependant, unDog
aboiement et unCat
miaulement alors queAnimal
la classe peut avoir une méthode pour faire du bruit, un chien et un chat font des bruits différents les uns par rapport aux autres et aux autres animaux. Ainsi, il est nécessaire de redéfinir ce comportement pour leurs types spécifiques. Ainsi la définition du polymorphisme. J'espère que cela t'aides.la source
La documentation Oracle a cité la différence avec précision.
héritage: une classe hérite des champs et des méthodes de toutes ses superclasses, qu'elles soient directes ou indirectes. Une sous-classe peut remplacer les méthodes dont elle hérite ou masquer les champs ou les méthodes dont elle hérite . (Notez que masquer des champs est généralement une mauvaise pratique de programmation.)
polymorphisme: le polymorphisme fait référence à un principe de biologie dans lequel un organisme ou une espèce peut avoir de nombreuses formes ou stades différents. Ce principe peut également être appliqué à la programmation orientée objet et aux langages comme le langage Java. Les sous-classes d'une classe peuvent définir leurs propres comportements uniques tout en partageant certaines des mêmes fonctionnalités de la classe parent.
le polymorphisme ne s'applique pas aux champs.
Article similaire:
Polymorphisme vs écrasement vs surcharge
la source
Le polymorphisme est un effet d' héritage . Cela ne peut se produire que dans des classes qui s'étendent les unes les autres. Il vous permet d'appeler des méthodes d'une classe sans connaître le type exact de la classe. En outre, le polymorphisme se produit au moment de l'exécution .
Par exemple, exemple de polymorphisme Java:
L'héritage permet aux classes dérivées de partager les interfaces et le code de leurs classes de base. Cela se produit au moment de la compilation .
Par exemple, toutes les classes de la plateforme Java sont des descendants d'objet (image fournie par Oracle):
Pour en savoir plus sur l'héritage Java et le polymorphisme Java
la source
L'héritage se produit lorsque la classe A hérite de toutes les méthodes / champs non statiques protégés / publics de tous ses parents jusqu'à Object.
la source
Si vous utilisez JAVA, c'est aussi simple que ceci:
Le polymorphisme utilise des méthodes héritées mais les «écrasant» pour faire quelque chose de différent (ou la même chose si vous appelez super donc ne serait pas techniquement polymorphe).
Corrige moi si je me trompe.
la source
Le principal objectif du polymorphisme : créer une variable de référence à la super classe et tenir l' objet de la sous - classe => un objet peut effectuer plusieurs comportements .
En héritage , la sous - classe hérite des propriétés de la super classe .
la source
l'héritage est une sorte de polymorphisme. En fait, l'héritage est le polymorphisme dynamique. Ainsi, lorsque vous supprimez l'héritage, vous ne pouvez plus remplacer.
la source
Avec l' héritage, l'implémentation est définie dans la superclasse - le comportement est donc hérité.
Avec Polymorphism, l'implémentation est définie dans la sous-classe - donc seule l' interface est héritée.
la source
Le polymorphisme est obtenu par héritage dans
Java
.Hamster
classe hérite la structure deAnimal
,Herbivore
etPet
d'exposer behaviorisme polymorphes d'un animal domestique.Cat
classe hérite de la structure deAnimal
,Carnivore
etPet
présente également behaviorisme polymorphes d'un animal domestique.la source