Vous êtes sur la page 1sur 25

RIFAI Amal

2011-2012

Sommaire
L'hritage
Dfinition- But de l'hritage- l'hritage en java Syntaxe de l'hritage- Initialisation des objets

Polymorphisme
Dfinition Polymorphisme pour les mthodes: Surcharge de mthodes & Redfinition des mthodes Appel d'une mthode redfinie dans une classe drive Polymorphisme pour les objets: transtypage implicite :
Appel d'une mthode; mcanisme d'appel d'une mthode; Appel d'une mthode l'aide d'un objet de base, appel d'une mthode redfinie & appel d'une mthode spcifique

transtypage explicite

Classes abstraites
Dfinition Mthodes abstraites

Interfaces:
Dfinition Syntaxe d'implmentation d'une interface/ plusieurs interfaces
01/12/2011 RIFAI AMAL 2

RIFAI AMAL

RIFAI Amal

2011-2012

Dfinitions

L'hritage
Super-Classe Super-Classe

L'hritage est un mcanisme qui permet une ou plusieurs classes d'hriter de l'ensemble du

comportement et des attributs d'une ou d'autres classes . Une classe qui hrite d'une autre classe est appele sous-classe ou classe drive. Une classe qui offre son hritage une autre est appele super-classe, classe de base ou classe mre;
01/12/2011 RIFAI AMAL 3

Classe_drive1

Classe_drive n

Classe drive 1.1

Classe drive 1.n

Classe drive n.1

drive

Classe n.n

L'hritage
But de lhritage
C'est la rutilisation des fonctionnalits dune classe tout en apportant certaines variations, spcifiques de lobjet. En effet, il permet de: viter de dupliquer du code (attributs et mthodes) dans diffrentes classes qui partagent des caractristiques communes; faciliter les modifications futures => elles nont besoin dtre faites qu un seul endroit.

01/12/2011

RIFAI AMAL

RIFAI AMAL

RIFAI Amal

2011-2012

En java

L'hritage

Chaque classe ne peut possder qu'une seule super-classe, mais elle peut avoir un nombre illimit de sous-classes = "Pas d'hritage multiple en java". La classe Object est la classe de base de toutes les autres. C'est la seule classe de Java qui ne possde pas de classe mre. Tous les objets en Java, quelque soit leur classe, sont du type Object. Cela implique que tous les objets possdent dj leur naissance un certain nombre d'attributs et de mthodes drives de la classe Object. Si une classe n'hrite d'aucune autre classe, la surclasse immdiatement suprieure est donc Object.
01/12/2011 RIFAI AMAL 5

L'hritage
Syntaxe de l'hritage
Si une classe B hrite d'une classe A, alors on exprime ce comportement d'hritage par la syntaxe suivante:

public class B extends A{}

01/12/2011

RIFAI AMAL

RIFAI AMAL

RIFAI Amal

2011-2012

L'hritage
Initialisation des objets:
Si la super classe possde des mthodes et des attributs, il ne sera pas ncessaire de les redfinir ou d'en copier le code pour disposer des mmes mthodes et attributs dans les classes drives. Mais, il est indispensable que les constructeurs des classes drives, chacun prenne en charge l'intgralit de la construction de l'objet c'est--dire l'initialisation des attributs des deux classes: la super classe et celle drive.
01/12/2011 RIFAI AMAL 7

L'hritage

Initialisation des objets


L'initialisation des attributs d'une super classe est ralise en appelant son constructeur l'aide de la mthode super() qui doit tre la premire instruction au niveau du constructeur de la classe drive, selon la syntaxe suivante: Public ClassFille (type arg1SuperClasse,,type argNSuperClasse, type arg1ClasseDrive,, type argNClasseDrive) { super (arg1SuperClasse,, argNSuperClasse); ; // la suite des initialisations des attributs de la classe drive }
01/12/2011 RIFAI AMAL 8

RIFAI AMAL

RIFAI Amal

2011-2012

L'hritage

Initialisation des objets


Exemple: Les deux classes disposent de constructeurs
public class ClasseMre{ int a; char c; float b; public ClassFille(int a, float b, chat c){ public ClassMre(int a, float b){ super(a,b); /** appel du constructeur de la this.a=a; this.b=b } }
super classe pour initialiser ses attributs avec les valeurs a et b et excuter ses instructions*/

public

class

ClasseFille

extends

ClasseMre{

this.c=c ; /*initialisation de l'attribut de la classe drive*/


RIFAI AMAL 9

01/12/2011

}}

Mcanisme d'initialisation des objets


class classeDrive extends superClasse{ Type Attr1=Valeur1; Premire tape de
l'appel du constructeur Type AttrN=ValeurN; de la classe drive
public classeDrive(type argSuperClasse1, ,

L'hritage

Aprs l'appel du constructeur de la classe drive: Allocation de la mmoire pour tous les champs hrits ou non de la classe drive et leur initialisation par dfaut; Initialisation explicite des champs hrits de la super classe; Excution des instructions du constructeur de la super classe; Initialisation explicite des champs propres la classe drive Excution des instructions du constructeur de la classe drive
10

type argSuperClasseN, type argClasseDrive1, , type argClasseDrive1) {

super(argSuperClasse1,, argSuperClasseN); Attr1= argClasseDrive1; AttrN= argClasseDriveN; Instructions; } }


01/12/2011 RIFAI AMAL

RIFAI AMAL

RIFAI Amal

2011-2012

Initialisation des objets

L'hritage

Notez bien: Si la super classe ne dispose pas de constructeur et la classe drive en dispose, alors:
Il suffit d'initialiser les attributs de la classe drive (s'il y en a) au niveau de son constructeur. Le constructeur par dfaut de la super classe peut tre appel dans la classe drive par la mthode super() ou implicitement sans utiliser la mthode super().

Exemple:
public class classeFille extends classeMre{ public class classeMre { // pas de constructeur } char c; public classeFille(char c){ this.c=c;} public static void main(String[] arg){
// Appel implicite du constructeur par dfaut de la super classe
01/12/2011 RIFAI AMAL

classeFille cf=new classeFille('A');}}

11

L'hritage

Initialisation des objets


Notez bien: Si la classe drive ne dispose pas de constructeur, alors: Cas 1: Si la super classe ne dispose pas de constructeur: Il y aura un appel implicite du constructeur par dfaut de la super classe. Exemple: class A{// pas de constructeur} class B extends A{// pas de constructeur}
01/12/2011 RIFAI AMAL 12

RIFAI AMAL

RIFAI Amal

2011-2012

L'hritage

Initialisation des objets


Notez bien: Si la classe drive ne dispose pas de constructeur:
Cas 2: Si la super classe dispose d'un constructeur avec paramtres :
Cas 2.1: Si la super classe dclare en plus de ce constructeur un autre constructeur par dfaut, alors, il y aura un appel implicite de ce constructeur par dfaut dans la classe drive. Dans ce cas, on n'aura pas une initialisation explicite des attributs de la super classe. Exemple:
class classeMre{ int a; float b;

public ClasseMre(){};
public ClasseMre(int a, float b){ this.a=a; this.b=b; }} 01/12/2011 RIFAI AMAL

class ClasseFille extends classeMre{ public static void main(String[] arg){ /*Appel des constructeurs par dfaut de la classe drive et de la super classe. */ ClasseFille CF=new ClasseFille();}}
13

Initialisation des objets

L'hritage

Notez bien: Si la classe drive ne dispose pas de constructeur: Cas 2: Si la super classe dispose d'un constructeur avec paramtres: Cas2.2: Si la super classe ne dfinit pas un constructeur par dfaut, alors, le compilateur dclarera une erreur de compilation.
public class ClasseMre{ int a; float b; public ClassMre(int a, float b){ this.a=a; this.b=b;}} public class ClasseMre{ int a;float b; public class ClasseFille extends ClasseMre{ // Pas de constructeur donc le compilateur dclarera une erreur} public class ClasseFille extends ClasseMre{ public ClassFille(int a, float b){ super(a,b);}// constructeur de la classe fille } public class ClasseFille extends ClasseMre{ // appel implicite du constructeur par dfaut de la super classe 14 }

public ClassMre(){}
public ClassMre(int a, float b){ Corrig this.a=a; 01/12/2011 RIFAI AMAL this.b=b;}}

RIFAI AMAL

RIFAI Amal

2011-2012

Le polymorphisme
Le polymorphisme est la capacit d'une entit possder plusieurs formes. En informatique, ce vocable s'applique aux objets et aussi aux mthodes selon leur degr d'adaptabilit.

01/12/2011

RIFAI AMAL

15

Polymorphisme

Pour les mthodes:

Nous distinguons deux dnominations : Le polymorphisme statique ou la surcharge de mthodes Le polymorphisme dynamique ou la redfinition de mthodes ou encore la surcharge hrite.

01/12/2011

RIFAI AMAL

16

RIFAI AMAL

RIFAI Amal

2011-2012

Polymorphisme

Pour les mthodes:


La surcharge de mthodes ou polymorphisme statique
C'est une fonctionnalit classique des langages volus et en particulier les langages orients objets; elle consiste dans le fait qu'une classe peut disposer de plusieurs mthodes ayant le mme nom, mais avec des paramtres formels diffrents ou ventuellement un type de retour diffrent.
01/12/2011 RIFAI AMAL 17

Polymorphisme

Pour les mthodes:

Exemple1: La surcharge de mthodes


class maClasse{ int a; Public maClasse(){a=100;} // surcharge du constructeur de la classe maClasse Public maClasse (int b){a=b;} Public maClasse (float b){a=(int) b;} }
01/12/2011 RIFAI AMAL 18

RIFAI AMAL

RIFAI Amal

2011-2012

Pour les mthodes:

Polymorphisme

Exemple2: class AppliSurcharge extends maClasse{ La surcharge de // surcharge de la mthode au niveau de la classe drive int f(int x, char y){ a=x+(int)y; mthodes
Return a;} class maClasse{ int a; public maClasse(int b){a=b;} void f(){a*=10;} void f(int x){a+=10*x;} } public AppliSurcharge(int a){super(a);} Public static void main(String[] arg){ AppliSurcharge obj=new AppliSurcharge (15); System.out.println("obj.a="+obj.a); obj.f(); System.out.println("<obj.f()> a="+obj.a); obj.f(2); System.out.println("<obj.f(2)> a="+obj.a);
01/12/2011 RIFAI AMAL

System.out.println("<obj.f(50,'a')> a="+obj.f(50,'a'); }} 19

Polymorphisme

Pour les mthodes:

La surcharge de mthodes
Remarque: Le compilateur n'prouve aucune difficult lorsqu'il rencontre un appel l'une des versions surcharge d'une mthode, il cherche dans la dclaration de toutes les surcharges celle dont la signature (la dclaration des paramtres formels) concide avec les paramtres effectifs de l'appel.

01/12/2011

RIFAI AMAL

20

RIFAI AMAL

10

RIFAI Amal

2011-2012

Polymorphisme

Redfinition de mthodes ou polymorphisme dynamique


C'est une fonctionnalit mise en uvre lors de l'hritage d'une super classe vers une classe drive. Son principe consiste implmenter diffremment une mthode ayant la mme signature dans une super classe et sa classe drive. Rappel: Une signature de mthode reprsente son entte avec ses paramtres formels.

01/12/2011

RIFAI AMAL

21

Redfinition de mthodes ou polymorphisme dynamique


class Forme{ int pX, pY; public Forme(int pX, int pY){ this. pX = pX; this. pY = pY;} Void afficher(){ System.out.println("Je forme, ma position suis est: une x=

Le polymorphisme
class Cercle extends Forme{ float ray; public Cercle(int pX, int pY, float ray){ // Appel du constructeur de la super classe super(pX, pY); // Initialisation de l'attribut de la classe drive this.ray=ray; } //Redfinition de la mthode afficher () Void afficher(){ System.out.println("Je suis un cercle, ma position est:x="+pX+"y="+pY+"et mon rayon est:"+ray);} }
22

"+pX+"y= "+pY);} }
01/12/2011 RIFAI AMAL

RIFAI AMAL

11

RIFAI Amal

2011-2012

Redfinition de mthodes ou polymorphisme dynamique

Polymorphisme

Appel d'une mthode redfinie dans une classe drive


La redfinition d'une mthode dans une classe drive cache la mthode d'origine de la super classe. C'est--dire que pour appeler une mthode, Java commence par chercher la mthode dans la classe de l'objet driv puis remonter dans sa super classe et ainsi de suite jusqu' terminer la hirarchie. Pour utiliser directement la mthode de la super classe et non celle redfinie dans la classe drive, on utilise le mot-cl super selon la syntaxe suivante: super.nom_mthode().
01/12/2011 RIFAI AMAL 23

Redfinition de mthodes ou polymorphisme dynamique

Le polymorphisme
class Cercle extends Forme{

Appel d'une mthode float ray; redfinie dans une classe public Cercle(int pX, int pY, float ray){ drive
super(pX, pY); //Appel du constructeur de la super classe class Forme{ int pX, pY; public Forme(int pX, int pY){ this. pX = pX; this. pY = pY;} Void afficher(){ System.out.println("ma position est: x= "+pX+"y= "+pY);}}
01/12/2011 RIFAI AMAL

this.ray=ray;

// une mthode spcifique la classe Cercle public double surface(){return ray*ray*3.14f;} //Redfinition de la mthode afficher () Void afficher(){ System.out.print("Je suis un cercle, mon rayon est:"+ray+"et ");} Void afficherCercle(){ afficher();//Appel de afficher() de la classe Cercle Super.afficher(); //Appel de afficher() de la super classe Forme} 24 }

RIFAI AMAL

12

RIFAI Amal

2011-2012

Polymorphisme

Pour les objets


Le transtypage de rfrences d'objets :the cast
Il est possible de convertir un objet d'une classe en un objet d'une autre classe si les classes ont un lien d'hritage Il existe deux types de transtypages: Transtypage implicite : sens ClasseDrive vers SuperClasse Transtypage explicite : sens SuperClasse vers ClasseDrive

01/12/2011

RIFAI AMAL

25

Pour les objets


Il est logique de dire qu'un objet driv est un objet de base;

Le polymorphisme

Transtypage implicite : sens ClasseDrive vers SuperClasse


Forme
Est une Est une

Donc il est toujours possible d'utiliser une rfrence de la super classe pour dsigner un objet d'une classe drive (fille, petitefille et toute la descendance). Il y a alors un transtypage implicite de la classe drive vers la super classe.
01/12/2011 RIFAI AMAL

Carr

Cercle

Animal
Est un Est un

Chat

Chien
26

RIFAI AMAL

13

RIFAI Amal

2011-2012

Pour les objets


ClasseMre OCM;

Le polymorphisme

Transtypage implicite : sens ClasseDrive vers SuperClasse


Le transtypage implicite peut tre exprim avec les lignes suivantes: // crer une rfrence de type ClasseMre

ClasseFille OCF=new ClasseFille(); // crer un objet de type ClasseFille OCM=OCF; /* la rfrence de type ClasseMre dsigne un objet de type ClasseFille*/ La dernire instruction implique un transtypage implicite. La rfrence OCM de type ClasseMre est alors utilise pour dsigner un objet de type ClasseFille . L'objet rfrenc par OCF qui est de type classeFille est alors transtyp en ClasseMre.
01/12/2011 RIFAI AMAL 27

Pour les objets


class Cercle extends Forme{ float ray; public Cercle(int pX, int pY, float ray){ super(pX, pY); this.ray=ray;}

Le polymorphisme

Exemple: Transtypage implicite (sens ClasseDrive vers SuperClasse)


class Forme{ int pX, pY; public ClasseMre(int pX,int pY){ this. pX = pX; this. pY = pY;}

Public void afficher(){System.out.println ( "Je Public void afficher(){ suis un cercle, ma position est: x=" +pX+"et System.out.println ( "Je suis une y="+pY+"et mon rayon est: rayon="+ray);} forme, ma position est: x=" +pX+"et y="+pY);}} public double surface(){ return rayon*rayon*3.14f ;} Public static void main(String[] arg){ Forme OF=new Forme(1,1); Cercle OC=new Cercle(1,1,2.5f); OF=OC; }} 01/12/2011
RIFAI AMAL

(Forme) OF (Cercle) OC (Forme) OF

1 pX 1 pY 1 pX 1 pY 2.5 ray 1 pX 1 pY28

RIFAI AMAL

14

RIFAI Amal

2011-2012

Appel d'une mthode


Dans la plupart des langages, lorsque le compilateur rencontre un appel de mthode, il doit tre mme de savoir exactement de quelle mthode il s'agit. Le lien entre l'appel et la mthode est alors tabli la compilation. Cette technique est appele Early-Binding (liaison prcoce). JAVA utilise cette technique pour les appels de mthodes dclares final. Elle a l'avantage de permettre certaines optimisations. Par contre pour les mthodes non final, le choix du code excuter ne se fait pas statiquement la compilation, mais dynamiquement l'excution. Cette technique est appele le late-binding (liaison tardive). En effet, l'invocation d'une mthode, le choix de l'implmentation excuter ne se fait pas en fonction du type dclar de la rfrence de l'objet, mais en fonction du type rel de l'objet.
01/12/2011
RIFAI AMAL 29

Pour les objets

Le polymorphisme

Mcanisme du fonctionnement de l'appel d'une mthode: Rfrence de type


ClasseMre

ClasseMre objCM; objCM=new ClasseMre(); objCM.maMthode();

(ClasseMre) objCM (ClasseMre) objCM Un objet de type ClasseMre

Etape1 : le compilateur vrifie la structure du type de la rfrence (ClasseMre) la recherche de la mthode (maMthode())
Oui le compilateur ne dclare pas une erreur Mthode existe Non le compilateur dclare une erreur

Etape2: l'interprteur excute la mthode (maMthode()) dclare dans le type rel de l'objet (obCM) Fin
01/12/2011 RIFAI AMAL 30

RIFAI AMAL

15

RIFAI Amal

2011-2012

Appel d'une mthode l'aide d'un objet de base dans le cas de l'hritage
Il est impossible de dire qu'un type de base est un type driv. Exemple une forme n'est jamais un cercle ou carr. Donc une rfrence d'un objet de type de base ne peut pas appeler une mthode spcifique, redfinie ou surcharge dans l'une de ses classes drives. Exemple: Forme OF=new Forme(1,1); Cas d'une mthode redfinie dans une classe drive OF.afficher (); /* excute la mthode afficher() de la classe Forme (de l'objet effectif) et non celle de la classe Cercle. Cas d'une mthode spcifique une classe drive OF.surface(); /* le compilateur dclare une erreur car au cours de sa vrification
dans la structure de la classe Forme, il ne trouvera pas la mthode surface() (celle-ci est spcifique la classe Cercle*/
01/12/2011 RIFAI AMAL 31

Appel d'une mthode redfinie dans le cas du Transtypage implicite (sens ClasseDrive vers SuperClasse)
class Forme{ int pX, pY; public ClasseMre(int pX, int pY){ this. pX = pX; this. pY = pY;} Public void afficher(){ System.out.println ( "Je suis une forme, ma position +pX+"et y="+pY);}
01/12/2011

class Cercle extends Forme{ float ray; public Cercle(int pX, int pY, float ray){ super(pX, pY); this.ray=ray;} Public void afficher(){System.out.println ("Je suis un cercle, ma position est: "+pX+"et "+pY+"et mon rayon est: "+ray);} // Une mthode spcifique la classe Cercle public double surface(){return ray*ray*3.14f ;} Public static void main(String[] arg){ Forme objF; Cercle objC=new Cercle(1,1,2.5f); objF=objC; //excute la mthode afficher() de Cercle objF.afficher();}}

est:

x="

RIFAI AMAL

32

RIFAI AMAL

16

RIFAI Amal

2011-2012

class Cercle extends Forme{

Appel d'une mthode spcifique une classe drive dans le cas du Transtypage implicite (sens ClasseDrive vers SuperClasse)
class Forme{ int pX, pY; public ClasseMre(int pX, int pY){ this. pX = pX; this. pY = pY;} Public void afficher(){ System.out.println ( "Je suis une forme, ma position +pX+"et y="+pY);}
01/12/2011

float ray; public Cercle(int pX, int pY, float ray){ super(pX, pY); this.ray=ray;} Public void afficher(){System.out.println ("Je suis un cercle, ma position est: "+pX+"et "+pY+"et mon rayon est: "+ray);} // Une mthode spcifique la classe Cercle public double surface(){return ray*ray*3.14f ;} Public static void main(String[] arg){ Forme objF; Cercle objC=new Cercle(1,1,2.5f); objF=objC; //transtypage implicite de l'objet objC (dont le type est Cercle) en type Forme double S=objF.surface(); //Erreur de compilation }}
33

est:

x="

RIFAI AMAL

Pour les objets

Le polymorphisme

Transtypage explicite : sens SuperClasse vers ClasseDrive


Le transtypage explicite des rfrences est utilis pour convertir le type d'une rfrence dans un type driv. Son but consiste permettre un objet de type super classe d'appeler une mthode spcifique de ses classes drives. Il est utilis avec la syntaxe suivante: ClasseMre objCM; ClasseFille objCF=new ClasseFille(); objCM=objCF; ((ClassFille) objCM).mthodeSpcifiqueClasseFille();
On a fait un transtypage de la rfrence objCM qui a t de type de base (ClasseMre) au type driv ClasseFille.
01/12/2011 RIFAI AMAL 34

RIFAI AMAL

17

RIFAI Amal

2011-2012

Le polymorphisme

Pour les objets


Transtypage explicite : class Forme{ int pX; int pY; public Forme(int pX, int pY){ this. pX = pX; this. pY = pY;} void afficher(){ Je suis une forme, ma position est: x= "+pX+"y= "+pY);} }
01/12/2011 RIFAI AMAL

class Cercle extends Forme{ float ray;

sens public Cercle(int pX, int pY, float ray){ super(pX, pY); SuperClasse vers ClasseDrive this.ray=ray;} public double surface(){return ray*ray*3.14f ;} Void afficher(){ System.out.println("Je suis un cercle, ma position est: x="+pX+"y="+pY+"mon rayon est:"+ray+ "ma surface est: "}; Public static void main(String[] arg){ double S; Forme objF; CercleobjC=new Cercle(1,1,2.5f); objF=objC; // transtypage explicite des rfrences S=((Cercle) objF).surface();}}
35

Notez bien: on peut viter le transtypage explicite en Java en utilisant les techniques du late-binding. En effet, on appelle une mthode spcifique d'une classe drive l'intrieur d'une mthode redfinie.
Exemple: On change la mthode afficher () de la classe Cercle de la manire suivante: void afficher(){ System.out.println("je suis un cercle, ma position est: "+ pX+"et "+pY+"mon rayon est: "+ray+"et ma surface est: "+surface()); } En excutant les lignes suivantes: Forme objF; Cercle objC=new Cercle(1,1,2.5f); objF=objC; // transtypage implicite de l'objet objC en type Forme objF.afficher() /* Au cours de l'appel de la mthode afficher(), puisqu'elle est dclare dans la classe Forme; le compilateur ne dclarera pas une erreur. Au cours de son excution, la version excute c'est celle qui correspond au type effectif de l'objet utilis qui est de type Cercle et puisque ce type dispose de la mthode spcifique surface() donc son excution sera possible sans dclarer des erreurs.
01/12/2011 RIFAI AMAL 36

RIFAI AMAL

18

RIFAI Amal

2011-2012

Le polymorphisme Exemple d'utilisation du polymorphisme et du transtypage avec un "vector"


class Vecteur { public static void main(String[] arg){ Cercle ce=new Cercle(2.5,1.5); Carr ca=new Carr(3.5,4.5); Forme fo=new Forme(0,0); Vector vec=new Vector(); vec.addElement(fo); vec.addElement(ce); vec.addElement(ca); for( int i=0 ; i<vec.size() ; i++) ((Forme) (vec.elementAt(i)).afficher(); }}
01/12/2011 RIFAI AMAL

class Forme{ public float px,py; public Forme(float x, float y){px=x; py=y;} public void affiche(){ System.out.println("je suis une forme, ma position est : x="+px+" y= "+py);}} class Cercle extends Forme{ public Cercle(int dx, int dy) {super(dx,dy);} public void affiche(){ System.out.println(" je suis un cercle , ma position est "+px+"et "+py);}} class Carr extends Forme{ public Carr(int dx, int dy) {super(dx,dy);} public void affiche(){ System.out.println(" je suis un carr, ma position est "+px+"et "+py);}}
37

Les classes abstraites


Une classe abstraite est une classe qui contient une ou plusieurs mthodes non implmentes. La syntaxe de dclaration d'une classe abstraite est la suivante: abstract class MaClasse{} Exemple: abstract class forme{ float pX,pY; Public abstract float surface(); Public abstract String nature(); Public void dplacer(){}}
01/12/2011 RIFAI AMAL 38

Forme surface(): Abstrait nature():Abstrait dplacer()

RIFAI AMAL

19

RIFAI Amal

2011-2012

Les classes abstraites


Une classe abstraites ne peut pas tre

instancie, mais elle peut tre hritable.


On peut construire une hirarchie de

classes abstraites.
Pour pouvoir construire un objet

Forme: abstraite surface(): Abstrait nature(): Abstrait dplacer()


Forme2D : abstraite Forme3D : abstraite

partir d'une classe abstraite, il faut crer une classe non abstraite hritant de la classe abstraite et implmentant toutes ses mthodes abstraites c'est--dire non implmentes.
01/12/2011 RIFAI AMAL

primtre(): abstract afficher()

volume(): abstract afficher()

Carr
surface()
primtre() nature()

Cercle
surface()
primtre()
nature()

Cube
surface()
volume()
nature()

Cylindre
surface()
volume()
nature()
39

Les classes abstraites

Les mthodes abstraites


Une mthode abstraite n'est qu'une signature de mthode sans

implmentation dans la classe ( elle n'a pas de corps). Donc, elle n'est pas excutable,
Dans l'entte d'une mthode abstraite, il faut indiquer le mot cl

abstract et les noms des arguments muets doivent figurer bien qu'ils ne servent rien.
La syntaxe de dclaration d'une mthode abstraite est:

droitAccs abstract valeurRetour nomMthode (type arg1type argN);


01/12/2011 RIFAI AMAL 40

RIFAI AMAL

20

RIFAI Amal

2011-2012

Les classes abstraites

Les mthodes abstraites


Une mthode abstraite doit tre dclare public ou protected au

niveau de la super classe pour pouvoir la redfinir dans les classes drives. Exemple: public abstract double surface();
L'implmentation d'une mthode abstraite est dlgue une classe

drive.
L'implmentation d'une mthode abstraite dans une classe drive ne

doit pas rduire son degr d'accs, par contre, la machine java accepte de modifier son droit d'accs un niveau suprieur; c'est-dire si une mthode abstraite est dclare protected, elle ne doit pas tre implmente dans la classe drive avec un droit d'accs private mais il est possible de l'implmenter avec un droit d'accs public
01/12/2011 RIFAI AMAL 41

Exemple:
abstract class Forme{ public abstract double surface( ); public abstract String nature( ); public void afficher( ){ } } abstract class Forme2D extends Forme{ public abstract float primtre( ) { } public void afficher( ){ }} abstract class Forme3D extends Forme { public abstract double volume( ) public void afficher( ){ }} class carr extends Forme2D{ Public double surface( ) { } Public double primtre(){} Public String nature( ){} }
01/12/2011 RIFAI AMAL

Les classes abstraites


class cercle extends Forme2D{ Public double surface( ) { } Public double primtre(){} Public String nature( ){}} Class cube extends Forme3D{ public abstract double volume( ) Public String nature( ){} Public double surface( ) { }}
Class Cylindre extends Forme3D{

Public double surface( ) { } Public String nature(){} public double volume( ) { } }


42

RIFAI AMAL

21

RIFAI Amal

2011-2012

Classes final
Une classe peut tre dclare final, dans un but de scurit ou doptimisation. Une classe final ne peut tre tendue pour crer des sousclasses. Par consquent, ses mthodes ne peuvent pas tre redfinies et leur accs peut donc se faire sans recherche dynamique. Une classe final ne peut pas tre clone.

01/12/2011

RIFAI AMAL

43

Les interfaces
Une interface est une classe dont toutes les mthodes sont abstraites et

publiques et tous les attributs sont constants. L'interface est dclare avec le mot cl interface. Sa syntaxe de dclaration est :

interface nom_interface{} Exemple: interface monInterface{ Public static final int constante=I; Public int f();}

01/12/2011

RIFAI AMAL

44

RIFAI AMAL

22

RIFAI Amal

2011-2012

Les interfaces
Une classe n'hrite pas d'une interface mais elle l'implmente l'aide

du mot cl implements selon la syntaxe suivante: Class B implements monInterface{Public int f(){return 1;} } Remarques:
On ne peut hriter que d'une classe mais on peut implmenter

plusieurs interfaces selon la syntaxe suivante:


Class B implements Interface1,,InterfaceN{} Dans ce cas nous avons une excellente alternative l'hritage

multiple.
01/12/2011 RIFAI AMAL 45

Les interfaces
Pour pouvoir construire un objet partir d'une interface, il faut

dfinir une classe non abstraite implmentant toutes les mthodes de l'interface.
Remarque: Si la classe n'implmente pas toutes les mthodes des interfaces

qu'elle implmentent, le compilateur dclare une erreur sinon il faut dclarer que la classe est abstraite

01/12/2011

RIFAI AMAL

46

RIFAI AMAL

23

RIFAI Amal

2011-2012

Les interfaces
Lorsque l'on cre une interface, on fournit un ensemble de dfinitions qui ne devraient plus tre modifis. Cette attitude de constance dans les dfinitions, protge les applications crites pour utiliser cette interface. Une classe drive peut implmenter une interface. Exemple: class B extends A implements monInterface {}

01/12/2011

RIFAI AMAL

47

Les interfaces
Une interface peut driver d'une autre: interface Int1 extends Int2
La dclaration cidessus consiste concatner les dclarations de Int1 et Int2.

Exemple: Interface I1{ Void f(int n); Static final int max=22;} Interface I2 extends I1{ Void g(); Static final int min=0;}
01/12/2011 RIFAI AMAL

La dfinition de I2 est quivalente la dclaration suivante:

Interface I2{ Void g(); Void f(int n); Static final int min=0; Static final int max=22; }
48

RIFAI AMAL

24

RIFAI Amal

2011-2012

?
01/12/2011 RIFAI AMAL 49

RIFAI AMAL

25

Vous aimerez peut-être aussi