Chapitre n3 POO

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

Professeur : Anasri Ahmed POO avec JAVA

Chapitre n°3
Héritage en Java

I) Généralités
L'héritage est le troisième des paradigmes de la programmation orientée objet (le 1er étant
l'encapsulation, le 2e la structure de classe).
L'emploi de l'héritage conduit à un style de programmation par raffinements successifs et permet
une programmation incrémentielle effective.
L'héritage peut être simple ou multiple (en java simple).
 L'héritage est mis en œuvre par la construction de classes dérivées.
 L’héritage une relation de spécialisation/généralisation.
 Les éléments spécialisés héritent de la structure et du comportement des éléments plus
généraux (propriétés, associations et autres héritages)
Exemple :

Par héritage d’Article, un livre a d’office un prix, une désignation et une opération acheter (), sans qu’il soit
nécessaire de le préciser.

Intérêt de l’héritage
vision descendante => la possibilité de reprendre intégralement tout ce qui a déjà été fait et de pouvoir
l'enrichir.
vision ascendante => la possibilité de regrouper en un seul endroit ce qui est commun à plusieurs.

1
Professeur : Anasri Ahmed POO avec JAVA

Chapitre n°3
II) Héritage en Java
class Livre extends Article {
...
}
Remarque : Le mot clé extends en Java n’a rien à voir avec le mot clé extends en UML, employé en
particulier dans les diagrammes de cas d’utilisation.
Exemple :

 Une classe B qui hérite d’une classe A est une sous-classe de A, et A est la super-classe de B.
 La classe java.lang.Object est la super-classe de toutes les classes Java, directement ou
indirectement

III) Conséquences pour les membres


Toutes les membres public et protected d'une classe parent sont accessibles à ses classes enfant. En

revanche, une classe parent ne peut accéder à ses classes enfant. Lorsque l'on définit une hiérarchie de

classes, on cherche donc à répartir les méthodes les plus générales sur les classes parent, et les méthodes

les plus spécialisées sur les classes enfant. Ce que l'on appelle "sous-classe" correspond en fait aux

classes possédant le plus de méthodes.

Si un attribut d'une classe enfant porte le même nom qu'un attribut d'une classe parent, alors l’attribut

enfant masque l’attribut parent. Par défaut, le code de la classe enfant accède à l’attribut enfant. En

revanche, le code de la classe parent accède à l’attribut de sa classe. Il est possible pour un code de la

classe enfant de lire l’attribut de la classe parent en utilisant le mot-clé super.

2
Professeur : Anasri Ahmed POO avec JAVA

Chapitre n°3

Exemple :

Accès aux attributs d'une super-classe

public class A { // déclarée dans le fichier A.java


protected String nom = "Je suis dans A" ;

public void uneMethode() {


System.out.println(nom) ; // imprime "Je suis dans A"
}
}

public class B extends A { // déclarée dans le fichier B.java


protected String nom = "Je suis dans B" ;

public void uneAutreMethode() {


System.out.println(nom) ; // imprime "Je suis dans B"
System.out.println(super.nom) ; // imprime "Je suis dans A"
}
}

Accès aux champs d'une super-classe

public class Main { // déclarée dans le fichier Main.java

public static void main(String... args) {


A a = new A() ; // la classe A est celle que nous venons de définir
B b = new B() ; // idem
A ba = b ; // cette déclaration est légale, car b est un élément de B,
// du fait que B étend A ;
// b et ba désignent le même objet
System.out.println("a.nom = " + a.nom) ;
System.out.println("b.nom = " + b.nom) ;
System.out.println("ba.nom = " + ba.nom) ;
}
}
Résultat :

> a.nom = Je suis dans A


> b.nom = Je suis dans B
> ba.nom = Je suis dans A

3
Professeur : Anasri Ahmed POO avec JAVA

Chapitre n°3
Constructeur
La classe dérivée doit prendre en charge la construction de la classe de base.
Pour construire un Avion, il faut construire d'abord un Véhicule ;
Le constructeur de la classe de base (Véhicule) est donc appelé avant le constructeur de la classe dérivée
(Avion).
Si un constructeur de la classe dérivée appelle explicitement un constructeur de la classe de base, cet appel
doit être obligatoirement la première instruction de constructeur. Il doit utiliser pour cela, le mot clé super
Exemple
class A { int i;
// Constructeur de la classe A
public A(int x){ i = x; } }
// Héritage
class B extends A { double z;
// Constructeur de la classe B
public B(int f, double w) {
// Appel explicite du constructeur de A et en 1 ère ligne.
super(f); z = w; } }
Lors de la construction de la classe dérivée, nous devons tenir compte de la présence du constructeur dans
la classe de base et/ou dans la classe dérivée.
Remarque :
1) La classe de base et la classe dérivée ont au moins un constructeur public, c’est le cas général. De ce fait,
le constructeur de la classe dérivée doit appeler le constructeur de la classe de base disponible.
2) La classe de base n’a aucun constructeur. La classe dérivée peut ne pas appeler explicitement le
constructeur de la classe de base. Si elle le fait, elle ne peut appeler que le constructeur par défaut, vu que
c’est le seul qui est disponible dans ce cas dans la classe de base.
3) La classe dérivée ne possède aucun constructeur. Dans ce cas, la classe de base doit avoir un
constructeur public sans argument (par défaut ou un explicite).
Droits d'accès
Les droits d'accès protègent les données et les méthodes, et réalisent aussi l'encapsulation.
Les droits d'accès sont accordés aux fonctions membres, ou aux fonctions globales.
L'unité de protection est la classe : tous les objets de la classe bénéficient de la même protection.
 un membre public est accessible à toutes les classes,
 un membre «rien» est accessible à toutes les classes du même paquetage,
 un membre private n'est accessible qu'aux fonctions membre de la classe.

4
Professeur : Anasri Ahmed POO avec JAVA

Si les membres de la classe de base sont :


Chapitre n°3
 public ou « rien » : les membres de la classe dérivée auront accès à ces membres (champs et
méthodes),
 private : les membres de la classe dérivée n'auront pas accès aux membres privés de la classe de
base.
En plus des 3 niveaux de protection (public, « rien » et private), il existe un 4 e niveau de protection :
protected. Un membre de la classe de base déclaré protected est accessible à ses classes dérivées ainsi
qu’aux classes du même paquetage.

IV) Phases d’initialisation d’un objet en héritage


Un objet de la classe de base A Un objet b de la classe dérivée B
allocation mémoire pour un objet du type A allocation mémoire pour un objet du type B (donc
A+B)
initialisation par défaut des champs initialisation par défaut des champs (A+B)
initialisation explicite des champs initialisation explicite des champs hérités de A
exécution des instructions du constructeur de A exécution des instructions du constructeur de A
initialisation explicite des champs hérités de B
exécution des instructions du constructeur de B

Redéfinition et surdéfinition des fonctions membres


Si la fonction affiche est membre de la classe de base A. Elle n'affiche que les membres privés de cette
classe. On ne peut donc pas afficher par un attribut propre de la classe dérivée B. Pour faire cela, nous
allons définir dans la classe dérivée B une fonction portant le même nom, et qui aura pour rôle d'afficher
les données privées de la classe dérivée B. On parle alors de redéfinition d'une fonction de la classe de base
A. Cette nouvelle méthode va masquer la présence de la méthode héritée.

En résumé :

Surdéfinition (surcharger) Redéfinition


Consiste à cumuler plusieurs méthodes ayant le Consiste à substituer une méthode par une autre.
même nom
même nom, mais signature différente et peu même nom, même signature, même type de retour.
importe le type de retour.
Remarque :
 Une méthode finale ne peut être redéfinie dans une classe dérivée.
 Une classe finale ne peut plus être dérivée.
 Un objet d'une classe dérivée peut toujours être utilisé au lieu d'un objet de sa classe de
base. Mais l'inverse n'est pas vrai.

Vous aimerez peut-être aussi