Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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
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:
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
RIFAI AMAL
RIFAI Amal
2011-2012
L'hritage
public
class
ClasseFille
extends
ClasseMre{
01/12/2011
}}
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
RIFAI AMAL
RIFAI Amal
2011-2012
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
11
L'hritage
RIFAI AMAL
RIFAI Amal
2011-2012
L'hritage
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
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
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
Polymorphisme
RIFAI AMAL
RIFAI Amal
2011-2012
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
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
01/12/2011
RIFAI AMAL
21
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
Polymorphisme
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
01/12/2011
RIFAI AMAL
25
Le polymorphisme
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
Le polymorphisme
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
Le polymorphisme
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
RIFAI AMAL
14
RIFAI Amal
2011-2012
Le polymorphisme
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
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
Le polymorphisme
RIFAI AMAL
17
RIFAI Amal
2011-2012
Le polymorphisme
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
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
RIFAI AMAL
19
RIFAI Amal
2011-2012
classes abstraites.
Pour pouvoir construire un objet
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
Carr
surface()
primtre() nature()
Cercle
surface()
primtre()
nature()
Cube
surface()
volume()
nature()
Cylindre
surface()
volume()
nature()
39
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:
RIFAI AMAL
20
RIFAI Amal
2011-2012
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
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
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
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