Le polymorphisme en Java
Le polymorphisme est l'un des piliers fondamentaux de la programmation orientée objet, aux côtés de
l'encapsulation, de l'héritage et de l'abstraction. Le terme "polymorphisme" vient du grec et signifie
"plusieurs formes". En programmation, il désigne la capacité d'une entité (méthode ou objet) à prendre
plusieurs formes différentes.
Qu'est-ce que le polymorphisme ?
Le polymorphisme permet de traiter des objets de classes différentes de manière uniforme. En termes
simples, il permet à une même action d'être réalisée différemment selon le contexte.
Prenons une analogie de la vie quotidienne : un téléphone. L'action "communiquer" peut prendre
plusieurs formes selon le type de téléphone :
● Sur un téléphone classique : on parle à travers le combiné
● Sur un smartphone : on peut parler, envoyer des SMS, des emails, utiliser des applications de
messagerie...
Bien que l'intention (communiquer) soit la même, la forme qu'elle prend varie selon le contexte.
Types de polymorphisme en Java
Il existe principalement deux types de polymorphisme en Java :
1. Polymorphisme au moment de la compilation (statique)
Aussi appelé surcharge de méthodes ou method overloading, il se produit lorsque plusieurs
méthodes du même nom existent dans une classe, mais avec des paramètres différents.
Le compilateur Java détermine quelle version de la méthode appeler en fonction des arguments
fournis :
2. Polymorphisme au moment de l'exécution (dynamique)
Aussi appelé redéfinition de méthodes ou method overriding, il se produit lorsqu'une sous-classe
fournit une implémentation spécifique d'une méthode déjà définie dans sa classe parent.
Le type réel de l'objet détermine quelle méthode est exécutée :
Exemple concret : Système de formes géométriques
Voici un exemple plus élaboré montrant comment le polymorphisme permet de traiter différents types
d'objets de manière uniforme :
Utilisation du polymorphisme avec ces classes :
Avantages du polymorphisme
1. Réutilisation du code : Permet d'écrire des méthodes plus génériques qui fonctionnent avec
différents types d'objets.
2. Flexibilité : Permet aux objets de changer de comportement à l'exécution selon leur type.
3. Organisation : Favorise une structure de code plus logique et hiérarchique.
Polymorphisme et collections
Le polymorphisme est particulièrement utile avec les collections Java :
Règles et considérations importantes
1. Liaison dynamique : En Java, la liaison dynamique détermine quelle méthode appeler en
fonction du type réel de l'objet, pas de la référence.
2. Compatibilité des types : Une référence de type parent peut pointer vers un objet de type
enfant, mais pas l'inverse.
3. Limites de la référence parent : Une référence de type parent ne peut accéder qu'aux
méthodes déclarées dans ce type, même si l'objet réel est d'un type enfant avec plus de
méthodes.
4. Conversion de type (cast) : Pour accéder aux méthodes spécifiques, il faut convertir
explicitement :
Conclusion
Le polymorphisme est un concept puissant qui permet de créer du code plus flexible, extensible et
réutilisable. En permettant à une même interface d'être utilisée pour différents types sous-jacents, il
facilite la création de systèmes modulaires où de nouveaux comportements peuvent être ajoutés sans
modifier le code existant.
En Java, le polymorphisme se manifeste principalement sous deux formes : la surcharge de méthodes
(au moment de la compilation) et la redéfinition de méthodes (au moment de l'exécution). C'est ce
deuxième type qui est le plus souvent associé au concept de polymorphisme en POO.
Maîtriser le polymorphisme est essentiel pour concevoir des applications Java bien structurées et
évolutives, car il permet de respecter des principes de conception fondamentaux comme le principe
ouvert/fermé (les entités doivent être ouvertes à l'extension mais fermées à la modification).