Vous êtes sur la page 1sur 25

RIFAI Amal

2011-2012

Sommaire
L'héritage
Définition- But de l'héritage- l'héritage en java– Syntaxe de l'héritage- Initialisation des objets

Polymorphisme
Définition Polymorphisme pour les méthodes: Surcharge de méthodes & Redéfinition des méthodes Appel d'une méthode redéfinie dans une classe dérivée Polymorphisme pour les objets: transtypage implicite :
Appel d'une méthode; mécanisme d'appel d'une méthode; Appel d'une méthode à l'aide d'un objet de base, appel d'une méthode redéfinie & appel d'une méthode spécifique

transtypage explicite

Classes abstraites
Définition Méthodes abstraites

Interfaces:
Définition Syntaxe d'implémentation d'une interface/ plusieurs interfaces
01/12/2011 RIFAI AMAL 2

RIFAI AMAL

1

RIFAI Amal

2011-2012

Définitions

L'héritage
Super-Classe Super-Classe

L'héritage est un mécanisme qui permet à une ou plusieurs classes d'hériter de l'ensemble du

comportement et des attributs d'une ou d'autres classes . Une classe qui hérite d'une autre classe est appelée sous-classe ou classe dérivée. Une classe qui offre son héritage à une autre est appelée super-classe, classe de base ou classe mère;
01/12/2011 RIFAI AMAL 3

Classe_dérivée1

Classe_dérivée n

Classe dérivée 1.1

Classe dérivée 1.n

Classe dérivée n.1

… dérivée

Classe n.n

L'héritage
But de l’héritage
C'est la réutilisation des fonctionnalités d’une classe tout en apportant certaines variations, spécifiques de l’objet. En effet, il permet de: éviter de dupliquer du code (attributs et méthodes) dans différentes classes qui partagent des caractéristiques communes; faciliter les modifications futures => elles n’ont besoin d’être faites qu’à un seul endroit.

01/12/2011

RIFAI AMAL

4

RIFAI AMAL

2

mais elle peut avoir un nombre illimité de sous-classes = "Pas d'héritage multiple en java". Cela implique que tous les objets possèdent déjà à leur naissance un certain nombre d'attributs et de méthodes dérivées de la classe Object.RIFAI Amal 2011-2012 En java L'héritage Chaque classe ne peut posséder qu'une seule super-classe. la surclasse immédiatement supérieure est donc Object. quelque soit leur classe. Si une classe n'hérite d'aucune autre classe. alors on exprime ce comportement d'héritage par la syntaxe suivante: public class B extends A{…} 01/12/2011 RIFAI AMAL 6 RIFAI AMAL 3 . 01/12/2011 RIFAI AMAL 5 L'héritage Syntaxe de l'héritage Si une classe B hérite d'une classe A. La classe Object est la classe de base de toutes les autres. Tous les objets en Java. C'est la seule classe de Java qui ne possède pas de classe mère. sont du type Object.

…. // la suite des initialisations des attributs de la classe dérivée } 01/12/2011 RIFAI AMAL 8 RIFAI AMAL 4 . il est indispensable que les constructeurs des classes dérivées.…. type arg1ClasseDérivée. argNSuperClasse). il ne sera pas nécessaire de les redéfinir ou d'en copier le code pour disposer des mêmes méthodes et attributs dans les classes dérivées. Mais. …. selon la syntaxe suivante: Public ClassFille (type arg1SuperClasse. 01/12/2011 RIFAI AMAL 7 L'héritage Initialisation des objets L'initialisation des attributs d'une super classe est réalisée en appelant son constructeur à l'aide de la méthode super() qui doit être la première instruction au niveau du constructeur de la classe dérivée. type argNClasseDérivée) { super (arg1SuperClasse. chacun prenne en charge l'intégralité de la construction de l'objet c'est-à-dire l'initialisation des attributs des deux classes: la super classe et celle dérivée.type argNSuperClasse.….RIFAI Amal 2011-2012 L'héritage Initialisation des objets: Si la super classe possède des méthodes et des attributs.

Instructions. de la classe dérivée public classeDérivée(type argSuperClasse1. chat c){ public ClassMère(int a. Exécution des instructions du constructeur de la super classe. Initialisation explicite des champs hérités de la super classe.a=a. /** appel du constructeur de la this. AttrN= argClasseDérivéeN. this. float b. ….b=b } } super classe pour initialiser ses attributs avec les valeurs a et b et exécuter ses instructions*/ public class ClasseFille extends ClasseMère{ this. } } 01/12/2011 RIFAI AMAL RIFAI AMAL 5 . Initialisation explicite des champs propres à la classe dérivée Exécution des instructions du constructeur de la classe dérivée 10 type argSuperClasseN. argSuperClasseN).c=c . public ClassFille(int a. Première étape de l'appel du constructeur Type AttrN=ValeurN. float b){ super(a. char c. L'héritage Après l'appel du constructeur de la classe dérivée: Allocation de la mémoire pour tous les champs hérités ou non de la classe dérivée et leur initialisation par défaut. type argClasseDérivée1) { super(argSuperClasse1. … .…. /*initialisation de l'attribut de la classe dérivée*/ RIFAI AMAL 9 01/12/2011 }} Mécanisme d'initialisation des objets class classeDérivée extends superClasse{ Type Attr1=Valeur1. Attr1= argClasseDérivée1. float b.RIFAI Amal 2011-2012 L'héritage Initialisation des objets Exemple: Les deux classes disposent de constructeurs public class ClasseMère{ int a. type argClasseDérivée1.b).

public classeFille(char c){ this.}} 11 L'héritage Initialisation des objets Notez bien: Si la classe dérivée ne dispose pas de constructeur.RIFAI Amal 2011-2012 Initialisation des objets L'héritage Notez bien: Si la super classe ne dispose pas de constructeur et la classe dérivée en dispose. Exemple: public class classeFille extends classeMère{ public class classeMère { …// pas de constructeur } char c.c=c. alors: Il suffit d'initialiser les attributs de la classe dérivée (s'il y en a) au niveau de son constructeur. Le constructeur par défaut de la super classe peut être appelé dans la classe dérivée par la méthode super() ou implicitement sans utiliser la méthode super(). alors: Cas 1: Si la super classe ne dispose pas de constructeur: Il y aura un appel implicite du constructeur par défaut 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 6 .} public static void main(String[] arg){ // Appel implicite du constructeur par défaut de la super classe 01/12/2011 RIFAI AMAL classeFille cf=new classeFille('A').

this. public ClassMère(int a. float b){ super(a. Dans ce cas.2: Si la super classe ne définit pas un constructeur par défaut. */ ClasseFille CF=new ClasseFille(). public class ClasseFille extends ClasseMère{ …// Pas de constructeur donc le compilateur déclarera une erreur} public class ClasseFille extends ClasseMère{ public ClassFille(int a.}} public class ClasseMère{ int a. float b.a=a.a=a.b=b.float b. public class ClasseMère{ int a. public ClasseMère(int a.}} 13 Initialisation des objets L'héritage Notez bien: Si la classe dérivée ne dispose pas de constructeur: Cas 2: Si la super classe dispose d'un constructeur avec paramètres: Cas2. on n'aura pas une initialisation explicite des attributs de la super classe. le compilateur déclarera une erreur de compilation. alors. this.b=b. float b){ this.b). 01/12/2011 RIFAI AMAL this. }} 01/12/2011 RIFAI AMAL class ClasseFille extends classeMère{ public static void main(String[] arg){ /*Appel des constructeurs par défaut de la classe dérivée et de la super classe.b=b.RIFAI Amal 2011-2012 L'héritage Initialisation des objets Notez bien: Si la classe dérivée ne dispose pas de constructeur: Cas 2: Si la super classe dispose d'un constructeur avec paramètres : Cas 2.1: Si la super classe déclare en plus de ce constructeur un autre constructeur par défaut.}// constructeur de la classe fille } public class ClasseFille extends ClasseMère{ …// appel implicite du constructeur par défaut de la super classe 14 } public ClassMère(){} public ClassMère(int a. float b){ Corrigé this. il y aura un appel implicite de ce constructeur par défaut dans la classe dérivée. public ClasseMère(){}. alors. float b. Exemple: class classeMère{ int a. float b){ this.a=a.}} RIFAI AMAL 7 .

En informatique.RIFAI Amal 2011-2012 Le polymorphisme Le polymorphisme est la capacité d'une entité à posséder plusieurs formes. ce vocable s'applique aux objets et aussi aux méthodes selon leur degré d'adaptabilité. 01/12/2011 RIFAI AMAL 15 Polymorphisme Pour les méthodes: Nous distinguons deux dénominations : Le polymorphisme statique ou la surcharge de méthodes Le polymorphisme dynamique ou la redéfinition de méthodes ou encore la surcharge héritée. 01/12/2011 RIFAI AMAL 16 RIFAI AMAL 8 .

} // surcharge du constructeur de la classe maClasse Public maClasse (int b){a=b.RIFAI Amal 2011-2012 Polymorphisme Pour les méthodes: La surcharge de méthodes ou polymorphisme statique C'est une fonctionnalité classique des langages évolués et en particulier les langages orientés objets. elle consiste dans le fait qu'une classe peut disposer de plusieurs méthodes ayant le même nom.} } 01/12/2011 RIFAI AMAL 18 RIFAI AMAL 9 . 01/12/2011 RIFAI AMAL 17 Polymorphisme Pour les méthodes: Exemple1: La surcharge de méthodes class maClasse{ int a. mais avec des paramètres formels différents ou éventuellement un type de retour différent. Public maClasse(){a=100.} Public maClasse (float b){a=(int) b.

f(50.f()> a="+obj.out.println("<obj.a). obj.a).} Public static void main(String[] arg){ AppliSurcharge obj=new AppliSurcharge (15). System. }} 19 Polymorphisme Pour les méthodes: La surcharge de méthodes Remarque: Le compilateur n'éprouve aucune difficulté lorsqu'il rencontre un appel à l'une des versions surchargée d'une méthode.f(50.println("obj.out.} void f(){a*=10.a).a="+obj. 01/12/2011 RIFAI AMAL System.} void f(int x){a+=10*x.'a')> a="+obj. System. System.'a').out. char y){ a=x+(int)y.f(2). obj. méthodes Return a.out. 01/12/2011 RIFAI AMAL 20 RIFAI AMAL 10 . il cherche dans la déclaration de toutes les surcharges celle dont la signature (la déclaration des paramètres formels) coïncide avec les paramètres effectifs de l'appel. public maClasse(int b){a=b.println("<obj.RIFAI Amal 2011-2012 Pour les méthodes: Polymorphisme Exemple2: class AppliSurcharge extends maClasse{ La surcharge de // surcharge de la méthode au niveau de la classe dérivée int f(int x.f().} class maClasse{ int a.} } public AppliSurcharge(int a){super(a).println("<obj.f(2)> a="+obj.

println("Je forme. pY). 01/12/2011 RIFAI AMAL 21 Redéfinition de méthodes ou polymorphisme dynamique class Forme{ int pX. public Forme(int pX.} Void afficher(){ System. // Initialisation de l'attribut de la classe dérivée this.} } 01/12/2011 RIFAI AMAL RIFAI AMAL 11 . public Cercle(int pX. ma position est:x="+pX+"y="+pY+"et mon rayon est:"+ray). Son principe consiste à implémenter différemment une méthode ayant la même signature dans une super classe et sa classe dérivée.out. ma position suis est: une x= Le polymorphisme class Cercle extends Forme{ float ray.} } 22 "+pX+"y= "+pY). } //Redéfinition de la méthode afficher () Void afficher(){ System.RIFAI Amal 2011-2012 Polymorphisme Redéfinition de méthodes ou polymorphisme dynamique C'est une fonctionnalité mise en œuvre lors de l'héritage d'une super classe vers une classe dérivée.println("Je suis un cercle. Rappel: Une signature de méthode représente son entête avec ses paramètres formels. pX = pX. int pY){ this. int pY.ray=ray. pY = pY. pY. float ray){ // Appel du constructeur de la super classe super(pX. this.out.

ray=ray. pX = pX.nom_méthode().afficher().RIFAI Amal 2011-2012 Redéfinition de méthodes ou polymorphisme dynamique Polymorphisme Appel d'une méthode redéfinie dans une classe dérivée La redéfinition d'une méthode dans une classe dérivée cache la méthode d'origine de la super classe. Pour utiliser directement la méthode de la super classe et non celle redéfinie dans la classe dérivée.println("ma position est: x= "+pX+"y= "+pY).14f. C'est-à-dire que pour appeler une méthode. int pY. public Forme(int pX. mon rayon est:"+ray+"et "). redéfinie dans une classe public Cercle(int pX. int pY){ this.out.} Void afficher(){ System. Java commence par chercher la méthode dans la classe de l'objet dérivé puis remonter dans sa super classe et ainsi de suite jusqu'à terminer la hiérarchie. 01/12/2011 RIFAI AMAL 23 Redéfinition de méthodes ou polymorphisme dynamique Le polymorphisme class Cercle extends Forme{ Appel d'une méthode float ray.out.} //Redéfinition de la méthode afficher () Void afficher(){ System. float ray){ dérivée super(pX. //Appel du constructeur de la super classe class Forme{ int pX. } // une méthode spécifique à la classe Cercle public double surface(){return ray*ray*3. this. on utilise le mot-clé super selon la syntaxe suivante: super. //Appel de afficher() de la super classe Forme} 24 } RIFAI AMAL 12 .} Void afficherCercle(){ afficher(). pY. pY = pY.//Appel de afficher() de la classe Cercle Super.print("Je suis un cercle. pY).}} 01/12/2011 RIFAI AMAL this.

01/12/2011 RIFAI AMAL Carré Cercle Animal Est un Est un Chat Chien 26 RIFAI AMAL 13 . Il y a alors un transtypage implicite de la classe dérivée vers la super classe. Le polymorphisme Transtypage implicite : sens ClasseDérivée vers SuperClasse Forme Est une Est une Donc il est toujours possible d'utiliser une référence de la super classe pour désigner un objet d'une classe dérivée (fille. petitefille et toute la descendance).RIFAI Amal 2011-2012 Polymorphisme Pour les objets Le transtypage de références 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'héritage Il existe deux types de transtypages: Transtypage implicite : sens ClasseDérivée vers SuperClasse Transtypage explicite : sens SuperClasse vers ClasseDérivée 01/12/2011 RIFAI AMAL 25 Pour les objets Il est logique de dire qu'un objet dérivé est un objet de base.

Cercle OC=new Cercle(1. // créer un objet de type ClasseFille OCM=OCF.out.5f). ma position est: x=" +pX+"et System. /* la référence de type ClasseMère désigne un objet de type ClasseFille*/ La dernière instruction implique un transtypage implicite.2. OF=OC.out. public Cercle(int pX.println ( "Je suis une y="+pY+"et mon rayon est: rayon="+ray).RIFAI Amal 2011-2012 Pour les objets ClasseMère OCM. L'objet référencé par OCF qui est de type classeFille est alors transtypé en ClasseMère.}} public double surface(){ return rayon*rayon*3.5 ray 1 pX 1 pY28 RIFAI AMAL 14 .1).} Public void afficher(){System. Le polymorphisme Transtypage implicite : sens ClasseDérivée vers SuperClasse Le transtypage implicite peut être exprimé avec les lignes suivantes: // créer une référence de type ClasseMère ClasseFille OCF=new ClasseFille().14f . pY.1. this.} forme.ray=ray. }} 01/12/2011 RIFAI AMAL (Forme) OF (Cercle) OC (Forme) OF 1 pX 1 pY 1 pX 1 pY 2. pX = pX. int pY.println ( "Je Public void afficher(){ suis un cercle.} Public static void main(String[] arg){ Forme OF=new Forme(1. pY). La référence OCM de type ClasseMère est alors utilisée pour désigner un objet de type ClasseFille . 01/12/2011 RIFAI AMAL 27 Pour les objets class Cercle extends Forme{ float ray. pY = pY.} Le polymorphisme Exemple: Transtypage implicite (sens ClasseDérivée vers SuperClasse) class Forme{ int pX.int pY){ this. float ray){ super(pX. public ClasseMère(int pX. ma position est: x=" +pX+"et y="+pY). this.

objCM. mais en fonction du type réel de l'objet. il doit être à même de savoir exactement de quelle méthode il s'agit.maMéthode(). 01/12/2011 RIFAI AMAL 29 Pour les objets Le polymorphisme Mécanisme du fonctionnement de l'appel d'une méthode: Référence de type ClasseMère ClasseMère objCM. le choix de l'implémentation à exécuter ne se fait pas en fonction du type déclaré de la référence de l'objet.RIFAI Amal 2011-2012 Appel d'une méthode Dans la plupart des langages. (ClasseMère) objCM (ClasseMère) objCM Un objet de type ClasseMère Etape1 : le compilateur vérifie la structure du type de la référence (ClasseMère) à la recherche de la méthode (maMéthode()) Oui le compilateur ne déclare pas une erreur Méthode existe Non le compilateur déclare une erreur Etape2: l'interpréteur exécute la méthode (maMéthode()) déclarée dans le type réel de l'objet (obCM) Fin 01/12/2011 RIFAI AMAL 30 RIFAI AMAL 15 . à l'invocation d'une méthode. Cette technique est appelée Early-Binding (liaison précoce). JAVA utilise cette technique pour les appels de méthodes déclarées final. le choix du code à exécuter ne se fait pas statiquement à la compilation. Le lien entre l'appel et la méthode est alors établi à la compilation. mais dynamiquement à l'exécution. Cette technique est appelée le late-binding (liaison tardive). Elle a l'avantage de permettre certaines optimisations. lorsque le compilateur rencontre un appel de méthode. Par contre pour les méthodes non final. objCM=new ClasseMère(). En effet.

/* exécute la méthode afficher() de la classe Forme (de l'objet effectif) et non celle de la classe Cercle. int pY. this. ma position est: "+pX+"et "+pY+"et mon rayon est: "+ray).out. Exemple une forme n'est jamais un cercle ou carré….2.}} est: x=" RIFAI AMAL 32 RIFAI AMAL 16 . ma position +pX+"et y="+pY). float ray){ super(pX. pY = pY. /* le compilateur déclare une erreur car au cours de sa vérification dans la structure de la classe Forme.} Public static void main(String[] arg){ Forme objF.afficher (). Cercle objC=new Cercle(1. public Cercle(int pX. //exécute la méthode afficher() de Cercle objF. objF=objC.} Public void afficher(){System. this. public ClasseMère(int pX.afficher(). Exemple: Forme OF=new Forme(1.1).println ("Je suis un cercle.surface().ray=ray. Donc une référence d'un objet de type de base ne peut pas appeler une méthode spécifique.1.} Public void afficher(){ System. redéfinie ou surchargée dans l'une de ses classes dérivées. pY.5f).RIFAI Amal 2011-2012 Appel d'une méthode à l'aide d'un objet de base dans le cas de l'héritage Il est impossible de dire qu'un type de base est un type dérivé.} 01/12/2011 class Cercle extends Forme{ float ray.println ( "Je suis une forme. int pY){ this.out. il ne trouvera pas la méthode surface() (celle-ci est spécifique à la classe Cercle*/ 01/12/2011 RIFAI AMAL 31 Appel d'une méthode redéfinie dans le cas du Transtypage implicite (sens ClasseDérivée vers SuperClasse) class Forme{ int pX. pY). Cas d'une méthode spécifique à une classe dérivée OF.} // Une méthode spécifique à la classe Cercle public double surface(){return ray*ray*3. Cas d'une méthode redéfinie dans une classe dérivée OF.14f . pX = pX.

//transtypage implicite de l'objet objC (dont le type est Cercle) en type Forme double S=objF. Son but consiste à permettre à un objet de type super classe d'appeler une méthode spécifique de ses classes dérivées. ((ClassFille) objCM). this.} 01/12/2011 float ray. int pY. 01/12/2011 RIFAI AMAL 34 RIFAI AMAL 17 . pY = pY. public Cercle(int pX. Il est utilisé avec la syntaxe suivante: ClasseMère objCM. this.} // Une méthode spécifique à la classe Cercle public double surface(){return ray*ray*3. pY.out.RIFAI Amal 2011-2012 class Cercle extends Forme{ Appel d'une méthode spécifique à une classe dérivée dans le cas du Transtypage implicite (sens ClasseDérivée vers SuperClasse) class Forme{ int pX. objCM=objCF. ma position est: "+pX+"et "+pY+"et mon rayon est: "+ray).} Public static void main(String[] arg){ Forme objF. //Erreur de compilation }} 33 est: x=" RIFAI AMAL Pour les objets Le polymorphisme Transtypage explicite : sens SuperClasse vers ClasseDérivée Le transtypage explicite des références est utilisé pour convertir le type d'une référence dans un type dérivé. ma position +pX+"et y="+pY).println ( "Je suis une forme. On a fait un transtypage de la référence objCM qui a été de type de base (ClasseMère) au type dérivé ClasseFille.} Public void afficher(){System. public ClasseMère(int pX.} Public void afficher(){ System.1. pY).surface().14f . float ray){ super(pX. pX = pX. ClasseFille objCF=new ClasseFille().println ("Je suis un cercle.2.5f).out. int pY){ this. Cercle objC=new Cercle(1.ray=ray. objF=objC.méthodeSpécifiqueClasseFille().

// transtypage implicite de l'objet objC en type Forme objF. } En exécutant les lignes suivantes: Forme objF.2. Au cours de son exécution. le compilateur ne déclarera pas une erreur. Public static void main(String[] arg){ double S.1.println("Je suis un cercle. this.} void afficher(){ Je suis une forme. // transtypage explicite des références S=((Cercle) objF).out. Forme objF.} Void afficher(){ System. 01/12/2011 RIFAI AMAL 36 RIFAI AMAL 18 . puisqu'elle est déclarée dans la classe Forme.1. En effet. Cercle objC=new Cercle(1.println("je suis un cercle.surface(). on appelle une méthode spécifique d'une classe dérivée à l'intérieur d'une méthode redéfinie. objF=objC.5f). objF=objC.} } 01/12/2011 RIFAI AMAL class Cercle extends Forme{ float ray. ma position est: x="+pX+"y="+pY+"mon rayon est:"+ray+ "ma surface est: "}.out.afficher() /* Au cours de l'appel de la méthode afficher().RIFAI Amal 2011-2012 Le polymorphisme Pour les objets Transtypage explicite : class Forme{ int pX.} public double surface(){return ray*ray*3. int pY. public Forme(int pX. la version exécutée c'est celle qui correspond au type effectif de l'objet utilisé qui est de type Cercle et puisque ce type dispose de la méthode spécifique surface() donc son exécution sera possible sans déclarer des erreurs.2. sens public Cercle(int pX.5f). float ray){ super(pX. pX = pX. int pY){ this. SuperClasse vers ClasseDérivée this. ma position est: "+ pX+"et "+pY+"mon rayon est: "+ray+"et ma surface est: "+surface()). ma position est: x= "+pX+"y= "+pY). pY = pY. Exemple: On change la méthode afficher () de la classe Cercle de la manière suivante: void afficher(){ System. pY).}} 35 Notez bien: on peut éviter le transtypage explicite en Java en utilisant les techniques du late-binding.ray=ray.14f . int pY. CercleobjC=new Cercle(1.

println(" je suis un cercle .dy).}} class Cercle extends Forme{ public Cercle(int dx.0).elementAt(i)).5). Public void déplacer(){…}} 01/12/2011 RIFAI AMAL 38 Forme surface(): Abstrait nature():Abstrait déplacer() RIFAI AMAL 19 .} public void affiche(){ System. Public abstract float surface(). i++) ((Forme) (vec. Public abstract String nature().5).println("je suis une forme. vec.}} 37 Les classes abstraites Une classe abstraite est une classe qui contient une ou plusieurs méthodes non implémentées. for( int i=0 . ma position est "+px+"et "+py). Forme fo=new Forme(0. public Forme(float x.size() . py=y.out. ma position est : x="+px+" y= "+py).}} class Carré extends Forme{ public Carré(int dx. float y){px=x.out.addElement(ce).5.addElement(fo). int dy) {super(dx. La syntaxe de déclaration d'une classe abstraite est la suivante: abstract class MaClasse{…} Exemple: abstract class forme{ float pX.1.println(" je suis un carré. Vector vec=new Vector(). vec.addElement(ca). Carré ca=new Carré(3. vec. i<vec.5. ma position est "+px+"et "+py). }} 01/12/2011 RIFAI AMAL class Forme{ public float px.py.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.} public void affiche(){ System.afficher().} public void affiche(){ System.dy).out.4. int dy) {super(dx.pY.

01/12/2011 RIFAI AMAL 40 RIFAI AMAL 20 . il faut indiquer le mot clé abstract et les noms des arguments muets doivent figurer bien qu'ils ne servent à rien. • La syntaxe de déclaration d'une méthode abstraite est: droitAccès abstract valeurRetour nomMéthode (type arg1…type argN). • Pour pouvoir construire un objet à Forme: abstraite surface(): Abstrait nature(): Abstrait déplacer() Forme2D : abstraite Forme3D : abstraite partir d'une classe abstraite. • Dans l'entête d'une méthode abstraite. Donc. il faut créer une classe non abstraite héritant de la classe abstraite et implémentant toutes ses méthodes abstraites c'est-à-dire non implémentées. elle n'est pas exécutable. 01/12/2011 RIFAI AMAL périmètre(): abstract afficher() volume(): abstract afficher() Carré surface() périmètre() nature() Cercle surface() périmètre() nature() Cube surface() volume() nature() Cylindre surface() volume() nature() 39 Les classes abstraites Les méthodes abstraites • Une méthode abstraite n'est qu'une signature de méthode sans implémentation dans la classe ( elle n'a pas de corps).RIFAI Amal 2011-2012 Les classes abstraites • Une classe abstraites ne peut pas être instanciée. mais elle peut être héritable. • On peut construire une hiérarchie de classes abstraites.

elle ne doit pas être implémentée dans la classe dérivée avec un droit d'accès private mais il est possible de l'implémenter avec un droit d'accès public 01/12/2011 RIFAI AMAL 41 Exemple: abstract class Forme{ public abstract double surface( ). Exemple: public abstract double surface(). c'est-àdire si une méthode abstraite est déclarée protected.RIFAI Amal 2011-2012 Les classes abstraites Les méthodes abstraites • Une méthode abstraite doit être déclarée public ou protected au niveau de la super classe pour pouvoir la redéfinir dans les classes dérivées. public abstract String nature( ). public void afficher( ){ …} } abstract class Forme2D extends Forme{ public abstract float périmètre( ) { … } public void afficher( ){ …}} abstract class Forme3D extends Forme { public abstract double volume( ) public void afficher( ){ …}} class carré extends Forme2D{ Public double surface( ) { … } Public double périmètre(){…} Public String nature( ){…} } 01/12/2011 RIFAI AMAL Les classes abstraites class cercle extends Forme2D{ Public double surface( ) { … } Public double périmètre(){…} 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 . par contre. • L'implémentation d'une méthode abstraite dans une classe dérivée ne doit pas réduire son degré d'accès. • L'implémentation d'une méthode abstraite est déléguée à une classe dérivée. la machine java accepte de modifier son droit d'accès à un niveau supérieur.

ses méthodes ne peuvent pas être redéfinies et leur accès peut donc se faire sans recherche dynamique. 01/12/2011 RIFAI AMAL 43 Les interfaces • Une interface est une classe dont toutes les méthodes sont abstraites et publiques et tous les attributs sont constants.RIFAI Amal 2011-2012 Classes final Une classe peut être déclarée final. Une classe final ne peut pas être clonée.} 01/12/2011 RIFAI AMAL 44 RIFAI AMAL 22 . Par conséquent. Sa syntaxe de déclaration est : interface nom_interface{…} Exemple: interface monInterface{ Public static final int constante=I. dans un but de sécurité ou d’optimisation. Public int f(). Une classe final ne peut être étendue pour créer des sousclasses. L'interface est déclarée avec le mot clé interface.

RIFAI Amal 2011-2012 Les interfaces • Une classe n'hérite pas d'une interface mais elle l'implémente à l'aide du mot clé implements selon la syntaxe suivante: Class B implements monInterface{Public int f(){return 1.} } Remarques: • On ne peut hériter que d'une classe mais on peut implémenter plusieurs interfaces selon la syntaxe suivante: • Class B implements Interface1. le compilateur déclare une erreur sinon il faut déclarer que la classe est abstraite 01/12/2011 RIFAI AMAL 46 RIFAI AMAL 23 .…. • Remarque: • Si la classe n'implémente pas toutes les méthodes des interfaces qu'elle implémentent.InterfaceN{…} • Dans ce cas nous avons une excellente alternative à l'héritage multiple. 01/12/2011 RIFAI AMAL 45 Les interfaces • Pour pouvoir construire un objet à partir d'une interface. il faut définir une classe non abstraite implémentant toutes les méthodes de l'interface.

Static final int max=22. Static final int min=0. Une classe dérivée peut implémenter une interface. Static final int min=0. } 48 RIFAI AMAL 24 . Static final int max=22. Cette attitude de constance dans les définitions. protège les applications écrites pour utiliser cette interface. Void f(int n). Exemple: class B extends A implements monInterface {…} 01/12/2011 RIFAI AMAL 47 Les interfaces Une interface peut dériver d'une autre: interface Int1 extends Int2 La déclaration ci–dessus consiste à concaténer les déclarations de Int1 et Int2.} 01/12/2011 RIFAI AMAL La définition de I2 est équivalente à la déclaration suivante: Interface I2{ Void g().RIFAI Amal 2011-2012 Les interfaces Lorsque l'on crée une interface.} Interface I2 extends I1{ Void g(). on fournit un ensemble de définitions qui ne devraient plus être modifiés. Exemple: Interface I1{ Void f(int n).

RIFAI Amal 2011-2012 ? 01/12/2011 RIFAI AMAL 49 RIFAI AMAL 25 .