Programmation Java
Héritage & polymorphisme
Pr. Elmahdi ERRAJI
ESTE
26 novembre 2025
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 1 / 26
Plan
1 Motivation & rappel
2 Notions de base sur l’héritage
3 Redéfinition de méthode
4 Polymorphisme
5 Classes abstraites
6 Considérations de conception & bonnes pratiques
7 Résumé
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 2 / 26
Où en sommes-nous ?
Jusqu’ici, nous avons vu :
Plateforme Java, variables, structures de contrôle
Classes, objets, encapsulation, packages
Étape suivante : réutilisation de code et concepts de conception flexibles
En C++ vous connaissez déjà l’héritage ; en Java c’est similaire, mais :
Héritage simple pour les classes
Interfaces au lieu de l’héritage multiple d’implémentation
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 3 / 26
Exemple de motivation
Supposons que nous modélisions des formes géométriques :
Cercle
Rectangle
Triangle
Toutes les formes :
ont une aire
ont un périmètre
Sans héritage :
nous allons dupliquer du code et des concepts
Avec héritage :
on crée une super-classe Shape
Circle / Rectangle / Triangle en héritent
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 4 / 26
Héritage en Java
L’héritage permet à une classe de réutiliser et d’étendre une autre classe
Syntaxe Java :
1 class Parent {
2 // champs, mthodes
3 }
4
5 class Child extends Parent {
6 // champs et mthodes supplmentaires
7 }
Terminologie :
Superclasse (classe parente, classe de base)
Sous-classe (classe fille, classe dérivée)
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 5 / 26
Exemple simple
1 class Person {
2 protected String name;
3 protected int age;
4
5 public Person(String name, int age) {
6 [Link] = name;
7 [Link] = age;
8 }
9
0 public void introduce() {
1 [Link]("Bonjour, je m'appelle " + name +
2 " et j'ai " + age + " ans.");
3 }
4 }
5
6 class Student extends Person {
7 private String major;
8 Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 6 / 26
Cont
1 class Student extends Person {
2 private String major;
3
4 public Student(String name, int age, String major) {
5 super(name, age); // appel au constructeur Person
6 [Link] = major;
7 }
8 }
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 7 / 26
Le mot-clé super
super est une référence à la partie superclasse de l’objet
Utilisations :
Appeler le constructeur de la superclasse : super(...);
Appeler une méthode de la superclasse : [Link]();
Appel de constructeur :
1 public Student(String name, int age, String major) {
2 super(name, age); // doit tre la premire instruction
3 [Link] = major;
4 }
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 8 / 26
Modificateurs d’accès et héritage
public : accessible partout
private : accessible uniquement dans la même classe
protected : accessible dans :
le même package
les sous-classes (même dans d’autres packages)
package-private (sans modificateur) :
accessible uniquement dans le même package
Utiliser protected avec parcimonie ; préférer private + getters/setters
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 9 / 26
Redéfinition de méthode
Une sous-classe peut redéfinir une méthode de sa superclasse
Même :
nom
liste de paramètres
type de retour compatible
Fournit une implémentation spécialisée
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 10 / 26
Exemple de redéfinition
1 class Person {
2 public void introduce() {
3 [Link]("Bonjour, je m'appelle " + name + ".");
4 }
5 }
6
7 class Student extends Person {
8
9 @Override
0 public void introduce() {
1 [Link]("Bonjour, je m'appelle " + name +
2 " et j'tudie " + major + ".");
3 }
4 }
L’annotation @Override indique au compilateur :
« Cette méthode a vocation à redéfinir une méthode de la superclasse. »
Si ce n’est pas le cas, erreur de compilation !
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 11 / 26
Appeler l’implémentation de la superclasse
1 class Student extends Person {
2
3 @Override
4 public void introduce() {
5 [Link](); // appel [Link]()
6 [Link]("J'tudie " + major + ".");
7 }
8 }
Utiliser [Link]() pour réutiliser une partie du comportement
Puis ajouter un comportement spécifique à la sous-classe
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 12 / 26
Méthodes et classes final
Une méthode peut être déclarée final :
1 public final void log(String message) { ... }
ne peut pas être redéfinie dans les sous-classes
Une classe peut être déclarée final :
1 public final class String { ... }
ne peut pas être étendue (pas de sous-classe)
Utiliser final pour :
protéger des invariants
éviter des hiérarchies fragiles
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 13 / 26
Qu’est-ce que le polymorphisme ?
« Plusieurs formes »
Une référence de type superclasse peut pointer vers des objets de n’importe quelle
sous-classe
La méthode exécutée dépend du type réel (runtime) de l’objet
C’est ce qu’on appelle le dispatch dynamique
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 14 / 26
Exemple polymorphe
1 class Shape {
2 public double area() {
3 return 0.0;
4 }
5 }
6
7 class Circle extends Shape {
8 private double radius;
9
0 public Circle(double radius) {
1 [Link] = radius;
2 }
3
4 @Override
5 public double area() {
6 return [Link] * radius * radius;
7 }
8 }
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 15 / 26
Utiliser le polymorphisme
1 Shape s1 = new Circle(2.0);
2 Shape s2 = new Rectangle(3.0, 4.0);
3
4 [Link]([Link]()); // [Link]()
5 [Link]([Link]()); // [Link]()
Type de la variable : Shape
Type réel de l’objet : Circle ou Rectangle
Java décide à l’exécution quelle méthode area() appeler
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 16 / 26
Upcasting et downcasting
Upcasting : affecter un objet de sous-classe à une référence de superclasse
1 Circle c = new Circle(2.0);
2 Shape s = c; // upcast : toujours sr
Downcasting : convertir une référence de superclasse vers une sous-classe
1 Shape s = new Circle(2.0);
2 Circle c = (Circle) s; // sr ici
Le downcasting est dangereux si l’objet n’est pas réellement de cette sous-classe :
1 Shape s = new Rectangle(3.0, 4.0);
2 Circle c = (Circle) s; // ClassCastException l'excution
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 17 / 26
L’opérateur instanceof
Utiliser instanceof pour tester le type réel d’un objet :
1 Shape s = getShape();
2
3 if (s instanceof Circle) {
4 Circle c = (Circle) s;
5 [Link]("Rayon : " + [Link]());
6 }
Mais un usage fréquent de instanceof est souvent un « code smell » :
Mieux : concevoir des méthodes polymorphes et éviter les tests de type
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 18 / 26
Classes abstraites
Une classe abstraite ne peut pas être instanciée
Elle peut contenir :
des méthodes abstraites (sans corps)
des méthodes non abstraites (avec implémentation)
Utilisée pour définir un gabarit commun pour les sous-classes
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 19 / 26
Exemple de classe abstraite
1 abstract class Shape {
2 public abstract double area(); // pas de corps
3
4 public void printArea() {
5 [Link]("Area = " + area());
6 }
7 }
8
9 class Circle extends Shape {
0 private double radius;
1
2 public Circle(double radius) {
3 [Link] = radius;
4 }
5
6 @Override
7 public double area() {
8 Pr. Elmahdi [Link]
return (ESTE) * radius * radius;
Héritage & polymorphisme 26 novembre 2025 20 / 26
Pourquoi des classes abstraites ?
Forcer les sous-classes à implémenter certaines méthodes
ex. : chaque Shape doit implémenter area()
Fournir du code commun partagé par toutes les sous-classes
ex. : printArea() appelle la méthode area() de manière polymorphe
Utile pour :
le patron de conception Template Method
définir des implémentations partielles
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 21 / 26
Héritage vs composition
« Est-un » vs « Possède-un »
Utiliser l’héritage lorsque :
il existe une relation est-un forte
on souhaite la substitution polymorphe
Utiliser la composition lorsque :
une classe est composée d’autres objets
ex. : Car possède un Engine
on souhaite plus de flexibilité / moins de couplage fort
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 22 / 26
Pièges fréquents
Utiliser l’héritage uniquement pour réutiliser du code
peut créer des hiérarchies fragiles
Exposer l’état interne aux sous-classes via protected
Casser les invariants dans les sous-classes
Recours excessif au downcasting et à instanceof
Préférer une meilleure conception polymorphe
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 23 / 26
Lignes directrices de conception
En cas de doute, préférer la composition à l’héritage
Garder les superclasses petites et focalisées
Marquer les classes et méthodes final lorsque c’est pertinent
Utiliser @Override partout où une méthode est redéfinie
Écrire des tests en utilisant des références de supertype
ex. : tester avec des références Shape pour de nombreuses formes concrètes
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 24 / 26
Résumé
Héritage :
extends, super, modificateurs d’accès
Redéfinition :
@Override, [Link](), final
Polymorphisme :
Références de superclasse pour des objets de sous-classes
Dispatch dynamique à l’exécution
Classes abstraites :
Non instanciables, définissent des méthodes abstraites
Conception :
Héritage vs composition
Éviter les hiérarchies fragiles
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 25 / 26
Suite du cours
Pratique :
Implémenter une petite hiérarchie de classes (formes, employés, comptes bancaires, etc.)
Utiliser le polymorphisme pour calculer des totaux, afficher des rapports, etc.
Prochain module :
Interfaces et conception par contrat
Pr. Elmahdi ERRAJI (ESTE) Héritage & polymorphisme 26 novembre 2025 26 / 26