<!-- Slide number: 1 -->
Conception par Objet et Programmation Java
1

Chapitre 4 : Héritage
Equipe Java
2019-2020

Notes:
<!-- Slide number: 2 -->
Plan
2
Introduction
Classe et objet
Encapsulation
Héritage
Polymorphisme
Exceptions
Connexion Base de donnée
Interfaces
Lambda Expression
Collections
Stream
Notes:
<!-- Slide number: 3 -->
Objectifs
3
Savoir identifier le lien entre les classes
Introduire la technique d’héritage : intérêt et
notation .
Introduire les droits d’accès d’une classe dérivée
aux membres de la classe de base.
Comprendre la construction d’un objet dérivé
Maîtriser la notion de redéfinition.
Stream
Notes:
<!-- Slide number: 4 -->
Héritage: Nouveau principe POO
4
Définition:
Technique offerte par les langages de programmation pour construire une classe à partir d’une (ou plusieurs)autre classe en partageant ses attributs et opérations.
Intérêts :
Spécialisation, enrichissement : une nouvelle classe réutilise les attributs et les opérations d ’une classe en y ajoutant et/ou des opérations particulières à la nouvelle classe
Redéfinition : une nouvelle classe redéfinit les attributs et opérations d’une classe de manière à en changer le sens et/ou le comportement pour le cas particulier défini par la nouvelle classe
Réutilisation : évite de réécrire du code existant et parfois on ne possède pas les sources de la classe à hériter
<!-- Slide number: 5 -->
Pourquoi hériter…
5
Pour relier des classes entre elles:
Lorsqu’une classe étend les fonctionnalités d’une autre classe
Lorsqu’une classe adapte le fonctionnement d’une autre classe
à une situation particulière.
Pour exploiter des classes existantes sans en modifier le code
même si ce code est inaccessible.
La documentation de la classe héritée suffit pour organiser le développement.
Regrouper les champs et les méthodes communs à plusieurs classes.
<!-- Slide number: 6 -->
Spécialisation de la classe « Voiture »
6
Un véhicule prioritaire est une voiture avec un gyrophare
Un véhicule prioritaire répond aux mêmes messages que la Voiture
On peut allumer le gyrophare d’un véhicule prioritaire
Une voiture électrique est une voiture dont l’opération de démarrage est différente
Une voiture électrique répond aux même messages que la Voiture
On démarre une voiture électrique en activant un disjoncteur

Héritage
<!-- Slide number: 7 -->
Classes et sous-classes
7
Un objet de la classe VehiculePrioritaire ou VoitureElectrique est aussi un objet de la classe Voiture donc il dispose de tous les attributs et opérations de la classe Voiture.

<!-- Slide number: 8 -->
Classes et sous-classes : terminologie
8
Définitions
La classe VehiculePrioritaire hérite de la classe Voiture.
Voiture est la classe mère et VehiculePrioritaire la classe fille.
Publicité
Voiture est la super-classe de la classe VehiculePrioritaire.
VehiculePrioritaire est une sous-classe de Voiture.
N.B
Un objet de la classe VehiculePrioritaire ou VoitureElectrique est forcément un objet de la classe Voiture.
Un objet de la classe Voiture n’est pas forcément un objet de la classe VehiculePrioritaire ou VoitureElectrique.
<!-- Slide number: 9 -->
Généralisation et Spécialisation
9
La généralisation exprime une relation « est-un » entre une classe et sa super-classe.

L’héritage permet
De généraliser dans le sens abstraction
De spécialiser dans le sens raffinement
<!-- Slide number: 10 -->
Héritage et Java
10
Héritage simple
Une classe ne peut hériter que d’une seule autre classe
Dans certains autres langages (ex : C++) possibilité d’héritage multiple
Utilisation du mot-clé extends après le nom de la classe
Voiture
VehiculePrioritaire
- gyrophare : boolean
+ allumeGyrophare ()
public class VehiculePrioritaire extends Voiture {
private boolean gyrophare;
...
public void allumeGyrophare() {
gyrophare = true;
}
...
}
<!-- Slide number: 11 -->
Héritage à plusieurs niveaux
11
public class Voiture {
...
public void demarre() {
...
}
}
Voiture
+ demmarer
public class VehiculePrioritaire extends Voiture {
...
public void allumeGyrophare()
{
...
}
}
Ambulance am = new Ambulance(...);
am.demarre();
am.allumeGyrophare();
am.chercher("Raoul");
VehiculePrioritaire
+ allumeGyropahre
public class Ambulance extends VehiculePrioritaire {
private String malade;
...
public void chercher(String ma) {
...
}
}
Ambulance
- malade : String
+ chercher (String)
<!-- Slide number: 12 -->
Surcharge et redéfinition 1/3
12
L’héritage
Une sous-classe peut ajouter des nouveaux attributs et/ou méthodes à ceux qu’elle hérite (surcharge en fait partie).
Une sous-classe peut redéfinir (redéfinition) les méthodes à ceux dont elle hérite et fournir des implémentations spécifiques pour celles-ci.
Surcharge : possibilité de définir des méthodes possédant le même nom mais dont les arguments (paramètres et valeur de retour) diffèrent.
Des méthodes surchargées peuvent
avoir des types de retour différents à
condition qu’elles aient des
arguments différents
<!-- Slide number: 13 -->
Publicité
Surcharge et redéfinition 2/3
13
Une voiture électrique est une voiture dont l’opération de démarrage est différente
Une voiture électrique répond aux même messages que la Voiture
On démarre une voiture électrique en activant un disjoncteur
Voiture
+ demarre()
VoitureElectrique
- disjoncteur : boolean
+ demarre()
public class VoitureElectonique extends Voiture {
private boolean disjoncteur;
...
public void demarre() {
disjoncteur = true;
}
...
}
Redéfinition de la méthode
<!-- Slide number: 14 -->
Surcharge et redéfinition 3/3
14
public class Voiture {
…
public void demarre() {
…
}
}
Ne pas confondre surcharge et redéfinition. Dans le cas de la surcharge la sous-classe ajoute des méthodes tandis que la redéfinition «spécialise» des méthodes existantes
Surcharge
Redéfinition
public VehiculePriotitaire extends Voiture{
…
public void demarre(int code) {
…
}
}
public VoitureElectonique extends Voiture{
…
public void demarre() {
…
}
}
VoitureElectronique possède “ au plus ” une méthode de moins que VehiculePrioritaire
VehiculePrioritaire possède “ au plus ” une méthode de plus que VehiculeElectonique
<!-- Slide number: 15 -->
Redéfinition avec réutilisation
15
Intérêt
La redéfinition d’une méthode cache le code de la méthode héritée. Réutiliser le code de la méthode hérité par le mot-clé super.
super permet ainsi la désignation explicite de l’instance d’une classe dont le type est celui de la classe mère.
Accès aux attributs et méthodes redéfinies par la classe courante mais que l’on désire utiliser.
super.nomSuperClasseMethodeAppelee(...)
Exemple de la Voiture : les limites à résoudre
L’appel à la méthode demarre de VoitureElectrique ne modifie que l’attribut disjoncteur
<!-- Slide number: 16 -->
Héritage et construction(1/6)
16
Possibilité comme les méthodes de réutiliser le code des constructeurs de la super-classe
Appel explicite d’un constructeur de la classe mère à l’intérieur d’un constructeur de la classe fille
Utilise le mot-clé super
super(paramètres du constructeur);
Appel implicite d'un constructeur de la classe mère est effectué quand il n'existe pas d'appel explicite. Java insère implicitement l'appel super()
L’appel au constructeur de la superclasse doit se faire absolument en première instruction
<!-- Slide number: 17 -->
Héritage et construction(2/6)
17
Pour initialiser les attributs hérités, le constructeur d’une classe peut invoquer un des constructeurs de la classe mère à l’aide du mot-clé super.
public class VoitureElectrique extends Voiture{
public VoitureElectrique( int puissance, boolean estDemarer, float vitesse) {
super(puissance, estDemarer,vitesse) ;
}
public Voiture( String unNom) {
this (puissance, estDemarer,vitesse) ;
}
}
super doit être la première instruction
Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la superclasse qui est appelé implicitement.
Publicité
<!-- Slide number: 18 -->
Héritage et construction(3/6)
18
Règles
1. L’appel d’un constructeur de la classe mère doit être la
première instruction du constructeur de la classe fille.
2. Il n’est pas possible d’utiliser à la fois un autre constructeur
de la classe et un constructeur de sa classe mère dans la
définition d’un de ses constructeurs.
public class A {
public A ( int x) {
super();
this() ;
}
}
INTERDIT
<!-- Slide number: 19 -->
Héritage et construction(4/6)
19
Constructeur implicite
public class B extends A {
public B( int x ) {
// appel super ( ) implicite
this . x = x ;
. . .
}
}
Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la superclasse qui est appelé implicitement.
Attention :
Dans ce cas, le constructeur sans argument doit être défini dans la super-classe
<!-- Slide number: 20 -->
Héritage et construction(5/6)
20
Constructeur implicite: erreur fréquente
Etape 2: Puis on ajoute un constructeur
Etape 1
public class A {
public int x ;
public A (int x) {
this.x =x;
}
}
public class B extends A {
public int y ;
public B ( int x , int y ) {
this . x = x ;
this . y = y ;
}
}
public class A {
public int x ;
}
public class B extends A {
public int y ;
public B ( int x , int y ) {
this . x = x ;
this . y = y ;
}
}
erreur
Héritage
<!-- Slide number: 21 -->
Héritage et construction(6/6)
21
Solution2:Appel explicite au super
Solution 1: ajout d’un constructeur vide
public class A {
public i n t x ;
public A () {}
public A ( int x ) {
this . x = x ;
}
}
public class B extends A {
public int y ;
public B ( i n t x , i n t y ) {
this . x = x ;
this . y = y ;
Publicité
}
}
public class A {
public i n t x ;
public A ( i n t x ) {
this . x = x ;
}
}
public class B extends A {
public int y ;
public B ( int x , int y ) {
super(x);
this . y = y ;
}
}
Héritage
<!-- Slide number: 22 -->
La Classe Object (1/2)
22
La classe Object est la classe de plus haut niveau dans la hiérarchie d'héritage.
Toute classe autre que Object possède une super-classe
Toute classe hérite directement ou indirectement de la classe Object
Une classe qui ne définit pas de clause extends hérite de la classe Object
Voiture
+ Class getClass()
+ String toString()
+ boolean equals(Object)
+ int hashCode()
…
public class Voiture extends Object {
...
public Voiture(int p, Galerie g)
{
puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}
...
}
Il n'est pas nécessaire d'écrire explicitement extends Object
<!-- Slide number: 23 -->
La Classe Object (2/2)
23
En Java, la racine de l’arbre d’héritage des classes est la classe java.lang.Object
La classe Object n’a pas de variable d’instance ni de
variable de classe.
La classe Object fournit plusieurs méthodes qui sont héritées par toutes les classes sans Exception.
Les plus couramment utilisées sont les méthodes toString et equals
<!-- Slide number: 24 -->
Méthodes et classes finales
24
Définition
Utilisation du mot-clé final
Méthode : interdire une éventuelle redéfinition d’une méthode
public final void demarre();
Classe : interdire toute spécialisation ou héritage de la classe concernée
public final class VoitureElectrique extends Voiture {
...
}
La classe String est finale
<!-- Slide number: 25 -->
Classes abstraites 1/2
25
Une classe abstraite est une classe incomplète. Elle regroupe un ensemble d’attributs et de méthodes mais certaines de ses méthodes ne contiennent pas d'instructions, elles devront être définies dans une classe héritant de cette classe abstraite.
A quoi ça sert ?
En général à définir les grandes lignes du comportement d'une classe d'objets sans forcer l'implémentation des détails de l'algorithme
En java, c'est le mot clef abstract qui permet de qualifier d'abstraite une classe ou une méthode
<!-- Slide number: 26 -->
Classes abstraites 2/2
26
Pourquoi "abstraite" ?
Une classe est abstraite soit parce qu'on n'est pas capable d'écrire l'implémentation de toutes les méthodes, soit parce qu'on ne veut pas créer d'instance de cette classe.
Une sous-classe qui n'implémente pas toutes les méthodes abstraites de sa super-classe est elle-même abstraite. Il faut donc la qualifier d'abstraite.
Quand on ne peut pas écrire d'implémentation pour une méthode donnée, cette méthode est qualifiée d'abstraite. Cela signifie que l'on laisse le soin aux sous-classes d'implémenter cette méthode.