Vous êtes sur la page 1sur 64

2e dition JAVA 5 et 6

Jrme Bougeault

TSoft et Groupe Eyrolles, 2003, 2008, ISBN : 978-2-21212250-3

Classes et objets Les constructeurs Proprits Les mthodes Lhritage Les interfaces Les relations Les packages Le transtypage Atelier

Module 3 :Concepts objet avec Java

Objectifs
Java est un langage orient objet. Il est donc ncessaire, pour bien matriser ce langage, de comprendre et d'assimiler les concepts de lobjet. Ce module prsente tous les aspects de l'objet : comment crer et utiliser des objets, quels sont les diffrents types d'objets, comment rutiliser du code objet, de quelle faon sont construites les applications orientes objet, etc.

Contenu
Nous allons voir ces concepts en partant de leur reprsentation en UML, et en examinant leur implmentation en Java. Crer des objets partir des classes. Modifier les objets. Utiliser les services d'un objet. L'hritage entre les objets. Les classes de concepts abstraits. Les relations et les associations entre les objets. Les packages de classes. Le transtypage des objets.

Eyrolles/Tsoft - Java la matrise

3-1

Module 3 : Concepts objet avec Java

La classe
La classe
La classe dfinit deux types de membres : les attributs ; les mthodes. Les membres peuvent tre privs ou publics. Classe
+ Attribut public - Attribut priv

Animal
+ Espce + Race + Man ger + Dormir - Respirer

+ Mthode publique - Mthode prive

Dans cet exemple, la classe Animal possde : des attributs : Espce et Race ; des mthodes : Manger, Dormir et Respirer. La mthode Respirer est prive (seule cette classe peut lappeler).
Module 3 : Concepts de l Objet- Diapo 3.1

TSOFT J av a : la m atris e

Lorsque l'on crit des programmes, on comprend bien la diffrence entre le source du programme et son instance d'excution : On commence par crire un programme (dans un langage de programmation quelconque), qui sera compos d'instructions qui sont des oprations sur des variables. Ce programme est stock dans un fichier de caractres (les langages informatiques sont gnralement proches du langage naturel que nous parlons). Lorsque le programme est crit, il peut alors tre excut. Les variables prennent leur place dans la mmoire, et les instructions sont transmises au microprocesseur. Un programme informatique est donc construit partir de deux choses : des variables en mmoire et des instructions. En programmation objet, c'est la mme chose. La diffrence rside simplement dans le fait que l'on peut (et que l'on doit) btir les applications partir de briques que l'on appelle les objets. Les objets sont de petits programmes qui possdent leurs propres variables et leurs propres instructions. Ainsi donc, au lieu de dvelopper un seul gros programme, nous allons en dvelopper de nombreux petits, qui communiqueront ensemble. Le processus de ralisation des objets est le mme que celui des programmes classiques : On crit le code de l'objet. Il contient des dclarations de variables et des instructions. On appelle cela la classe. Une classe est donc simplement un programme source, et il tient dans un fichier. Puis on excute le programme. La classe s'excute sur l'ordinateur, son instanciation s'appelle alors un objet. Un objet est donc le programme tel qu'il s'excute dans la mmoire de l'ordinateur.

3-2

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Les membres
Un objet contient des variables et du code, dclars et dfinis dans la classe. Ces deux composants s'appellent les membres. On a donc deux types de membres : Les Attributs : aussi appels Champs, Proprits ou variables d'instance, ce sont les variables dfinies (dclares) dans la classe. Les Mthodes : les instructions du code de la classe sont regroupes dans des fonctions. On appelle ces dernires les mthodes de l'objet. On dit qu'elles dfinissent le comportement de l'objet. En Java, les classes sont dfinies dans des groupes d'instructions (entre accolades) prcds de la dclaration class suivie du nom de la classe :
class NomDeLaClasse { // Dfinition des proprits (variables) et des // mthodes (code) de la classe }

Le nom de la classe doit tre unique. C'est ce nom qui sera utilis pour crer des objets partir de la classe.

La notation UML
Les classes sont dfinies en phase de conception. On s'appuie sur cette notation pour concevoir les applications. Comme nous le verrons, un programme objet est compos d'un grand nombre de classes (et donc d'objets) qui interagissent entre eux. De plus, les relations qui existent entre ces objets sont nombreuses et mettent en uvre de nombreux concepts. La complexit d'une application objet peut tre telle qu'une description par le langage peut s'avrer trs difficile. Comme on dit souvent, un petit schma vaut mieux qu'une longue explication. C'est en partant de ce principe qu'a t imagine la notation UML. Cette notation permet de reprsenter tous les concepts de l'objet au travers d'une symbolique graphique. Nous verrons cette symbolique dans les transparents de ce module. Le transparent ci-avant montre la reprsentation d'une classe en notation UML. Le symbole est donc un rectangle spar en trois parties : En haut : le nom de la classe. Au dessous : la liste des proprits. Encore au dessous : la liste des mthodes. L'exemple animal qui est prsent possde deux proprits et trois mthodes : Espce et Race est propre chaque animal, et ces champs sont publics car on veut pouvoir accder ces informations de l'extrieur de l'objet. Manger, Dormir et Respirer sont des mthodes, le code est donc le mme pour tous les objets Animal. Les animaux mangent, dorment et respirent donc tous, et tous de la mme manire. On note que Respirer est priv, cette mthode est donc interne chaque animal. En effet, la respiration est un mcanisme qui ne peut tre provoqu de faon externe.

Eyrolles/Tsoft - Java la matrise

3-3

Module 3 : Concepts objet avec Java

Les objets
Les objets
Medor: Animal
espece= Chien race= Teckel

Animal
+ espece: Espece + race: Race + Man ger() + Dormir() - Respirer()

Les objets sont des instances dune classe

Minou: Animal
espece= Chat race= Goutire

Titi: Animal
espece= Oiseau race= Canari
TSOFT J av a : la m atris e Module 3 : Concepts de l Objet- Diapo 3.2

Les objets sont crs partir des classes, la classe est donc une sorte de moule. L'objet est donc moul partir de la classe. On peut aussi dfinir la classe comme un ensemble dlments (appels objets) partageant les mmes comportements et une mme structure. Un objet est appel instance de classe. Il est cr (on dit aussi construit) partir dune classe, et rside dans la mmoire centrale de lordinateur. Un objet est un module logiciel encapsul. Il possde : Un tat : ce sont les valeurs de ses attributs qui sont dfinies dans la classe. Un comportement : cest lensemble de ses mthodes, dfinies et implmentes dans la classe. Une identit : cest ce qui permet de lidentifier pour le manipuler. Tous les objets issus dune mme classe ont strictement la mme structure et les mmes comportements.

Les constructeurs
En Java, cest loprateur new qui permet de crer des objets. Il prend en argument le type de lobjet (cest dire le nom de la classe) et ventuellement des paramtres qui pourront tre utiliss par la mthode de cration de lobjet, ce que lon appelle le constructeur. Exemple :
Animal ami= new Animal();

Cette ligne effectue les oprations suivantes : Dclaration dune variable a contenant la rfrence d'un objet de type Animal. Assignation de a : on met la rfrence de l'objet cr (oprateur new). Si nous reprenons l'exemple de transparent, l'implmentation de la classe Animal sera la suivante :

3-4

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


public class Animal { // Dfinition des proprits public String espece; // L'espce est dfinie par une chane public String race; public void manger() { // Instructions pour manger } public void dormir() { // Instructions pour dormir } private void respirer() { // Inspirer, expirer } } // La race aussi // Dfinition des mthodes

Accs aux membres


Pour accder aux variables d'un objet, ou invoquer (excuter) une de ses mthodes, on a besoin de sa rfrence (obtenue par le new). A partir de sa rfrence, on va "pointer" le membre l'aide de l'oprateur point (.). Exemple :
ami.race= "Caniche"; // Initialisation System.out.println( "Race: "+ami.race); // Rcupration ami.dormir(); // Invocation de la mthode

La cration et l'initialisation des trois objets Mdor, Minoux et Titi se feront de la manire suivante (dans le main ou dans n'importe quelle mthode d'un autre objet) :
// Dclaration de trois variables objet: Animal medor; Animal minou; Animal titi; // On cre les trois nouveaux animaux: medor= new Animal(); medor= new Animal(); titi= new Animal(); // On spcifie leurs proprits: medor.espece= "Chien"; medor.race= "Teckel"; minou.espece= "Chat"; minou.race= "Gouttire"; titi.espece= "Oiseau"; titi.race= " Canari";

Eyrolles/Tsoft - Java la matrise

3-5

Module 3 : Concepts objet avec Java

Les constructeurs
Les constructeurs
Animal
+ espece: Espece + race: Race Animal() An imal( String) Animal( String, Strin g) ~Animal + Man ger() + Dormir() - Respirer()

Constructeur sans argument Constructeur avec un argument (de type String) Constructeur avec deux arguments (tous deux de type String) Destructeur

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet- Diapo 3.3

L'oprateur new permet de crer des objets. Le processus de cration dans la machine virtuelle Java s'effectue en quatre tapes : Rservation de la mmoire : l'objet crer est typ, la JVM connat donc la taille mmoire rserver pour y mettre l'objet. Cration d'un objet "vierge" dans l'espace mmoire allou (les proprits sont initialises 0). Initialisation de l'objet : appel d'un constructeur dfini dans l'objet. Renvoi de la rfrence de l'objet (son adresse) l'argument de gauche de l'oprateur new, qui doit tre une variable du mme type que l'objet cr. Le constructeur est une sorte de mthode, qui sera appele uniquement au moment de la cration de l'objet. Il permet deffectuer des oprations dinitialisation de lobjet. Il est dfini dans la classe. On peut avoir autant de constructeurs que lon souhaite dans une classe. Toutefois, deux constructeurs dune mme classe ne peuvent avoir le mme nombre et les mmes types darguments. Exemple :
class Animal { // Dfinition des proprits public String espece; // L'espce est dfinie par une chane public String race; // Constructeurs public Animal( String e, String r) { espece= e; // Initialisation de la proprit espece // La race aussi

3-6

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


race= r; } // Constructeur sans argument public Animal() { espece=""; race=""; } } // Initialisation de la proprit race

En Java, les constructeurs doivent tre dfinis en respectant imprativement les deux rgles suivantes : Ils portent obligatoirement le mme nom que celui de la classe (attention aux majuscules et aux minuscules, Java est case sensitif). Ils sont dfinis comme des mthodes, toutefois ils ne sont pas typs (ils ne retournent pas de valeur). Lors de la cration d'un objet, seul un constructeur est appel, celui qui a t utilis lors de sa construction. Exemple :
Animal medor; // Utilisation du constructeur qui prend deux arguments medor= new Animal( "Chien", "Teckel"); // Utilisation du constructeur sans argument: minou= new Animal();

this et null
this est un mot cl qui reprsente l'objet dans lequel on est. Il a deux utilisations : Utilis comme rfrence, c'est la rfrence de lobjet dans lequel on est. Utilis comme mthode, c'est un des constructeurs de l'objet dans lequel on est. Ce constructeur ne peut tre appel que par un autre constructeur de ce mme objet. Exemple :
class Animal { // Dfinition des proprits public String espece; // L'espce est dfinie par une chane public String race; // Constructeurs public Animal( String espece, String race) { // Utilisation de this comme rfrence sur moi-mme // Permet de faire le distingo entre espece variable locale // et espece variable d'instance (this.espece) this.espece= espece; this.race= race; } // Constructeur sans argument // La race aussi

Eyrolles/Tsoft - Java la matrise

3-7

Module 3 : Concepts objet avec Java


public Animal() { // Appel du constructeur par dfaut this( "", ""); // Ci-dessous est tentant mais syntaxiquement incorrect // Animal( "", ""); } }

null est la valeur dune variable objet non initialise. A la cration des objets, toutes leurs proprits sont initialises 0. Cela signifie que : Les proprits ayant un type primitif (int, float, boolean) sont initialises 0 (pour les entiers), 0.0 (pour les nombres virgule flottante) ou encore false (pour les boolens). Les proprits ayant un type objet sont initialises null. Exemple :
String s; // s est gal null String s= new String( "Hello"); // s nest pas null

Constructeur par dfaut


La premire classe Animal que nous avons fait en dbut de module ne possdait pas de constructeur. Si on ne dfinit pas de constructeur dans une classe, alors Java nous en met un, par dfaut, et de faon transparente. Ce constructeur par dfaut ne possde pas d'argument. Donc, une classe possde toujours au moins un constructeur. Remarque : Java ne met un constructeur par dfaut que dans les classes qui n'en ont pas. Ainsi, si on dfinit un constructeur qui prend des arguments, cette classe n'aura alors plus de constructeur sans argument.

Le destructeur
Contrairement certains autres langages, Java ne possde pas de destructeur. En effet, la destruction des objets est la charge du Garbage Collector. Toutefois, il existe une mthode qui est appele par le Garbage Collector lorsque celui-ci va dtruire l'objet.
public void finalize();

Cette mthode peut tre implmente si on souhaite y mettre du code.

3-8

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Zoom sur les proprits


Zoom sur les proprits
medor Chien Animal
+ espece: Espece + race: Race longevite: int

Teckel

medor.espece medor.race medor.longevite

15

minou Chat Persan

minou.espece minou.race minou.longevite Animal.longevite

Les variables dinstance sont stockes dans les objets. Les variables de classe sont stockes dans les classes.
TSOFT J av a : la m atris e Module 3 : Concepts de l Objet- Diapo 3.4

Ce sont les variables internes chaque objet cr partir de la classe. On appelle cela aussi des champs, des attributs ou encore des variables dinstance. Ces variables peuvent tre de type simple, mais aussi de type objet. Elles contiennent alors des rfrences dautres objets. Les modifier est aussi appel configurer l'objet . Elles sont dfinies dans la classe, mais initialises dans lobjet. Chaque objet a donc des valeurs diffrentes dans ses champs. Comme on le voit sur la figure, elles sont stockes dans la mmoire de chaque objet.

Attributs de classe
Une variable de classe est globale toutes les instances de la classe. Sa valeur est donc partage parmi tous les objets construits avec cette classe. Sa valeur nest pas stocke dans l'espace mmoire des objets, mais dans la classe elle mme. On peut donc accder sa valeur en dehors de toute instance de la classe. Sa reprsentation UML est symbolise simplement par une proprit souligne (voir le transparent). En Java, les attributs static sont dclars l'aide du modificateur static. Exemple :
class Animal { Espece espece; // Java est case-sensitif, d'o la Race race; // distinction entre Espece et espece et // entre Race et race static int longevite; }

Eyrolles/Tsoft - Java la matrise

3-9

Module 3 : Concepts objet avec Java


On peut accder une proprit static partir d'une instance, mais aussi directement partir de la classe :
Animal medor= new Animal(); medor.longevite= 15; Animal minou= new Minou(); // minou.longevite = medor.longevite = 15 Animal.longevite= 20; // Maintenant minou.longevite = medor.longevite = 20

Voici un clbre exemple intressant dcortiquer :


System.out.println( "Hello");

On voit dans cette ligne : println est une mthode prenant en argument une chane de caractres. out est un objet dans lequel est invoque la mthode println. System est une classe dans laquelle out est un attribut static. Remarque : Afin de faciliter la lecture du code, et notamment de distinguer les noms des classes des noms des objets, Sun conseille de suivre la convention qui consiste toujours donner aux classes un nom qui commence par une majuscule, et aux objets, attributs et mthodes un nom qui commence par une minuscule. Je vous conseille vivement de suivre cette convention. En tenant compte de cette remarque, on en dduit que System est bien une classe, donc out est obligatoirement une proprit statique. Un autre exemple est la mthode main. Le dmarrage d'un programme Java passe par le dmarrage de la machine virtuelle Java, en passant en argument le nom d'une classe. Cette classe doit imprativement avoir un point d'entre sous la forme d'une mthode statique appele main (ce qui veut dire principale en anglais). La signature de cette mthode doit tre prcisment la suivante :
public static void main( String [] args);

Cette mthode prend en argument un tableau de chanes de caractres qui sont les arguments passs en paramtres sur la ligne de commande.

Attributs et mthodes final


Le modificateur final permet de spcifier un membre qui ne pourra pas tre modifi. Cest tout simplement une constante. Il sera donc ncessaire de toujours linitialiser lors de sa dclaration. Exemple :
public final double PI=3.141592;

3-10

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Zoom sur les mthodes


Zoom sur les mthodes
Animal
+ espece: Espece + race: Race + Manger( Nourriture) + Dormir() - Respirer()

La signature dune mthode : son nom le nombre darguments les types darguments

Les mthodes accdent toutes les proprits de lobjet. Les mthodes de classe naccdent quaux variables de classe.
TSOFT J av a : la m atris e Module 3 : Concepts de l Objet- Diapo 3.5

Ce sont les actions lmentaires que peut effectuer un objet. On appelle cela aussi les services de lobjet. Lensemble des mthodes dfinissent le comportement des objets. Pratiquement, ce sont des fonctions crites laide du langage de programmation. Les mthodes permettent aux objets de communiquer entre eux. On dit souvent que les objets communiquent par messages. Le mcanisme repose sur l'appel des mthodes, les messages sont alors les arguments. On utilise le point comme oprateur daccs aux mthodes, comme pour les proprits. Exemple :
Animal medor= new Animal("Chien", "Teckel"); o.toString(); int i= o.sonEntier; // Invocation de la mthode toString de o // Accs l'attribut sonEntier de o

La signature de la mthode
Elle reprsente son nom, mais aussi le nombre et les types de ses arguments. Dans une classe, deux mthodes ne peuvent pas avoir la mme signature, ce qui veut dire que deux mthodes peuvent avoir le mme nom, condition davoir des arguments diffrents. Exemples :
public class Animal { // Proprits public String espece, race, longevite; // Mthodes public boolean estDeRaceConnue() {

Eyrolles/Tsoft - Java la matrise

3-11

Module 3 : Concepts objet avec Java


if( race != null) return true; else return false; } public void afficher() { System.out.println( "Espece: "+espece); } public void afficher( String nom) { System.out.println( "L'animal "+nom+" est un "+espece); } // Ci-dessous erreur car signature dj utilise public boolean afficher() { return true; } }

Dans l'exemple ci-dessus, on a dfini trois mthodes afficher. Bien qu'elles possdent le mme nom, les deux premires n'ont pas les mmes arguments (la premire n'en a pas et la deuxime en a un de type String). Elles n'ont donc pas la mme signature, et peuvent cohabiter dans la mme classe. Par contre, la troisime, bien qu'elle ne soit pas du mme type que les deux premires (boolean au lieu de void), pose un problme car sa signature est la mme que la premire (pas d'argument). Ce problme sera dtect la compilation qui ne pourra pas s'effectuer.

Le polymorphisme
Pourquoi faire plusieurs mthodes qui possdent le mme nom ? C'est la base d'une notion que lon appelle le polymorphisme. Ce terme vient de deux mots grecs : Poly et Morphe. On peut les traduire par "diffrentes formes". Le principe est d'implmenter de diffrentes manires des services, destins faire la mme chose, parce qu'ils s'appuient sur des donnes diffrentes. Dans notre exemple, les mthodes afficher sont destines faire la mme chose : afficher. Toutefois, les arguments tant diffrents, le code le sera aussi.

Passage des arguments


En Java, les arguments sont passs par valeur. Cela signifie que lorsque l'on appelle une mthode en lui passant des variables en argument, c'est la valeur de la variable et non pas son adresse qui est passe. Ainsi, si la mthode modifie l'argument, la valeur initiale de la variable ne sera pas touche. Exemple :
public void ajouter( int a, int b) { a=a+b; } int e= 3; // e = 3

3-12

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


ajouter( e, 2); // e = 3 et non pas 5

Toutefois, il y a un effet de bord intressant signaler : les variables objets contiennent les rfrences (adresses) de ces objets. Passer en argument une variable objet, c'est passer son adresse (et non pas une copie). Par exemple, supposons la classe suivante :
public class Entier { int valeur; }

Examinons le code ci-dessous :


public void ajouter( Entier e, int montant) { e.valeur = e.valeur+montant; } Entier e; e.valeur= 3; ajouter( e, 2); // e.valeur est maintenant 5!

On voit bien que l'objet pass en argument a t modifi. La variable e passe en argument n'a pas t modifie (elle possde toujours la mme rfrence de l'objet qu'elle pointe). Par contre, c'est le contenu de l'objet qui a t modifi par la mthode ajouter.

Les variables locales


On peut dfinir des variables de travail l'intrieur d'une mthode. Ces variables seront soumises aux rgles suivantes : Elles ne sont visibles qu' l'intrieur de la mthode. Leur contenu est perdu ds que l'on quitte la mthode (elles ne sont pas conserves entre deux appels la mme mthode). Elles ne sont pas initialises 0 par dfaut. Exemple :
public class TestVarLocales { static int b= 0; public static void fonction(){ int a= 0; // Initialisation obligatoire variables locales System.out.println( "a est : "+a+" et b : "b); if( a == 0) a= 1; if( b == 0) b= 2; } public static void main( String [] args) { fonction(); fonction(); } }

Eyrolles/Tsoft - Java la matrise

3-13

Module 3 : Concepts objet avec Java


Ce programme donne :
a est : 0 et b : 0 a est : 0 et b : 2

On voit donc bien que la valeur de la variable locale a n'est pas conserve entre deux appels la fonction, alors que celle de la variable d'instance b est bien conserve. On remarque que la fonction et la variable b sont dclars en static, car elles sont appeles par la mthode main qui est static aussi (nous verrons cela plus loin). Enfin, il faut noter l'obligation d'initialiser les variables locales avant de les utiliser. Java n'initialise pas automatiquement les variables locales 0 comme c'est le cas pour les variables d'instance. Le compilateur effectue d'ailleurs une vrification dans le code. Si on dclare une variable locale non initialise, ds la premire instruction qui cherche rcuprer son contenu, une erreur sera gnre par le compilateur.

Type et retour des mthodes


Les mthodes sont types. Elles peuvent avoir un type parmi : Tous les types primitifs (int, float, boolean, etc.). Tous les types objet (String, Date, Animal, LecteurDeMonLivre, etc.). void, c'est dire qu'elles ne retournent pas de valeur. A l'exception des mthodes de type void, les mthodes doivent obligatoirement retourner une valeur de leur type. On utilise pour cela l'instruction return suivie de la valeur retourner (qui peut tre dans une variable). Exemples :
public int somme( int a, int b) { return a+b; } public String ditBonjourALaDame() { return "Bonjour Madame"; } public Animal rendUnChien( String race) { Animal a= new Animal( "Chien", race); return a; }

Remarque : Pour les "procdures" (mthodes de type void, on peut aussi utiliser l'instruction return (sans valeur de retour) simplement pour quitter la mthode et revenir l'appelant.

Accesseurs et mutateurs
Ce sont des mthodes permettant laccs en lecture (accesseur) et en criture (mutateur) aux attributs. Il peut tre intressant de dclarer tous les attributs en priv, et de permettre laccs certains d'entre eux au travers de mthodes publiques.

3-14

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


Cela permet par exemple de : Comptabiliser leur accs. Dfinir une logique daccs implmente dans la mthode. Tracer dans une log les accs. Vrifier les droits daccs par un mcanisme de scurit implment dans la mthode. Gnralement, ces mthodes portent des noms qui sont composs de get (en lecture) ou de set (en criture) suivi du nom de la proprit. Exemples :
public class Animal { // Proprits en private private String espece; private String race; // Mthodes d'accs l'espece public String getEspece() { return espece(); } public void setEspece( String espece) { this.espece= espece; } // Accs la race en lecture seule (pas de set) public String getRace() { return race; } }

Remarque : Une mthode public peut accder un membre private, et vice-versa.

Les mthodes nombre variable darguments

Java 5

Cette fonctionnalit qui existe en C est maintenant supporte par Java. Elle permet de spcifier un nombre indfini darguments dun mme type. Dans cet exemple, notez la forme particulire de la boucle for pour rcuprer lensemble des arguments disponibles :
public static int somme( int ... args) { int somme=0 ; for( int x : args) { somme+=x; } return somme; }

Cet exemple pourra tre invoqu de la manire suivante :


System.out.print( "somme de 3, 4, 5,12 et 7= " +somme(3, 4, 5, 12, 7));

Eyrolles/Tsoft - Java la matrise

3-15

Module 3 : Concepts objet avec Java


La variable contenant les arguments sera en fait un tableau. Lexemple ci-dessus est quivalent ceci :
public static int somme( int args) { int somme=0 ; for( int n=0 ; n < args.length ; n++) somme+= args[n]; } return somme; } {

Mthodes de classe
Elles sont spcifies par le modificateur static (comme pour les variables de classes). Ces mthodes peuvent, comme pour les variables de classe, tre utilises au travers d'une instance de la classe, ou directement dans la classe. Cela explique qu'elles ne peuvent faire rfrence qu' des variables locales ou des variables de classe, et qu'elles ne peuvent invoquer que dautres mthodes de classe. Exemple :
import java.util.Date; public class Random{ private static int random= (int)(new Date().getTime()); public static int random() { random= random ^ (random * random); return random; } public static void main( String [] args) { for( ;;) System.out.println( "Alatoire: "+Random.random()); } }

Cet exemple est un petit gnrateur de nombres alatoires. La mthode de calcul est static. Elle peut donc tre appele directement partir de la classe, c'est d'ailleurs ce qui est fait dans le main :
System.out.println( "Alatoire: "+Random.random());

Cette ligne se trouve dans un for( ;; ) qui est donc une boucle sans fin (il sera ncessaire de faire un CTRL+C pour stopper le dfilement de nombres alatoires). La mthode random() utilise la variable static random (on peut donner une proprit le mme nom qu'une mthode). Cette variable, de type int, est initialise la dclaration. Cette initialisation est effectue automatiquement ds la mie en mmoire de la classe (au dmarrage de la JVM). La valeur d'initialisation de random est le rsultat de l'invocation de la mthode getTime() de l'objet cr partir de la classe java.util.Date. Nous parlerons des packages et de la classe Date un peu plus tard, considrons simplement que la

3-16

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


variable random est initialise au nombre de millisecondes depuis le 1er janvier 1970 au moment o le programme a t dmarr. Chaque appel la mthode random va modifier la variable random en effectuant un ou exclusif entre sa valeur et le rsultat de son carr. Cela nous donnera chaque fois une valeur diffrente qui peut s'apparenter un nombre alatoire (mme si ce n'est pas tout fait alatoire ! Enfin, on remarque le cast l'appel de getTime() :
random= (int)(new Date().getTime());

En effet, getTime() est une mthode qui retourne un long. Il y aura perte d'information (cela ne nous gne pas car on cherche simplement un nombre alatoire). Pour rsumer et bien comprendre quand les variables sont initialises : Les variables d'instance dclares avec une initialisation sont initialises la cration de l'instance (cration de l'objet avec l'oprateur new). Les variables de classe dclares avec une initialisation sont initialises au dmarrage de la machine virtuelle (dmarrage de l'application).

Les blocs d'initialisation statique


L'initialisation d'une variable peut ncessiter un code un peu plus complexe qu'une simple assignation. Dans le cas de variables d'instance, les constructeurs sont faits pour cela. Dans le cas de variables de classe, on dispose des blocs d'initialisation statique. Ils permettent dexcuter du code au moment du dmarrage de la machine virtuelle Java. Ils sont simplement positionns dans la classe (entre deux accolades). Sil en existe plusieurs, ils seront alors excuts en squence. On peut faire le parallle entre ces blocs et les constructeurs, aux diffrences que : Ils ne reoivent pas de paramtres (mais on peut toutefois aller les chercher dans un fichier de configuration : nous verrons notamment plus tard la classe Property). Ils ne sont excuts quune fois au dmarrage de la JVM (alors que le constructeur est excut chaque cration dobjet). Exemple :
public class DebugLog { static OutputStream sortie; // Flux dcriture static { // Dbut dun bloc dinitialisation sortie= System.out; } }

Dans cet exemple, on initialise la proprit sortie l'objet OutputStream qui spcifie la sortie standard (les entres/sorties sont vues dans un prochain module).

Eyrolles/Tsoft - Java la matrise

3-17

Module 3 : Concepts objet avec Java

Lhritage
Lhritage
Animal

Gnralisation

Marin
Hritage multiple

Terrien

Dauphin
TSOFT Java : la matrise

Loutre

Vache
Module 3 : Concepts de l Objet- Diapo 3.6

L'hritage permet de crer des classes en rutilisant des classes dj existantes. Les nouvelles classes ainsi cres peuvent contenir de nouveaux membres (mthodes et proprits) ou redfinir des proprits ou des mthodes dj dfinies dans les classes dont on hrite. Cela permet donc dtendre les possibilits dune classe. D'o l'emploi du terme : tendre une classe. Remarque : Une classe ne peut hriter d'elle mme, videmment. Une classe ne peut hriter d'une classe qui elle mme hrite dj d'elle (car l on se mord la queue).

La spcialisation
Cela consiste partir de classes trs gnrales, et d'utiliser l'hritage pour crer des classes de plus en plus particulires. Par exemple, partir de la classe Humain, l'tendre vers la classe Travailleur, puis Salari, puis Fonctionnaire, etc.

La gnralisation
C'est le chemin inverse de la spcialisation : on part d'un grand nombre de classes trs spcialises, et on essaie d'en extraire les concepts communs afin de construire des classes trs gnrales dont hriteront les classes plus spcialises. Cette dmarche peut faciliter la cration de classes trs rutilisables.

3-18

Eyrolles/Tsoft - Java la matrise

Spcialisation

Molusque

Mammifre

Ovipare

Module 3 : Concepts objet avec Java

La recherche dun membre dans la hirarchie


Lorsque lon cherche atteindre un membre dun objet (attribut ou mthode), la machine virtuelle le recherche dabord dans lobjet, puis sil nest pas trouv, dans le pre de lobjet, et ainsi de suite jusqu la classe la plus haute dans la hirarchie. Redfinir un membre, cest donc locculter derrire le nouveau membre dfini.

Les mthodes et les classes "final"


Nous avons dj vu le modificateur final. Pour une mthode, cela signifie qu'elle ne pourra pas tre redfinie dans les hritiers de la classe. Son fonctionnement sera donc fig, elle est finale. Pour une classe, cest la classe elle mme qui ne pourra pas tre tendue, elle ne pourra avoir dhritier.

L'hritage multiple
L'hritage multiple permet d'hriter de plusieurs classes. C'est assez dangereux car cela peut gnrer des conflits d'implmentations. Dans l'exemple de notre moteur, supposons que la mthode demarrer() soit implmente la fois dans Vhicule essence et dans Vhicule lectrique. Si j'invoque cette mthode dans Voiture hybride, et que cette mthode n'y est pas redfinie, alors laquelle sera invoque ? En Java, il a t dcid de ne pas permettre l'hritage multiple.

Implmentation de l'hritage en Java


En Java on utilise le mot cl extends qui permet de spcifier la classe dont on hrite. Exemple :
public class Animal { public void seDeplacer() { } } public class Mammifere } extends Animal {

Voici la classe Mammifere qui hrite de Animal. On remarque qu'aucune implmentation n'a t mise dans le corps de la dfinition de la classe Mammifere. Si j'invoque la mthode seDeplacer dans un objet cr partir de la classe Mammifere, alors c'est le code de la mthode implmente dans Animal qui sera excut.
public class Marin extends Mammifere { public void seDeplacer() { // Plouf, floc floc je nage } }

Dans ce cas, Marin hrite de Mammifere, mais redfinit la mthode seDeplacer().

Eyrolles/Tsoft - Java la matrise

3-19

Module 3 : Concepts objet avec Java

Le polymorphisme
L'hritage permet de favoriser le polymorphisme dynamique. Il existe deux formes de polymorphisme : Le polymorphisme statique : plusieurs mthodes dune mme classe qui ont une mme fonction possdent un mme nom, mais ont des arguments diffrents, donc une implmentation diffrente (nous l'avons dj vu prcdemment). Le polymorphisme dynamique : une mthode ayant une mme signature (mme nom et mmes types d'arguments) sera implmente dans diffrentes classes, donc de diffrentes manires suivant la logique de chaque classe. Avec l'hritage, on peut dfinir des mthodes qui seront redfinies dans toutes les classes hritires pour s'adapter la logique des classes. Par exemple, la mthode seDeplacer() dfinie dans Animal possdera videmment une implmentation diffrente suivant s'il s'agit d'un Molusque, d'un Mammifere Marin ou encore d'un Mammifere Terrien.

Types des objets


La classe d'un objet reprsente aussi son type. Un objet cr partir de la classe Marin est de type Marin. Avec l'hritage, un objet est aussi du type des classes dont il hrite. Dans notre exemple, un objet Marin est aussi de type Mammifere ainsi que du type Animal. On peut d'ailleurs dire dans notre langage naturel : "Un mammifre est un animal".

La classe Object
Lorsqu'une classe n'hrite de rien, elle hrite en fait, par dfaut, de la classe Object. Cette classe dfinie dans Java, est la classe racine de Java. Toutes les classes hritent directement ou indirectement de la classe Object. Dans l'exemple ci-dessus, Animal hrite de Object. En Java, il existe un certain nombre de mthodes polymorphes que lon trouve dans toutes les classes car elles sont implmentes dans Object. Citons par exemple : public String toString(); retourne une chane de caractres, reprsentation textuelle de lobjet (le contenu dpendra donc directement de la nature de lobjet). public boolean equals( Object); permet de comparer lobjet un autre objet. Cette implmentation dpend l aussi directement de la logique de lobjet. public int hashCode(); rend un code de hashage de lobjet. protected Object clone(); rend un objet copie conforme de lobjet, etc. Toutes les mthodes ci-dessus sont implmentes dans la classe Object, mais peuvent tre redfinies dans les classes que lon cre, afin de correspondre leurs logiques.

3-20

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Super
Le mot cl super dfinit l'instance de l'objet de la classe dont on hrite directement. Super, cest le pre! On peut lutiliser pour accder aux membres dfinis dans la classe dont on hrite, on peut aussi lutiliser pour appeler un constructeur du pre. Exemple :
public class Heritier extends Ancetre { int age; public Heritier( String nom) { super( nom); } // O.K. si ce constructeur existe dans // la classe pere

Remarque : Lutilisation de super pour invoquer un constructeur du pre doit se faire sous certaines rgles et contraintes trs importantes : On ne peut pas appeler le constructeur du pre en dehors dun constructeur. On ne peut appeler quun seul constructeur du pre, et obligatoirement en premire instruction du constructeur du fils (afin de respecter la rgle dordre dexcution des constructeurs : du plus ancien vers le plus jeune. Honneur aux anciens!). Par dfaut, sil ny a pas dappel un constructeur du pre, tout constructeur appellera obligatoirement le constructeur par dfaut du pre, celui qui na pas dargument : super();.
public Heritier() { super(); // Ligne inutile (lire le point 3 de la remarque // ci-dessous } public Heritier( int n) { age= n; super(); // Erreur! Lire le point 2 de la remarque // ci-dessous. Il faut inverser ces 2 lignes } public int getAgeDuPere() { super(); // Erreur! Lire le point 1 de la remarque // dans la classe Ancetre } } return super.age(); // O.K. si lattribut age existe

Attention : une classe n'hrite pas des constructeurs de la classe qu'elle tend. Il faut ncessairement toujours dfinir dans une classe tous les constructeurs dont elle a besoin, mme si ces derniers ne font que des appels aux constructeurs du pre par super(arguments).

Eyrolles/Tsoft - Java la matrise

3-21

Module 3 : Concepts objet avec Java

Transtypage des objets


Transtypage des objets
Object FormeGeometrique Oval Rectangle Carre Contrat

Implicite: Explicite: Un carr Une FormeGeometrique est peut tre une FormeGeometrique un Carre
TSOFT J av a : la m atris e

Impossible Un Contrat nest pas une FormeGeometrique


Module 3 : Concepts de l Objet- Diapo 3.7

Nous avons vu le transtypage des variables de types primitifs dans le prcdent module. Le principe est de stocker dans une variable une valeur d'un autre type, qui sera "adapte". Le principe du transtypage des objets part du mme principe : mettre la rfrence d'un objet d'un certain type dans une variable objet d'un autre type. Nous allons voir qu'il existe trois possibilits de transtypage. Il peut tre : Implicite. Explicite. Impossible.

Transtypage implicite
Comme nous l'avons vu, l'hritage permet de crer des objets ayant plusieurs types : Leur propre type et tous ceux des anctres. Par exemple, un Carre est aussi un Rectangle, un FormeGeometrique et enfin un Object. On peut donc considrer, implicitement, qu'un objet de type Rectangle est de type Object, donc peut tre stock dans une variable de ce type :
Object o= new Rectangle();

Ici, on cre un objet de type Rectangle, et on stocke sa rfrence dans une variable Object. Le transtypage est implicite : un Rectangle est bien un Object.

Transtypage explicite
Si un Rectangle est bien FormeGeometrique, le contraire n'est pas forcment vrai. Par exemple un Cercle, qui est aussi FormeGeometrique, n'est pas un Rectangle.

3-22

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


Supposons que l'on stocke dans une variable de type FormeGeometrique un objet de type Rectangle (transtypage implicite), et que l'on veuille rcuprer cet objet (maintenant de type FormeGeometrique) dans une variable Rectangle : il faudra alors spcifier que cet objet FormeGeometrique est bien en Rectangle. Exemple :
FormeGeometrique forme= new Rectangle(); Rectangle r= forme; // Cette ligne est incorrecte

Dans cet exemple, rien ne devrait s'opposer ce que la variable r (de type Rectangle) ne reoive la valeur de forme, qui contient un objet de type Rectangle. Pourtant, le compilateur n'acceptera pas une telle assignation, en effet, mme si dans cet exemple forme contient bien un Rectangle, il pourrait tout aussi bien contenir autre chose, un Cercle par exemple! Il est donc ncessaire de "forcer" l'assignation par un cast :
Rectangle r= (Rectangle) forme;

La syntaxe est similaire ce que nous avons dj vu avec les types primitifs. Ce "casting" est de la responsabilit du programmeur, et peut provoquer des erreurs s'il est mal utilis. Par exemple :
FormeGeometrique forme= new Cercle(); Rectangle r= (Rectangle)forme();

Syntaxiquement, ces deux lignes sont justes. Le compilateur ne dtectera pas d'erreur, et pourtant, dans la logique il y a un problme : on essaie de faire passer un objet Cercle pour un Rectangle. Ce transtypage est impossible : une erreur surviendra lors de l'excution de l'application : une exception de type ClassCastException sera lance (le prochain chapitre parlera des exceptions).

Transtypage impossible
Le transtypage est impossible lorsque les types ne sont pas compatibles, cest dire lorsquils nont pas de lien de parent par hritage. Exemples :
Carre c= (Carre) new String( Hello); String s= (String) new Rectangle( 12, 4); Color= (Color)new Carre( 34);

Une String n'est pas un Carre, un Rectangle n'est pas une String, et un Carre n'est pas une Color. Dans ce cas, lerreur est signale au moment de la compilation. Mme si on utilise un cast (comme sur les exemples ci-dessus), le compilateur ne sera pas d'accord : il vrifie l'existence d'un lien de parent par hritage.

Loprateur instanceof
Pour viter les erreurs dincompatibilits de types dans le transtypage, il est possible dutiliser cet oprateur afin de tester si un objet est dun certain type. Il prend en argument de gauche un objet et en argument de droite le nom d'une classe. Exemples :
Rectangle r= new Carre();

Eyrolles/Tsoft - Java la matrise

3-23

Module 3 : Concepts objet avec Java


FormeGeometrique f= new Rectangle(); r instanceof Object r instanceof FormeGeometrique r instanceof Rectangle r instanceof Carre f instanceof Object f instanceof FormeGeometrique f instanceof Rectangle f instanceof Carre // Renvoie true // Renvoie true // Renvoie true // Renvoie true // Renvoie true // Renvoie true // Renvoie true // Renvoie false!

Transtypage dobjets et invocations des mthodes


En Java, les mthodes sont toujours des fonctions virtuelles. Cest dire que quel que soit le type de la variable contenant la rfrence de lobjet, la mthode invoque sera celle de la classe relle de lobjet. Exemple :
Rectangle r= new Carre( 34); r.paint(); // Excute la mthode paint de la classe Carre et // non pas celle de la classe Rectangle (sauf si // cette mthode n'a pas t dfinie dans la classe // Carre)

Attention, pour les proprits c'est diffrent, ce sont celles accessibles dans la classe correspondant au type de la variable qui sont utilises. Exemple :
public class TestHeritage { String s= "TestHeritage"; public static void main( String [] args) { ClasseFils cf= new ClasseFils(); System.out.println( "cf-> "+cf.s); TestHeritage th= cf; System.out.println( "th-> "+th.s); } } class ClasseFils extends TestHeritage{ String s= "ClasseFils"; }

Cet exemple rend :


cf-> ClasseFils th-> TestHeritage

Ce qui peut surprendre puisqu'il s'agit du mme objet!

3-24

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Tableaux d'objets
On peut stocker des objets de n'importe quel type dans un tableau, si le type de ses cellules est Object. Exemple :
String s= "Toto"; Date d= new Date(); Object[] to= new Object[2]; to[0]= s; to[1]= d; // Dans l'autre sens, il faut caster: s= (String) to[0]; d= (Date)to[1]; d= (Date)to[0]; // Ca passe la compile, // mais a casse l'excution

Lorsque l'on utilisera des collections d'objets, on vrifiera donc bien le type des objets avant de les utiliser.

Eyrolles/Tsoft - Java la matrise

3-25

Module 3 : Concepts objet avec Java

Les objets numriques


Les objets numriques
6 7 3 5 1 5 7 2 4 8 9 9 3 1 9 5 8 9 4 8 9 3 76 8 8 4 3 4 7 7 6 1 1 8 1 9 5 8 9 5 7 9 3 4 6 2 3 6 9 5 8 2 8 7 6 2 2 3 8 4 1 9 2 2 3 4 7 5 1 6 7 new Byte( byte b);
new Double( double d); new Float( float f); new Integer( int i); new Long( long l); new Short( short s); byte byteValue(); double doubleValue(); float floatValue(); int intValue(); long longValue(); short shortValue() ;
Module 3 : Concepts de l Objet- Diapo 3.8

9 16

TSOFT Java : la matrise

En Java, les nombres sont dans des variables, qui sont de simples cellules mmoire, mais pas des objets. On appelle cela des types primitifs. Cela ne pose pas de problme en soi, lorsquon les utilise simplement pour faire des oprations, ou des passages de paramtres. Mais, comme nous les verrons plus loin (dans les collections dobjets ou dans la srialisation), cela en pose un lorsque lon a besoin de manipuler une variable en tant quobjet et pas seulement en tant que valeur. Pour manipuler un entier (int) ou un rel (float) ou autre type primitif, comme sil sagissait dun objet, on dispose dans java de types numriques, aussi appels wrappers .

Les types Wrapper


Chaque type primitif a son pendant en objet, qui hrite de la classe Number : byte short int long float double Byte Short Integer Long Float Double

Remarque : Le type objet porte le mme nom que le type primitif, mais commence par une majuscule, lexception du type primitif int dont le type objet est Integer. Pour crer un objet numrique, le constructeur prend en paramtre la valeur du numrique quil contiendra. Exemple :

3-26

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


public Integer( int n) ; public Long( long l) ; public Double( double d); etc

A noter aussi un constructeur qui prend une chane de caractres quil dcodera :
public Integer( String s) ; public Long( String s) ; etc

Pour rcuprer la valeur du numrique quil contient, les mthodes ci-dessous son implmentes dans chacun des types.
byte byteValue(); double doubleValue(); float floatValue(); int intValue(); long longValue(); short shortValue() ;

Lusage des ces mthodes peut engendrer des conversions qui peuvent provoquer des troncatures ou la perte de la partie dcimale lors du passage dans un entier, comme par exemple :
Double f= 234.643; int i= f.intValue(); // i contiendra la valeur entire 234

On notera enfin les principales mthodes communes tous ces types numriques :
String toString() ; int compareTo( TypeDeLObjet objetIntegerCompare); boolean equals( Object o); static TypeDeLObjet valueOf( String s);

Dautres mthodes sont dcouvrir, particulires chaque type, comme par exemple la conversion en hxadcimal pour les entiers, la reprsentation en divers formats virgule flottante pour les rels, etc. Veuillez vous reporter la documentation des classes.

Lautoboxing

Java 5

On a dcouvert cette possibilit dans le langage de programmation C# de Microsoft. Miracle de la concurrence : Sun la ajout (JSR 201) dans la version 5 de Java ! Jusqu prsent, les lignes suivantes taient incorrectes :
int i= new Integer( 34) ; Integer n= 32;

En effet, i nest pas un objet et nest pas un entier. Cela devait tre cod comme suit :
int i= (new Integer(34)).intValue() ; Integer n= new Integer(32);

Eyrolles/Tsoft - Java la matrise

3-27

Module 3 : Concepts objet avec Java


Grce lautoboxing, lorsque lon cherche mettre le contenu dune variable primitive dans un objet ou linverse, les transformations et transtypages sont totalement automatiques. Exemples :
Long l= 42L ; Integer i= 34 ; Long total= i+l;

Remarque : Si lon cherche autoboxer un objet null, alors cest la valeur 0 qui est prise par dfaut. Exemple :
Integer i ; // Objet i null int n= i+3; // n prend la valeur 0+3

Il ny a pas envoi dune NullPointerException (vu au chapitre suivant), ce qui nest pas trs correct du point de vue Java, car un objet non initialis cache souvent un bug.

3-28

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Les classes abstraites


Les classes abstraites
FormeGeometrique
+couleur getSurface() getPerimetre() Classe abstraite

Oval
getSurface() getPerimetre()

Triangle
getSurface() getPerimetre()

Rectangle
getSurface() getPerimetre()

Rond

Carre

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet- Diapo 3.9

Ce sont des classes dont certaines mthodes ne sont pas implmentes. Le rle de ces classes est de dfinir des concepts au travers de mthodes qui seront obligatoirement implmentes par les hritiers. On ne peut pas instancier une classe abstraite, puisque certaines mthodes n'ont pas de code et ne peuvent donc pas tre appeles. Les classes qui hritent d'une classe abstraite sont elles mme abstraites (non instanciables) sauf si elles implmentent toutes les mthodes abstraites. Pour crer une classe instanciable qui hrite d'une classe abstraite, on doit donc obligatoirement implmenter du code pour chaque mthode abstraite. C'est une sorte d'engagement ou de contrat. L'exemple du transparent illustre bien ce concept avec les classes gomtriques. La classe FormeGeometrique reprsente le concept de forme gomtrique. On y trouve la proprit couleur et les mthodes getSurface() et getPerimetre(). Ces mthodes calculent la surface et le primtre de la forme. Elles ne peuvent pas tre implmentes dans la classe FormeGeometrique : elle est trop abstraite. Par contre, elles seront implmentes dans les formes gomtriques concrtes : Oval, Triangle et Rectangle. Remarque : En notation UML, les classes abstraites sont notes en italique.

Les classes abstraites en Java


En Java, les classes abstraites sont spcifies par le modificateur abstract. Les mthodes abstraites sont simplement dclares par leurs prototypes. Exemple : Eyrolles/Tsoft - Java la matrise

3-29

Module 3 : Concepts objet avec Java


public abstract class FormeGeometrique { Color couleur; // Mthodes abstraites: public double getSurface(); public double getPerimetre(); // Mthodes concrtes: public void setCouleur( Color coul) { couleur= coul; } public Color getCouleur() { return couleur; } }

Ceci est la dfinition du concept de la forme gomtrique. Une forme doit retourner sa surface, son primtre et sa couleur, on doit aussi pouvoir modifier sa couleur. Les calculs de sa surface et de son primtre dpendent de sa nature. Ils seront donc implments en fonction de la nature de la forme qui sera dfinie par une classe hritant de FormeGeometrique. Remarque : Il est ncessaire de spcifier quune classe est abstraite laide du mot cl abstract, sinon le compilateur refusera de compiler cette classe. C'est ce modificateur qui interdit l'instanciation avec l'oprateur new. Voici quelques implmentations de FormeGeometrique :
public class Rectangle extends FormeGeometrique { double longueur, largeur; public Rectangle( double longueur, double largeur) { this.longueur= longueur; this.largeur= largeur; } public double getSurface() { return longueur*largeur; } public double getPerimetre() { return 2*(longueur + largeur); } } // Un carr est un rectangle dont la hauteur et la largeur // sont identiques. public class Carre extends Rectangle { // Tout est gr dans Rectangle que l'on tend. // Le constructeur prend le ct du carr en argument // et appelle le constructeur de Rectangle qui prend

3-30

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


// en argument la longueur et la largeur du rectangle public Carre( } } double cote) { super( cote, cote);

Dans cet exemple, Carre hrite de Rectangle, qui hrite de FormeGeometrique. Carre est donc bien de type FormeGeometrique.
public class Cercle extends FormeGeometrique { double rayon; public static final double PI= 3.141592; public Cercle( double rayon) { this.rayon= rayon; } public getSurface() { return PI*rayon*rayon; } public getPerimetre() { return PI*rayon*2; } }

On voit dans cet exemple lutilisation dune variable statique : PI.

Eyrolles/Tsoft - Java la matrise

3-31

Module 3 : Concepts objet avec Java

Les interfaces
Les interfaces

Comparable

ChaineDeCaracteres

* Contient *

Interface Comparable
estEgal() estSuperieur() estInferieur()

ListeDeChaines

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.10

Linterface dun objet reprsente sa partie visible, cest--dire principalement ses mthodes publiques. Il est possible en Java de dfinir, dans un fichier, une interface sans implmentation, donc simplement une liste de signatures de mthodes. Puis il sera possible de dclarer dans une classe que lon implmente cette interface, c'est--dire que l'on implmente toutes les mthodes qui y sont dclares. On ne peut pas parler d'hritage dans le cas des interfaces, car pour qu'il y ait hritage il faut qu'il y ait quelque chose hriter, or les interfaces ne sont que des coquilles vides. Mais cest en tous les cas lobligation, pour pouvoir compiler la classe, dimplmenter toutes les mthodes de linterface en les redfinissant. Ce principe permet de dfinir un comportement abstrait, qui sera implment par plusieurs classes. Exemple :
public interface Comparable { boolean estEgal( Object o); boolean estSuperieur( Object o); boolean estInferieur( Object o); }

Une interface se cre dans un fichier portant son nom (ici ce sera Comparable.java) et se dclare comme une classe, lexception du mot cl interface qui prend la place du mot class. Dans notre exemple, cette interface permet de dfinir le concept de comparaison. Elle permettra de comparer, donc par exemple de trier, des objets de types de classes qui limplmentent.

3-32

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


Prenons lexemple de notre classe Carre. Nous allons implmenter dans cette classe notre interface Comparable, ce qui nous permettra de comparer deux objets de type Carre. La logique de comparaison sera propre la logique mtier des classes qui limplmentent. Par exemple, nous supposerons que deux carrs sont gaux lorsquils ont la mme couleur et la mme dimension.
public Carre extends Rectangle implements Comparable{ public Carre( } boolean estEgal( Object o) { Carre c= (Carre)o; if( Couleur.equals( c.couleur) && longueur==o.longueur) return true; else return false; } } double cote) { super( cote, cote);

Examinons le code : La premire ligne dclare la classe Carre et spcifie quelle implmente Comparable. Une classe peut implmenter autant dinterfaces quon le souhaite. Elles seront spcifies toutes ce niveau, spares par des virgules. On retrouve le code de notre Carre (qui se limite un constructeur qui fait appel au pre Rectangle), auquel sajoute limplmentation de la mthode estEgal. La premire chose que fait notre mthode est de dclarer un objet c de type Carre, et de lui donner comme valeur celle de lobjet o de type Object, ce qui explique le typage en Carre de o en spcifiant entre parenthses la classe Carre devant o. En fait, la mthode estEgal vient dune interface qui se veut gnrique (comparaison de tous types dobjets). Cest la raison pour laquelle nous utilisons le type Object. Il est le plus gnrique puisquau sommet de la hirarchie des classes : tout objet, quel que soit son type, est de type Object. Enfin, la comparaison passe par une comparaison, la fois de la longueur, mais aussi de la couleur des carrs. Dans cet exemple, le fichier Carre.java ne pourra pas tre compil, car les mthodes estSuperieur et estInferieur nont pas t implmentes. Le compilateur lancera siumplement le message derreur signalant que la classe Carre est abstraite, et doit de ce fait tre dclare comme telle.

Linterface est un contrat


Nous voyons bien ici la notion de contrat. Si une classe implmente Comparable, elle sengage implmenter toutes ses mthodes. On apprciera le nommage des interfaces par un nom se terminant par able (Comparable, Triable ou Sortable, Affichable, Imprimable, Calculable, Serializable, Stockable, etc.)

Eyrolles/Tsoft - Java la matrise

3-33

Module 3 : Concepts objet avec Java

Hritage entre les interfaces


Une interface ne peut implmenter une autre interface, bien sr, puisquil ny a pas dimplmentation dans une interface. Par contre, une interface peut hriter dune autre interface, et mme de plusieurs autres interfaces en Java. Lhritage multiple tant ici autoris, car il ny a pas de problme de conflits dimplmentation, et pour cause! Lorsque dans une classe on implmente une interface qui hrite dautres interfaces, nous devons videmment implmenter toutes les mthodes de toutes ces interfaces. Il faut donc toutes les examiner, cest la raison pour laquelle il vaut mieux ne pas trop utiliser lhritage dans les interfaces.

Les types interfaces


Un objet qui implmente une interface est du type de cette interface. Ainsi, bien que lon ne puisse pas crer dobjet du type dune interface, rien ne nous empche de dclarer une variable du type dune interface, de linitialiser avec un objet qui implmente cette interface. Exemple :
Comparable c= new Carre( 25);

Attention, lobjet c tant de type Comparable, seules les mthodes de linterface Comparable peuvent tre invoques, mais certainement pas celles de Carre, bien que cet objet soit un Carre. Nous verrons tout au long de ce cours que cette notion est trs importante en Java.

Les interfaces ont des proprits


On ne trouve pas que des mthodes dans les interfaces. On peut aussi y dclarer des proprits. L'hritage multiple des interfaces peut gnrer des ambiguts au niveau du compilateur (si on implmente deux interfaces qui ont chacun une proprit de mme nom). Pour viter cet effet de bord, les proprits des interfaces sont systmatiquement statiques, mme si on ne les dclare pas comme telles. De plus, leur accs ne peut se faire que par le nom de l'interface (proprits de classes).

Conclusion
Les interfaces permettent : L'hritage multiple de concepts. L'engagement d'implmenter toutes les mthodes dfinies dans les interfaces (notion de contrat). Le transtypage d'objets incompatibles vers des types interfaces. On a la notion d'ensembles d'objets.

3-34

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

La gnricit
Gnricit
Liste
ajou ter( t:T) retirer( t: T) retirer( index: entier) recuperer(index: entier):T trier() comparer( t1: T, t2:T):boolean

ListeDeDates
ajouter( t: Date) retirer( t: Date) retirer( index: entier) recuperer(index: en tier):Date trier() comparer( t1: Date, t2:Date):boolean
TSOFT J av a : la m atris e

ListeDeChaines
ajouter( t: Chain e) retirer( t: Chaine) retirer( in dex: en tier) recu perer(index: entier):Chaine trier() comparer( t1: Chaine, t2:Ch aine):boolean
Module 3 : Concepts de l Objet -Diapo 3.11

La gnricit permet de concevoir des classes gnriques, vhiculant des concepts trs sophistiqus, et qui seront implmentes de diffrentes manires suivant les types des objets qu'elles manipulent. L'exemple le plus classique est la liste. Une telle classe doit tre capable de manipuler des objets de diffrents types, avec des fonctions telles que linsertion dans la liste, la suppression, la rcupration, le tri, etc.

La gnricit en Java
La gnricit n'existe en Java qu partir de la version 5, avant, on sen approchait avec le polymorphisme et les interfaces. Prenons l'exemple typique de la liste. Nous voulons faire une classe Liste qui supporte le tri des lments. En Java, nous crerons simplement une classe qui va contenir des objets dont le type sera celui d'une interface (par exemple Comparable). Les objets que ma liste contiendra pourront tre de n'importe quel type, pourvu que celui-ci implmente l'interface Comparable. Exemple :
public class Liste { public void ajouter( Comparable element) { // etc. } public void retirer( Comparable element) { // etc. } public void retirer( int index) { // etc.

Eyrolles/Tsoft - Java la matrise

3-35

Module 3 : Concepts objet avec Java


} public Comparable recuperer( int index) { // etc. } public void trier() { // Appliquer un algorithme en s'appuyant sur les // mthodes de l'interface } public boolean comparer( Comparable e1, Comparable e2) { return e1.estEgal( e2); } }

L'interface Comparable existe dj dans Java :


public interface Comparable { public int compareTo(Object o); }

La mthode compareTo retourne 0 si l'objet est gal (dans sa logique) celui spcifi en argument, un nombre ngatif s'il est plus petit, et un nombre positif s'il est plus grand. Il restera simplement implmenter cette interface dans toutes les classes d'objets que nous voudrons faire entrer dans la liste. On notera que l'interface Comparable est implmente dans la classe String. On peut donc faire entrer des chanes de caractres dans notre Liste. Exemple :
public static void main( String [] args) { Liste l= new Liste(); // On fait entrer tous les arguments de la ligne de // commande dans la liste for( int n=0; n < args.length; n++) l.ajouter( args[n]); l.trier(); }

Java 5

Les types gnriques sont apparus dans la version 5 de Java. Ils sont surtout employs dans les classes de collections dobjets que nous verrons au chapitre 7. Si nous reprenons notre exemple de Liste, il serait implment comme ceci :
public class Liste<A> { public void ajouter( A element) { // etc. } public void retirer( A element) { // etc.

3-36

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


} public void retirer( int index) { // etc. } public Comparable recuperer( int index) { // etc. } public void trier() { // Appliquer un algorithme en s'appuyant sur les // mthodes de l'interface } public boolean comparer( A e1, A e2) { return e1.estEgal( e2); } }

On voit donc que linterface Comparable qui tait employe avant est remplac par un type A qui nexiste pas. Il nexistera que sous la forme qui sera choisie par le programme au moment de son utilisation. Exemple :
public static void main( String [] args) { Liste<String> l= new Liste<String>(); // On fait entrer tous les arguments de la ligne de // commande dans la liste for( int n=0; n < args.length; n++) l.ajouter( args[n]); // Vrifications la compilation // que cest bien une String l.trier(); }

Dans cet exemple, on utilise la classe gnrique Liste avec des objets String. Dans la mthode ajouter, la vrification que cest bien un objet String est faite lors de la compilation. Avant, ctait uniquement une vrification sur une interface qui pouvait tre implmente par des objets de types incompatibles.

Eyrolles/Tsoft - Java la matrise

3-37

Module 3 : Concepts objet avec Java

Relations entre les classes


Relations entre les classes
Espce Espce Caractrise > < Fait partie de
Fournisseur * 0..1 Employeur Clien t * * Salari

Animal Animal

Entreprise
+ Nom + Raison sociale + Activit + Adresse

Personne
+ Nom + Numro ss + Adresse + Employeur

Les relation s n en tren t pas dan s les attributs en modlisation UML


TSOFT J av a : la m atris e Module 3 : Concepts de l Objet -Diapo 3.12

Les relations sont les liens qu'il peut y avoir entre diffrents objets. Une relation peut tre spcifie en langage naturel. Par exemple, sur le premier exemple de la figure ci-dessus, on voit quune espce caractrise un animal et quun animal fait partie dune espce. Les relations peuvent avoir diffrents types de cardinalits (un vers un, un vers n, etc.), et on peut avoir plusieurs types de relations entre des objets. Par exemple, le second cas du transparent montre qu'une personne peut tre un client ou un salari (ou les deux) pour une entreprise. Il y a donc l deux relations : Dans la premire relation, une personne peut avoir un nombre indfini dentreprises fournisseurs et une entreprise un nombre indfini de personnes clientes. Pour la seconde, une personne peut avoir zro ou une entreprise employeur, et une entreprise peut avoir un nombre indfini de personnes salaries. On trouve diffrents types de cardinalits : 1 0..1 * 1..* n m..n Un et un seul Zro ou un De zro un nombre indfini De 1 un nombre indfini Exactement n De m n

Pratiquement, les relations sont sous la forme de rfrences vers un ou plusieurs autres objets dans une variable d'instance. Les relations sont donc des proprits des objets.

3-38

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


Par exemple, les relations que l'on a entre Entreprise et Personne seront implmentes de la faon suivante :
public class Entreprise { public String nom; punlic String raisonSociale; public String activite; public String adresse; // Une entreprise a 0, 1 ou plusieurs clients private Personne [] client; // Une entreprise a 0, 1 ou plusieurs salaris private Personne [] salarie; } public class Personne { public String nom; public String numeroSS; public String adresse; // Une personne a 0 ou 1 employeur (si c'est 0, la rfrence // de employeur est null, sinon c'est la rfrence de // l'objet Employeur private Entreprise employeur; // Une personne a 0, 1 ou plusieurs fournisseurs private Entreprise [] fournisseur; }

Remarque : Dans la modlisation UML, les relations nentrent pas dans les attributs, cela ferait double-emploi. Par exemple il ne sera pas correct d'ajouter dans la classe Personne lattribut employeur. Par contre, dans limplmentation Java, employeur sera un attribut, dont le type dpendra du type de relation.

Eyrolles/Tsoft - Java la matrise

3-39

Module 3 : Concepts objet avec Java

Les agrgations
Les agrgations

1 4

Automobile

Moteur Roue

Personne
Enfants *

Paren ts 0..2

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.13

L'agrgation est un type de relation. Son concept permet un objet de possder dautres objets comme attributs. Il y a une notion d'appartenance. Les deux exemples de la figure ci-dessus seront implments en Java de la faon suivante :
public class Automobile { Moteur moteur; Roue [] roues= new Roue[4]; }

Pour les roues, on utilise un tableau de quatre objets de type Roue. Nous reverrons dans le prochain chapitre la syntaxe de Java pour les tableaux.
public class Personne { Personne pere; Personne mere; Personne[] enfants; }

Lagrgation et la mmoire
Lorsquun objet nest plus utilis, il doit tre dtruit de la mmoire. Sil possde des objets agrgs, ces objets doivent aussi tre dtruits, sauf sils ont encore des relations avec dautres objets non encore dtruits. On voit que la libration de la mmoire des objets inutiles peut vite devenir complexe, cest aussi une source de bugs classique. Cest la raison pour laquelle Java possde le Garbage Collector, qui prend en charge cette fonction, ce qui facilite bien la vie du dveloppeur.

3-40

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Les associations
Les associations
Client
+ Nom + NumeroClient + TypePaiement + Adresse 1

Produit acheter
1..100 + Nom + CodeProduit + Description + Prix

Achat
+ Date + TypeAch at + Remise

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.14

Lassociation est une sorte dindex. Cela permet de dfinir une action entre deux classes. Dans lexemple de la figure ci-dessus, on voit bien les objets de type Achat qui seront effectus entre un objet de type Client et un objet de type Produit. On voit aussi qu'un achat est compos d'un acheteur (l'objet Client) et d'au moins un produit (100 maximum). Limplmentation en Java pourrait tre la suivante :
public class Client { public String nom; public int numeroClient; public char typePaiement; public String adresse; // Les achats d'un client Achat[] achats; } public class Produit { public String nom; public int codeProduit; public String description; public double prix; } public class Achat { public Date date;

Eyrolles/Tsoft - Java la matrise

3-41

Module 3 : Concepts objet avec Java


public char typeAchat; public float remise; public Client acheteur; // 100 produits maxi par achat public Produit [] produits= new Produit[100]; // Compteur de produits dans le tableau int nombreProduits= 0; // Constructeur public Achat( Client client, Produit produit) { this.client= client; this.produit[0]= produit; nombreProduits++; } // Mthode pour ajouter un produit un achat public void ajoutProduit( Produit produit) { this.produit[nombreProduits]= produit; nombreProduits++; } }

On voit bien ici que lassociation entre client et produit est faite dans le constructeur au moment de la cration de lobjet Achat.

3-42

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Les packages
Les packages
In terfaceGraphique

Fenetre
Facturation

Dialogue

Composant

Facture
*

SaisieFacture

Partenaires

Societe
1

Fournisseur

Client

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.15

Trs rapidement, le dveloppement d'applications va gnrer un nombre considrable de classes, et, comme dans Java, les classes sont stockes dans des fichiers spars, le nombre important de fichiers va forcment nuire l'organisation de projet. Les packages permettent de rassembler des classes ayant des liens au niveau de lorganisation du logiciel, par exemple mettre ensemble les interfaces graphiques, puis dans un autre package les classes mtier, etc. Il faut noter que rien nempche de faire des hritages, des associations ou des agrgations entre classes de packages diffrents. Certains langages comme Java, comme nous allons le voir juste aprs, prennent en compte le package dans la visibilit des classes et de leurs membres.

Crer des packages en Java


Les packages sont organiss de faon arborescente, exactement comme les rpertoires des fichiers. Cest sur le gestionnaire de fichiers que Java sappuie pour stocker les classes. Pour crer un package, il suffit simplement de crer un rpertoire, visible depuis lune des entres de la variable denvironnement CLASSPATH. Le nom de ce rpertoire sera le nom du package. Les rpertoires devront tre retrouvs, la fois par le compilateur, mais aussi par l'interprteur, c'est dire la machine virtuelle. Ils utilisent tous les deux le CLASSPATH. Exemple : Nous allons crer une nouvelle entre dans le CLASSPATH vers un rpertoire appel monProjet contenant les packages de notre projet :
C:\>md monProjet C:\>set CLASSPATH=c:\monProjet;%CLASSPATH%

Dans ce rpertoire, on cre un package appel outils : Eyrolles/Tsoft - Java la matrise

3-43

Module 3 : Concepts objet avec Java


C:\>md monProjet\outils

Toutes les classes qui feront partie de ce package devront tre stockes dans ce rpertoire, de plus, elles devront tre marques comme faisant partie de ce package en mettant en premire ligne de fichier java : package nomDuPackage;. Exemple :
package outils; public class Test{ // etc. }

Remarque : Il est conseill de toujours donner aux packages des noms en minuscules. Les packages sont arborescents, on peut donc crer autant de sous packages que lon veut dans les packages. Ils seront stocks dans des sous-rpertoires. Le nommage des sous-packages en java se fait en utilisant le point (.) comme sparateur. Exemple : On va crer le sous-package graphique dans le package outils.
C:\>md monProjet\outils\graphique

On stockera dans ce nouveau rpertoire les classes en faisant partie, par exemple :
package outils.graphique; public class Fenetre { // Etc. }

Remarque : On trouve de nombreuses classes outils disponibles sur Internet, payantes, mais aussi parfois gratuites. Ces outils sont dans des packages. Pour ne pas mlanger les packages provenant de diffrentes sources, Sun conseille de toujours crer ses propres packages dans un package contenant le nom de domaine de sa socit, nom thoriquement unique. Ainsi par exemple, si votre socit possde le nom de domaine acme.com, vos packages devrons tre dans le package : com.acme .

Utiliser des packages en Java


Laccs aux packages nest pas automatique en Java. Il est ncessaire, pour chaque classe, de spcifier les packages dont elle a besoin. Pour cela, on utilise linstruction import en dbut de code. Exemple :
package principal; import outils.graphique.Fenetre; import outils.*; import java.util.*;

3-44

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


public class Application { // Etc. }

Dans cet exemple, les trois lignes import permettent respectivement de : Utiliser la classe Fenetre du package outils.graphique. Utiliser toutes les classes du package outils. Utiliser toutes les classes du package java.util, qui fait partie de la machine virtuelle et contient divers utilitaires (dont nous en reparlerons plus tard). Le package java contient toutes les classes de Java organises par domaine. Remarque : Laccs aux classes dun package nest pas rcursif dans les sous-packages. Ainsi, par exemple, le deuxime import de notre exemple importe toutes les classes qui sont dans le rpertoire outils, mais pas celles de ses sous rpertoires (par exemple celles du rpertoire outils\graphique).

Les imports statiques

Java 5

Cela permet dutiliser des proprits (ou constantes) statiques de classes sans avoir en hriter ou les prfixer par leur classe. Cest pratique pour gagner du temps, mais attention aux risques de confusion La syntaxe consiste dclarer un import avec le modificateur static. Cet import spcifie le chemin complet de la classe, suivi dun point et du nom de la proprit statique ou dune * si lon veut cibler toutes les proprits statiques de la classe. Exemple :
import static java.lang.System.*; public class Test{ public static void main( String[] args) { out.println( "Hello plus simple"); } }

Dans cet exemple, je peux utiliser les membres statiques de la classe System (ici jutilise la constante out qui pointe sur la sortie standard).

Les packages de Java


La machine virtuelle Java est livre avec de nombreux packages dont nous allons tudier les principaux dans ce cours. Citons notamment : java.lang java.util java.io java.awt java.awt.event java.sql java.beans Eyrolles/Tsoft - Java la matrise Toutes les classes de base du langage (String). Divers outils (dates, collections). Entres sorties. Interface graphique. Gestion des vnements de linterface graphique. Gestion des bases de donnes (JDBC). Support des JavaBeans.

3-45

Module 3 : Concepts objet avec Java


java.applet java.net java.security Cration dapplets. Gestion du rseau. Gestion de la scurit.

Remarque : Il nest pas ncessaire dimporter le package java.lang, il est import par dfaut.

Les fichiers JAR


Une application est donc un ensemble de classes, dissmines dans des packages, parmi lesquels on trouvera peut-tre des packages achets lextrieur, ainsi que des packages propres lenvironnement dexcution de lapplication (serveur dapplications par exemple). De plus, lapplication aura probablement besoin de divers fichiers de donnes pour fonctionner (configuration, images, scripts de bases de donnes, donnes de dmarrage, etc.) En phase de dploiement ou de distribution de lapplication, il pourrait tre intressant de rassembler tout cela dans un seul fichier. Cest pour cela que lon a invent les fichiers JAR (Java ARchive). Ces fichiers sont au format ZIP (On peut le consulter avec n'importe quel WinZIP du march) dans lequel sont stocks, et donc ventuellement compresss, tous les fichiers dune application (classes, fichiers XML, etc.) Pour tre utilis, le fichier JAR na pas besoin dtre dcompress. La machine virtuelle Java sait aller trouver les classes et les autres fichiers directement dedans. Il suffit simplement dajouter le nom complet du fichier JAR comme une entre du CLASSPATH. Par exemple, si lon a stock le fichier MonAppli.JAR dans le rpertoire c:\applications, il suffit de lajouter au CLASSPATH :
C:\>set CLASSPATH=c:\applications\MonAppli.JAR;%CLASSPATH%

Pour crer les fichiers JAR, un outil est mis notre disposition dans le JDK : JAR.EXE.

Java Web Start


C'est le nom d'un produit propos par Sun pour faciliter le dploiement des applications crites en Java. C'est une application cliente, qui permet le tlchargement et l'excution d'applications Java partir d'un serveur Web. On dispose, grce cela, des facilits des architectures Web, tout en conservant la possibilit de btir des applications clientes complexes mais facilement distribuables. Pour plus d'informations, se connecter l'url : http://java.sun.com/products/javawebstart/

3-46

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Visibilit des membres en Java


Visibilit des membres en Java
Visibilit des membres
La cl asse ell e-mme Une classe hritire du mme pack age Une classe du mme package Une classe hritire d un autre pack age Une classe dun autre package

public X X X X X

protected X X X X

private friendly protected X X X X X X

private X

Visibilit des classes


Une classe hri tire du mme pac kage Une classe du m me packa ge Une classe hri tire dun autre package Une classe dun a utr e pack age

public X X X X

protected X X X

friendly X X

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.16

En Java, on a 5 possibilits pour spcifier la visibilit dun membre : public : le membre peut tre accd de nimporte quelle autre classe. protected : le membre peut tre accd par les classes de son propre package et par les classes qui en hritent, quelles soient ou non dans son package. aucune spcification (appel friendly ) : le membre peut tre accd uniquement par les classes de son propre package. private protected : le membre ne peut tre accd que par ses hritiers, quils soient ou non dans son package. private : le membre ne peut pas tre accd dune autre classe.

Visibilit des classes


On peut spcifier deux types de classes : public et friendly . La classe public sera visible dabsolument partout. Il faut, par ailleurs, que le source de la classe soit dans un fichier ayant le mme nom qu'elle. La classe friendly ne sera visible qu lintrieur du mme package. Remarque : Une classe peut aussi tre private, mais condition dtre interne une autre classe.

Visibilit des membres


L'usage des diffrents modificateurs de visibilit suit les rgles suivantes : private : pour des membres utiliss exclusivement en interne de la classe. Leur invisibilit de l'extrieur amliore l'encapsulation de la classe.

Eyrolles/Tsoft - Java la matrise

3-47

Module 3 : Concepts objet avec Java


public : pour des membres ddis au monde extrieurs (proprits de configuration de l'objet, mthodes des services). protected : pour des membres usage interne, mais qui doivent pouvoir tre ventuellement manipuls par des mthodes de classes hritires. friendly : pour des membres ddis uniquement au monde extrieur proche, c'est dire les classes du mme package.

Redfinition des mthodes dans l'hritage


Les modificateurs des mthodes peuvent changer lorsqu'on les redfinit, mais dans un seul sens : du plus restrictif au moins restrictif. Par exemple, une mthode dclare en private dans une classe pourra tre redfinie en private, protected, "friendly" ou public dans une classe fille, mais, une mthode dclare en public ne pourra tre redfinie dans une fille que en public. Exemple :
public class TestHeritage { private int methode1() { return 1;} public int methode2() { return 2;} } class ClasseFils extends TestHeritage{ public int methode1() { return 1;} // methode2 ne peut qu'tre public // private int methode2() { return 2;} }

3-48

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Les annotations
Les annotations
Directives spcifies dans le code source des programmes @Override @Depracated @SupressWarnings On peut crer ses propres annotations public @interface ToDo { } On peut crer son propre processeur dannotations, qui sera invoqu la compilation Gnration de warnings ou derreurs Gnration de fichiers descripteurs
TSOFT Java : la matrise Module 3 : Concepts de l Objet- Diapo 3.17

Java 5

Les annotations permettent dajouter, dans les sources des programmes, des directives lattention des diffrentes cibles du code : Compilateur, Javadoc, interprteur, analyseur de code Cette nouveaut de la version 5 est une volution logique du langage de programmation. Dj, on connaissait les annotations destines la documentation des classes (voir lannexe de cet ouvrage consacre Javadoc), qui permettaient dinsrer des commentaires dans une forme normalise afin de les exploiter dans un processus de documentation automatique. On peut maintenant aller plus loin, et aussi annoter la compilation et lexcution du code (runtime). Tout lintrt des annotations est de permettre dinsrer directement dans le code des classes des directives qui taient jusqu prsent mises dans des fichiers de configuration spars (fichiers descripteurs).

Fonctionnement des oprations


Les annotations sont associes des classes ou des membres. Elles prcdent le modifier (public, static). Elles sont indiques par un mot cl qui commence toujours par une arobase. Exemple :
@Deprecated public vieilleMethode () { // etc...

Les annotations standards de Java


La version 5 de Java contient 3 annotations standards : Eyrolles/Tsoft - Java la matrise

3-49

Module 3 : Concepts objet avec Java


@Override @Deprecated @SuppressWarnings

@Override Cette annotation sutilise pour les mthodes uniquement, elle permet de spcifier quune mthode redfinit une mthode hrite. Elle est utile afin dviter les erreurs de frappe, lorsque lon redfinit une mthode. En effet, lors de la redfinition, si on crit la mthode avec un nom lgrement diffrent, ce sera alors une nouvelle mthode, elle ne redfinira pas lancienne. Exemple :
public class MonObjet extends Object { @override public String toStirng() { return "Cest moi"; }

On voit dans cet exemple une faute de frappe dans la mthode toString, crite par erreur toStirng. Cette erreur sera signale lors de la compilation puisque cette mthode nexiste pas dans la classe Object. @Deprecated Elle permet de spcifier quune mthode est dprcie. Toute invocation de cette mthode entranera un warning au moment de la compilation. Remarque : Il ne faut pas confondre cette annotation avec celle de javadoc : @deprecated (Attention, la premire lettre est une minuscule dans le cas du @deprecated de javadoc). La diffrence est importante : Dans le cas de javadoc, cest une simple dclaration qui sera intgre la documentation, pour signaler que cette mthode ne doit plus tre utilise, et qui permet de documenter par exemple la raison pour laquelle cette API est dprcie. Dans le cas de lannotation standard, elle impactera simplement le compilateur : Cette annotation gnrera un warning lors de la compilation si le code invoque cette mthode. Exemple :
public class Societe { /** * Retourne le numro de SIRET pour la TVA. * @return Numro SIRET pour la TVA. * @deprecated Il faut maintenant utiliser le numro * de TVA intracommunautaire. Invoquer la mthode * getIntraTVA() */ @Deprecated

3-50

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


public int getSiretTVA() { return numeroSiret; } }

@SuppressWarnings Cette annotation est destination du compilateur et permet de supprimer laffichage des warnings spcifis en argument. Exemple :
@SuppressWarnings ("deprecated") public class ClasseQuiVaUtiliserDesMethodesDepreciees { // etc

On voit ci-dessus le danger de cette annotation : On perd dfinitivement la trace, lors de la compilation, de lutilisation dAPIs dprcies par cette classe. Remarque : Cette annotation peut aussi prendre en argument un tableau de chanes de caractres :
@SuppressWarnings( { "deprecated", "unchecked" } )

Crer ses propres annotations


Il est aussi possible de crer ses propres annotations. Cest principalement destination doutils qui prendront le relai au moment de la construction du code. Imaginons par exemple, dans le cadre de la mise en place dun processus qualit, un mcanisme base dannotations qui permet, au moment de la construction de lapplication, de signaler les portions de code non testes ou incompltes. Nous allons crer les 2 annotations suivantes : @ToTest permettra de spcifier ce qui doit tre test. @ToDo permettra, dans le code, de spcifier ce qui reste faire. Puis nous crerons le programme qui permettra de lire les classes et de signaler ce qui reste faire et tester. La dfinition dune annotation ressemble celle dune interface (on reconnat lannotation au caractre @ qui la diffrencie dune interface. Exemple :
public @interface ToTest {}

Lutilisation des annotations dans le code sera possible partout o lon utilise les modifiers public, static ou final (interfaces, classes, mthodes, attributs). Par convention, on fera toujours prcder lannotation du modifier. Exemple :
@ToTest public class NombresComplexes { // etc

Une annotation peut contenir des dclarations de mthodes, qui doivent rpondre aux caractristiques suivantes : Elles nont pas dargument. Eyrolles/Tsoft - Java la matrise

3-51

Module 3 : Concepts objet avec Java


Elles nont pas de clause throws . Elles ne retournent que des types primitifs, des String, des Class, des annotations et des numrations ou des tableaux de ces mmes types. Elles peuvent avoir des valeurs par dfaut. Ces mthodes cachent en fait des attributs. Exemple :
public @interface ToDo { int id() ; String date() ; String description() ; }

Des valeurs par dfaut peuvent tre spcifies pour chaque membre. Exemple :
public @interface ToDo { int id() default 0; String date() ; String description() ; }

Lutilisation de cette annotation se fera de la manire suivante :


@ToDo( id=137, date= "10/6/2007", description= "Implmenter les nombres ngatifs" ) public class NombresComplexes { // etc

Remarque : Une annotation sans contenu (comme dans lexemple @ToTest) est appele un marqueur. Une annotation contenant seulement un lment dont le nom est value est appele une valeur. Exemple de valeur :
public @interface Auteur { String value(); }

Qui sera utilise ainsi :


@Auteur ("Jrme Bougeault") public class MaClasse { // etc

Tableau dannotations
Il nest pas possible de spcifier plusieurs fois la mme annotation. Par exemple, le code ci-dessous nest pas correct :

3-52

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


@ToDo( id=137, date= "10/6/2007", description= "Implmenter les nombres ngatifs" ) @ToDo( id=138, date= "10/6/2007", description= "Commenter les mthodes" ) public class NombresComplexes { // etc

Pour remdier cela, on peut faire des annotations contenant des tableaux dannotations. Exemple :
@interface TableauToDo { ToDo [] tableau(); }

qui serait utilis ainsi :


@TableauToDo ( tableau= { @ToDo( id=137, date= "10/6/2007", description= "Implmenter les nombres ngatifs" ), @ToDo( id=138, date= "10/6/2007", description= "Commenter les mthodes" )}) public class NombresComplexes { // etc

Les mta annotations


Quatre mta-annotations sont disponibles pour la cration de ses propres annotations :
@Documented @Inherit @Retention @Target

Leur utilisation ncessite linclusion du package java.lang.annotation. @Documented Ne sapplique qu la dclaration dune annotation. Permet de spcifier loutil javadoc que lannotation doit tre prsente dans la documentation gnre automatiquement. Eyrolles/Tsoft - Java la matrise

3-53

Module 3 : Concepts objet avec Java


Exemple :
import java.lang.annotation.* ; @Documented public @interface ToDo { int id(); String date(); public String description(); }

Si lon reprend lexemple ci dessus de la classe NombresComplexes, le passage au javadoc donnera le rsultat suivant :

On remarque que les accents, comme laccoutume, passent trs mal @Inherited Par dfaut, une annotation nest pas hrite. Cela signifie quune classe hritant dune superclasse ou un membre redfinissant celui de sa superclasse nhriteront pas des annotations de celle ci. Cette mta-annotation permet de remdier cela en faisant systmatiquement hriter lannotation spcifie. Exemple :
import java.lang.annotation.* ; @Inherited @Documented public @interface ToDo { int id(); String date(); public String description(); }

3-54

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

@Retention Elle permet de dfinir le primtre de lannotation laide dune des valeurs suivantes : RetentionPolicy.SOURCE Lannotation est destination des outils qui exploitent les sources (compilateur, javadoc). Elle ne sera pas crite dans les fichiers compils (.class). RetentionPolicy.CLASS Lannotation est destination des outils qui exploitent les fichiers compils, lexception de la JVM (par exemple les outils dintrospection). Elle est donc crite dans les fichiers compils. RetentionPolicy.RUNTIME Elle est crite dans les fichiers compils, mais ne sera utilise que par la JVM au moment de lexcution de lapplication.

Exemple :
import java.lang.annotation.* ; @Retention( RetentionPolicy.SOURCE) @Inherited @Documented public @interface ToDo { int id(); String date(); public String description(); }

@Target Enfin, on peut spcifier les types dlments sur lesquels on souhaite voir appliquer lannotation laide de cette mta-annotation : ElementType.ANNOTATION_TYPE ElementType.CONSTRUCTOR ElementType.FIELD ElementType.LOCAL_VARIABLE ElementType.METHOD ElementType.PACKAGE ElementType.PARAMETER ElementType.TYPE sur une annotation. sur un constructeur. sur un attribut. sur une variable locale. sur une mthode. sur un package. sur le paramtre dune mthode. sur une classe, une interface ou une numration.

Exemple :
import java.lang.annotation.* ; @Target( ElementType.TYPE) @Retention( RetentionPolicy.SOURCE) @Inherited @Documented public @interface ToDo {

Eyrolles/Tsoft - Java la matrise

3-55

Module 3 : Concepts objet avec Java


int id(); String date(); public String description(); }

Remarque : La mta-annotation @Target peut aussi recevoir un tableau en argument, si plusieurs types sont prendre en compte. Exemple :
@Target( {ElementType.METHOD, ElementType.FIELD})

Annotation Processing Tool (APT)


Les annotations seront surtout destines renseigner, directement dans le code source, des informations susceptibles dtres utilises par des outils autres que le compilateur. Par exemple des fichiers descripteurs (Descripteur de dploiement dun EJB, classe BeanInfo dun JavaBean). Cette gnration automatise de fichiers descripteurs pourra tre effectue par loutil APT. Disponible partir de Java 5, il fait partie des excutables du JSDK. La gnration automatise des fichiers descripteurs (ou autre) sera assure par un code quil faudra dvelopper, partir de lAPI mirror . Fournie en open source, et dfinie dans la JSR 269. Elle se trouve dans la package com.sun.mirror.apt qui se trouve dans le fichier tools.jar dans le rpertoire lib du rpertoire o est install le JDK. Pour lutiliser avec NetBeans, choisir loption menu File / Project properties , puis loption Libraries , cliquer sur le bouton Add Jar/Folder , et aller chercher le fichier tools.lib (par exemple en C:\jdk1.6.0\lib\tools.jar). Il faudra aussi ajouter dans le processus de compilation linvocation de la commande APT. Cest facilement ralisable si lon utilise loutil ANT.

Invocation dun processeur depuis le compilateur

Java 6

A partir de la version 6, loutil APT nest plus ncessaire. Il est possible dinvoquer un processeur directement dans la phase de compilation. Linvocation seffectue par loption processor du compilateur : Exemple :
javac -processor ClasseProcesseur Programme.java

La classe processeur devra tre prsente dans le CLASSPATH au moment de la compilation. Reprenons notre exemple dannotation @ToDo, nous allons crer une classe processeur qui va simplement afficher, au moment de la compilation, le contenu de cette annotation chaque fois quelle est trouve dans le code compiler. Nous allons crer un package contenant la fois la classe de lannotation, et celle du processeur. Lannotation ToDo ci-dessous fait partie du package mesannotations. Elle est utilisable soit pour une mthode, soit pour un constructeur.
package mesannotations; import java.lang.annotation.*;

3-56

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

@Target( {ElementType.METHOD, ElementType.CONSTRUCTOR}) public @interface ToDo { String value(); }

Le processeur ToDoProcessor ci-dessous fera aussi partie du package mesannotations. Il se contente dafficher lannotation vers la console java, et denvoyer un Warning.
package mesannotations; import java.util.Set; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.*; import javax.tools.*; @SupportedAnnotationTypes("*") @SupportedSourceVersion( SourceVersion.RELEASE_6) public class ToDoProcessor extends AbstractProcessor{ /** Creates a new instance of ToDoProcessor */ public ToDoProcessor() { } public boolean process( Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element e : roundEnv.getElementsAnnotatedWith(ToDo.class)) { if (e.getKind() != ElementKind.FIELD) { System.out.println( "Traitement d'une annotation: " +e.getAnnotation(ToDo.class) +" dans "+e.getSimpleName()); processingEnv.getMessager().printMessage( Diagnostic.Kind.WARNING, "ToDo dans: "+e.getEnclosingElement(), e); continue; } } return true; } }

Eyrolles/Tsoft - Java la matrise

3-57

Module 3 : Concepts objet avec Java

Enfin, lutilisation de cette annotation se fera dans la classe ClassePrincipale, dans un autre package (test).
package test; import mesannotations.ToDo; public class ClassePrincipale { /** Creates a new instance of ClassePrincipale */ @ToDo( "Le constructeur n'est pas encore implment") public ClassePrincipale() { } @ToDo ("Vrifier cette mthode") public static void main( String [] args) { System.out.println( "Excution du programmme"); } }

Cette classe sera cre dans un autre projet, dont les paramtres de compilation prendront en compte lutilisation du processeur (Aller dans les proprits du projet File / project properties ) : Aller dans loption Build / Compiling et spcifier dans le champ Additionnal Compiler Options la ligne suivante : -processor mesannotations.ToDoProcessor . Aller dans loption Libraries et cliquer sur Add project et choisir le projet contenant le processeur. La compilation donnera laffichage suivant :

On voit dans cet exemple lintrt des annotations : permettre dajouter des actions de gnralisation dans le processus de compilation du code.

Conclusion
Les annotations nont aucun effet sur la smantique des programmes. Elles sont destines des outils lors de la construction du code. Cette nouveaut est assez peu utilise dans le cadre de programmes J2SE, mais beaucoup plus utile pour la programmation serveur (J2EE), notamment pour les composants mtiers (EJB) et plus gnralement tous composants ncessitant des directives lors de leurs assemblages (Web Services). Mais il est probable que leur utilisation se dveloppera aussi dans la version standard de Java, par exemple pour la gnration des interfaces graphiques.

3-58

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Atelier
Atelier
Objectifs : Mettre en pratique les concepts de lobjet (classes, objets, proprits, mthodes, hritage, etc) Bien comprendre les notions de polymorphisme et dinterface

Dure minimum : 60 minutes.

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.18

Exercice 1 : Cration d'une classe


Crer une classe Date, qui permettra de crer des objets reprsentant des dates. Cette classe dispose de trois proprits (de type int) : Jour. Mois. An.

Exercice 2 : Cration d'objets


Dans la classe Date cre dans le premier exercice, implmenter une mthode main. Dans cette mthode, crer trois objets Date, les initialiser des dates diffrentes.

Exercice 3 : Variable de classe


Reprendre toujours la mme classe Date, y dfinir une variable statique nomme jourDeLAn, de type Date et initialise au premier janvier. Cette variable nous permettra de vrifier si la date de l'objet est un jour de l'an (si le jour et le mois sont identiques ceux de la variable jourDeLAn).

Exercice 4 : Mthode publique


Implmenter dans Date la mthode :
public void afficher()

Cette mthode affiche le contenu de l'objet date sous la forme jour/mois/an. Eyrolles/Tsoft - Java la matrise

3-59

Module 3 : Concepts objet avec Java


Si la date correspond au jour de l'an, afficher en plus le message "Bonne anne". Invoquer cette mthode dans le main, sur les trois objets Date crs.

Exercice 5 : Mthode prive


Implmenter une mthode interne (private) de vrification de la validit de la date (on se limitera vrifier que le mois est compris entre 1 et 12 et le nombre de jours de chaque mois, en ne prenant pas en compte les annes bissextiles : fvrier fait toujours 28 jours).
private boolean verifDate();

Cette mthode rend false si la date est fausse.

Exercice 6 : Constructeur
Crer un constructeur qui prend en argument le jour, le mois et l'anne. Utiliser ce constructeur dans le main pour crer les trois objets Date. Crer aussi un constructeur sans argument.

Exercice 7 : Hritage
Crer une nouvelle classe : Evenement, qui hrite de Date. La nouveaut dans cette classe est qu'elle possde une proprit supplmentaire qui contient le texte de l'vnment (par exemple "anniversaire Toto", "Nol", etc.). Crer le constructeur qui renseigne la date et le texte de l'vnement :
public Evenement( int jour, int mois, int an, String texte);

Exercice 8 : Polymorphisme
Implmenter dans Date et Evenement les mthodes polymorphes :
String toString(); boolean equals( Object o);

toString renvoie une chane de caractres contenant : Pour la classe Date : la date au format jour/mois/an. Pour la classe Evenement : le texte de l'vnement suivi de sa date au format jour/mois/an. equals renvoie true si l'objet pass en argument est identique : Pour la classe Date : les jours, mois et ans sont identiques. Pour la classe Evenement : la date et le message sont identiques (pour ce dernier, s'appuyer sur la mthode equals de String). Remarque : La mthode polymorphe equals est un peu particulire.

3-60

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java

Exercice 9 : Association
Rcuprer l'algorithme du tri bulles pour trier cette fois-ci des chanes de caractres. Voir dans la documentation du JDK les mthodes de la classe String qui permettent de comparer deux chanes de caractres. La nouvelle classe de tri (que l'on nommera TriBulle2) ne possdera pas de mthode static main, mais un constructeur qui prendra en argument un tableau de String, une mthode pour dclencher le tri et une mthode pour afficher le contenu du tableau :
public class TriBulle2 { private String[] tableau; // Le tableau trier, initialis // dans le constructeur ci-dessous // Constructeur public TriBulle2( String [] tableau) { // continuer ici } public void trier() { // Trier le tableau ici } public void afficher() { // Afficher chaque ligne du tableau ici } }

Exercice 10 : Cration d'interface


Et si nous voulions pouvoir trier nimporte quel type dobjet, comment faire ? On peut utiliser l'interface Comparable dj dfinie dans Java. Attention bien vrifier si les objets comparer sont compatibles ! Reprendre le programme TriBulle2, le modifier pour qu'il puisse trier des objets Comparable au lieu d'objets String. Remarque : La classe String implmente l'interface Comparable. Avec cette nouvelle version de TriBulle2, on peut donc toujours trier des String.

Exercice 11 : Implmentation d'une interface


Tri de dates. Pour trier des objets Date avec la classe de tri cre juste avant, il faut implmenter Comparable dans Date.

Exercice 12 : Cration d'un package


Nous allons maintenant crer un package outils dans lequel nous allons mettre la classe de tri prcdemment cre.

Eyrolles/Tsoft - Java la matrise

3-61

Module 3 : Concepts objet avec Java

Questions/Rponses
Questions/rponses

TSOFT J av a : la m atris e

Module 3 : Concepts de l Objet -Diapo 3.19

Q. Quelle est la diffrence entre une variable locale, une variable globale et une variable dinstance ? R. Les variables locales sont dclares dans les mthodes, elles sont stockes dans la pile de programme, et ne sont donc accessible que l'intrieur du bloc d'instruction de la mthode dans le contexte de son appel (deux appels successifs la mme mthode ne permettent pas au second appel de retrouver les donnes initialises par le premier appel). Les variables d'instance sont dclares dans la classe, et sont stockes dans la mmoire globale. Mais elles sont propres chaque objet. Deux objets n'ont pas les mmes valeurs pour les mmes variables. Lorsque l'on appelle deux fois la mme mthode d'un mme objet, les donnes initialises par le premier appel sont rcupres dans le second appel. Enfin, les variables globales sont des variables de classe, elles sont aussi dclares dans la classe, mais avec le modificateur static. Elles sont stockes dans la mmoire globale et sont partages par toutes les instances de la classe. Elles sont visibles uniquement dans les objets issus de la classe dans laquelle elles sont dclares. Q. Est-il possible d'appeler super.super ? R. Non, en effet on sait que toute classe a un pre (mme une classe qui n'hrite de rien explicitement, hritera implicitement de Object). Par contre, elle ne possdera pas forcment un grand-pre. Est-il autoris dhriter dune classe abstraite mais de ne pas implmenter toutes les mthodes non implmentes de la classe abstraite ? Oui, mais dans ce cas vous crez une autre classe abstraite, et il faudra la dclarer en abstract. Q. Peut-on avoir, dans un mme projet, des classes ayant exactement le mme nom ?

3-62

Eyrolles/Tsoft - Java la matrise

Module 3 : Concepts objet avec Java


R. Oui, condition que ces classes soient dans des packages diffrents. Si vous souhaitez utiliser ces classes homonymes, simultanment dans une mme classe de votre programme, il y a alors une ambigut qui ne peut tre leve que en spcifiant ces classes par leur chemin complet. Cela est plutt astreignant, ce qui expliquera que l'on vitera l'usage de noms identiques pour des classes diffrentes. Cela existe, malgr tout, dans les classes de Java, comme par exemple les classes java.util.Date et java.sql.Date, qui reprsentent respectivement une date Java et une date SQL. Q. Peut-on avoir un package dans deux entres du CLASSPATH ? R. Oui, les fichiers sont vus dans l'ordre des entres dans cette variable d'environnement. Attention aux problmes de conflits de version ! Q. Peut-on avoir une mthode avec un nombre darguments variable de types diffrents ? R. Non, par contre si vous dfinissez que le type des arguments de votre mthode est Object, alors ce peut tre des types diffrents, puisque tous les types objet descendent de Object. Attention bien reconnatre les types des objets reus avant de les caster pour les manipuler Q. Peut-on dclarer un constructeur private, et si oui quoi cela peut-il servir ? R. La rponse est oui. Un exemple d'utilisation pourrait tre dans le cas d'une classe dont une seule instance doit tre faite dans la JVM (par exemple un driver). Dans ce cas on dclarera le constructeur en private pour viter qu'on ne l'utilise, mais il sera appel depuis une mthode statique. Exemple :
static ClasseAUneInstance uneSeuleInstance; private ClasseAUneInstance() { // Constructeur private } // La mthode qui n'instanciera qu'une seule fois // et retournera toujours l'instance public static ClasseAUneInstance getInstance() { if( uneSeuleInstance == null) ClasseAUneInstance= new ClasseAUneInstance(); return uneSeuleInstance; }

Q. Peut-on accder un membre statique dans une classe abstraite ? R. Oui, rien n'empche d'accder une proprit statique, ou d'invoquer une mthode statique dans une classe abstraite.

Eyrolles/Tsoft - Java la matrise

3-63