Héritage
100
Notions de POO en Java
Que pensez vous de classes suivantes ?
101
L’héritage en Java
Généralisation
Spécialisation
102
L’héritage en Java
103
L’héritage en Java
Définition
• Le terme héritage désigne le principe selon lequel une classe peut
hériter des caractéristiques (attributs et méthodes) d’autres classes.
• Grâce à l'héritage, une classe peut disposer immédiatement de
toutes les fonctionnalités d'une classe existante.
• Pour raccourcir les temps d’écriture et de mise au point du code d’une
application, il est intéressant de pouvoir réutiliser du code déjà écrit.
Exemple : Héritage, Agrégation ou Utilisation
➢ Salle de bains et Baignoire ? Agrégation
➢ Piano et Joueur de piano ? Utilisation
➢ Personne, Enseignant et Étudiant ? Héritage 104
Réutilisation par l'héritage
Notion d’héritage
L’héritage existe dans tous les langages [Link] permet d’écrire une classe B:
➢ qui se comporte dans les grandes lignes comme la classe A.
➢ mais avec quelques différences sans toucher au code source de A.
On a seulement besoin du code compilé de A
Le code source de B ne comporte que ce qui a changé par rapport au code de
A
On peut par exemple:
➢ ajouter de nouvelles méthodes
➢ modifier certaines méthodes
La classe A s'appelle une classe mère, classe parente ou super-classe
105
La classe B qui hérite de la classe A s'appelle une classe fille ou sous-classe
Héritage en java
106
L’héritage en Java
107
Exemple d’héritage en Java - classe mère
Exemple d’héritage
public class Personne {
protected String Nom, Prenom; //
protected int age;
// La classe contient des constructeurs,
// des méthodes getNom(), setNom(String )
// getPrenom(), getAge(),
// setPrenom(String), setAge(int),
...
public void Afficher ()
{ [Link](‘’nom : ‘’+Nom+‘’ Prenom : ‘’+Prenom+‘’Age : ‘’+Age);
}
} 108
Exemple d’héritage en Java - classe fille
exemple d’héritage(suite)
public class Etudiant extends Personne {
private int cne; // nouvelle variable
// Constructeurs
...
// Nouvelles Méthodes
public getCne() { return [Link]; }
public setCne(int Cne) { [Link]= Cne; }
// Méthodes modifiées
public void Afficher() {// redéfinition de Afficher()
[Link]();// appel de la méthode afficher de la classe mère
[Link](‘’ CNE: ‘’+cne);
} 109
}
L’héritage en Java
Notion d’héritage
En Java, chaque classe a une et une seule classe mère (pas d’héritage
multiple) dont elle hérite les variables et les méthodes.
Le mot clef extends indique la classe mère :
class Etudiant extends Personne
Par défaut une classe hérite de la classe Object.
La classe qui hérite peut:
➢ ajouter des variables, des méthodes et des constructeurs
➢ redéfinir des méthodes (exactement les mêmes types de
paramètres)
➢ surcharger des méthodes (même nom mais pas même signature)
(possible aussi à l’intérieur d’une classe)
110
L’héritage en Java
Notion d’héritage
Exercice : Proposer une modélisation en classe, puis une implémentation en java en
profitant de l’héritage
Vendeur Avocat EnseignantPermanant EnseignantVacataire
NumSecu NumSecu NumSecu NumSecu
Nom Nom Nom Nom
NomDuStand AdresseCabinet Spécialité Spécialité
Anciennté NbrAffaires NbrCours NbrCours
NumBureau NbeVacation
+ Afficher() + Afficher()
+ Afficher() + Afficher()
111
L’héritage en Java
Correction: Diagramme de classes
112
L’héritage en Java
Correction: en JAVA ( 3 classes)
113
L’héritage en Java
114
L’héritage en Java
115
116
Principe important lié à la notion d’héritage
Notion d’héritage
Si « B extends A », le grand principe est que tout B est un A
Par exemple:
➢ un étudiant est une personne;
➢ un poisson est un animal ;
➢ une voiture est un véhicule
B est un sous-type de A si on peut ranger une expression de type B dans une
variable de type A.
Les sous-classes d’une classe A sont des sous types de A.
En effet, si B hérite de A, tout B est un A donc on peut ranger un B dans une
variable de type A
Par exemple,
117
A a = new B(…); est autorisé
Pas d’héritage multiple en java
118
Héritage sur plusieurs niveaux
119
Héritage sur plusieurs niveaux
120
Encapsulation en JAVA
Encapsulation en JAVA
121
La visibilité en Java
Encapsulation en JAVA
On peut étendre la visibilité aux sous-classes avec le mot clé : proctected.
Attention : on n’étend pas la visibilité private mais la visibilité par défaut.
⇒ l’héritage s’ajoute aux packages
⇒ protected ne protège pas mais augmente la visibilité !
▪ public
▪ Toutes les classes
▪ protected
▪ Ajoute les sous-classes
▪ défaut
▪ Ajoute les classes du package
▪ private
▪ La classe
122
La visibilité en Java
Encapsulationen JAVA
On peut étendre la visibilité aux sous-classes avec le mot clé : proctected.
Attention : on n’étend pas la visibilité private mais la visibilité par défaut.
=⇒ l’héritage s’ajoute aux packages
=⇒ protected ne protège pas mais augmente la visibilité !
private défaut protected public
la classe elle-même OUI OUI OUI OUI
une sous-classe, paquetage = NON OUI OUI OUI
pas une sous-classe, paquetage = NON OUI OUI OUI
une sous-classe, paquetage différent NON NON OUI OUI
pas une sous-classe, paquetage diff NON NON NON 123
OUI
La visibilité en Java
124
Le mot super en Java
125
Le mot super en Java
126
Le mot super en Java
127
Le mot super en Java
128
Le mot super en Java
129
Constructeurs et héritage en Java
130
Constructeurs et héritage en Java
131
Constructeurs et héritage en Java
132
Redéfinition et Surcharge des méthodes
Redéfinition vs Surcharge
➢ Ne pas confondre redéfinition et surcharge des méthodes :
–on redéfinit une méthode quand une nouvelle méthode a la même signature
qu’une méthode héritée de la classe mère.
–on surcharge une méthode quand une nouvelle méthode a le même nom,
mais pas la même signature, qu’une autre méthode de la même classe
➢ En règle générale, il est préférable d'utiliser la surcharge entre deux
méthodes quand elles ont la même sémantique.
float sqrt(float value) {...}
double sqrt(double value) {...}
❖ Rappel: Signature d’une méthode (nom de la méthode + ensemble des
133
types de ses paramètres)
Redéfinition et Surcharge des méthodes
Redéfinition vs Surcharge
➢ Soit une classe B qui hérite d'une classe A.
➢ Dans une méthode d'instance m() de B, super. sert à désigner un membre de A :
– en particulier, super.m()désigne la méthode de A qui est donc en train d’être
redéfinie dans B :
int m(int i) {
return 500 + super.m(i);
➢ On ne peut trouver super.m() dans une méthode static m() ;
➢ Attention !!!: une méthode static ne peut être redéfinie.
134
Redéfinition et Surcharge des méthodes
135
Redéfinition et Surcharge des méthodes
136
Redéfinition et Surcharge des méthodes
137
Redéfinition et Surcharge des méthodes
138
final et héritage
139
La classe Object
140
La classe Object
141
Polymorphisme
Polymorphisme
142
Polymorphisme
Contexte: soit B hérite de A et que la méthode m() de A soit
redéfinie dans B
Quelle méthode m() sera exécutée dans le code suivant, celle de
A ou celle de B ?
A a = new B(5); a est un objet de la classe B
mais il est déclaré de la classe A
a.m();
La méthode appelée ne dépend que du type réel (B) de
l’objet a (et pas du type déclaré, ici A).
C’est la méthode de la classe B qui sera exécutée
143
Polymorphisme
Le polymorphisme est le fait qu’une même écriture
peut correspondre à différents appels de méthodes ;
par exemple,
A a = x.f();
a.m();
appelle la méthode m() de A ou de n’importe quelle sous-
classe de A f peut renvoyer une instance de A
ou de n’importe quelle sous-
classe de A
Ce concept est une notion fondamentale de la programmation
objet, indispensable pour une utilisation efficace de l’héritage
144
Mécanisme du polymorphisme
Le polymorphisme est obtenu grâce au « late binding
» (liaison retardée) : la méthode qui sera exécutée est
déterminée
–seulement à l’exécution, et pas dès la compilation
–par le type réel de l’objet qui reçoit le message (et
pas par son type déclaré)
145
Utilisation du polymorphisme
Le polymorphisme facilite l’extension des programmes :
on peut créer de nouvelles sous-classes sans toucher aux programmes déjà
écrits
Par exemple, si on ajoute une classe Enseignant, le code de
Afficher() sera toujours valable
Sans polymorphisme, il aurait fallu modifier le code source de
la classe Personne.
146
Exercice
147
Exercice
Donnez les résultats des bouts de code suivants:
148
Exercice
Donnez les résultats des bouts de code suivants:
149