Héritage

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 14

Programmation orientée objet en Java

Chapitre n◦ 6: Héritage

ISMAILI ALAOUI El Mehdi 1

Filière: SMI-S5

1. Université Moulay Ismail Faculté des Sciences de Meknès Département d’Informatique


ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 1 / 14
Plan

1 L’héritage
Exemple introductif
La relation « est un »
Un cercle « est un » point géométrique
Le constructeur d’une classe héritée
La protection des attributs hérités
Les conversions explicites de références
Le polymorphisme
Classes et méthodes finales
Surcharge vs. polymorphisme

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 2 / 14


L’héritage Exemple introductif

Classe Point Classe Cercle


class Point { class Cercle {
int x, y ; int x, y ;
void deplacer(int dx, int dy) {x += dx ; double r ; // rayon
y += dy ; void deplacer(int dx, int dy) {x += dx ;
} y += dy ;
} }
double surface(){return (Math.PI*r*r) ;}
}

Problème de réutilisabilité
Comment écrire une classe qui possède tous les membres d’une classe et d’autres
en plus, sans tout réécrire ?
p Comment éviter d’écrire plusieurs fois la même chose dans des classes qui
ont des membres communs mais pas tous ?

Solution : L’héritage
L’héritage permettant de réutiliser des classes déjà existantes, appelées super-classes
afin de créer des classes plus spécialisées, appelées sous-classes.

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 3 / 14


L’héritage La relation « est un »

p Pour déterminer si une classe B hérite d’une classe A, il suffit de savoir s’il existe
une relation est un entre B et A. Si tel est le cas, la syntaxe de déclaration est la
suivante :
.
class B extends A {
. // attributs et méthodes de la classe B
. }

Exemple : classe Cercle est un Point


class Cercle extends Point {
double r ;
double surface(){return (Math.PI*r*r) ;}
}

p Dans ce cas, on dit que :


å Point est une super-classe (classe de base), déclare les membres et
commune peut avoir plusieurs sous-classes.
å Cercle est une sous-classe(classe dérivée) de Point, posséde uniquement
une super-classe et hérite les membres de la super-classe (sauf les
constructeurs).
ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 4 / 14
L’héritage Un cercle « est un » point géométrique

p Les membres de la classe Point restent disponibles pour la classe Cercle afin
d’éviter la duplication de code.
p Pour appeler un membre défini dans la classe Point, la solution consiste à utiliser le
terme super.membre
Exemple :
class Point {
. int x, y ;
. void deplacer(int dx, int dy){x += dx ; y += dy ;}
. void afficher(){System.out.print("Je suis en"+x+" "+y) ;}
}
class Cercle extends Point{
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 5 / 14
L’héritage Le constructeur d’une classe héritée

p La 1ère instruction d’un constructeur de la sous-classe est :


1 soit un appel à un autre constructeur de la même classe this(args).
2 soit un appel au constructeur de la super-classe super(args).
p Le compilateur choisit le constructeur en fonction des arguments.

Exemple :
class Point {
. int x,y ;
. Point(int x0, int y0){x = x0 ;y = y0 ;}
. ...
}
class Cercle extends Point{
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 6 / 14


L’héritage Le constructeur d’une classe héritée

p Si la première instruction n’appelle ni le constructeur de la super-classe, ni un autre


constructeur de sous-classe.
å Alors le compilateur insère de lui-même au début de chaque constructeur de la
sous-classe un appel de super() de la super-classe.
å Ce fonctionnement pose un problème lorsqu’il n’existe pas de constructeur par
défaut.
p Il est préférable toujours de définir explicitement un constructeur sans paramètre dans la
classe de base.
p Erreur si l’appel vient plus tard ou 2 fois.

Exemple :
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 7 / 14


L’héritage La protection des attributs hérités

p Lorsqu’un attribut de la classe de base est déclaré en mode private, la classe


dérivée ne peut ni consulter ni modifier directement cet attribut hérité. L’accès
ne peut se réaliser qu’au travers des méthodes de la classe de base.
å En effet, héritage n’est pas synonyme d’accessibilité.
p Lorsqu’un attribut de la classe de base est déclaré en mode protected, ces attributs
ne sont accessibles que dans cette classe et dans les sous-classes de cette classe.

Exemple :
class Point{
private int x ;
protected int y ;
public int getX(){return x ;}
}
class Cercle extends Point{
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 8 / 14


L’héritage Les conversions explicites de références

p La relation d’héritage permet de traiter les objets des sous-classes comme s’ils
étaient des objets de leur classe parente.

Exemple :
Cercle c1 = new Cercle(...) ;
Point p1 = c1 ; // Ok, un cercle est un point
Cercle c2 = p1 ; // Erreurr, un point n’est pas forcément un cercle !
Cercle c3 = (Cercle)p1 ; // Ok, p1 référence effectivement un cercle

p Si nécessaire, le système effectue donc une conversion automatique de la


sous-classe vers la classe parente (upcasting).
p Une conversion explicite d’un objet de la classe parente vers un objet de la
sous-classe (downcasting) est possible si l’instance à convertir référence
effectivement (au moment de l’exécution) un objet de la sous-classe considérée
(sinon, il y aura une erreur ClassCastException à l’exécution).

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 9 / 14


L’héritage Le polymorphisme

p Le polymorphisme se fonde sur la redéfinition des méthodes et découle


directement de l’héritage.
p Par polymorphisme, il faut avoir (au moins) deux méthodes de même signature
mais leur contenu est différent, définies l’une dans la classe de base, l’autre dans la
classe dérivée.
Exemple :
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

p Le polymorphisme veut dire que la même méthode peut avoir un comportement


différent suivant l’objet sur lequel elle est appliquée.
ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 10 / 14
L’héritage Le polymorphisme

p Au moment de la compilation, le compilateur ne sait pas si c’est la méthode


afficher() de la classe Point ou celle de la classe Cercle qui sera lancée.
à Autrement dit, la liaison entre l’identificateur afficher et le code à lancer est
déterminé à l’exécution du programme : la liaison est dynamique.
p On utilise le polymorphisme à l’aide d’une référence d’objet de classe de base.
p La méthode appelée ne dépend que du type réel de l’objet et non du type déclaré.

Exemple :
public class TestPointsCercles {
. public static void main(String [] arg) {
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 11 / 14


L’héritage Le polymorphisme

Exemple :
class Point {
. int x,y ;
. Point(int x, int y){this.x = x ;this.y = y ;}
. void afficher(){
. this.identifie() ;
. System.out.print("Je suis en "+x+" "+y) ;
. }
. void identifie(){System.out.print("Je suis un point") ;}
. }
class Cercle extends Point {
. double r ;
. Cercle(int a, int b, doublr r) {super(a,b) ; this.r=r ;}
. void afficher(){
. super.afficher() ;
. System.out.print(" et mon rayon est :"+r) ;
. }
. void identifie(){System.out.print("Je suis un cercle ") ;}
. }
public class TestPolymorphisme {
. public static void main (String[] args){
. Point p1 = new Point(5,4) ;p1.afficher() ;//Affiche Je suis un point Je suis en 5 4
. Point p2 = new Cercle(3,5,2.5) ; p2.afficher() ;//Affiche Je suis un cercle Je suis en 3 5
.} . et mon rayon est :2.5
}
ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 12 / 14
L’héritage Classes et méthodes finales

p Le modificateur final permet de bloquer l’extension d’une classe.


Exemple
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

p Une méthode déclarée final ne peut pas être redéfinie dans une classe dérivée.
Exemple
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 13 / 14


L’héritage Surcharge vs. polymorphisme

p Il ne faut pas confondre les notions de surcharge et polymorphisme qui ont


finalement peu de point commun.
p Voici un tableau qui résume les différences :
Surcharge Polymorphisme
Héritage nul besoin nécessite une arborescence de classes
Signature des méthodes doivent différer doivent être les mêmes
résolu à la compilation l’exécution

ISMAILI ALAOUI El Mehdi Programmation orientée objet en Java Filière: SMI-S5 14 / 14

Vous aimerez peut-être aussi