Vous êtes sur la page 1sur 63

Concept dobjet

Quest-ce quun objet ?

Le monde qui nous entoure est compos d'objets Ces objets ont tous deux caractristiques un tat un comportement chien tat : nom, couleur, race, poids.... comportement : manger,aboyer,renifler... Bicyclette tat : nombre de vitesses, vitesse courante, couleur comportement : tourner, acclrer, changer de vitesse

Exemples dobjets du monde rel

Franois Bonneville - Laboratoire d'Informatique de Besanon

Lapproche objet

Lapproche objet :

Programmation dirig par les donnes et non par les traitements les procdures existent toujours mais on se concentre dabord sur les entits que lon va manipuler avant de se concentrer sur la faon dont on va les manipuler Notion dencapsulation les donnes et les procdures qui les manipulent (on parle de mthodes) sont regroups dans une mme entit (la classe).

Un objet informatique

maintient son tat dans des variables (appeles champs) implmente son comportement l'aide de mthodes objet informatique = regroupement logiciel de variables et de mthodes

Cycle de vie

construction (en mmoire) Utilisation (changements dtat par affectations, comportements par excution de mthodes) destruction
Franois Bonneville - Laboratoire d'Informatique de Besanon 2

Concept de classe

La classification dun univers quon cherche modliser est sa distribution systmatique en diverses catgories, daprs des critres prcis En informatique, la classe est un modle dcrivant les caractristiques communes et le comportement dun ensemble dobjets : la classe est un moule et lobjet est ce qui est moul partir de cette classe Mais l'tat de chaque objet est indpendant des autres

Les objets sont des reprsentations dynamiques (appeles instances) du modle dfini au travers de la classe Une classe permet dinstancier plusieurs objets Chaque objet est instance dune seule classe
Franois Bonneville - Laboratoire d'Informatique de Besanon 3

La classe (1) : dfinition

Classe : description dune famille dobjets ayant une mme structure et un mme comportement. Elle est caractrise par :

Un nom Une composante statique : des champs (ou attributs) nomms ayant une valeur. Ils caractrisent ltat des objets pendant lexcution du programme Une composante dynamique : des mthodes reprsentant le comportement des objets de cette classe. Elles manipulent les champs des objets et caractrisent les actions pouvant tre effectues par les objets.

Franois Bonneville - Laboratoire d'Informatique de Besanon

La classe (2) : reprsentation graphique


Nom
Champs

Mthodes

Une classe reprsente avec la notation UML (Unified Modeling Language)

Franois Bonneville - Laboratoire d'Informatique de Besanon

Syntaxe de dfinition dune classe


Exemple : Une classe dfinissant un point Class Point Nom de la Classe
{ double x; // abscisse du point double y; // ordonne du point // translate de point de (dx,dy) void translate (double dx, double dy) { x = x+dx; y = y+dy; } // calcule la distance du point lorigine double distance() { return Math.sqrt(x*x+y*y); } }
Franois Bonneville - Laboratoire d'Informatique de Besanon 6

Attributs

Mthodes

Linstanciation (1)

Instanciation : concrtisation dune classe en un objet concret .

Dans nos programmes Java nous allons dfinir des classes et instancier ces classes en des objets qui vont interagir. Le fonctionnement du programme rsultera de linteraction entre ces objets instancis . En Programmation Oriente Objet, on dcrit des classes et lapplication en elle-mme va tre constitue des objets instancis, partir de ces classes, qui vont communiquer et agir les uns sur les autres.

Franois Bonneville - Laboratoire d'Informatique de Besanon

Linstanciation (2)

Instance

reprsentant physique d'une classe obtenu par moulage du dictionnaire des variables et dtenant les valeurs de ces variables. Son comportement est dfini par les mthodes de sa classe Par abus de langage instance = objet si nous avons une classe voiture, alors votre voiture est une instance particulire de la classe voiture. Classe = concept, description Objet = reprsentant concret dune classe

Exemple :

Franois Bonneville - Laboratoire d'Informatique de Besanon

Les constructeurs (1)

L'appel de new pour crer un nouvel objet dclenche, dans l'ordre :


L'allocation mmoire ncessaire au stockage de ce nouvel objet et l'initialisation par dfaut de ces attributs, L'initialisation explicite des attributs, s'il y a lieu, L'excution d'un constructeur.

Un constructeur est une mthode d'initialisation.


Le constructeur est ici celui par dfaut (pas de constructeur dfini dans la classe Personne)

public class Application { public static void main(String args[]) { Personne jean = new Personne() jean.setNom("Jean") ; } }

Franois Bonneville - Laboratoire d'Informatique de Besanon

Les constructeurs (2)

Lorsque l'initialisation explicite n'est pas possible (par exemple lorsque la valeur initiale d'un attribut est demande dynamiquement l'utilisateur), il est possible de raliser l'initialisation au travers d'un constructeur. Le constructeur est une mthode :

de mme nom que la classe, sans type de retour.

Toute classe possde au moins un constructeur. Si le programmeur ne l'crit pas, il en existe un par dfaut, sans paramtres, de code vide.
Franois Bonneville - Laboratoire d'Informatique de Besanon 10

Les constructeurs (3)


Personne.java public class Personne { public String nom; public String prenom; public int age; public Personne(String unNom, String unPrenom, int unAge) { nom=unNom; prenom=unPrenom; age = unAge; } } Va donner une erreur la compilation Dfinition dun Constructeur. Le constructeur par dfaut (Personne() )nexiste plus. Le code prcdent occasionnera une erreur

public class Application { public static void main(String args[]) { Personne jean = new Personne() jean.setNom("Jean") ; } }
11

Franois Bonneville - Laboratoire d'Informatique de Besanon

Les constructeurs (4)


Pour une mme classe, il peut y avoir plusieurs constructeurs, de signatures diffrentes (surcharge). L'appel de ces constructeurs est ralis avec le new auquel on fait passer les paramtres.

p1 = new Personne("Pierre", "Richard", 56); Il se fait en fonction des paramtres passs lors de l'appel (nombre et types). C'est le mcanisme de "lookup". Si le programmeur cre un constructeur (mme si c'est un constructeur avec paramtres), le constructeur par dfaut n'est plus disponible. Attention aux erreurs de compilation !
Franois Bonneville - Laboratoire d'Informatique de Besanon 12

Dclenchement du "bon" constructeur

Attention

Les constructeurs (5)


Personne.java public class Personne { public String nom; public String prenom; public int age; public void Personne() { nom=null; prenom=null; age = 0; } public String Personne(String unNom, String unPrenom, int unAge) { nom=unNom; prenom=unPrenom; age = unAge; } } Redfinition dun Constructeur sans paramtres

On dfinit plusieurs constructeurs qui se diffrencient uniquement par leurs paramtres (on parle de leur signature)

Franois Bonneville - Laboratoire d'Informatique de Besanon

13

Classe et objet en Java


Du modle la classe Java et de la classe ... ... des instances de cette classe

class Personne Personne jean, pierre; { jean = new Personne (); String nom; pierre = new Personne (); int age; float salaire; } Loprateur dinstanciation en Java est new : MaClasse monObjet = new MaClasse(); En fait, new va rserver lespace mmoire ncessaire pour crer lobjet monObjet de la classe MaClasse Le new ressemble beaucoup au malloc du C

Franois Bonneville - Laboratoire d'Informatique de Besanon

14

Objets, tableaux, types de base

Lorsqu'une variable est d'un type objet ou tableau, ce n'est pas l'objet ou le tableau lui-mme qui est stock dans la variable mais une rfrence vers cet objet ou ce tableau (on retrouve la notion dadresse mmoire ou du pointeur en C). Lorsqu'une variable est d'un type de base, la variable contient la valeur.

Franois Bonneville - Laboratoire d'Informatique de Besanon

15

Rfrences

La rfrence est, en quelque sorte, un pointeur pour lequel le langage assure une manipulation transparente, comme si c'tait une valeur (pas de drfrencement). Par contre, du fait qu'une rfrence n'est pas une valeur, c'est au programmeur de prvoir l'allocation mmoire ncessaire pour stocker effectivement l'objet (utilisation du new).

Franois Bonneville - Laboratoire d'Informatique de Besanon

16

Diffrences entre objets et types de base


Mmoire int x=3,y=3; x == y est vrai 3

3
0x768 0x852

String s1="abc",s2="abc"; s1 == s2 est faux... Quand on compare 2 variables dun type de base on compare leur valeur. Quand on compare 2 objet avec les oprateurs on compare leur rfrence (leur adresse en mmoire). Introduction de la mthode equals() pour les objets : s1.equals(s2) est vrai
Franois Bonneville - Laboratoire d'Informatique de Besanon

Abc ....

Abc ....

17

Accs aux attributs dun objet (1)


Personne.java public class Personne { public String nom; public String prenom; public int age; public void setNom(String unNom) { nom = unNom; } public String getNom() { return (nom); } }

Franois Bonneville - Laboratoire d'Informatique de Besanon

18

Accs aux attributs dun objet (2)


Application.java public class Application { public static void main(String args[]) { Personne jean = new Personne() jean.nom = "Jean" ; jean.prenom = "Pierre" ; } } Remarque : Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas initialiss, se voient affecter automatiquement une valeur par dfaut. Cette valeur vaut : 0 pour les variables numriques, false pour les boolens, et null pour les rfrences.
Franois Bonneville - Laboratoire d'Informatique de Besanon 19

Accs aux mthodes dun objet (1)


Personne.java public class Personne { public String nom; public String prenom; public int age; public void setNom(String unNom) { nom = unNom; } public String getNom() { return (nom); } }

Franois Bonneville - Laboratoire d'Informatique de Besanon

20

Accs aux mthodes dun objet (2)


Application.java public class Application { public static void main(String args[]) { Personne jean = new Personne() jean.setNom("Jean") ; } }

Franois Bonneville - Laboratoire d'Informatique de Besanon

21

Notion de mthodes et de paramtres (1)


La notion de mthodes dans les langages objets Proches de la notion de procdure ou de fonction dans les langages procduraux. La mthode cest avant tout le regroupement dun ensemble dinstructions suffisamment gnrique pour pouvoir tre rutilises Comme pour les procdures ou les fonctions (au sens mathmatiques) on peut passer des paramtres aux mthodes et ces dernires peuvent renvoyer des valeurs (grce au mot cl return).

Franois Bonneville - Laboratoire d'Informatique de Besanon

22

Mode de passage des paramtres


Java n'implmente qu'un seul mode de passage des paramtres une mthode : le passage par valeur. Consquences :

l'argument pass une mthode ne peut tre modifi, si l'argument est une instance, c'est sa rfrence qui est passe par valeur. Ainsi, le contenu de l'objet peut tre modifi, mais pas la rfrence elle-mme.

Franois Bonneville - Laboratoire d'Informatique de Besanon

23

Notion de mthodes et de paramtres (2)


exemple : public, static type de la valeur renvoye ou void couples d'un type et d'un identificateur spars par des ,

<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}

public double add (double number1, double number2)

{
return (number1 +number2); }

Notre mthode retourne ici une valeur

Franois Bonneville - Laboratoire d'Informatique de Besanon

24

Porte des variables (1)

Les variables sont connues et ne sont connues qu lintrieur du bloc dans lequel elles sont dclares
public class Bidule { int i, j, k; public void truc(int z) { int j,r; r = z; } public void machin() { k = r; } }

Ce sont 2 variables diffrentes k est connu au niveau de la mthode machin() car dclar dans le bloc de la classe. Par contre r nest pas dfini pour machin(). On obtient une erreur la compilation

Franois Bonneville - Laboratoire d'Informatique de Besanon

25

Porte des variables (2)

En cas de conflit de nom entre des variables locales et des variables globales, cest toujours la variable la plus locale qui est considre comme tant la variable dsigne par cette partie du programme

Attention par consquent ce type de conflit quand on manipule des variables globales.

Cest le j dfini en local qui est utilis dans la mthode truc()

public class Bidule { int i, k, j; public void truc(int z) { int j,r; j = z; } }


26

Franois Bonneville - Laboratoire d'Informatique de Besanon

Destruction dobjets (1)


Java n'a pas repris son compte la notion de destructeur telle quelle existe en C++ par exemple. C'est le ramasse-miettes (ou Garbage Collector - GC en anglais) qui s'occupe de collecter les objets qui ne sont plus rfrencs. Le ramasse-miettes fonctionne en permanence dans un thread de faible priorit (en tche de fond ). Il est bas sur le principe du compteur de rfrences.

Franois Bonneville - Laboratoire d'Informatique de Besanon

27

Destruction dobjets (2)

Ainsi, le programmeur na plus grer directement la destruction des objets, ce qui tait une importante source d'erreurs (on parlait de fuite de mmoire ou memory leak en anglais). Le ramasse-miettes peut tre "dsactiv" en lanant l'interprteur java avec l'option -noasyncgc. Inversement, le ramasse-miettes peut tre lanc par une application avec l'appel System.gc();

Franois Bonneville - Laboratoire d'Informatique de Besanon

28

Destruction dobjets (3)


Il est possible au programmeur d'indiquer ce qu'il faut faire juste avant de dtruire un objet. C'est le but de la mthode finalize() de l'objet. Cette mthode est utile, par exemple, pour :

fermer une base de donnes, fermer un fichier, couper une connexion rseau, etc.

Franois Bonneville - Laboratoire d'Informatique de Besanon

29

Lencapsulation (1)

Notion d'encapsulation :

les donnes et les procdures qui les manipulent sont regroupes dans une mme entit, l'objet. Les dtails d'implmentation sont cachs, le monde extrieur n'ayant accs aux donnes que par l'intermdiaire d'un ensemble d'oprations constituant l'interface de l'objet. Le programmeur n'a pas se soucier de la reprsentation physique des entits utilises et peut raisonner en termes d'abstractions.

Franois Bonneville - Laboratoire d'Informatique de Besanon

30

Lencapsulation (2)

Programmation dirige par les donnes :


pour traiter une application, le programmeur commence par dfinir les classes d'objets appropries, avec leurs oprations spcifiques. chaque entit manipule dans le programme est un reprsentant (ou instance) d'une de ces classes. L'univers de l'application est par consquent compos d'un ensemble d'objets qui dtiennent, chacun pour sa part, les cls de leur comportement.

Franois Bonneville - Laboratoire d'Informatique de Besanon

31

Contrle daccs (1)

Chaque attribut et chaque mthode d'une classe peut tre :

visible depuis les instances de toutes les classes d'une application. En d'autres termes, son nom peut tre utilis dans l'criture d'une mthode de ces classes. Il est alors public. visible uniquement depuis les instances de sa classe. En d'autres termes, son nom peut tre utilis uniquement dans l'criture d'une mthode de sa classe. Il est alors priv.

Les mots rservs sont :

public private

Franois Bonneville - Laboratoire d'Informatique de Besanon

32

Contrle daccs (2)

En toute rigueur, il faudrait toujours que :

les attributs ne soient pas visibles, Les attributs ne devraient pouvoir tre lus ou modifis que par l'intermdiaire de mthodes prenant en charge les vrifications et effets de bord ventuels. les mthodes "utilitaires" ne soient pas visibles, seules les fonctionnalits de l'objet, destines tre utilises par d'autres objets soient visibles. Cest la notion dencapsulation

Nous verrons dans la suite que lon peut encore affiner le contrle daccs
Franois Bonneville - Laboratoire d'Informatique de Besanon 33

Contrle daccs (3)


public class Parallelogramme { private int longueur = 0; // dclaration + initialisation explicite private int largeur = 0; // dclaration + initialisation explicite public int profondeur = 0; // dclaration + initialisation explicite public void affiche ( ) {System.out.println("Longueur= " + longueur + " Largeur = " + largeur + " Profondeur = " + profondeur); }} public class ProgPpal { public static void main(String args[]) { Parallelogramme p1 = new Parallelogramme(); p1.longueur = 5; // Invalide car l'attribut est priv p1.profondeur = 4; // OK p1.affiche( ); // OK }}
Franois Bonneville - Laboratoire d'Informatique de Besanon 34

Variables de classe (1)

Il peut s'avrer ncessaire de dfinir un attribut dont la valeur soit partage par toutes les instances d'une classe. On parle de variable de classe. Ces variables sont, de plus, stockes une seule fois, pour toutes les instances d'une classe. Mot rserv : static Accs :

depuis une mthode de la classe comme pour tout autre attribut, via une instance de la classe, l'aide du nom de la classe.

Franois Bonneville - Laboratoire d'Informatique de Besanon

35

Variables de classe (2)


Variable de classe

public class UneClasse { public static int compteur = 0; public UneClasse () { compteur++; } }
public class AutreClasse { public void uneMethode() { int i = UneClasse.compteur; } }

Utilisation de la variable de classe compteur dans le constructeur de la classe

Utilisation de la variable de classe compteur dans une autre classe

Franois Bonneville - Laboratoire d'Informatique de Besanon

36

Mthodes de classe (1)

Il peut tre ncessaire de disposer d'une mthode qui puisse tre appele sans instance de la classe. C'est une mthode de classe. On utilise l aussi le mot rserv static Puisqu'une mthode de classe peut tre appele sans mme qu'il n'existe d'instance, une mthode de classe ne peut pas accder des attributs non statiques. Elle ne peut accder qu' ses propres variables et des variables de classe.

Franois Bonneville - Laboratoire d'Informatique de Besanon

37

Mthodes de classe (2)


public class UneClasse { public int unAttribut; public static void main(String args[]) { unAttribut = 5; // Erreur de compilation } } La mthode main est une mthode de classe donc elle ne peut accder un attribut non lui-mme attribut de classe

Autres exemples de mthodes de classe courantes

Math.sin(x); String String.valueOf (i);

Franois Bonneville - Laboratoire d'Informatique de Besanon

38

Composition dobjets (1)

Un objet peut tre compos partir dautres objets Exemple : Une voiture compose de

5 roues (roue de secours) chacune compose dun pneu dun moteur compos de plusieurs cylindres de portires Voiture Moteur Portire etc Roue Pneu Roue Pneu Roue Pneu

Portire

Roue Pneu

Roue Pneu

Chaque composant est un attribut de lobjet compos


Franois Bonneville - Laboratoire d'Informatique de Besanon 39

Composition dobjets (2)


Syntaxe de composition dobjets
class Pneu { private float pression ; void gonfler(); void degonfler();} class Roue { private float diametre; Pneu pneu ;}

class Voiture { Roue roueAVG,roueAVD, roueARG, roueARD , roueSecours ; Portiere portiereG, portiereD; Moteur moteur;}

Franois Bonneville - Laboratoire d'Informatique de Besanon

40

Composition dobjets (3)

Gnralement, le constructeur dun objet compos doit appeler le constructeur de ses composants
public Roue () { pneu = new Pneu();} public Voiture () { roueAVG = new Roue(); roueAVD = new Roue(); roueARG = new Roue(); roueARD = new Roue(); portiereG = new Portiere(); portiereD = new Portiere(); moteur = new Moteur();}

Franois Bonneville - Laboratoire d'Informatique de Besanon

41

Composition dobjets (4)

Linstanciation dun objet compos instancie ainsi tous les objets qui le composent Voiture
RoueAV GG RoueAV D

Moteur

Portire

Portire

Roue
diamtre

Roue
diamtre

RoueAR G

Roue
diamtre

RoueAR D

RoueSecours

Roue
diamtre

Roue
diamtre

Pneu
pression

Pneu
pression

Pneu
pression

Pneu
pression

Pneu
pression

Franois Bonneville - Laboratoire d'Informatique de Besanon

42

Lhritage (1) : Concept


La modlisation du monde rel ncessite une classification des objets qui le composent Classification = distribution systmatique en catgories selon des critres prcis Classification = hirarchie de classes Exemples :

classification des lments chimiques classification des tres vivants

Franois Bonneville - Laboratoire d'Informatique de Besanon

43

Lhritage (2) : exemple


Forme gomtrique

Polygone Quadrilatre
Rectangle

Ellipse Triangle Cercle

Triangle equilateral

Triangle Rectangle

Carr

Franois Bonneville - Laboratoire d'Informatique de Besanon

44

Lhritage (3) : dfinition

Hritage : mcanisme permettant le partage et la rutilisation de proprits entre les objets. La relation dhritage est une relation de gnralisation / spcialisation. La classe parente est la superclasse. La classe qui hrite est la sous-classe.

Franois Bonneville - Laboratoire d'Informatique de Besanon

45

Lhritage (3) : reprsentation graphique

Superclasse

Lien dhritage Sous-classe

Reprsentation avec UML dun hritage (simple)


Franois Bonneville - Laboratoire d'Informatique de Besanon 46

Lhritage avec Java (1)

Java implmente le mcanisme d'hritage simple qui permet de "factoriser" de l'information grce une relation de gnralisation / spcialisation entre deux classes. Pour le programmeur, il s'agit d'indiquer, dans la sousclasse, le nom de la superclasse dont elle hrite. Par dfaut toutes classes Java hrite de la classe Object L'hritage multiple n'existe pas en Java. Mot rserv : extends

Franois Bonneville - Laboratoire d'Informatique de Besanon

47

Lhritage avec Java (2)


class Personne { private String nom; private Date date_naissance; // ... } class Employe extends Personne { private float salaire; // ... } class Etudiant extends Personne { private int numero_carte_etudiant; // ... }
Franois Bonneville - Laboratoire d'Informatique de Besanon 48

Lhritage en Java (3)

Constructeurs et hritage

par dfaut le constructeur dune sous-classe appelle le constructeur "par dfaut" (celui qui ne reoit pas de paramtres) de la superclasse. Attention donc dans ce cas que le constructeur sans paramtre existe toujours dans la superclasse... Pour forcer l'appel d'un constructeur prcis, on utilisera le mot rserv super. Cet appel devra tre la premire instruction du constructeur.

Franois Bonneville - Laboratoire d'Informatique de Besanon

49

Lhritage en Java (4)


public class Employe extends Personne { public Employe () {} public Employe (String nom, String prenom, int anNaissance) { super(nom, prenom, anNaissance); } } public class Personne { public String nom, prenom; public int anNaissance; public Personne() { nom=""; prenom=""; } public Personne(String nom, String prenom, int anNaissance) { this.nom=nom; this.prenom=prenom; this.anNaissance=anNaissance; } }
50

Appel explicite ce constructeur avec le mot cl super

Franois Bonneville - Laboratoire d'Informatique de Besanon

Lhritage en Java (5)


public class Personne { public String nom, prenom; public int anNaissance; public Personne() { nom=""; prenom=""; } public Personne(String nom, String prenom, int anNaissance) { this.nom=nom; this.prenom=prenom; this.anNaissance=anNaissance; } } public class Object { public Object() { / ... } }

Appel par dfaut dans le constructeur de Personne au constructeur par dfaut de la superclasse de Personne, qui est Object

Franois Bonneville - Laboratoire d'Informatique de Besanon

51

Redfinition de mthodes

Une sous-classe peut redfinir des mthodes existant dans une de ses superclasses (directe ou indirectes), des fins de spcialisation.

Le terme anglophone est "overriding". On parle aussi de masquage. La mthode redfinie doit avoir la mme signature.

class Employe extends Personne class Cadre extends Employe { { redfinition private float salaire; public calculePrime() public calculePrime( ) { { // ... // ... } } // ... } }
Franois Bonneville - Laboratoire d'Informatique de Besanon 52

Recherche dynamique des mthodes (1)

Le polymorphisme

Capacit pour une entit de prendre plusieurs formes. En Java, toute variable dsignant un objet est potentiellement polymorphe, cause de l'hritage. Polymorphisme dit dhritage dclenchement de la mthode la plus spcifique dun objet, c'est-dire celle correspondant au type rel de l'objet, dtermin l'excution uniquement (et non le type de la rfrence, seul type connu la compilation, qui peut tre plus gnrique). Cette dynamicit permet d'crire du code plus gnrique.

le mcanisme de "lookup" dynamique :

Franois Bonneville - Laboratoire d'Informatique de Besanon

53

Recherche dynamique des mthodes (2)


Employe jean = new Employe(); jean.calculePrime();

Employe salaire : Double calculePrime()

Cadre calculePrime()

Employe jean = new Cadre(); jean.calculePrime();

Franois Bonneville - Laboratoire d'Informatique de Besanon

54

Surcharge de mthodes (1)

Dans une mme classe, plusieurs mthodes peuvent possder le mme nom, pourvu qu'elles diffrent en nombre et/ou type de paramtres.

On parle de surdfinition ou surcharge, on encore en anglais doverloading en anglais. Le choix de la mthode utiliser est fonction des paramtres passs l'appel. Ce choix est ralis de faon statique (c'est--dire la compilation). Trs souvent les constructeurs sont surchargs (plusieurs constructeurs prenant des paramtres diffrents et initialisant de manires diffrentes les objets)
Franois Bonneville - Laboratoire d'Informatique de Besanon 55

Oprateur instanceof

L'oprateur instanceof confre aux instances une capacit d'introspection : il permet de savoir si une instance est instance d'une classe donne.

Renvoie une valeur boolenne


if ( ... ) Personne jean = new Etudiant(); else Personne jean = new Employe();
//... if (jean instanceof Employe) // discuter affaires else // proposer un stage
Franois Bonneville - Laboratoire d'Informatique de Besanon 56

Forage de type / transtypage (1)

Lorsqu'une rfrence du type d'une classe dsigne une instance d'une sous-classe, il est ncessaire de forcer le type de la rfrence pour accder aux attributs spcifiques la sous-classe. Si ce n'est pas fait, le compilateur ne peut dterminer le type rel de l'instance, ce qui provoque une erreur de compilation. On utilise galement le terme de transtypage Similaire au cast en C

Franois Bonneville - Laboratoire d'Informatique de Besanon

57

Forage de type / transtypage (2)


class Personne { private String nom; private Date date_naissance; // ... } class Employe extends Personne { public float salaire; // ... } Personne jean = new Employe (); float i = jean.salaire; // Erreur de compilation float j = ( (Employe) jean ).salaire; // OK A ce niveau pour le compilateur dans la variable jean cest un objet de la classe Personne, donc qui na pas dattribut salaire

On force le type de la variable jean pour pouvoir accder lattribut salaire . On peut le faire car cest bien un objet Employe qui est dans cette variable
58

Franois Bonneville - Laboratoire d'Informatique de Besanon

Lautorfrence : this (1)

Le mot rserv this, utilis dans une mthode, dsigne la rfrence de l'instance laquelle le message a t envoye (donc celle sur laquelle la mthode est excute ). Il est utilis principalement :

lorsqu'une rfrence l'instance courante doit tre passe en paramtre une mthode, pour lever une ambigut, dans un constructeur, pour appeler un autre constructeur de la mme classe.

Franois Bonneville - Laboratoire d'Informatique de Besanon

59

Lautorfrence : this (2)


class Personne { public String nom; Personne (String nom) { this.nom=nom; } }

Pour lever lambigut sur le mot nom et dterminer si cest le nom du paramtre ou de lattribut

public MaClasse(int a, int b) {...}


public MaClasse (int c) { this(c,0); } Appelle le constructeur MaClasse(int a, int b)

public MaClasse () { this(10); }

Appelle le constructeur MaClasse(int c)

Franois Bonneville - Laboratoire d'Informatique de Besanon

60

Rfrence la superclasse

Le mot rserv super permet de faire rfrence au constructeur de la superclasse directe mais aussi dautres informations provenant de cette superclasse.
Appel la mthode calculPrime() de la superclasse de Cadre

class Employe extends Personne { private float salaire; public float calculePrime() { return (salaire * 0,05); } // ... }

class Cadre extends Employe { public float calculePrime() { return (super.calculePrime() / 2); } // ... }
Franois Bonneville - Laboratoire d'Informatique de Besanon 61

Classes abstraites (1)

Il peut tre ncessaire au programmeur de crer une classe dclarant une mthode sans la dfinir (c'est-dire sans en donner le code). La dfinition du code est dans ce cas laisse aux sous-classes. Une telle classe est appele classe abstraite. Elle doit tre marque avec le mot rserv abstract. Toutes les mthodes de cette classe qui ne sont pas dfinies doivent elles aussi tre marques par le mot rserv abstract. Une classe abstraite ne peut pas tre instancie.
Franois Bonneville - Laboratoire d'Informatique de Besanon 62

Classes abstraites (2)


Par contre, il est possible de dclarer et d'utiliser des variables du type de la classe abstraite. Si une sous-classe d'une classe abstraite ne dfinit pas toutes les mthodes abstraites de ses superclasses, elle est abstraite elle aussi.
public abstract class Polygone { private int nombreCotes = 3; public abstract void dessine (); // methode non dfinie public int getNombreCotes() { return(nombreCotes); } }
Franois Bonneville - Laboratoire d'Informatique de Besanon 63