0% ont trouvé ce document utile (0 vote)
5 vues26 pages

Programmation Java

Le document traite de l'héritage et du polymorphisme en Java, expliquant comment les classes peuvent hériter d'autres classes et redéfinir des méthodes. Il aborde également les concepts de classes abstraites, de polymorphisme, et les bonnes pratiques de conception, tout en soulignant l'importance de la composition par rapport à l'héritage. Enfin, il propose des exercices pratiques et annonce le prochain module sur les interfaces.

Transféré par

caraklein17
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
5 vues26 pages

Programmation Java

Le document traite de l'héritage et du polymorphisme en Java, expliquant comment les classes peuvent hériter d'autres classes et redéfinir des méthodes. Il aborde également les concepts de classes abstraites, de polymorphisme, et les bonnes pratiques de conception, tout en soulignant l'importance de la composition par rapport à l'héritage. Enfin, il propose des exercices pratiques et annonce le prochain module sur les interfaces.

Transféré par

caraklein17
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi