Vous êtes sur la page 1sur 29

Programmation Java

Licence professionnelle Informatique 2012/1013

Samira Haguouche

Le concept dhritage

Intrt de lhritage
Vision descendante => la possibilit de rutiliser

tout ce qui a dj t fait et de pouvoir l'enrichir.


Vision ascendante => la possibilit de regrouper

en un seul endroit ce qui est commun plusieurs.

Exemple dapplication de lhritage

Exemple dapplication de lhritage


class Point{ private int x, y ; public void initialise (int abs, int ord){ x = abs ; y = ord ; } public void deplace (int dx, int dy){ x += dx ; y += dy ; } public void affiche (){ System.out.println ("Je suis en " + x + " " + y) ; } }
5

Exemple dapplication de lhritage


class Pointcol extends Point{ private byte couleur ; public void colorer (byte couleur){ this.couleur = couleur ; } }

Pointcol est une classe drive de Point, ou une

sous-classe. Classe Point est la classe de base ou super classe.


6

public class TstPcol1{ public static void main (String args[]){ Pointcol pc = new Pointcol() ; pc.affiche() ; pc.initialise (3, 5) ; pc.colorer ((byte)3) ; pc.affiche() ; pc.deplace (2, -1) ; pc.affiche() ; Point p = new Point() ; p.initialise (6, 9) ; p.affiche() ;

}}

Un objet dune classe drive accde ses propres mthodes comme il accde aux mthodes publics et protected de sa classe de base.
7

Accs aux membres de sa classe de base


void afficheCol() { System.out.println ("Je suis en " + x + " " + y) ; System.out.println (" et ma couleur est : " + couleur) ; }

Accs aux membres de sa classe de base


void afficheCol() { System.out.println ("Je suis en " + x + " " + y) ; System.out.println (" et ma couleur est : " + couleur) ; }
Champs private !

public void afficheCol (){ affiche() ; System.out.println (" et ma couleur est : " + couleur) ; } Lappel affiche() dans la mthode afficheCol() est quivalent : this.affiche()
9

Accs aux membres de sa classe de base


Les membres publics de la classe de base se

comportent comme des membres de la classe drive.


Les membres protected de la classe de base sont

accessible partir de la classe drive. Une clase drive hrite aussi des membre privs, mais on ne peut y accder partir de la Exercice :drive. classe Complter limplmentation de classe PointCol drive de la classe Point qui a deux mthodes afficheCol() et initialiseCol()
10

Appels des constructeurs


Essayer de dfinir un constructeur pour la classe Pointcol qui permet dinitialiser les coordonnes x, y et la couleur.

class Pointcol extends Point{ private byte couleur ; public Pointcol (int x, int y, byte couleur) { ......... } }
11

Appels des constructeurs


public Pointcol (int x, int y, byte couleur) { super (x, y) ; // appelle du constructeur de la classe
de base

this.couleur = couleur ; }
Rgle : Si un constructeur dune classe drive appelle un constructeur dune classe de base, il doit obligatoirement sagir de la premire instruction du constructeur et ce dernier est dsign par le mot-cl super.
12

Classe de base sans constructeur


class A { ..... // aucun constructeur } class B extends A { public B (...) // constructeur de B { super() ; // appelle le constructeur par defaut de A ..... } }
13

Classe drive sans constructeur


class B extends A { ..... // pas de constructeur } 3 cas de figure pour la classe A: ne possder aucun constructeur possder un constructeur sans argument, possder un constructeur avec arguments. =>erreur
14

Classe drive sans constructeur


B b = new B() ;
Rgle : La cration dun objet de type B entrane lappel du constructeur par dfaut de B, qui appelle le constructeur de A. Si la classe A possder un constructeur avec arguments on obtient une erreur de compilation car le constructeur par dfaut de B cherche appeler un constructeur sans argument de A.
15

Initialisation dun objet driv


1. Allocation mmoire pour un objet de type B 2. Initialisation par dfaut de tous les champs de B

(aussi bien ceux hrits de A, que ceux propres B) aux valeurs "nulles".
3. Initialisation explicite, sil y a lieu, des champs

hrits de A.
4. Excution du corps du constructeur de A. 5. Initialisation explicite, sil y a lieu, des champs

propres B.
16

6. Excution du corps du constructeur de B.

Drivations successives

17

Rq :Contrairement C++, Java ne dispose pas dhritage multiple, notion gnralement dlicate manipuler. Java dispose en revanche de la notion dinterface, qui offre des possibilits proches de celles de lhritage multiple, sans en prsenter les inconvnients.

Notion de redfinition de mthode


Cette notion permet une classe drive de redfinir une

mthode de sa classe de base, en proposant une nouvelle dfinition. Cest alors cette nouvelle mthode qui sera appele sur tout objet de la classe drive, masquant la mthode de la classe de base.

18

public void affiche(){ super.affiche() ; // appel de la methode affiche de la superclasse System.out.println (" et ma couleur est " + couleur) ; }

Surcharge et hritage
En Java, une classe drive peut surcharger une mthode dune classe de base (ou, plus gnralement, dune classe ascendante).

19

Surcharge et hritage
class A { public void f (int n) { ..... } .....} class B extends A { public void f (float x) { ..... } .....} Aa;Bb; int n ; float x ; ..... a.f(n) ; // appelle f (int) de A a.f(x) ; // erreur de compilation : une seule methode acceptable (f(int) de A b.f(n) ; // appelle f (int) de A b.f(x) ; // appelle f(float) de B

20

Redfinition et surcharge simultanes


class A { ..... public void f (int n) { ..... } public void f (float x) { ..... } } class B extends A { ..... public void f (int n) { ..... } // redefinition de f(int) de A public void f (double y) { ..... } // surdefinition de f (de A et de B) } Aa;Bb; int n ; float x ; double y ; ..... a.f(n) ; a.f(x) ; Pour chaque appel, a.f(y) ; laquelle des mthodes est b.f(n) ; appele ? b.f(x) ; b.f(y) ;

21

Redfinition et surcharge simultanes


class A { ..... public void f (int n) { ..... } public void f (float x) { ..... } } class B extends A { ..... public void f (int n) { ..... } // redefinition de f(int) de A public void f (double y) { ..... } // surdefinition de f (de A et de B) } Aa;Bb; int n ; float x ; double y ; ..... a.f(n) ; // appel de f(int) de A (mise en jeu de surdefinition dans A) a.f(x) ; // appel de f(float) de A (mise en jeu de surdefinition dans A) a.f(y) ; // erreur de compilation b.f(n) ; // appel de f(int) de B (mise en jeu de redefinition) b.f(x) ; // appel de f(float) de A (mise en jeu de surdefinition dans A et B) b.f(y) ; // appel de f(double) de B (mise en jeu de surdefinition dans A et B)

22

Contraintes portant sur la redfinition


en cas de redfinition, Java impose non seulement lidentit des signatures, mais aussi celle du type de la valeur de retour
class A { public int f (int n) { ..... } } class B extends A { public float f (int n) { ..... } // erreur }
23

La class Object
il existe une classe nomme Object dont drive implicitement toute classe simple. Ainsi, lorsque vous dfinissez une classe Point de cette manire : class Point{ ..... } Tout se passe comme si vous aviez crit class Point extends Object{ ..... }
24

Le polymorphisme
Il permet de manipuler des objets sans en connatre (tout fait) le type.

25

Le polymorphisme
Le polymorphisme en Java se traduit par : Compatibilit par affectation entre un type classe et un type ascendant. Un point color est aussi un point, on peut donc bien le traiter comme un point, la rciproque tant bien sr fausse.
Ligature dynamique des mthodes : la capacit de

choisir dynamiquement la mthode qui correspond au type rel de lobjet.

26

Point p; p=new Point(3,5); p.affiche(); p=new PointCol(4,8,(byte)2); p.affiche();

Application
Ecrire un programme dans lequel exploiter les possibilits de polymorphisme pour crer un tableau "htrogne" dobjets: un tableau de 4 objet : 2 de type Point et 2 de type PoinCol. Faire une boucle pour laffichage

27

Polymorphisme :Objet en argument


class A { public void identite() { System.out.println ("objet de type A") ; }} class B extends A { public void identite () { System.out.println ("objet de type B") ; // redefinition de identite }} class Util { static void f(A a) // f attend un argument de type A { a.identite() ; }} ..... A a = new A() ; B b = new B() ; Util.f(a) ; // affiche : "objet de type A" Util.f(b) ; // cet appel affiche : "objet de type B"
28

Cas particulier pour la redfinition : des valeurs de retour covariantes


Redfinition : identit du type de la valeur de retour. Le JDK 5.0 introduit une exception cette rgle : class A { public A f () { ..... } ..... } class B extends A { public B f () { ..... } ..... }

// B.f redefinit bien A.f

29

la nouvelle mthode peut maintenant renvoyer une valeur dun type identique ou driv de celui de la mthode quelle redfinit.