Héritage et Polymorphisme en Java - Cours POO

Telechargé par Moez Ben Rkaya
Cours POO (Java) - 31 - Amir Souissi © 2018
C
HAPITRE
4
HÉRITAGE ET POLYMORPHISME
Chapitre 4 Héritage et Polymorphisme
Cours POO (Java) - 32 - Amir Souissi © 2018
1. Relation d’héritage entre classes
Le concept de l’héritage spécifie une relation de spécialisation/généralisation entre les classes.
(Document : Livre, Revue, … | Personne : Etudiant, Emplo, …)
Lorsqu’une classe A hérite d’une classe B :
A possède toutes les caractéristiques de B et en plus ceux spécifiques à A
A est une spécialisation de B (A est un cas particulier)
B est une généralisation de A (B est un cas général)
A est appelée classe dérivée (fille ou sous-classe)
B est appelée classe de base (mère ou superclasse)
Tout objet instancié de A est considéré, aussi, comme un objet de type B
Un objet instancié de B n’est pas forcément un objet de type A.
Une classe peut hériter de plusieurs classes : héritage multiple
Une classe de base peut être héritée par plusieurs classes
L’héritage minimise l’écriture du code (par réutilisation) et favorise l’extension.
1.1. Héritage en Java
La classe Object est la classe mère de toutes les classes en Java (même sans l’indiquer).
Object comporte uniquement des méthodes et elle est définie dans le package java.lang de
l’API Java.
Tout objet est implicitement de type Object.
L’héritage multiple est interdit en Java (possible avec les interfaces).
Héritage Simple Héritage Multiple
En Java, l’héritage est une sorte d’extension des classes : on utilise « extends »
public class A extends B {
//La nouvelle classe A hérite de B
}
Personne
Enseignant
Etudiant
Enseignant Etudiant
Enseignant-Chercheur
Chapitre 4 Héritage et Polymorphisme
Cours POO (Java) - 33 - Amir Souissi © 2018
Une référence d’objet de type B peut référencer un objet de type A, mais l’inverse est
faux.
Exemple :
class B { …………… }
class A extends B {………………}
B b = new B() ;
A a = new A() ;
b=a; //correct
a=b; //incorrect
1.2. Constructeur de la classe dérivée
Le constructeur de la classe de base est appelé par le constructeur de la classe dérivée
lorsque ce dernier utilise super ( ).
Le nombre de paramètres dans super() identifie le constructeur à appeler dans la classe
mère.
L’instruction super() doit être la première dans le constructeur de la classe fille.
Si dans le constructeur de la classe dérivée, on ne fait pas appel à super (), alors Java
appelle implicitement le constructeur par défaut de la classe de base (implicite ou
explicite).
Exemple :
class Point {
private int abs, ord;
//deux attributs privées
public Point(int a, int b){
abs = a;
ord = b;
}
}
class PointColore extends Point {
private String couleur;
public PointColore (int a, int b, String c) {
super (a, b);
//appel au constructeur de la classe mère (public)
couleur = c;
System.out.println("abs et ord sont :" + super.abs + "et" + super.ord) ;
//Erreur, car abs et ord sont privés à la classe mère, donc invisible pour la classe fille.
}
}
Chapitre 4 Héritage et Polymorphisme
Cours POO (Java) - 34 - Amir Souissi © 2018
Lors de la construction d’une instance dérivée, les opérations de construction de la classe
mère sont successivement appelées.
PointColore pc = new PointColore (1,2,"noir");
//appel de consructeur de Point puis appel de Constructeur de PointColore
Remarques :
Si les deux classes mère et fille ne possèdent aucun constructeur, le constructeur par
défaut de la classe fille appelle le constructeur par défaut de la classe de base.
Si la classe fille ne possède pas de constructeur, alors le constructeur par défaut de la
classe fille cherche à appeler un constructeur par défaut (sans arguments) de la classe
mère. Si ce dernier n’existe pas alors on obtient une erreur de compilation.
1.3. Accès aux membres hérités par « protected »
Le modificateur d’accès protected peut être utilisé dans la classe de base.
Les attributs et méthodes déclarées protected dans la classe de base sont accessibles
(peuvent être utilisés) par les classes dérivées. Mais, cet accès reste interdit pour les autres
classes qui ne sont pas dérivées.
Exemple:
class Point {
protected int abs, ord;
//deux attributs protégés
public Point(int a, int b){
abs = a;
ord = b;
}
}
class PointColore extends Point {
private String couleur;
public PointColore (int a, int b, String c) {
super (a, b);
//appel au constructeur de la classe mère
couleur = c;
System.out.println("abs et ord sont :" + super.abs + "et" + super.ord) ;
//accès autorisé à abs et ord, ils sont accessibles par les méthodes des classes filles
}
}
Chapitre 4 Héritage et Polymorphisme
Cours POO (Java) - 35 - Amir Souissi © 2018
Remarques :
Lorsque les attributs abs et ord de la classe Point sont déclarés protégés, alors ils sont
considérés aussi des attributs de la classe PointColore. On peut alors les accéder aussi bien
par super que par this. ( super.abs ou this.abs donnent le même résultat)
Si on déclare un attribut abs dans PointColore alors dans ce cas, this.abs fait référence à
l’attribut de PointColore et super.abs fait référence à l’attribut de Point.
Exemple:
class Point {
...
protected void afficher(){
System.out.println(“abs = ” + abs + “ord = ” + ord);
}
}
class PointColore extends Point {
...
public void afficherCouleur(){
System.out.println(“couleur = ” + couleur);
}
}
...
public static void main(String args[]) {
PointColore pc = new PointColore (1, 2, “noir”);
pc.afficher() ;
//objet pc utilise afficher() de Point comme si c’était sa méthode
pc.afficherCouleur() ;
}
Dans cet exemple, l’affichage de tous les attributs d’un PointColore doit passer par l’appel de
la méthode afficher() de Point et afficherCouleur() de PointColore.
La méthode afficher() de Point est partiellement utile à PointColore. On pourra ajouter une
méthode void afficher() à la classe PointColore et ainsi ne plus utiliser celle de Point : on
appelle ça la redéfinition de méthode.
2. Redéfinition des méthodes héritées
Une méthode héritée peut être redéfinie si sa version initiale n’est pas satisfaisante pour la
classe dérivée.
La redéfinition consiste à conserver la signature de la méthode (même nom, même
nombre, type et position des paramètres, même type de retour) et à proposer un code
différent.
1 / 11 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!