Académique Documents
Professionnel Documents
Culture Documents
Chapitre 4 : Héritage
1
Programmation orientée objet Mme Eya cheikh
Introduction
L’héritage constitue l’une des bases de la programmation orientée objet. En particulier il est à
la base des possibilités de réutilisation de composants logiciels.
Prenons ce cas : une application a besoin de services dont une partie seulement est proposée par
une classe déjà définie (classe dont on ne possède pas nécessairement la source) sans devoir
réécrire le code.
La solution en POO c’est l’héritage c’est à dire définir une nouvelle classe à partir de la classe
déjà existante.
I. L’héritage
1.1 Définition
L’héritage permet de définir de nouvelles classes dites dérivées ou filles ou sous-classes à partir
d’une ou de plusieurs classes existantes dites de base ou mères ou super-classes.
La classe dérivée héritera des potentialités de la classe de base tout en lui ajoutant de nouvelles
possibilités.
Donc même si une classe ne répond pas totalement à nos besoins, nous pouvons profiter de cette
classe et ceci en créant une nouvelle classe qui va hériter de la classe existante et lui ajouter
d’autres propriétés et d’autres opérations.
2
Programmation orientée objet Mme Eya cheikh
Classe de base
Classe dérivée
1.2 Syntaxe
La syntaxe de l’héritage est la suivante :
// La Super-classe // La Sous-classe
class A class B extends A
{// membres de la classe A {// membres de la classe B
} }
Exemple
Prenons l’exemple de la classe Client qui hérite de la classe Personne et à laquelle est ajouté
l’attribut type et les accesseurs correspondants.
Personne
Client
3
Programmation orientée objet Mme Eya cheikh
class Personne {
…………..
}
Remarque
Une classe fille dérive d'une unique classe mère, l'héritage multiple n'étant pas supporté par le
langage Java. On verra par la suite un moyen de simuler l’héritage multiple par le concept
d’interface.
4
Programmation orientée objet Mme Eya cheikh
Règle 2 : Si on invoque super( ), cela signifie que le constructeur en cours d'exécution passe
la main au constructeur de la classe mère pour commencer à initialiser les attributs définis dans
cette dernière. Ensuite le premier constructeur continue son exécution.
Règle 3 : Si on invoque this(), le constructeur considéré passe la main à un autre constructeur
de la classe considérée. Encore une fois, cela doit être la première instruction du bloc.
3.2 Exemples
fichier "Classe1.java" fichier "Classe2.java"
class Classe1 {
Classe1(){ class Classe2 extends Classe1 {
System.out.println("Classe1"); Classe2(){
} super(5);
System.out.println("Classe2"); }
Classe1(int val){ Classe2(int val){
this(); System.out.println(val); }}
System.out.println(val); }}
Exemple de création d'objet Résultats
new Classe1(); Classe1
Classe1
new Classe1(3);
3
Classe1
new Classe2(); 5
Classe2
Classe1
new Classe2(2);
2
5
Programmation orientée objet Mme Eya cheikh
son tour, invoque le constructeur de sa classe de base et ainsi de suite. Cette cascade d’appels
s’arrête évidemment lorsqu’on atteint le constructeur de la classe Object.
6
Programmation orientée objet Mme Eya cheikh
III. Redéfinition
3.1 Redéfinition des attributs
Les attributs déclarés dans la classe dérivée sont toujours des attributs supplémentaires.
Si l’on définit un attribut ayant le même nom qu’un attribut de la classe de base, il existera alors
deux attributs de même nom. Le nom de l’attribut désignera celui déclaré dans la classe dérivée.
Pour avoir accès à celui de la classe de base, il faudra changer le type de la référence pointant
sur l’objet, ou utiliser super.
Exemple
class A {
public int i;
}
class B extends A {
public int i;
public void uneMethode() {
i = 0; // attribut défini dans la classe B
7
Programmation orientée objet Mme Eya cheikh
8
Programmation orientée objet Mme Eya cheikh
y = b;
}
void affiche() {
System.out.print("(" + x + "," + y + ")");
}
}
class pixel extends point {
private String couleur;
public pixel(int a, int b, String c) {
super(a, b);
couleur = c;
}
void affiche() {
System.out.print("[");
super.affiche();
System.out.print(":" + couleur+"]");
}
public static void main(String[] argv) {
point p = new point(2, 3);
pixel px = new pixel(4, 5, "rouge");
p.affiche();
System.out.println();
px.affiche();
}
}
Exécution
(2,3)
[(4,5):rouge]
Remarques
Pour avoir accès à une méthode redéfinie de la classe de base, il faudra utiliser le mot
clé super.
9
Programmation orientée objet Mme Eya cheikh
Une méthode static peut aussi être redéfinie par une autre méthode static (mais pas
par une méthode non static).
10
Programmation orientée objet Mme Eya cheikh
V. La classe Object
6.1 Définition
La classe Object est la racine de l'ensemble de la hiérarchie de classes Java. Elle est directement
ou indirectement présente dans la hiérarchie de toute classe d’une application. Les méthodes
définies dans la classe Object sont donc disponibles pour n’importe quelle classe.
11
Programmation orientée objet Mme Eya cheikh
Class c;
c = o.getClass();
System.out.println(" Le nom de la classe : " + c.getName());
System.out.println(" Elle est dans le package : "
+ c.getPackage().getName());
System.out.println(" Elle hérite de la classe :"
+ c.getSuperclass().getName());
System.out.println(" Elle possède les attributs :");
for (int i = 0; i < c.getFields().length; i++) {
System.out.println("\t" + c.getFields()[i].getName());
System.out.println(" de type:"
+ c.getFields()[i].getType().getName());
}
System.out.println(" Elle possède les méthodes :");
for (int i = 0; i < c.getMethods().length; i++) {
System.out.println("\t" + c.getMethods()[i].getName());
}
}
class Test {
public static void main (String[] args) {
Client c1, c2;
c1 = new Client("n1", "p1", "tunis", "Particulier");
Client.infoClass(c1);}
}
Voici le résultat obtenu :
Le nom de la classe : Ex2.Client
Elle est dans le package : Ex2
Elle hérite de la classe :Ex2.Personne
Elle possède les attributs :
12
Programmation orientée objet Mme Eya cheikh
Nom
de type:java.lang.String
Prenom
de type:java.lang.String
Elle possède les méthodes :
equals
getType
infoClass
setType
getNom
getPrenom
getAdresse
setNom
setPrenom
setAdresse
init_Personne
afficher_homme
wait
wait
wait
toString
hashCode
getClass
notify
notifyAll
13
Programmation orientée objet Mme Eya cheikh
Elle retourne true si les 2 références autreObjet et this désignent le même objet. Ce sont au
fait les hash-code des deux objets qui sont comparés.
Exemple
14
Programmation orientée objet Mme Eya cheikh
Cette méthode à l’inverse de la méthode getClass doit pratiquement être redéfinie. Elle
permet d’obtenir la représentation d’un objet sous forme d’une chaîne de caractères. Par
défaut l’implémentation de cette méthode dans la classe Object renvoie le nom de la classe
suivi du hashcode de l’instance.
Exemple
Client c1 = new Client("n1", "p1", "tunis", "Particulier");
System.out.println(c1.toString());
Remarque :
L’appel de la méthode toString est parfois implicite lorsque l’on passe un objet comme
paramètre à une méthode. Les deux syntaxes suivantes sont donc équivalentes :
Client c1 ;
c1 = new Client("n1", "p1", "tunis", "Particulier");
System.out.println(c1.toString());
// ou bien
System.out.println(c1);
15
Programmation orientée objet Mme Eya cheikh
QCM
1. Le langage Java ne supporte pas :
o Le polymorphisme
o L'héritage multiple
o L'encapsulation
o oui
o non
4. Avec quel mot clé peut-on accéder aux méthodes d'une classe mère lorsque nous créons
classe héritée ?
o this
o super
o hyper
5. Les méthodes et propriétés private d'une classe mère ne sont pas accessibles dans la
classe
fille.
o oui
o non
16
Programmation orientée objet Mme Eya cheikh
o Orpheline
o String
o Object
7. Qu'est-ce qui ne va pas dans ce code (cette classe est héritée d'une classe nommée A)
?
class B {
public B(){
super();
}}
o Mauvaise utilisation de super();
public class A{
public A(){
System.out.println("1");
}
}
public class B extends A{ }
17
Programmation orientée objet Mme Eya cheikh
}
o Rien
o 1
o Erreur de compilation
9. Pour empêcher une classe d'être étendue, quel est le mot réservé que l'on utilise dans
la déclaration de classe ?
o transient
o final
o abstract
o native
10. Le code:
class A{int i=10; void f(){System.out.print(" i="+i);}}
{ C(String s){}}
class D extends C{
D(){}}
18
Programmation orientée objet Mme Eya cheikh
19