Vous êtes sur la page 1sur 11

POO HERITAGE

CHAPITRE 4 :

LHERITAGE
Objectifs spcifiques 1. 2. 3. 4. 5. Introduire la technique dhritage : intrt et notation Introduire les droits daccs dune classe drive aux membres de la classe de base Comprendre la construction dun objet driv Matriser la notion de redfinition Dcouvrir le concept de drivations multiples

Elments de contenu I. Lencapsulation II. Modificateurs de visibilit et accs III. Surcharge des mthodes Volume Horaire : Cours : 4 heures 30 Travaux Pratiques : 6 heures

4.1

Le principe de l'hritage

L'hritage est un mcanisme qui facilite la rutilisation du code et la gestion de son volution. Grce l'hritage, les objets d'une classe ont accs aux donnes et aux mthodes de la classe parent et peuvent les tendre. Les sous classes peuvent redfinir les variables et les mthodes hrites. Pour les variables, il suffit de les redclarer sous le mme nom avec un type diffrent. Les mthodes sont redfinies avec le mme nom, les mmes types et le mme nombre d'arguments, sinon il s'agit d'une surcharge. L'hritage successif de classes permet de dfinir une hirarchie de classe qui ce compose de super classes et de sous classes. Une classe qui hrite d'une autre est une sous classe et celle dont elle hrite est une super_classe. Une classe peut avoir plusieurs sous classes. Une classe ne peut avoir qu'une seule classe mre : il n'y a pas d'hritage multiple en java.

Object est la classe parente de toutes les classes en java. Toutes les variables et mthodes contenues
dans Object sont accessibles partir de n'importe quelle classe car par hritage successif toutes les classes hritent d'Object.

4.2

Syntaxe

Mlle I.SGHAIER

38

POO HERITAGE

class Fille extends Mere { ... } On utilise le mot cl extends pour indiquer qu'une classe hrite d'une autre. En l'absence de ce mot rserv associ une classe, le compilateur considre la classe Object comme classe parent. Exemple
//Classe de base class graphique { private int x, y; graphique (int x, int y) {this.x = x ; this.y = y ;} void affiche () { System.out.println (`` Le centre de lobjet se trouve dans : + x + et + y) ;} double surface () {return (0) ;} } // fin de la classe graphique //Classe drive1 class Cercle extends graphique { private double rayon =1 ; void affiche () { Sustem.out.println ( Cest un cercle de rayon + rayon) ; Super.affiche () ;} double surface () {return (rayon * 2* 3.14) ;} } //Classe drive2 class Rectangle extends graphique { private int larg, longueur ; Rectangle ( int x, int y, int l1, int l2) {super (x,y) ; longueur = l1 ; larg = l2 ;} double surface () {return (longueur*largeur) ;} }// fin de la classe Rectangle //Classe drive3 class carr extends graphique { private double ct ; Carr (double c, int x, int y) { Super ( x,y) ; Ct = c ;} Double surface () {return (ct * ct) ;} }// fin de la classe carr

Interprtation
1. Dans cet exemple, la classe Cercle hrite de la classe graphique les attributs et les mthodes, redfinit les deux mthodes surface et affiche et ajoute lattribut rayon.

Mlle I.SGHAIER

39

POO HERITAGE

2. La classe Rectangle redfinit la mthode surface et ajoute les attributs longueur et larg 3. La classe carr ajoute lattribut ct et redfinit la mthode surface. Remarques Le concept dhritage permet la classe drive de : 1. Hriter les attributs et les mthodes de la classe de base. 2. Ajouter ses propres dfinitions des attributs et des mthodes. 3. Redfinir et surcharger une ou plusieurs mthodes hrites. 4. Tout objet peut tre vu comme instance de sa classe et de toutes les classes drives. 5. Toute classe en Java drive de la classe Object. 6. Toute classe en Java peut hriter directement dune seule classe de base. Il ny a pas la notion dhritage multiple en Java, mais il peut tre implment via dautres moyens tels que les interfaces (Chapitre suivant). Pour invoquer une mthode d'une classe parent, il suffit d'indiquer la mthode prfixe par super. Pour appeler le constructeur de la classe parent il suffit d'crire super(paramtres) avec les paramtres adquats. Le lien entre une classe fille et une classe parent est gr par le langage : une volution des rgles de gestion de la classe parent conduit modifier automatiquement la classe fille ds que cette dernire est recompile. En java, il est obligatoire dans un constructeur d'une classe fille de faire appel explicitement ou implicitement au constructeur de la classe mre.

4.3

L'accs aux proprits hrites

Les variables et mthodes dfinies avec le modificateur d'accs public restent publiques travers l'hritage et toutes les autres classes. Une variable d'instance dfinie avec le modificateur private est bien hrite mais elle n'est pas accessible directement, elle peut ltre via les mthodes hrites. Si l'on veut conserver pour une variable d'instance une protection semblable celle assure par le modificateur private, il faut utiliser le modificateur protected. La variable ainsi dfinie sera hrit dans toutes les classes descendantes qui pourront y accder librement mais ne sera pas accessible hors de ces classes directement. Exemple1 : La classe drive et la classe de base sont dans le mme package package Formes_geo ; class graphiques { private x, y ; public String couleur ;
void affiche () {

System.out.println ( Le centre de lobjet = ( + x + , + y + ) ) ; } double surface ( ) {return (0) ;} } //fin de la classe graphiques

Mlle I.SGHAIER

40

POO HERITAGE

package Formes_geo ; class cercle extends graphiques{ double rayon ; void changer_centre ( int x1, int y1, double r) {x = x1 ; y = y1 ; // faux car x et y sont dclars private dans la classe de base rayon =r ; public double surface ( ) {return (rayon * 2* 3.14) ;} public void affichec () {affiche () ; // juste car le modificateur de visibilit de ce membre est freindly System.out.println ( Le rayon = + rayon + La couleur = + couleur ) ;} } Interprtation : Dans le premier cas, la classe drive est la classe de base sont dans le mme package, donc la classe cercle a pu accder aux membres (attributs et mthodes) publiques (lattribut couleur), de mme elle a pu accder aux membres freindly c'est--dire qui nont pas un modificateur de visibilit (la mthode affiche), mais elle na pas pu accder aux membres privs (x et y). Exemple 2 : La classe drive et la classe de base ne sont pas dans le mme package package Formes_geo ; class graphiques { private x, y ; public String couleur ;
void affiche () {

System.out.println ( Le centre de lobjet = ( + x + , + y + ) ) ; } double surface ( ) {return (0) ;} } //fin de la classe graphiques package FormesCirc ; class cercle extends graphiques{ double rayon ; void changer_centre ( int x1, int y1, double r) {x = x1 ; y = y1 ; // faux car x et y sont dclars private dans la classe de base rayon =r ; public double surface ( ) {return (rayon * 2* 3.14) ;} public void affichec () {affiche () ; // FAUX car le modificateur de visibilit de ce membre est freindly

Mlle I.SGHAIER

41

POO HERITAGE

System.out.println ( Le rayon = + rayon + La couleur = + couleur ) ;} } Interprtation : 7. Dans le deuxime cas, la classe drive est la classe de base ne sont pas dans le mme package, donc la classe cercle a pu accder aux membres (attributs et mthodes) publiques (lattribut couleur), mais, elle na pas pu accder aux membres freindly c'est--dire qui nont pas un modificateur de visibilit (la mthode affiche) et aux membres privs (x et y). Nous avons dj vu quil existe 3 types de modificateurs de visibilit publiques ( public ), privs (private) et de paquetage ou freindly (sans mention). Il existe encore un quatrime droit daccs dit protg (mot cl protected ).

4.4

Construction et initialisation des objets drivs

En java, le constructeur de la classe drive doit prendre en charge lintgralit de la construction de lobjet. Si un constructeur dune classe drive appelle un constructeur dune classe de base, il doit obligatoirement sagir de la premire instruction du constructeur. Le constructeur de la classe de base est dsign par le mot cl super . Exemple
class graphiques { private x, y ; public graphiques (int x1, int y1) {x = x1 ; y=y1 ;} //autres mthodes } class cercle extends graphiques{ private double rayon ; cercle ( int a, int b, double r) { super (a, b) ; //appelle le constructeur de la classe de base rayon = r ; } //autres mthodes }

Remarque Dans le cas gnral, une classe de base et une classe drive possdent chacune au moins un constructeur. Le constructeur de la classe drive complte la construction de lobjet driv, et ce, en appelant en premier lieu le constructeur de la classe de base. Toutefois, il existe des cas particuliers qui sont : cas1 : La classe de base ne possde aucun constructeur

Mlle I.SGHAIER

42

POO HERITAGE

Dans ce cas, si la classe drive veut dfinir son propre constructeur, elle peut optionnellement appeler dans la 1re instruction de constructeur la clause super () pour dsigner le constructeur par dfaut de la classe de base. Cas2 : La classe drive ne possde pas un constructeur Dans ce cas, le constructeur par dfaut de la classe drive doit initialiser les attributs de la classe drive et appeler : Exemple1 (cas1)
Class A { // pas de constructeur } class B extends A { public B(.) {super() ; //appel de constructeur par dfaut de A } B b = new B(); // Appel de constructeur1 de A

Le constructeur par dfaut de la classe de base si elle ne possde constructeur. Le constructeur sans argument si elle possde au moins un constructeur.

aucun

Dans le cas o il n y a pas un constructeur sans argument et il y a dautres constructeurs avec arguments, le compilateur gnre des erreurs.

Exemple2 (cas2)
Class A { public A() {.} //constructeur1 public A ( int n) {..} //constructeur2 } class B extends A { // ..pas de constructeur } B b = new B(); // Appel de constructeur1 de A

Exemple3 (cas 2)
Class A { public A ( int n) {..} //constructeur1 } class B extends A { // ..pas de constructeur }

Mlle I.SGHAIER

43

POO HERITAGE

B b = new B(); /* On obtient une erreur de compilation car A ne dispose pas un constructeurs sans argument et possde un autre constructeur*/

Exemple4 (cas1 et 2)
Class A { //pas de constructeurs } class B extends A { //pas de constructeurs } B b = new B (); // Appel de constructeur par dfaut de B qui Appelle le constructeur par //dfaut de A.

4.5

Drivations successives

Dune mme classe peuvent tre drives plusieurs classes diffrentes. Les notions de classe de base et de classe drive sont relatives puisquune classe drive peut, son tour servir de base pour une autre classe. Autrement dit, on peut rencontrer des situations telles que

La classe Caniche est une classe descendante directement de la classe Chien et une classe descendante de Animal La notion de lhritage multiple nexiste pas directement en Java, mais elle peut tre implmente via la notion des interfaces

4.6

Redfinition et surcharge de membres

Mlle I.SGHAIER

44

POO HERITAGE

Nous avons dj tudi la notion de surcharge (surdfinition) de mthode lintrieur dune mme classe. Nous avons vu quelle correspondait des mthodes de mme nom, mais de signatures diffrentes. Nous montrerons ici comment cette notion se gnralise dans le cadre de lhritage : une classe drive pourra son tour surcharger une mthode dune classe ascendante. Bien entendu, la ou les nouvelles mthodes ne deviendront utilisables que par la classe drive ou ses descendantes, mais pas par ses ascendantes. De mme une classe drive peut fournir une nouvelle dfinition dune mthode de mme nom et aussi de mme signature et de mme type de retour. =>Alors que la surcharge cumule plusieurs mthodes de mme nom, la redfinition substitue une mthode une autre.

4.6.1

Redfinition dune mthode

La redfinition d'une mthode hrite doit imprativement conserver la dclaration de la mthode parent (type et nombre de paramtres, la valeur de retour et les exceptions propages doivent tre identiques) et fournir dans une sous-classe une nouvelle implmentation de la mthode. Cette nouvelle implmentation masque alors compltement celle de la super-classe. Si la signature de la mthode change, ce n'est plus une redfinition mais une surcharge. Remarques La re-dclaration doit tre strictement identique celle de la super-classe : mme nom, mme paramtres et mme type de retour. Grce au mot-cl super, la mthode redfinie dans la sous-classe peut rutiliser du code crit dans la mthode de la super-classe, qui nest plus visible autrement. Exemple //Super-classe class graphiques { private x, y ; public String couleur ; public void affiche () { System.out.println ( Le centre de lobjet = ( + x + , + y + ) ) ; } double surface ( ) {return (0) ;} } //fin de la classe graphiques //classe drive class cercle extends graphiques{ double rayon ; public double surface ( ) { return (rayon * 2* 3.14) ;} //redfinition de surface public void affiche () //redfinition de la mthode affiche {super.affiche () ; // appel de affiche de la super-classe

Mlle I.SGHAIER

45

POO HERITAGE

System.out.println ( Le rayon = + rayon + La couleur = + couleur ) ;} }

4.6.2

Redfinition de mthode et drivations successives

Soit larborescence suivante : La prsence dun astrisque (*) signale la dfinition ou la redfinition dune mthode f

A* B C*

D*
Classe A : Mthode f de A Classe B : Mthode f de A Classe C : Mthode f de C Classe D : Mthode f de D Classe E : Mthode f de A Classe F : Mthode f de C

Lappel de la fonction f conduira pour chaque classe lappel de la mthode indique :

4.6.3

Surcharge des mthodes

En Java, une mthode drive peut surcharger une mthode dune classe ascendante Exemple Class A {public void f (int n) {..} } Class B extends A {public void f (float n) {..} } Aa,Bb; int n; float x; a.f(n) // appelle f(int) de A a.f(x) // Erreur, on a pas dans A f(float) b.f(n) // appelle f(int) de A

Mlle I.SGHAIER

46

POO HERITAGE

b.f(x) // appelle f(float) de B

4.6.4

Utilisation simultane de surcharge et de redfinition


Class A {public void f (int n) {..} public void f (float n) {..} } Class B extends A {public void f (int mthode f( int ) de A public void f (double n) {..} // Surcharge de la mthode f de A et de B } Aa,Bb; int n , float x, double y ; a.f(n) ;//Appel de f(int) de A a.f(x) ;//Appel de f(float) de A a.f(y) ; //Erreur, il n y a pas f(double) dans A b.f(n) ; //Appel de f(int) de B car f(int) est redfinie dans B a.f(x) ;//Appel de f(float) de A a.f(y) ;//Appel de f(double) de B n) {..} // redefinition de la

4.6.3

Rgles gnrales de redfinition

- Si une mthode dune classe drive a la mme signature qune mthode dune classe ascendante : Les 2 mthodes doivent avoir le mme type de retour. Le droit daccs de la mthode de la classe drive ne doit pas tre moins lev que celui de la classe ascendante. - Une mthode statique ne peut pas tre redfinie.

4.7 Autres mots cls final et super Le mot cl super


- Le mot cl super peut tre utilis pour : * appeler un constructeur de la classe de base dans le constructeur de la classe drive. Cet appel doit tre la 1re instruction dans le constructeur de la classe drive. Syntaxe : super (<liste des arguments>).

Mlle I.SGHAIER

47

POO HERITAGE

* Accder dans une mthode dune classe drive une mthode de la super-classe (optionnel sauf dans le cas de redfinition) Syntaxe : super.nom_mthode (<liste des arguments>) ; *Accder dans une mthode drive un attribut de la classe de base (optionnel) Syntaxe : super.nom_attribut

Le modificateur final
Cas1 : Le modificateur final plac devant une classe interdit sa drivation Exemple final class A { //Mthodes et attributs } class B extends A //Erreur car la classe A est dclare finale {//....} Cas 2 : Le modificateur final plac devant une mthode permet dinterdire sa redfinition Class A { final Public void f(int x) {..} //Autres mthodes et attributs } Class B { //Autres mthodes et attributs public void f (int x) {} // Erreur car la mthode f est dclare finale. Pas de redfinition } Les classes et les mthodes peuvent tre dclares finales pour des raisons de scurit pour garantir que leur comportement ne soit modifi par une sous-classe.

4.8 Des conseils sur l'hritage


Lors de la cration d'une classe mre il faut tenir compte des points suivants : la dfinition des accs aux variables d'instances, trs souvent prives, doit tre rflchie entre protected et private ; pour empcher la redfinition d'une mthode (surcharge) il faut la dclarer avec le modificateur final. Lors de la cration d'une classe fille, pour chaque mthode hrite qui n'est pas final, il faut envisager les cas suivant : la mthode hrite convient la classe fille : on ne doit pas la redfinir ; la mthode hrite convient mais partiellement du fait de la spcialisation apporte par la classe fille : il faut la redfinir voir la surcharger. La plupart du temps une redfinition commencera par appeler la mthode hrite (via super) pour garantir l'volution du code ; la mthode hrite ne convient pas : il faut redfinir ou surcharger la mthode sans appeler la mthode hrite lors de la redfinition.

Mlle I.SGHAIER

48