Académique Documents
Professionnel Documents
Culture Documents
JAVA
Dr Fatou KAMARA-SANGARE
UFR de Sciences Appliquées et de Technologie
Université Gaston Berger de Saint-Louis
Chapitre 1II
Mise en œuvre de l’héritage en java
Héritage
Rappels
L’héritage est un mécanisme de transmission des propriétés d’une classe vers une
classe.
L’héritage implique une classe de base et une classe dérivée. La classe dérivée hérite
de la classe de base et apporte ses propres spécificités.
Héritage=définir une classe dérivée (nouvelle classe) d’une classe de base (classe
existante).
Héritage
Avantages
L’héritage est un mécanisme de partage de code qui permet de :
▪ éviter la duplication de code ;
▪ réutiliser du code dans un autre contexte ;
▪ faciliter la maintenance des programmes.
class Livre extends Document {private String auteur; private int nombreDePages;}
class Dictionnaire extends Document { private String langue ; private int nombreDArticles;}
Le mot clé extends est uitilisé pour signaler au compilateur que les classes Livre et
Dictionnaire dérivent de la classe Document.
classe nom_classefille extends nom_classemere {}
Héritage
Constructeur d’une classe dérivée
Pour initialiser les attributs hérités, un constructeur d’une classe dérivée peut invoquer
un des constructeurs de la classe mère en utilisant le mot-clé super.
class Document {
protected String titre;
protected int numeroEnregistrement;public
Document(int numeroEnregistrement, String titre) {
this.numeroEnregistrement = numeroEnregistrement;
this.titre = titre;}}
Héritage
Constructeur d’une classe dérivée
class Livre extends Document {
private String auteur;
private int nombreDePages;
public Livre(int numeroEnregistrement, String titre, String auteur, int nombreDePages)
{// appel au constructeur de la classe de base
super(numeroEnregistrement, titre);
this.auteur = auteur;
this.nombreDePages = nombreDePages;}}
Une classe dérivée n’accède pas aux attributs privés de sa classe de base. Il faut utiliser les getters
et setters (getNomAttribut et setNomAttribut).
Dans le cas d’un héritage de plusieurs niveaux, l’accès des membres des classes mères se fait à un
niveau supérieur. L’instruction suivante est incorrecte : super.super.m() ;
Autrement dit, l’appel par super ne concerne que le constructeur de la classe de base de niveau
immédiatement supérieur (vu qu’une classe peut dériver d’une classe qui aussi dérive d’une autre
Héritage
Mot clé super
Possibilité d’appeler dans un constructeur un autre constructeur de la même classe, en utilisant
le mot clé this comme nom de méthode comme première instruction du constructeur appelant.
Possibilité d’appeler un constructeur mère en utilisant le mot clé super comme méthode. Cet
appel doit correspondre à la première instruction du constructeur.
Autrement dit, dans un constructeur d’une classe dérivée, il n’est pas possible d’appeler en même
temps un constructeur de la même classe et un constructeur d’une classe de base.
Exemple
this vs super
this super
fait référence à l’objet courant fait référence à la classe parente
invoque un constructeur de la même classe fait appel à un constructeur de la classe de base
différencie les attributs d’une classe des permet à une classe dérivée d’accéder aux
variables locales (des arguments, variables attributs et méthodes de sa classe mère
locales utilisés dans une méthode
Héritage
Redéfinition d’une méthode
La signature d’une méthode est l’ensemble composé de :
▪ du nom de la méthode
▪ types des paramètres
Elle permet d’identifier de manière unique une méthode dans une classe.
Pour redéfinir :
1. la méthode est définie dans une classe de base ;
2. une nouvelle définition de la méthode est proposée dans la classe dérivée ;
3. La signature de la méthode définie dans la classe dérivée est identique à celle
définie dans la classe de base.
Héritage
Redéfinition d’une méthode
Ajoutez une méthode description(), définie dans la classe Document et redéfinie dans
les classes Livre et Dictionnaire qui renvoie une chaîne de caractères qui est affiche la
fiche d'un document.
class Document {
protected String titre; protected int numeroEnregistrement;
public Document(int numeroEnregistrement, String titre) {
this.numeroEnregistrement = numeroEnregistrement;
this.titre = titre;}
//redéfinition de la méthode toString de la classe object
public String toString()
{return "titre : "+titre+"\n"+"numéro d'enregistre : "+numeroEnregistrement;}
public void description(){System.out.println(toString());}}
Héritage
Redéfinition d’une méthode
class Livre extends Document {
private String auteur;
private int nombreDePages;
public Livre(int numeroEnregistrement, String titre, String auteur, int nombreDePages) {
// appel au constructeur de la classe de base
super(numeroEnregistrement, titre);
this.auteur = auteur;
this.nombreDePages = nombreDePages;}
Remarques
▪ Une classe définie avec le mot clé final ne peut pas disposer de sous-classe
▪ Une méthode déclarée finale ne peut être redéfinies dans les sous-classes
▪ Une méthode de classe (static) ne peut pas être redéfinie dans une classe
dérivée.
Polymorphisme
Définition
En programmation Objet, on appelle polymorphisme le fait que :
▪ un objet d’une classe puisse être manipulé comme s’il appartenait à une
autre classe ;
Document
titre
numeroEnregistrement
afficher
description
Livre Dictionnaire
auteur langue
nombredePages NombreDeArticles
afficher afficher
description description
Roman
PrixLittéraire
afficher
description
Polymorphisme
Définition
Le type dynamique d’un objet est le type de l’objet instancié (type réel).
Choix de la méthode : liaison dynamique
Liaison dynamique ≈ répond à la question: «quel code est exécuté ?»
La méthode définie pour le type réel de l’objet recevant le message est appelée
et non pas celle définie pour son type déclaré.
A la compilation :
▪ seules des vérifications statiques qui se basent sur le type déclaré de
l’objet (de la référence) sont effectuées.
Document
titre
numeroEnregistrement
afficher
description
Livre Dictionnaire
auteur langue
nombredePages NombreDeArticles
afficher afficher
description description
Roman
PrixLittéraire
afficher
description
Choix de la méthode : liaison dynamique
Roman unRoman=new Roman(arg)
Roman.afficher()
Le principe de l’exécution est la suivante
Si la méthode afficher existe dans la classe Roman alors
Elle est exécutée
Sinon
la méthode est rechercher dans sa classe de base
La méthode existe dans les quatre classes , alors la méthode définie dans la classe
Roman sera exécutée
La méthode est définie dans les classes Document,, Livre et Dictionnaire, alors la
méthode afficher de la classe Livre sera exécutée
La méthode est définie dans les classes Document et Dictionnaire, alors la méthode
de la classe Document sera exécutée
Polymorphisme
La méthode description a quatre codes différents. En d’autres termes description a plusieurs
formes de codes différents : c’est le polymorphisme.
▪ Une méthode abstraite ne doit pas être déclarée final car elle doit
être redéfinie dans une sous-classe.
On définit une classe abstraite en Java en utilisant le mot clé abstract devant le nom de la classe
Exemple
Une forme géométrique dans le plan peut être un cercle, un rectangle,
etc. Une forme géométrique peut être évaluée en fonction de son
périmètre et de sa surface. Un cercle est identifié par son centre et son
rayon. Un rectangle par sa largeur et sa longueur. Le rayon d’un cercle
est la distante du centre et d’un point du cercle
//Définition du constructeur
Rectangle(int largeur, int longueur) {super(largeur,longueur);}
//Définition du constructeur
public Cercle(Point p, Point q) {super(p, q);}
interface NomDeLinterface {
//déclaration de constantes
Interface =classe
Toutes les méthodes
sont abstraites
//Définition du constructeur
public UnCercle(Point centre, double rayon) {
this.centre = new Point (centre.getX(),centre.getY());
this.rayon = rayon;}
//Définition du constructeur
public UnRectangle(double largeur, double longueur) {
this.largeur = largeur; this.longueur = longueur;}