Vous êtes sur la page 1sur 220

Programmation Oriente Objet en Java

Licence Fondamentale SMI S5

El Mostafa DAOUDI
Dpartement de Mathmatiques et dInformatique, Facult des Sciences Universit Mohammed Premier Oujda m.daoudi@fso.ump.ma Septembre 2012
El Mostafa DAOUDI- p. 1

Quelques Rfrences: - Cours JAVA SMI S5, Daoudi 2011/2012 Livre: - Titre: Programmer en JAVA , AuteurClaude Delnoy, Editeur: Eyrolles - Thinking in Java, Bruce Eckel Ressources Internet: - http ://www.java.sun.com - Richard Grin: http://deptinfo.unice.fr/~grin - Cours Mickal BARON - 2007 - Cours Interface graphique en Java API swing, Juliette Dibie-Barthlemy mai 2005 - ..

El Mostafa DAOUDI- p. 2

Ch I. Introduction gnrale au langage Java


I. Introduction Java est un langage orient objet: l'entit de base de tout code Java est la classe Cr en 1995 par Sun Microsystems Sa syntaxe est proche du langage C Il est fourni avec le JDK (Java Developpment Kit)
Outils de dveloppement Ensemble de paquetages trs riches et trs varis

Multi-tches (threads) Portable grce lexcution par une machine virtuelle


El Mostafa DAOUDI- p. 3

En Java, tout se trouve dans une classe. Il ne peut y avoir de dclarations ou de code en dehors du corps d'une classe. La classe elle mme ne contient pas directement du code.
Elle contient des attributs. et des mthodes (quivalents des fonctions).

Le code se trouve exclusivement dans le corps des mthodes, mais ces dernires peuvent aussi contenir des dclarations de variables locales (visibles uniquement dans le corps de la mthode).

El Mostafa DAOUDI- p. 4

II. Environnement de Programmation 1. Compilation La compilation dun programme Java ne traduit pas directement le code source en fichier excutable. Elle traduit dabord le code source en un code intermdiaire appel bytecode. Cest le bytecode qui sera ensuite excut par une machine virtuelle (JVM ; Java Virtual Machine). Ceci permet de rendre le code indpendant de la machine qui va excuter le programme. Sun fournit le compilateur javac avec le JDK. Par exemple,
javac MonPremProg.java

compile la classe MonPremProg dont le code source est situ dans le fichier MonPremProg.java
El Mostafa DAOUDI- p. 5

Si le fichier MonPremProg.java fait rfrence, par exemple, des classes situes dans les rpertoires /prog/exemple et /cours, alors la compilation se fait de la faon suivante:
sous windows: sous Linux: javac -classpath /prog/exemple ; /cours; MonPremProg.java javac -classpath /prog/exemple : /cours; MonPremProg.java

On peut dsigner le fichier compiler par un chemin absolu ou relatif : javac home/user2/MonPremProg.java Cette compilation cre un fichier nomm MonPremProg.class qui contient le bytecode

Si un systme possde une JVM, il peut excuter tous les bytecodes (fichiers .class) compils sur nimporte quel autre systme.
El Mostafa DAOUDI- p. 6

2. Excution du bytecode
Le bytecode doit tre excut par une JVM. Cette JVM n'existe pas; elle est simule par un programme qui lit les instructions (en bytecode) du programme .class, les traduit dans le langage machine relatif la machine sur laquelle il sera excut. Lance leur excution Pour excuter, Sun fournit le programme java qui simule une JVM. Il suffira dutiliser la commande: java MonPremProg Si des classes dautres rpertoires sont ncessaires, alors faut alors utiliser loption classpath de la mme faon que la compilation: sous windows: java -classpath /prog/exemple ; /cours MonPremProg sous Linux: java -classpath /prog/exemple : /cours MonPremProg
El Mostafa DAOUDI- p. 7

3. Mon premier programme en Java


Considrons le code source suivant: public class MonPremProg { public static void main(String args[]) { System.out.println(" Bonjour: mon premier programme Java " ); } } Important: 1. Ce code doit tre sauvegarder obligatoirement dans le Fichier source nomm MonPremProg.java 2. Une classe excutable doit possder une mthode ayant la signature public static void main(String[] args).

El Mostafa DAOUDI- p. 8

Dans le cas de lenvironnement JDK de SUN. Pour compiler, il suffit dutiliser la commande javac: javac MonPremProg.java Pour excuter, il suffira dutiliser la commande: java MonPremProg qui interprte le bytecode de la mthode main() de la classe MonPremProg

El Mostafa DAOUDI- p. 9

Lexcution du programme MonPremProg affiche lcran, comme rsultat, la chane de caractres: Bonjour: mon premier programme Java Ceci grce linstruction: System.out.println(" Bonjour: mon premier programme Java ");

El Mostafa DAOUDI- p. 10

De manire gnrale, dans tout programme destin tre excut doit contenir une mthode particulire nomme main() dfinie de la manire suivante:
public static void main(String args[]) { /* corps de la mthode */ }

Le paramtre args de la mthode main() est un tableau dobjets de type String. Il est exig par le compilateur Java. La classe contenant la mthode main() doit obligatoirement tre public afin que la machine virtuelle y accde. Dans lexemple prcdent, le contenu de la classe MonPremProg est rduit la dfinition dune mthode main().
El Mostafa DAOUDI- p. 11

Un fichier source peut contenir plusieurs classes mais une seule doit tre public (dans lexemple cest la classe: MonPremProg ). Le nom du fichier source est identique au nom de la classe publique qu'il contient, suivi du suffixe .java. Dans lexemple prcdent, le fichier source doit obligatoirement avoir le nom: MonPremProg.java

El Mostafa DAOUDI- p. 12

Ch. II Les classes et les Objets


I. Gnralit sur la Programmation Oriente Objet La Programmation Oriente Objet (POO) propose une mthodologie de programmation centre sur les objets, o un objet peut tre vu comme une entit regroupant un ensemble de donnes et de mthodes de traitement. Le programmeur - Doit dabord identifier les objets qui doivent tre utilis (ou manipul) par le programme: on commence par dcider quels objets doivent tre inclus dans le programme. - Il va ensuite crire les traitements, en associant chaque traitement un objet donn. Il s'agit donc : - de dterminer les objets prsents dans le programme. - d'identifier leurs donnes . - de dfinir les traitements faire sur ses objets .

El Mostafa DAOUDI- p. 13

Intrts de la Programmation Oriente Objet (POO) Programmation modulaire: Faciliter de la rutilisation de code. Encapsulation (Principe de la POO) et abstraction (proche du monde rel): Regrouper les caractristique dans une classe. Cacher les membres dune classe: choix dans les niveaux de confidentialit. Programmation par composants (chaque portion de code est isole) : Faciliter de lvolution du code. Les grands principes de la POO - lencapsulation - Lhritage - Le Polymorphisme
El Mostafa DAOUDI- p. 14

II. Les classes


Une classe (ou type dobjets) reprsente une famille dobjets qui partagent des proprits communes. Une classe regroupe les objets qui ont : - La mme structure (mme ensemble dattributs). - Le mme comportement (mme mthodes). - Les classes servent pour la cration des objets Un objet est une instance dune classe - Un programme orient objet est constitu de classes qui permettent de crer des objets qui senvoient des messages. - Lensemble des interactions entre les objets dfini un algorithme. - Les relations entre les classes refltent la dcomposition du programme.
El Mostafa DAOUDI- p. 15

Les membres dune classe: - Champs (appels aussi attributs ou donnes membres): lensemble des membres dfinissent ltat dun objet (chaque objet a ses donnes propres). - Mthodes (appels aussi fonctions membres ou comportement): dfinissent un ensemble doprations applicables lobjet (on manipule les objets par des appels de ses mthodes). Lensemble des mthodes est appel linterface de lobjet. Une interface dfinit toutes les oprations quon peut appliquer lobjet (dfinit tous ce quil est possible de "faire" avec un objet).
El Mostafa DAOUDI- p. 16

Exemple: Rectangle est une classe utilise pour crer des objets reprsentant des rectangles particuliers. Elle regroupe 4 donnes de type rel qui caractrisent le rectangle: longueur , largeur et origine (x,y) (la position en abscisse et en ordonne de son origine). On suppose quon peut effectuer les oprations de dplacement et de calcul de la surface du rectangle. Les symboles + et sont les spcificateurs daccs (voir plus loins) Exemple (notation UML)
Rectangle - longueur - largeur -x -y + deplacer(int,int) + calculSurface() Nom de la classe Description des attributs

Description des mthodes


El Mostafa DAOUDI- p. 17

Cration dune classe Pour crer une classe (un nouveau type dobjets) on utilise le mot cl class. La syntaxe pour crer une classe de nom ClasseTest est la suivante: class ClasseTest{ /* ClasseTest est le nom de la classe crer */ /* Corps de la classe - Description des attributs (donnes membres) - Description des mthodes */ } Pour les commentaire on utilise: // pour un commentaire sur une seule ligne /* pour un commentaire tal sur plusieurs lignes. Il doit terminer avec */
El Mostafa DAOUDI- p. 18

Exemple: Soit Rectangle une classe utilise pour crer des objets reprsentant des rectangles particuliers. Un objet de type Rectangle est caractris par: La longueur de ses cots. Sa position dans le plan: cette position peut tre dfinie par la position de son centre dans le plan. On suppose aussi que les cots du rectangle sont parallles laxe des abscisses et laxe des ordonnes. On suppose quon peut effectuer sur un objet de type rectangle, les oprations suivantes: calcul de la surface dplacement dans le plan

El Mostafa DAOUDI- p. 19

Code java de la classe Rectangle : Nom de la classe

Attributs

Mthodes

class Rectangle { int longueur; int largeur; int x; int y; void deplacer(int dx, int dy) { x = x+ dx; y = y + dy; } int calculSurface() { return longueur * largeur; } }
El Mostafa DAOUDI- p. 20

10

III. Cration et manipulation dObjets 1. Introduction Une fois la classe est dfinie, on peut crer des objets (variables). Donc chaque objet est une variable dune classe. Il a son espace mmoire, il admet une valeur propre chaque attribut. Les valeurs des attribut caractrisent ltat de lobjet. Lopration de cration de lobjet est appele une instanciation. Un objet est aussi appel une instance d'une classe. Il est rfrenc par une variable ayant un tat (ou valeur). On parle indiffremment dinstance, de rfrence ou dobjet
El Mostafa DAOUDI- p. 21

Une classe permet dinstancier plusieurs objets. les attributs et les mthodes dun objet (une instance dune classe) sont les mmes pour toutes les instances de la classe. Les valeurs des attributs sont propres chaque objet. Par exemple rectangleR1 est une instance de la classe Rectangle
Rectangle instance rectangleR1 - longueur =10 - largeur =2 - x=0 - y=0 - : private
El Mostafa DAOUDI- p. 22

Nom de la classe Relation dinstanciation Nom de lobjet ou de linstance

Valeurs des attributs qui caractrisent lobjet rectangleR1

11

Les valeurs des attributs peuvent tre diffrents. Chaque instance dune classe possde ses propres valeurs pour chaque attribut (chaque objet a son propre tat).

Rectangle instance

rectangleR1 - longueur =10 - largeur =2 - x=0 - y=0

rectangleR2 - longueur =5 - largeur =2 - x=1 - y=2

rectangleR3 - longueur =3 - largeur =3 - x=2 - y=0

El Mostafa DAOUDI- p. 23

2. Etapes de cration des Objets


Contrairement aux types primitifs, la cration dobjets se passe en deux tapes: - Dclaration de lobjet - Cration de lobjet 2.1. Dclaration dun objet: Chaque objet appartient une classe. Cest une variable comme les autres. Il faut notamment quil soit dclar avec son type. Syntaxe: NomDeClasse1 objetId; NomDeClasse2 objetId1, objetId2,.; NomDeClasse1 et NomDeClasse2 dsignent les noms de deux classes. Elles dclarent - objetId comme variable de type NomClasse1 - objetId1 , objetId2 , comme variables de type NomClasse2
El Mostafa DAOUDI- p. 24

12

Attention: - La dclaration dune variable de type primitif rserve un emplacement mmoire pour stocker la variable. - Par contre, la dclaration dun objet, ne rserve pas une place mmoire pour lobjet, mais seulement un emplacement pour une rfrence cet objet. les objets sont manipuls avec des rfrences

El Mostafa DAOUDI- p. 25

Exemple: Considrons la classe ClasseTest class ClasseTest { // corps de la classe ClasseTest } linstruction: ClasseTest objA; - Dclare objA comme objet (variable) de type ClasseTest - Dfinit le nom et le type de lobjet. - Dclare que la variable objA est une rfrence un objet de la classe ClasseTest. Cela veut dire quon va utiliser une variable objA qui rfrencera un objet de la classe ClasseTest. - Aucun objet nest cr: un objet seulement dclar, vaut null .
objA null
El Mostafa DAOUDI- p. 26

13

2.2. Cration dun objet Aprs la dclaration dune variable, on doit faire la cration (et allocation) de la mmoire de lobjet qui sera rfrenc par cette variable. - La cration doit tre demand explicitement dans le programme en faisant appel loprateur new. - La cration rserve de la mmoire pour stocker lobjet et initialise les attributs. Lexpression new NomDeClasse() cre un emplacement pour stocker un objet de type NomDeClasse. Important: - avant dutiliser un objet on doit le crer. - la dclaration seule dun objet, ne nous permet pas de lutiliser.
El Mostafa DAOUDI- p. 27

Exemple class ClasseTest { /* Corps de la classe ClasseTest */ } ClassTest objA ; /* dclare une rfrence sur lobjet objA */ objA= new ClasseTest(); /* cre un emplacement pour stocker lobjet objA */ Les deux expressions prcdentes peuvent tre remplaces par : ClassTest objA = new ClasseTest(); En gnrale: 1. Chaque objet met ses donnes membres dans sa propre zone mmoire. 2. En gnral, les donnes membres ne sont partages entre les objets de la mme classe.

El Mostafa DAOUDI- p. 28

14

Exemple : Considrons la classe rectangle public class Rectangle{ int longueur; int largeur; int x; int y; public static void main (String args[]) { Rectangle rectangleR1; /* dclare une rfrence sur lobjet rectangleR1 */ rectangleR1 = new Rectangle(); /* cration de lobjet rectangleR1 */ // rectangle R1 est une instance de la classe Rectangle // Les deux expressions peuvent tre remplaces par : // Rectangle rectangleR1=new Rectangle(); } }

El Mostafa DAOUDI- p. 29

2.3. Initialisation par dfaut La cration dun objet entrane toujours une initialisation par dfaut de tous les attributs de lobjet mme si on ne les initialise pas:
---------------------------------------------------------------Type | Valeur par dfaut | ---------------------------- |-----------------------------------| boolean | false | char | \u0000 (null) | byte | (byte) 0 | short | (short) 0 | int | 0 | long | 0L | float | 0.0f | double | 0.0 | Class | null | ------------------------------------------ ----------------------|
El Mostafa DAOUDI- p. 30

15

Attention: Cette garanti dinitialisation par dfaut ne sapplique pas aux variables locales (variables dclare dans un bloc: par exemple les variables locales dune mthode) (voir plus loin).

El Mostafa DAOUDI- p. 31

IV. Les mthodes


1. Dfinition En Java, chaque fonction est dfinie dans une classe . Elle est dfinie par : un type de retour un nom une liste (ventuellement vide) de paramtres typs en entre une suite dinstructions (un bloc dinstructions) qui constitue le corps de la mthode Syntaxe: typeRetour nomMethode ( Liste des paramtres ) { /* corps de la mthode: les instructions dcrivant la mthode */ }
El Mostafa DAOUDI- p. 32

16

- nomMethode : cest le nom de la mthode

- Liste des paramtres : liste des arguments de la mthode. Elle dfinit les types et les noms des informations quon souhaite passer la mthode lors de son appel. - typeRetour : cest le type de la valeur qui sera retourne par la mthode aprs son appel. Si la mthode ne fournit aucun rsultat, alors typeRetour est remplac par le mot cl void. Remarque: Dans le cas o la mthode retourne une valeur, la valeur retourne par la fonction doit tre spcifie dans le corps de la mthode par linstruction de retour:
return expression; ou return; // (possible uniquement pour une fonction de type void)
El Mostafa DAOUDI- p. 33

2. Passage des paramtres Le mode de passage des paramtres dans les mthodes dpend de la nature des paramtres : - par valeur pour les types primitifs. - par valeur des rfrences pour les objets: la rfrence est passe par valeur (i.e. le paramtre est une copie de la rfrence), mais le contenu de lobjet rfrenc peut tre modifi par la fonction (car la copie de rfrence pointe vers le mme objet) :

El Mostafa DAOUDI- p. 34

17

Exemple: class ClasseTest { void methode1(int j){ j+=12; } void methode2() { int j = 3; methode1(j); System.out.println(j=" + j); // j=3 } }

El Mostafa DAOUDI- p. 35

3. Surcharge des mthodes On parle de surcharge (en anglais overload) lorsquun mme symbole possde plusieurs significations diffrentes entre lesquelles on choisit en fonction du contexte. Par exemple la symbole + dans linstruction a+b dpend du type des variables a et b. En Java , on peut surcharger une mthode, cest--dire, dfinir (dans la mme classe) plusieurs mthodes qui ont le mme nom mais pas la mme signature (diffrencies par le type des arguments) Remarques: La signature dune mthode est: le nom de la mthode et lensemble des types de ses paramtres.

- En Java, le type de la valeur de retour de la mthode ne fait pas partie de sa signature.


El Mostafa DAOUDI- p. 36

18

Considrons lexemple suivant ou la classe ClasseTest est dote de 2 mthodes calcMoyenne: - La premire a deux arguments de type double - La deuxime a trois arguments de type double

El Mostafa DAOUDI- p. 37

class ClasseTest{ public double calcMoyenne(double m1, float m2) { return (m1+m2)/2; } public float calcMoyenne(double m1, double m2, double m3) { return (m1+m2+m3)/3; } } public class TestSurcharge { public static void main(String[] args) { ClasseTest objA; System.out.println(Moy1="+objA.calcMoyenne(10., 12.2)); System.out.println(Moy2="+objA.calcMoyenne(10., 12.6, 8.)); } }
El Mostafa DAOUDI- p. 38

19

V. Accs aux membres dun objet


1. Accs aux attributs(donnes membres) Considrons la classe ClassTest suivante: class ClasseTest { double x; boolean b; } ClasseTest objA = new ClasseTest(); // cette instruction a cr un objet de rfrence objA // on dit aussi que objA est une instance de la classe ClassTest // ou tous simplement on a cr un objet : objA ClasseTest objB = new ClasseTest();
El Mostafa DAOUDI- p. 39

Une fois lobjet est cr, on peut accder ses donnes membres de la manire suivante: on indique le nom de lobjet suivi par un point, suivi par le nom de lattribut comme suit: nomObjet.nomAttibut o:
nomObjet = nom de la rfrence lobjet (nom de lobjet) nomAttribut =nom de la donne membre (nom de lattribut).

Exemple: pour les objets objA et objB de la classe ClassTest qui sont dj crs: objA.b=true; // affecte true lattribut b de lobjet objA. objA.x=2.3; // affecte le rel 2.3 lattribut x de lobjet objA. objB.b=false; // affecte false lattribut b de lobjet objB. objB.x=0.35; // affecte le rel 0.35 lattribut x de lobjet objB.
El Mostafa DAOUDI- p. 40

20

2. Accs aux mthodes: appels des mthodes Les mthodes ne peuvent tre dfinies que comme des composante dune classe. Une mthode ne peut tre appele que pour un objet. Lappel dune mthode pour un objet se ralise de la manire suivante: on indique le nom de lobjet suivi dun point, suivi du nom de la mthode et de sa liste darguments: nomObjet.nomMethode(arg1, .). o nomObjet: nom de lobjet nomMethode: nom de la mthode.
El Mostafa DAOUDI- p. 41

Exemple 1: soit f () une mthode qui prend un paramtre de type double et qui retourne une valeur de type int.
class ClasseTest { // attributs int f(double x) { int n; // corps de la fonction f() return n; } }

ClasseTest objA = new ClasseTest(); // cr un objet objA; int j = objA.f(5.3); // affecte j la valeur retourne par f()

El Mostafa DAOUDI- p. 42

21

Exemple 2: Considrons la classe Rectangle dote de la mthode initialise qui permet daffecter des valeurs lorigine (aux attributs x et y). public class Rectangle{ int longueur, largeur; int x,y; void initialise_origine(int x0, int y0) { x=x0; y=y0; } public static void main (String args[]) { Rectangle r1; r1.longueur=4; r1.largeur=2; r1. initialise_origine(0,0); // affecte 0 aux attribut x et y // Affiche lerreur : NullPointException() /* En effet lobjet r1 est seulement dclar. Il nest pas encore cr. Avant de lutiliser, il faut tout dabord le crer */ } }
El Mostafa DAOUDI- p. 43

Exemple : cre lorigine un rectangle r1 de longueur 4 et de largeur 2 public class Rectangle{ int longueur, largeur; int x,y; void initialise_origine(int x0, int y0) { x=x0; y=y0; } public static void main (String args[]) { Rectangle r1=new Rectangle (); r1.longueur=4; r1.largeur=2; r1. initialise_origine(0,0); } }

El Mostafa DAOUDI- p. 44

22

VI. Encapsulation
Une classe permet denvelopper les objets : Un objet est vu par le reste du programme comme une entit opaque. L'enveloppement [wrapping] des attributs et mthodes l'intrieur des classes plus (+) le contrle d'accs aux membre de lobjet est appel encapsulation. Le contrle d'accs aux membres de lobjet est appel cacher l'implmentation: Les membres publiques sont vus de l'extrieur mais les membres privs sont cachs. L'encapsulation est un mcanisme consistant rassembler les donnes et les mthodes au sein d'une structure en cachant l'implmentation de l'objet, c'est--dire en empchant l'accs aux donnes par un autre moyen que les services proposs.

El Mostafa DAOUDI- p. 45

Possibilit daccder aux attributs dune classe Java mais ceci nest pas recommand car contraire au principe dencapsulation: Les donnes (attributs) doivent tre protgs. Accessibles pour lextrieur par des mthodes particulires (par exemple slecteurs). Plusieurs niveaux de visibilits peuvent tre dfinis en prcdant, la dclaration dun attribut, dune mthode ou dun constructeur, par un modificateur (spcificateur daccs) : private, public ou protected.

El Mostafa DAOUDI- p. 46

23

Spcificateurs daccs: L'encapsulation permet de dfinir 3 niveaux de visibilit des lments de la classe. Ces 3 niveaux de visibilit (public, private et protected) dfinissent les droits d'accs aux donnes suivant le type daccs:

Membres privs : un membre d'une classe C dont la dclaration est prcde par le modificateur private est considr comme un membre priv. Il n'est accessible que depuis lintrieur. Cest dire seulement les mthode de la classe elle-mme (classe C) qui ont le droit daccder ce membre. Accs par dfaut: lorsquaucun spcificateur daccs nest mentionn devant un membre de la classe C, on dit que ce membre a l'accessibilit par dfaut. Ce membre n'est accessible que depuis la classe C et depuis les autres classes du paquet auquel C appartient (classes du mme paquetage que la classe C).
El Mostafa DAOUDI- p. 47

Membres protgs : un membre d'une classe C dont la dclaration est prcd par le modificateur protected se comporte comme private avec moins de restriction: il n'est accessible que depuis: - la classe C, - les classes du paquet auquel C appartient (les classes du mme paquetage que la classe C) - et les sous-classes, directes ou indirectes, de C. Attention: une classe drive a un accs aux membres protected mais pas aux membres private. Membres publics : un membre de la classe C dont la dclaration commence par le modificateur public est accessible partout o C est accessible. Il peut tre accder depuis lextrieure (par une classe quelconque).

El Mostafa DAOUDI- p. 48

24

Exemple 1: accs pour modification depuis lextrieur dun champs


class ClasseTest { public int x; private int y; public void initialise (int i, int j){ x=i; y=j; // ok: accs depuis lintrieur (depuis la classe elle-mme) lattribut private y } } public class TestA{ // fichier source de nom TestA.java public static void main (String args[]) { ClasseTest objA; objA=new ClasseTest(); // On peut aussi dclarer ClasseTest objA=new ClasseTest(); objA.initialise(1,3); /* ok: accs depuis lextrieur (depuis une autre classe) une mthode public. Aprs appel de initialise(), x vaut 1 et y vaut 3 */ objA.x=2;
// ok: accs depuis lextrieur lattribut public x. la valeur de x devienne 2

} }

objA.y=3; // ne compile pas car accs depuis lexterieur un attribut priv: private y
El Mostafa DAOUDI- p. 49

Exemple 2: affichage depuis lextrieur dun champs.


class ClasseTest { public int x; private int y; public void initialise (int i, int j){ x=i; y=j; // ok: accs lattribut private y depuis lintrieur } } public class TestA{ // fichier source de nom TestA.java public static void main (String args[]) { ClasseTest objA = new ClasseTest(); objA.initialise(1,3); // ok a initialise() depuis lextrieur car elle est public. System.out.println(" x= "+objA.x); /* affiche x = 1 car on peut accder x depuis lextrieur: x est attribut public */ System.out.println(" y= "+objA.y); // ne compile pas car on ne peut pas accder y qui est un attribut priv. } }
El Mostafa DAOUDI- p. 50

25

VII. Mthodes daccs aux valeurs des variables depuis lextrieur Comment peut on accder la valeur dune variable protge ?? Considrons la classe etudiant qui a les champs nom et prenom private. Exemple: class Etudiant { private String nom, prenom; public Etudiant(String st1, String st2){ nom=st1; prenom=st2; } } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); System.out.println("Nom = "+e.nom); // ne compile pas car le champs nom est priv /* comment faire pour afficher le nom de ltudiant e; ?? } }
El Mostafa DAOUDI- p. 51

Pour afficher la valeur de lattribut nom (champs private), on dfinie Un accesseur (mthode getNom) qui est une mthode permettant de lire, depuis lextrieur, le contenu d'une donne membre protge. Exemple: class Etudiant { private String nom, prenom; public Etudiant(String nom, String Prenom){ this.nom=nom; this.prenom=prenom; } public String getNom (){ return nom; } public String getPrenom (){ return prenom } }
El Mostafa DAOUDI- p. 52

26

public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); e.initialise("Mohammed","Ali"); System.out.println("Nom = "+e.getNom()); System.out.println("Prenom = "+e.getPrenom()); } }

El Mostafa DAOUDI- p. 53

Comment peut-on modifier (depuis lextrieur) le contenu d'un attribut priv ?.


Exemple: class Etudiant { private int cne; } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant(); // Modifier le champs cne (attribut private)
e.cne=23541654; // ne compile pas car le champ cne est un champ protg (private)

} }

El Mostafa DAOUDI- p. 54

27

Pour modifier la valeur de lattribut nom (champs private), on dfinie Un modificateur (mutateur) qui est une mthode permettant de modifier le contenu d'une donne membre protge. Exemple: class Etudiant { private int cne; public void setCNE (int cne){ this.cne=cne; } } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant(); e.setCNT(23541654); } }
El Mostafa DAOUDI- p. 55

VIII. Autorfrences: emploi de this - Possibilit au sein dune mthode de dsigner explicitement l'instance courante (lobjet courant): faire rfrence lobjet qui a appel cette mthode. - Par exemple pour accder aux attributs "masqus" les paramtres de la mthode. class ClasseA { . public void f(.) { // ici lemploi de this dsigne la rfrence lobjet // ayant appel la mthode f } }
El Mostafa DAOUDI- p. 56

28

Exemple:

class Etudiant { private String nom, prenom; public initialise(String st1, String st2) { nom = st1; prenom = st2; } } Comme les identificateurs st1 et st2 sont des arguments muets pour la mthode initialise(), alors on peut les noter nom et prenom qui nont aucune relation avec les champs private nom et prenom. Dans ce cas la classe Etudiant peut scrire comme suit:
El Mostafa DAOUDI- p. 57

class Etudiant { private String nom, prenom; public initialise(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } }

El Mostafa DAOUDI- p. 58

29

IX. Champs et mthodes de classe 1. Champs de classe (variable de classe) Considrons la dfinition simpliste suivante: class ClasseTest { int n; double x; } Chaque objet de type ClasseTest possde ses propres valeurs (ses propres donnes) pour les champs n et x. Les valeurs des champs ne sont pas partages entre les objets. Exemple : on cr deux objets diffrents instances de la classe ClassTest: ClasseTest objA1=new ClasseTest(); ClasseTest objA2= new ClasseTest(); objA1.n et objA2.n dsignent deux donnes diffrentes. objA1.x et objA2.x dsignent aussi deux donnes diffrents.
El Mostafa DAOUDI- p. 59

Certaines attributs peuvent tre partags par toutes les instances dune classe. Cest--dire ils peuvent tre dfinis indpendamment des instances (objets): Par exemple: le nombre dtudiants = le nombre dobjets tudiants crs. Les attributs qui peuvent tre partags entre tous les objets sont nomms champs de classe ou variables de classe. Ils sont comparables aux variables globales . Ces variables nexistent quen un seul exemplaire. Elles sont dfinies comme les attributs mais prcds du mot-cl static.

El Mostafa DAOUDI- p. 60

30

Exemple: Considrons la classe: class ClasseTest { static int n; // la valeur de n est partage par toutes les instances double y; } ClasseTest objA1=new ClasseTest(), objA2=new ClasseTest(); Ces dclarations cres deux objets (instances) diffrents: objA1 et objA2. Puisque n est un attribut prcd du modificateur static , alors il est partag par tous les objets en particulier les objets objA1 et objA2 partagent la mme variable n. objA1.n et objA2.n dsignent la mme donne. La valeur de lattribut n est indpendante de linstance (lobjet). Pour accder au champs statique n, on utilise le nom de la classe ClasseTest.n // champs (statique) de la classe ClasseTest
El Mostafa DAOUDI- p. 61

Exemple1:

class ClasseTest { int n; double y; } public class MethodeStatic{ public static void main(String[] argv) { ClasseTest objA1=new ClasseTest(); objA1.n+=4; // La valeur de lattribut n de lobjet objA1 vaut 4; ClasseTest objA2=new ClasseTest(); // objA2.n = ? /* la valeur de lattribut n de lobjet objA2 vaut 0. initialisation par dfauts des attributs. */ } }
El Mostafa DAOUDI- p. 62

31

Exemple2:

class ClasseTest { static int n; // la valeur de n est partage par toutes les instances float y; } public class MethodeStatic{ public static void main(String[] argv) { ClasseTest objA1=new ClasseTest(); objA1.n+=4; // objA1.n vaut 4; // quivalent ClasseTest.n=4; ClasseTest objA2=new ClasseTest(); // objA2.n = ? // objA2 vaut 4 car champs statique . } }
El Mostafa DAOUDI- p. 63

2. Mthodes de classe Ce sont des mthodes qui ont un rle indpendant dun objet spcifique. Elles excutent une action indpendante dune instance particulire de la classe La dclaration dune mthode de classe se fait laide du mot cl static. Lappelle dune telle mthode ne ncessite que le nom de la classe correspondante. Important: Une mthode de classe ne pourra pas accder des champs usuels (champs non statiques).
El Mostafa DAOUDI- p. 64

32

Exemple: class ClasseTest{ private static int n; // champs de classe private float x; // champs usuel public static void f() { // mthode de clase
/* ici (dans le corps de la mthode f(), on ne pas accder au champs x, champs usuel Par contre on peut accder au champs statique n. */

} }
El Mostafa DAOUDI- p. 65

X. Le mot cl final Lattribut final indique que la valeur de la variable ne peut tre modifie : on pourra lui donner une valeur une seule fois dans le programme. Variable dinstance final Une variable dinstance final est une constante pour chaque objet. Remarques: - une variable dinstance final peut avoir 2 valeurs diffrentes pour 2 objets diffrents. - une variable d'instance final peut ne pas tre initialise sa dclaration mais elle doit avoir une valeur la sortie de tous les constructeurs.
El Mostafa DAOUDI- p. 66

33

Variable locale final Considrons une variable locale prcd par le mot cl final. Si la variable est dun type primitif, sa valeur ne pourra pas changer. Si la variable rfrence un objet, elle ne pourra pas rfrencer un autre objet mais ltat de lobjet peut tre modifi Exemple: final Etudiant e = new Etudiant("Mohammed", "Ali");
...

e.nom = "Ahmed"; // ok, changement de ltat de lobjet e e.setCNE(32211452); // ok, changement de ltat de lobjet e e = new Etudiant("Ahmed"); /* Interdit car cette instruction indique que e rfrence un autre objet */
El Mostafa DAOUDI- p. 67

Constantes de classe Usage Ce sont des variables de classes dclares avec le mot-cl final Ce sont des constantes lies une classe Elles sont crites en MAJUSCULES Pour y accder, il faut utiliser non pas un identificateur dobjet mais le nom de la classe Exemple: public class Galerie { public static final int MASSE_MAX = 150; } if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}
El Mostafa DAOUDI- p. 68

34

Ch. III. Les constructeurs


I. Un exemple introductif Considrons la classe point suivante: elle dispose des mthodes: - initialise pour attribuer des valeurs aux coordonnes dun points - dplace pour modifier les coordonnes dun point - affiche pour afficher les coordonnes dun point

El Mostafa DAOUDI- p. 69

public class Point{ private int x; // abscisse private int y; // ordonne public void initialise (int abs,int ord){ x=abs; y=ord; } public void deplace (int dx, int dy){ x+=dx; y+=dy; } public void affiche (){ System.out.println(" abscisse : "+ x + " ordonne : " + y); } }
El Mostafa DAOUDI- p. 70

35

public class TstPoint{ public static void main (String args[]) { Point pA=new Point(); // cration de lobjet pA pA.initialise(1,1); // initialisation de lobjet pA pA.deplace(2,0); Point pB=new Point(); // cration de lobjet pB pB.initialise(2,3); // initialisation de lobjet pB pB.affiche(); } }

El Mostafa DAOUDI- p. 71

Remarque: La cration et linitialisation des attributs sont spares: - Tout dabord on cre lobjet (linstance). - Ensuite, dans notre exemple, pour chaque instance on appelle la mthode initialise() pour initialiser lobjet ainsi crer. On personnalise ltat de lobjet - Si on nappelle pas la mthode initialise, lobjet de type Point ainsi crer ne sera pas initialis. Pas derreur la compilation mais risque de problme smantique : toute manipulation de lobjet, utilisera les valeurs de linitialisation par dfaut. Crer un objet, ne garanti pas son initialisation
El Mostafa DAOUDI- p. 72

36

II. Dfinition de Constructeur


Le constructeur est une mthode spcial qui peut contenir des

instructions excuter la cration des objets, en particulier : linitialisation des attributs. La cration et linitialisation peuvent tre unifies Quand une classe possde un constructeur, Java lappel automatiquement toute cration dobjet avant quil ne puisse tre utilis. Chaque classe a un ou plusieurs constructeurs qui servent crer les instances initialiser ltat de ces instances Rgles de dfinition dun constructeur : un constructeur: porte le mme nom que la classe. na pas de type retour. peut disposer dun nombre quelconque darguments (ventuellement aucun).
El Mostafa DAOUDI- p. 73

Exemple: Considrons la classe point et transformons la mthode initialise en un constructeur. public class Point{ private int x; // abscisse: variable dinstance private int y; // ordonne: variable dinstance public Point (int abs, int ord) { // Constructeur, remplace initialise x=abs; y=ord; } public void deplace (int dx, int dy){ x+=dx; y+=dy; } public void affiche (){ System.out.println(" abscisse : "+ x + " ordonne : " + y); } }

El Mostafa DAOUDI- p. 74

37

public class TestPoint{ public static void main (String args[]) { Point pA=new Point(1,1); // cration et initialisation de lobjet pA pA.deplace(2,0); Point pB=new Point(2,3); // cration et initialisation de lobjet pB pB.affiche(); } } Remarque: - Les instructions: Point pA=new Point(); et pA.initialise(1,1) ; sont remplaces par: Point pA = new Point(1,1); Attention: Linstruction: Point pA = new Point(); ne convient plus car le constructeur a besoin de deux arguments
El Mostafa DAOUDI- p. 75

Un autre exemple public class Etudiant { private String nom, prenom; private int codeNatEtudiant;

// Variables dinstance

public Etudiant(String n, String p) { // dfinition dun constructeur nom = n; prenom = p; } public void setCNE (int cne) { codeNatEtudiant = cne; } public static void main(String[] args) { Etudiant e; e = new Etudiant("Mohammed", "Ali"); // cration d'une instance e.setCNE(23456765); } }
El Mostafa DAOUDI- p. 76

38

III. Quelques rgles concernant les constructeurs


1. Aucun type, mme void, ne doit figurer devant son nom. 2. Lorsque le code de la classe comporte un constructeur alors il doit tre appel chaque cration. 3. Lorsque le code dune classe ne comporte pas de constructeur, un constructeur par dfaut sera automatiquement ajout par Java. Dans ce cas on peut crer des objets de la classe ClasseTest par linstruction ClasseTest c = new ClasseTest(); //ok si ClasseTest na pas de constructeur. 4. Rgle gnrale: Si pour une classe ClasseA donne, linstruction ClasseA a=new ClasseA(); est accepte Cela signifie que: - Soit la classe ClasseA ne possde pas de constructeur - Soit la classe ClasseA possde un constructeur sans arguments.
El Mostafa DAOUDI- p. 77

5. Un constructeur ne peut pas tre appel de la mme manire que les autres mthodes. Par exemple: Point a=new Point(1,1); // ok car Point possde un constructeur a.Point (2,3); // Interdit car Point() est un constructeur et // non une mthode classique. 6. Si un constructeur est dclar private, dans ce cas il ne pourra plus tre appel de lextrieur, cest--dire il ne pourra pas tre utilis pour instancier des objets. Exemple: class ClasseA{ private ClasseA() { } // constructeur prive sans arguments } ClasseA a=new ClasseA(); // erreur, car constructeur ClasseA() est priv

El Mostafa DAOUDI- p. 78

39

IV. Initialisation des attributs On distingues 3 types dinitialisation des attributs: 1. Initialisation par dfaut: les champs dun objet sont toujours initialiss par dfaut. ------------------------------------ |--------------------------------Type de lattribut ( champ) | Valeur par dfaut ------------------------------------ |-------------------------------boolean | false char | caractre de code nul int, byte, short, int long | 0 float, double | 0.f ou 0. class | null --------------------------------------------------------------------El Mostafa DAOUDI- p. 79

2. Initialisation explicite des champs dun objet: Un attribut peut tre initialis pendant sa dclaration. Par exemple: class ClasseTest{ private int n=10; private int p; } 3. Initialisation par le constructeur:
On peut aussi initialiser les attributs lors de lexcution des instructions du corps du constructeur. Exemple du constructeur Point(int,int) voir avant: Point pA=new Point(8,12);
El Mostafa DAOUDI- p. 80

40

Dune manire gnrale, la cration dun objet entrane toujours, par ordre chronologique, les oprations suivantes:
- Linitialisation par dfaut de tous les champs de lobjet. - Linitialisation explicite lors de la dclaration du champ. - Lexcution des instructions du corps du constructeur.

El Mostafa DAOUDI- p. 81

Exemple: Considrons la classe suivante: class ClasseTest{ public ClasseTest () { } // Constructeur ClasseTest private int n=10; private int p; } Linstruction suivante: ClasseTest objA=new ClasseTest(); Entrane successivement: 1. initialisation implicite (par dfaut) des champs n et p de lobjet objA 0 2. initialisation explicite: On affecte au champ n la valeur 10 (la valeur figurant dans sa dclaration). 3. excution des instruction du constructeur: Le corps du constructeur nest excut quaprs linitialisation par dfaut et linitialisation explicite.
El Mostafa DAOUDI- p. 82

41

class ClasseA { public ClasseA() { // ici n =20, p =10 et np = 0 np=n*p; n=5; } private int n=20, p=10; private int np; } public class Init { public static void main (String args[]) { ClasseA objA=new ClasseA(); // ici objA.n =5, objA.p = 10, mais objA.np = 200 } } Aprs appel du constructeur on a: n=5 , p=10 , np = 200
El Mostafa DAOUDI- p. 83

V. Surcharge des constructeurs (Plusieurs constructeurs)


Une classe peut avoir plusieurs constructeurs. Comme le nom du constructeur est identique au nom de la classe: Java permet la surcharge des constructeurs. class Etudiant { private String nom, prenom; // Variables dinstance private int codeNatEtudiant; public Etudiant(String n, String p) { // Constructeur nom = n; prenom = p; } public Etudiant(String n, String p, int cne) {// Constructeur nom = n; prenom = p; codeNatEtudiant = cne; } }
El Mostafa DAOUDI- p. 84

42

public class TestEtudiant { public static void main (String[] args) { Etudiant e1, e2; e1 = new Etudiant("Mohammed", "Ali"); e2 = new Etudiant("Ouardi", " fatima", 22564321); } }

El Mostafa DAOUDI- p. 85

VI. Utilisation du mot cl this dans un constructeurs

Il est possible, quau sein dun constructeur, on peut appeler un autre constructeur de la mme classe. Pour faire on fait appel au mot cl this qui est utilis cette fois comme nom de mthode. Supposons que la classe Point admet deux constructeurs. Un constructeur initialise lorigine (au point (0,0)) et un autre initialise un point quelconque.

El Mostafa DAOUDI- p. 86

43

Exemple: La classe Etudiant peut tre rcrite de la faon suivante:


class Etudiant { private String nom, prenom; // Variables dinstance private int codeNatEtudiant; public Etudiant(String n, String p) { // Constructeur nom = n; prenom = p; } public Etudiant(String n, String p, int cne) {// Constructeur this( n,p); // appel au constructeur Etudiant(String,String); codeNatEtudiant = cne; } }
El Mostafa DAOUDI- p. 87

Ch. IV. Gnralits sur la structure lexicale de Java


I. Variables Les variables dinstances: sont dclares en dehors de toute mthode. conservent ltat dun objet, instance de la classe sont accessibles et partages par toutes les mthodes de la classe Les variables locales: sont dclares lintrieur dune mthode conservent une valeur utilise pendant lexcution du bloc dans lequel elles sont dfinies. ne sont accessibles que dans le bloc dans lequel elles ont t dclares. Dclaration des variables: En Java, toute variable utilise doit tre dclare avant son utilisation.
El Mostafa DAOUDI- p. 88

44

La syntaxe de la dclaration : type identificateur; O - identificateur est une suite de caractres pour dsigner les diffrentes entits manipuls par un programme: variables, mthode, classe, objet, - type dsigne le type de la variable dclare Remarque: concernant les identificateurs: - Tous les caractres sont significatifs. - On fait la diffrence entre les majuscules et les minuscules. - Mots rservs: un identificateur ne peut pas correspondre un mot rserv du langage (par exemple if, else, while, ..., ). Exemple: int val; double delta; Rectangle r1; /* Rectangle est une classe */
El Mostafa DAOUDI- p. 89

Mots rserv du langage Java

El Mostafa DAOUDI- p. 90

45

II. Style de programmation non standard Conventions de nommage en Java: ne sont pas obligatoire, mais fortement recommandes (cest essentiel pour la lisibilit du code et sa maintenance). Identificateur: pas d'emploi de $ (et de caractres non ASCII) Nom de classe : Si le nom de la classe est compos de plusieurs mots, ils sont accols (on ne les spare pas avec le trait _ soulign). Commencez chaque mot par une majuscule Exemple: HelloWorld, ClasseTest, MonPremierProgramme.

El Mostafa DAOUDI- p. 91

Nom de variable ou mthode : Si le nom est compos dun seul mot: la premire lettre est minuscule. Si le nom est compos par plusieurs mots, ils sont accols et respecte la rgle suivante: La premire lettre du premier mot est minuscule. Les premires lettre des autres mots sont majuscules Exemple: maPremiereNote, initialiseAttribut(), calculTaux(), main(), objEtudiant, Les constantes: majuscules et sparation des mots par _ : VALEUR_MAX; Usage non recommand : mapremierevariable ma_premiere_variable
El Mostafa DAOUDI- p. 92

46

Les commentaires Sur une seule ligne : style C++ // Ceci un commentaire int taux = 75; // taux de russite Sur plusieurs lignes : style C /* Premire ligne du commentaire suite du commentaire */

El Mostafa DAOUDI- p. 93

Mise en page des programmes La mise en page dun programme Java est libre. - Une instruction peut tre tendue sur plusieurs lignes. - Une ligne peut comporter plusieurs instructions Emploi du code Unicode: Java utilise le codage Unicode, qui est bas sur 2 octets (16 bits), par consquent on peut coder 65 536 symboles, ce qui permet de couvrir la plus part des symboles utiliss dans le monde. Pour assurer la portabilit, le compilateur commence par traduire le fichier source en Unicode. On peut, par exemple, utiliser lidentificateur lment: int lment; On peut aussi utiliser le code Unicode dun caractre (mais viter pour la lisibilit) de la manire suivante: \uxxxx reprsente le caractre ayant comme code Unicode la valeur xxxx. Par exemple \u0041 reprsente le caractre A.
El Mostafa DAOUDI- p. 94

47

III. Laffectation Lopration daffectation affecte ( assigne) une valeur une variable. Elle est ralise au moyen de loprateur = . la syntaxe : identificateur = valeur ; Signifie prendre la valeur du cot droit et la copier du cot gauche. identificateur : dsigne une variable. valeur : est une constante, une variable ou une expression qui retourne une valeur du mme type que la variable rfrence par identificateur .

El Mostafa DAOUDI- p. 95

Cas des types primitifs Soient a et b de type primitif. Laffectation a=b; signifie que le contenu de b est copi dans a. Exemple: a=2; b=15; a=b; // La nouvelle valeur de a est 15 aprs affectation a et b existent et ont tous la mme valeur 15. Remarque: si ensuite on modifie le contenu de a, alors le contenu de b ne sera pas modifi.
El Mostafa DAOUDI- p. 96

48

Cas des Objets Soient objA est objB deux objets, Laffectation objA=objB; signifie quon copie la rfrence de objB dans objA. 1. Aprs affectation, les rfrences objA et objB pointent vers le mme objet rfrenc par objB. 2. Lobjet qui a t initialement rfrenc par objA existe toujours, mais on na aucun contrle sur lui (il reste inaccessible).

El Mostafa DAOUDI- p. 97

Exemple: class A { public int i; } public class TestAffectation { public static void main(String[] args) { A a=new A(); A b=new A(); a.i=6; b.i=11; a=b; // a et b contiennent la mme rfrence, on a: a.i=11 a.i=20; // b.i = 20 b.i=13; // a.i = 13 }
a= new A() a Instance a a a= b b Instance b b Instance b Instance a

b= new B()

El Mostafa DAOUDI- p. 98

49

IV. Types de donnes en Java


2 groupes de types de donnes sont manipuls par Java: types primitifs objets (instances de classe)

El Mostafa DAOUDI- p. 99

1. Types primitifs
Boolen: Boolean : prend deux valeurs true ou false Caractre (un seul caractre) : char : cod sur 2 octet par le codage Unicode Nombres entiers : byte: reprsent sur 1 octet (8 bits), short: reprsent sur 2 octets (16 bits), int : reprsent sur 4 octets (32 bits), long : reprsent sur 8 octets (64 bits). Nombres virgule flottante : float : flottant (IEEE 754) 32-bit double : flottant (IEEE 754) 64-bit
El Mostafa DAOUDI- p. 100

50

1.1. Type boolen


Sert reprsenter une valeur logique du type vrai/faux:
Une variable de type boolen est dclar par: boolean b;

b prend une des deux valeurs true ou false Cest un vritable type:
Il est retourn par les oprateurs de comparaison Il est attendu dans tous les tests

ne peut pas tre converti en entier

El Mostafa DAOUDI- p. 101

1.2. Type caractre Permet de manipuler des caractres: Java reprsente un caractre sur 2 octets (16 bits) 16-bit => 65536 valeurs : presque tous les caractres de toutes les critures. Ne sont affichables que si le systme possde les polices de caractres adquates. Une variable de type caractre est dclare par: char c1,c2; Constantes de type caractre doivent tre crites entre simples quottes . Exemple : 'a , 'Z' , E Les caractres disposant dune notation spciale.
Notation \b \t \n \f \r \" \ \\ Code Unicode 0008 0009 000a 000c 000d 0022 0027 005c Abrviation usuelle BS(Back Space) HT(Horizontal Tabulation) LF(line Feed) FF(Form Feed) CR(Cariage Return) Signification Retour arrire Tabulation horizontale Saut de ligne Saut de page Retour chariot

El Mostafa DAOUDI- p. 102

51

1.3. Nombres entiers - Les valeurs min/max


byte : cod sur sur 1 octet = 8 bits short : compris entre 32 768 et 32 767 int : compris entre 2.147 483 648 et 2 147 483 647 long : compris entre -923 372 036 854 775 808

et

923 372 036 854 775 807

El Mostafa DAOUDI- p. 103

Constantes nombres: Une constante entire est de type int. Si elle est suffixe par L ou l alors elle est de type long. Exemple: 108 // 108 constante de type int, reprsent sur 32 bits 108L // 108 constante de type long, reprsent sur 64 bits Reprsentation en octal (8bits) et hexadcimale (16 bits). Exemple 1: 014 // 14 en octal (base 8) = 12 en dcimal 0xA7 // A7 en hexadcimal (base 16) = 167 en dcimal Conversion automatique (implicite) seulement vers les types entiers plus grands (taille plus grande). (int long, short int, byte short) et vers les types flottants.

El Mostafa DAOUDI- p. 104

52

Types des rsultats des calculs


Avec des nombres entiers Tout calcul entre entiers donne un rsultat de type int si au moins un des oprandes est de type long, alors le rsultat est de type long Exemple: byte b1 = (byte)20; byte b2 = (byte)15; byte b3 = b1 + b2; Provoquera une erreur la compilation car : (b1 + b2) est de type int (cod sur 32 bits) alors que b3 est de type byte (cod sur 8 bits seulement).

El Mostafa DAOUDI- p. 105

1.4. Les nombres flottants


float : environ 7 chiffres significatifs ;
Valeur absolue (arrondie) maximal 3,4 x 1038 ( constante prdfinie Float.MAX_VALUE) Valeur absolue (arrondie) minimal 1,4 x 10-45 (constante prdfinie Float.MIN_VALUE)

double : environ 15 chiffres significatifs ;


Valeur absolue maximal (arrondie) 1,8 x 10308 (constante prdfinie Double.MAX_VALUE) Valeur absolue minimal (arrondie) 4,9 x 10-324 (constante prdfinie Double.MIN_VALUE)

El Mostafa DAOUDI- p. 106

53

Constantes nombres
Une constante relle est par dfaut elle est de type double. Pour spcifier un float, il faut la suffixe par F ou f . Conversion automatique (implicite) : seulement float double Exemple: .567e2 // 56,7 de type double 5.123E-2F // 0,05123 de type float float x=2.5f //ok double y = 2.5; //ok float x = 2.5; // Erreur: conversion double float

El Mostafa DAOUDI- p. 107

2. Type objet: Constante null null : valeur d'une "rfrence vers rien" (pour tous types de rfrences). Elle indique quune variable de type non primitif ne rfrence rien) ; convient pour tous les types non primitifs.

El Mostafa DAOUDI- p. 108

54

3. Transtypage
Java est un langage fortement typ Dans certains cas, il est ncessaire de forcer le programme changer le type dune expression. On utilise pour cela le cast (transtypage) : (type-forc) expression Exemple: int i=13; // i cod sur 32 bit; 13 constante , par dfaut de type int byte b=i; // Erreur: pas de conversion implicite int byte Pour que a marche, on doit faire un caste (un transtypage) cest-dire on doit forcer le programme changer le type de int en byte. byte b=(byte)i; // de 32 bits vers 8 bit. b vaut 13 cod sur 8 bits

El Mostafa DAOUDI- p. 109

Casts autoriss En Java, deux seuls cas sont autoriss pour les casts : entre types primitifs, entre classes mre/anctre et classes filles.

El Mostafa DAOUDI- p. 110

55

3.1. Casts entre types primitifs Un cast entre types primitifs peut occasionner une perte de donnes sans aucun avertissement ni message d'erreur. int i=13; // i cod sur 32 bit; byte b=(byte)i; 13 cod sur 32 bits

// b vaut 13 car conversion de 32 bits vers 8 bit (On considre les 8 bits de poids le plus faible). i est un entier petit int i=256; // i cod sur 32 bit; 256 cod sur 32 bits byte b=(byte)i; // b = 0 ! Pourquoi ??? // b vaut 0 car conversion dun int vers un byte (de 32 bits vers 8 bits : on considre les 8 bits de poids le plus faible). i est un entier grand int i = 130; b = (byte)i;

// b = -126 !

Pourquoi ???

El Mostafa DAOUDI- p. 111

Transtypage implicite et explicite: Une affectation types primitifs peut utiliser un cast implicite si elle ne provoque aucune perte Exemple: byte =120; // cast implicite Ne provoque pas derreur car 120 est dans max/min pour les byte. byte b=130; // Provoque une erreur "cannot convert from int to byte" car 130 est hors max/min. Dans ce cas le cast explicite est obligatoire. Mais attention au perte dinformation: byte b=(byte)130; // cast explicite. Ca passe la compilation mais provoque une erreur de calcul: renvoie -126. Pour une affectation non statique, le cast est obligatoire : int i = 120; byte b=i; // Provoque une erreur mme si la valeur de i est dans lintervalle max/min des byte. On doit faire un cast explicite: byte b = (byte)i ; // cast obligatoire, sinon erreur
El Mostafa DAOUDI- p. 112

56

Les casts de types flottants vers les types entiers tronquent les nombres : float x=1.99F; int i = (int)x; /* i = 1, et pas 2. On fait une troncature et non un arrondi. */ Attention: la conversion peut donner un rsultat totalement faux sans aucun avertissement ni message d'erreur : int c = (int)1e+30; // c = 2147483647 ! int x = 10, y = 3; double z; z=x/y; // donne z=3.0; car x/y donne 3 si on veut que z=3.3333.. et pas 3.0, on doit crire: z = (double)x / y; // cast de x suffit

El Mostafa DAOUDI- p. 113

De mme, on peut affecter un entier une variable de type nombre virgule flottante float x; int i; x=i; Un cast peut provoquer une simple perte de prcision : la conversion d'un long vers un float peut faire perdre des chiffres significatifs mais pas l'ordre de grandeur.

El Mostafa DAOUDI- p. 114

57

3.2. Casts entre entiers et caractres Ils font correspondre un entier un caractre qui a comme code Unicode la valeur de lentier La correspondance char int, long sobtient par cast implicite Le code dun char peut aller de 0 65 535 donc char short, byte ncessite un cast explicite (short ne va que jusqu 32 767) Les entiers sont signs et pas les char donc long, int, short ou byte char ncessite un cast explicite
El Mostafa DAOUDI- p. 115

Tableau rcapitulatif de conversion de types

El Mostafa DAOUDI- p. 116

58

Exemple avec la surcharge des mthode


class Point { private int x,y; public void Point (int x, int y){ this.x=x; this.y=y; } pubic void deplace (int dx, int dy) { x+=dx; y+=dy; } pubic void deplace (int dx) { x+=dx; } pubic void deplace (short dx) { x+=dx; } } public class Surcharge { public static void main(String arg[]) { Point a=new Point(1,2); a.deplace(1,3); // appel deplace (int,int) a.deplace(2);

// appel deplace (int)

short p=3; // ok car 3 est dans le max/min de short a.deplace(p); // appel deplace (short) byte b=2; } }
El Mostafa DAOUDI- p. 117

// // ok car 2 est dans le max/min de byte

a.deplace(b);

// appel deplace(short) aprs conversion de b en short

Attention: Il peut y avoir ambigut. Supposons que la classe contient les deux mthodes deplace () suivantes: public void deplace(int dx, byte dy) { x+=dx; y+=dy; } public void deplace(byte dx, int dy) { x+=dx; } Soit la classe excutable suivante: public class Surcharge { public static void main(String arg[]) { Point a =new Point(2,4); int n; byte b; a.deplace(n,b); a.deplace(b,n); a.deplace(b,b); } }
El Mostafa DAOUDI- p. 118

// ok appel de deplace (int,byte) // ok appel de deplace (byte,n) // erreur de compilation, ambigut

59

V. Principaux oprateurs
affectation : = arithmtiques : + - * / % comparaisons : < <= > >= == boolens : && || ! ^ oprations bit--bit (sur les entiers) : & | ^ ~ << >> >>> opration et affectation simultanes : += -= *= /= %= &= |= ^= <<= >>= >>>= pr/post-incrmentation : ++ pr/post-dcrmentation : -oprateur ternaire : ?: cration tableau ou objet (allocation mmoire) : new test de type des rfrences : instanceof
El Mostafa DAOUDI- p. 119

!=

VI. Notion de porte et de dure de vie des objets


Un bloc est un ensemble dinstructions dlimit par les accolades { et } Les blocs peuvent tre embots les uns dans les autres. On peut grouper plusieurs instructions en un bloc dlimit par des accolades { et }. Le concept de porte fixe simultanment la visibilit et la dure de vie des noms dfinis dans cette porte. Exemple 1: int a=1, b=2; { //dbut de bloc int x=a; x = 2*a+b; } //fin de bloc x = 3; //ERREUR: x nest pas connu ici
El Mostafa DAOUDI- p. 120

60

Remarque : La porte ( zone de validit de la dclaration) d'une variable va de sa dclaration jusqu' la fin du bloc o elle est dclare. Elle est fixe par les accolades { }.
Exemple 2: { int x=12; // x est accessible { int q; q=x+100; // x et q tous les deux sont accessibles } x=6; // x est accessible q=x+2; // Erreur: q est hors de porte }
El Mostafa DAOUDI- p. 121

Attention: Ceci nest pas permis en Java { int x=12; { int x=96; // illgale en Java, valable en C, C++ } }

El Mostafa DAOUDI- p. 122

61

Porte des objet : Considrons une classe nomme ClasseA et qui a une mthode publique nomme f(). objetA { Attribut1 Attribut2 ClasseA objA=new ClasseA(); . } // fin de porte objA.f(); // Erreur car la rfrence objA est hors porte. Remarque: - La rfrence ObjA disparat la fin de la porte, - Par contre lobjet qui a t rfrenc par objA existe toujours, mais on na aucun contrle sur lui (il reste inaccessible). Les objets nont pas la mme dure de vie que les types primitifs.

El Mostafa DAOUDI- p. 123

Gestion de la mmoire (Garbage Collector)


Lorsquon perd le contrle sur un objet. Il persiste et il occupe de la mmoire. - Il nexiste aucun oprateur explicite pour dtruire lobjet dont on na pas besoin, - Mais il existe un mcanisme de gestion automatique de la mmoire, connu sous le nom de ramasse miettes (en anglais Garbage Collector). Son principe est le suivant: - A tout instant, on connat le nombre de rfrences un objet donn. - Lorsquil nexiste plus aucune rfrence sur un objet, on est certains que le programme ne peut pas y accder, donc lobjet devient candidat au ramasse miette.
El Mostafa DAOUDI- p. 124

62

Le ramasse-miettes (garbage collector) est une tche qui travaille en arrire-plan libre la place occupe par les instances non rfrences compacte la mmoire occupe Il intervient quand le systme a besoin de mmoire ou, de temps en temps, avec une priorit faible

El Mostafa DAOUDI- p. 125

VII. Instructions de contrle 1. Structure alternative if else Soit exprBool une expression Boolenne qui retourne true (Vrai) ou false (faux) if (exprBool) { instructions; // excutes si exprBool retourne true } if (exprBool) { instructions1 ; } else { instructions2; }

// excutes si exprBool retourne true

// excutes si exprBool retourne false

El Mostafa DAOUDI- p. 126

63

if (exprBool1) { instructions ; // Excutes si exprBool1 retourne true } else if (exprBool2) { instruction;


// Excutes si exprBool1 retourne false et exprBool2 retourne true.

} else { // ... } Remarque: Un bloc serait prfrable, mme sil ny a quune seule instruction.
El Mostafa DAOUDI- p. 127

2. Expression conditionnelle

Lexpression: expressionBoolenne ? expression1 : expression2 Est quivalente : if (expressionBoolenne) { expression1; } else { expression2; }
El Mostafa DAOUDI- p. 128

64

Exemple: int x, y; if (x % 2 == 0) y = x + 1; else y = x; Est quivalent int x; int y = (x % 2 == 0) ? x + 1 : x;

El Mostafa DAOUDI- p. 129

3. Cas multiple: Distinction de cas suivant une valeur switch(expression) { case val1: instructions; // excutes si expression ==val1 break; // Attention, sans break, les instructions du cas suivant sont excutes ! case val2: instructions; // excutes si expression ==val2 break; ... case valn: instructions; // excutes si expression ==valn break; default: instructions; // excutes si aucune des valeurs prvues break; } Expression est de type char, byte, short, ou int, ou de type numration (ou type numr dfini avec enum). Sil ny a pas de clause default, rien nest excut si expression ne correspond aucun case (aucune valeur prvue).
El Mostafa DAOUDI- p. 130

65

4. Boucles de rptitions Deux types de boucles : - Rptitions tant que while (expressionBoolenne) { instructions; // corps de de la boucle } - Rptition faire tant que : le cors de la boucle est excut au moins une fois. do { instructions; // corps de de la boucle } while (expressionBoolenne);

El Mostafa DAOUDI- p. 131

5. Boucle ditration: Rptition for


for(init; test; incrment){ instructions; // corps de la boucle } init (initialisation): Dclaration et/ou affectations, spares par des virgules incrments : expressions spares par des virgules Test: expression boolenne Remarque: Dans le cas o le corps de la boucle est forme dune seule instruction pas besoin de mettre les accolades { } pour marquer le dbut et la fin du bloc Elle est quivalente init; while (test) { instructions; incrment; }
El Mostafa DAOUDI- p. 132

66

6. Interruptions des boucles Break : sortie de la boucle : sort de la boucle et continue lexcution des instructions se trouvant aprs la boucle. continue : passage l'itration suivante: interrompe litration encours et passe litration suivante break et continue peuvent tre suivis dun nom dtiquette qui dsigne une boucle englobant la boucle o elles se trouvent (une tiquette ne peut se trouver que devant une boucle)

El Mostafa DAOUDI- p. 133

Etiquette de boucles etiq1: while (pasFini) { // etiq1: tiquette ... for (int i=0; i < n; i++) { ... if (t[i] < 0) continue etiq1; // rexcuter partir de etiq1 ... } ... }

El Mostafa DAOUDI- p. 134

67

VIII. Entres Sorties Standards


1. Affichage standard (Ecriture sur la sortie standard) Laffichage standard lcran est effectu laide des mthodes print() et println() de la classe PrintStream (la classe de l'objet System.out). print() ne fait pas retour la ligne . println() fait retour la ligne suivante. Dans le cas o: tous les arguments sont des types primitifs ou String: les types primitifs sont convertis vers le type String par l'appel des mthodes statiques valueOf() de la classe String. un argument est un objet, alors lobjet sera convertit en un type String par l'appel de la mthode toString().
El Mostafa DAOUDI- p. 135

Exemple 1: float z=1.732f; System.out.print("z="); System.out.println(z); System.out.println(" et 2z= " + (2*z)); Affiche: z=1.732 et 2z= 3.464 Exemple 2:

Soit obj est un objet, l'expression


System.out.println("rsultat: " + obj) ; est quivalente l'expression: System.out.println ("rsultat: " + obj.toString());
El Mostafa DAOUDI- p. 136

68

2. Lecture (Saisi partir du clavier: La classe Scanner: Les mthodes de la classe Scanner les plus intressantes sont certainement : byte nextByte() : Lecture dune valeur de type byte short nextShort() : Lecture dune valeur de type short. int nextInt() : Lecture dune valeur de type int. long nextLong() : Lecture dune valeur de type long. float nextFloat() : Lecture dune valeur de type float. double nextDouble() : Lecture dune valeur de type double. String nextLine() : Lecture dune chaine jusqu une marque de fin de ligne. La marque de fin de ligne n'est pas incorpore la chane produite.

El Mostafa DAOUDI- p. 137

Exemple: import java.util.Scanner; public class TestScanner { public static void main(String[] args) { Scanner entree = new Scanner(System.in); System.out.print("nom et prnom? "); String nom = entree.nextLine(); System.out.print("ge? "); int age = entree.nextInt(); System.out.print("taille (en m)? "); float taille = entree.nextFloat(); System.out.println("lu: "+nom+", "+age+" ans, "+taille+" m"); } }

El Mostafa DAOUDI- p. 138

69

Chp. V. Les tableaux


I. Introduction En Java
Les tableaux sont considrs comme des objets. Ils sont manipuls par des rfrences. les variables de type tableau contiennent des rfrences aux tableaux. Les lments du tableau peuvent tre dun type primitif ou dun type objet. Les tableaux sont crs par loprateur new: allocation dynamique par new. vrification des bornes l'utilisation. La taille du tableau est dfinie l'excution. Elle est fixe une fois pour toute.
El Mostafa DAOUDI- p. 139

II. Dclaration et cration des tableaux 1. Dclaration : La dclaration dune rfrence un tableau prcise le type des lments du tableau. int[] tab; Ou int tab[]; Cette dernire forme permet de mlanger les tableaux de type int et les variables de type int. Exemple: int [] a, tabNotes, b; // a, tabNotes et b sont tous des tableaux de type int. double a, tabNotes[ ], b; /* a et b de type double, tabeNotes est un tableau de type double */ Attention: En java la taille des tableaux nest pas fixe la dclaration. Elle est fixe quand lobjet tableau sera effectivement cr. int[10] tabNotes; // Erreur car on a fix la taille pendant la dclaration. // Le programme ne compile pas
El Mostafa DAOUDI- p. 140

70

2. Cration: avec loprateur new - Cration aprs la dclaration int [] tab; // dclaration du tableau dentier tab tab = new int[5]; // cration et fixation de la taille du tableau - Dclaration et cration. int [] tab = new int[5]; La cration dun tableau par loprateur new: - Alloue la mmoire en fonction du type et de la taille - Initialise, par dfaut, chaque lment du tableau 0 ou false ou null, suivant le type de base du tableau.

El Mostafa DAOUDI- p. 141

3. Accs la taille et aux lments dun tableau:


Accs la taille: La taille est accessible par le "champ final" length: final int length tab = new int[8]; int l = tab.length; // la longueur du tableau tab est l = 8 Indices du tableau: Les indices dun tableau tab commence 0 et se termine (tab.length 1). Accs aux lment du tableau: Soit tab un tableau. tab[i], avec 0 i (tab.length 1), permet daccder llment dindice i du tableau tab. Java vrifie automatiquement lindice lors de laccs. Il lve une exception si tentative daccs hors bornes. tab = new int[8]; int e = tab[8]; // tentative daccs hors bornes
/* Lexcution produit le message ArrayIndexOutOfBoundsException */
El Mostafa DAOUDI- p. 142

71

Remarques:

- La taille peut tre une variable.


int n=Clavier.lireInt( ); // saisir au clavier lentier n. int tab[ ]=new int [n]; - Aprs excution, la taille ne pourra plus tre modifie. - Par contre la rfrence tab peut changer. Elle peut par exemple rfrencer un autre objet de taille diffrente : par affectation ou par new. Exemple: double [] tab1, tab2; // tab1 et tab2 deux tableaux de type double tab1=new double [10]; // tab1.length retourne 10 tab2=new double [15]; // tab2.length retourne 15 tab1=new double [36]; /* tab1 rfrence (dsigne) un nouveau tableau de taille tab1.length = 36. */ tab1=tab2 ; /* tab1 et tab2 dsignent le mme tableau rfrenc par tab2. tab1.length retourne 15 */
El Mostafa DAOUDI- p. 143

4. Autres mthodes de cration et dinitialisation. On peut lier la dclaration, la cration et linitialisation explicite dun tableau. La longueur du tableau ainsi cre est alors calcule automatiquement daprs le nombre de valeurs donnes (Attention : cette syntaxe n'est autorise que dans la dclaration) : Cration et initialisation explicite la dclaration int tab[] = {5, 2*7, 8}; // la taille du tableau tab est fix 3 Etudiant [] etudiantsSMI = { new Etudiant("Mohammed", "Ali"), new Etudiant("Fatima", "Zahra") } // la taille du tableau etudiantsSMI est fix 2 Initialisation lors de la cration. int[] tab; tab = new int[] {6, 9, 3, 10}; // la taille du tableau est fix 4
El Mostafa DAOUDI- p. 144

72

Exemple:
public class ExempleTableau { public static void main(String[] args) { // DECLARATION double[] tab; // CREATION dun tableau de dimension 100 tab = new double[100]; // AFFECTATION DES ELEMENTS DU TABLEAU for (int i=0; i<tab.length; i++) tab[i] = 1.; // AFFICHAGE for (int i=0; i<tab.length; i++) System.out.print(tab[i]+" "); System.out.println(); } }
El Mostafa DAOUDI- p. 145

Exemple de tableau de paramtres de la ligne de commande public class TestArguments { public static void main(String[] args) { for (int i=0; i < args.length; i++) System.out.println(argument +i+ = +args[i]); } } $ javac TestArguments // compilation $ java TestArguments arg1 arg2 /* excution en passant 2 arguments (deux chaines de caractres arg1 et arg2) la ligne de commande */ Le programme affichera: argument 0 = arg1 argument 1 = arg2
El Mostafa DAOUDI- p. 146

73

III. Affectation de Tableaux


Java permet de manipuler globalement les tableaux par affectation de leurs rfrences. laffectation ne modifie que la rfrence. Elle permet le changement de rfrences. Soient tab1 et tab2 deux tableaux tab1=tab2; => On perd lobjet initialement rfrenc par tab1. => La rfrence contenue dans tab2 est affecte tab1. Maintenant tab1 et tab2 dsignent le mme objet tableau qui tait initialement rfrenc par tab2. tab1[2]=3; // tab2[2] =3. tab2[4]=6; // tab1[4] = 6; Attention: Si on veut copier uniquement les valeurs de tab2 dans tab1, alors dans ce cas on peut faire une copie lment par lment
El Mostafa DAOUDI- p. 147

IV. Copie de tableau


Mthode manuelle : cration d'un nouveau tableau puis copie lment par lment. Copie par appel de : System.arraycopy() : System.arraycopy(src, srcPos, dest, destPos, nb); src : tableau source. srcPos : indice du 1er lment copi partir de src. dest : tableau destination destPos : indice de dst o sera copi le 1er lment nb : nombre d'lments copis Copie nb lments du tableau src (source) partir de lindice srcPos et les affecte dans le tableau dest (destination) partir de lindice destPos. Exemple: import java.lang.* System.arraycopy(tab1, 6, tab2, 2, 50); copie de 50 lments de tab1 partir de lindice 6 et les affecte dans tab2 partir de lindice 2.

El Mostafa DAOUDI- p. 148

74

Allocation et copie par appel de: Arrays.copyOf() ou Arrays.copyOfRange() Exemple: Soit tab un tableau dentier dj cre et initialis. Cration et initialisation du tableau t2 partir du tableau tab import java.util.Arrays; int[] t2= Arrays.copyOf(tab, 10); // 1. cre le tableau t2 // 2. affecte au tableau t2 les 10 premiers lments du tableau tab. int[] t3= Arrays.copyOfRange(tab, debut, fin); // 1. cre le tableau t3 //2. affecte t3 les lments de tab situs entre // les indices: debut et (fin-1) :

El Mostafa DAOUDI- p. 149

V. Comparer 2 tableaux de type primitifs


Comparer le contenu de deux tableaux: 1. On peut comparer les lments des deux tableaux un un . 2. On peut aussi utiliser la mthode equals() de la classe Arrays de la faon suivante: import java.util. Arrays; . // soient tab1 et tab2 deux tableau // On suppose que les deux tableaux sont dj initialiss boolean b=Arrays.equals(tab1,tab2); /* compare les contenus des tableaux tab1 et tab2 et retourne le rsultat de la comparaison dans la variable boolenne b */ .
El Mostafa DAOUDI- p. 150

75

VI. Tableaux dobjets


Les lments dun tableau peuvent tre dun type objet. Attention: La dclaration dun tableau dobjets cre uniquement des cases pour stocker des rfrences aux objets, mais ne cre pas les objets eux-mmes. Ces rfrences valent initialement null. Il faut crer les objets avant de les utiliser.

El Mostafa DAOUDI- p. 151

Exemple Considrons lexemple de la classe Etudiant. Soit setCNE(int ) une mthode de la classe Etudiant. Etudiants [] etudiantSMI = new Etudiant[100]; /* dclare un tableau de 100 tudiants. Chaque lment du tableau contient une rfrence vers un objet de type Etudiant */ etudiantSMI[0].setCNE(11225467); /* gnre une erreur, car pour le moment etudiantSMI[0] ne contient que la rfrence vers un objet de type Etudiant. Avant dutiliser lobjet etudiantSMI[0] il faut le crer. */ etudiantSMI[0] = new Etudiant(); // Cration de lobjet etudiantSMI[0] etudiantSMI[0].setCNE(11225467); // ok! Car lobjet etudiantSMI[0] est cr.

El Mostafa DAOUDI- p. 152

76

Attention: Pour les tableaux dobjets, la mthode equals() de la classe Arrays compare les rfrences. Exemple: Considrons la classe Point (voir TD). public class TestTableauObjet { public static void main(String[] args) { Point p1[]=new Point[2]; // p1 est tableau de Point de taille 2 Point p2[]=new Point[2]; // p2 est tableau de Point de taille 2 Point p3[]=new Point[2]; // p3 est tableau de Point de taille 2 p1[0]=new Point(1,2); p1[1]=new Point(5,8); // initialisation p2[0]=new Point(1,2); p2[1]=new Point(5,8); // initialisation boolean b1=Arrays.equals(p1,p2); // retourne false p3[0]= p1[0]; p3[1] =p1[1] boolean b2=Arrays.equals(p1,p3); // retourne true p1=p2; boolean b3=Arrays.equals(p1,p2); // retourne true } }
El Mostafa DAOUDI- p. 153

VII. Les tableaux en argument dune mthode: - Le passage des tableaux se fait par spcification du tableau comme paramtre dune mthode. - On ne doit pas spcifier la taille de chaque dimension. Cette taille peut tre obtenue dans la mthode laide de lattribut length. - Le passage des tableaux comme paramtres des mthodes se fait par rfrence (comme les objets) et non par copie (comme les types primitifs) - La mthode agit directement sur le tableau et non sur sa copie.

El Mostafa DAOUDI- p. 154

77

VIII. Tableaux deux dimensions - Un tableau deux dimensions, ou matrice, reprsente un rectangle compos

de lignes et de colonnes. - Si tab est un tableau deux dimensions, llment de la ligne i et de la colonne j est dsign par tab[i][j]. Dclaration int[][] notes; // dclare un tableau deux dimensions Chaque lment du tableau contient une rfrence vers un tableau Cration: On utilise lopration new de cration de tableaux. Il faut donner au moins la premire dimension

El Mostafa DAOUDI- p. 155

Exemple: notes = new int[30][3]; // cr un tableau de 30 tudiants, chacun a au plus 3 notes Nous pouvons considr le tableau notes comme un rectangle avec 30 lignes et 3 colonnes. Par convention, la premire dimension est celle des lignes, et la deuxime, celle des colonnes. Les indices dbutent 0. Lors de sa cration, les lments du tableau sont initialiss par dfaut. notes = new int[30][]; //cre un tableau de 30 tudiants, chacun a un nombre variable de notes Remarques: - Les tableaux plusieurs dimensions sont dfinis laide de tableaux des tableaux. Ce sont des tableaux dont les composantes sont elles-mmes des tableaux. - Un tableau deux dimensions de tailles n et m, est en ralit un tableau unidimensionnel de n lignes, o chaque ligne est un tableau de m composantes.
El Mostafa DAOUDI- p. 156

78

Dimensions du tableau Soit t un tableau a deux dimensions: t.length : donne la longueur de la premire dimension, cest--dire le nombre de lignes du tableau t. t[i].length : donne la longueur de la ligne i de t, autrement dit, le nombre de colonnes de cette ligne. Initialisation - Comme pour les tableaux une dimension, on peut faire linitialisation dune matrice par numration de ses composantes. Exemple 1: int [][] tab = { {1,2,3,4}, {5,6,8}, {9,10,11,12}}; /* cr une matrice 3 lignes (un tableau 3 composante). Chaque ligne (chaque composante) est un tableau unidimensionnelle un nombre variable de composantes: */ int [] t = tab[1]; // cre le tableau t= {5,6,8} tab[1][2] = 8;
El Mostafa DAOUDI- p. 157

Exemple 2: int[][] t; t = new int[2][]; int[] t0 = {0, 1}; t[0]= t0; // t[0] est un tableau t[1] = new int[] {2, 3, 4, 5}; // Dclaration et initialisation for (int i = 0; i < t.length; i++) { for (int j = 0; j < t[i].length; j++) { System.out.print(t[i][j] + " "); } System.out.println(); } Affiche: 0 1 2 3 4 5

El Mostafa DAOUDI- p. 158

79

Exemple 3:
Possibilit de forme non rectangulaire : float triangle[][]; int n; // ... triangle = new float[n][]; //cr un tableau n lignes for (int i=0; i<n; i++) { triangle[i] = new float[i+1]; // la ligne i est de dimension i } Quelques (rares) fonctions connatre sur les tableaux de tableaux : Arrays.deepEquals(); // explorer Arrays.deepToString(); // explorer

El Mostafa DAOUDI- p. 159

Ch. VI. Hritage


L'hritage est une notion fondamentale en Java et de manire gnrale dans les langages de programmation par Objets. Il permet de crer de nouvelles classes par combinaison de classes dj existantes sans toucher au code source des classes existantes. Il permet de rutiliser une classe existante: - en l'adaptant: ajouter de nouveaux attributs et mthodes la nouvelles classes ou adapter (personnaliser) les attributs et les mthodes de la classes existante. - en la factorisant: plusieurs classes peuvent partager les mmes attributs et les mmes mthodes.
El Mostafa DAOUDI- p. 160

80

1. Syntaxe:
class <ClasseDerivee> extends <ClasseDeBase> Interprtation: Permet de dfinir un lien d'hritage entre deux classes: - La classe <ClasseDeBase> est le nom de la classe de base. On lappelle aussi une classe mre, une classe parente ou une super-classe. Le mot clef extends indique la classe mre. - La classe <ClasseDerivee> est le nom de la classe drive. Elle hrite de la classe <ClasseDeBase>. On l'appelle aussi une classe fille ou une sous-classe. Remarques: - On a seulement besoin du code compil de la clase de base. - Toutes les classe hritent de la classe Object. Par dfaut, on ne met pas extends Object dans la dfinition dune classe. Exemple: public class TestClasse { } // quivalent : public class TestClasse extends Objet { }

El Mostafa DAOUDI- p. 161

Lorsqu'une classe hrite d'une autre classe La classe drive bnficie automatiquement des dfinitions des attributs et des mthodes de la classe mre. Elle hrite de tous les attributs (y compris static) et mthodes membres de la classe mre (sauf les mthodes prives et les constructeurs) . En plus, la classe drive peut avoir des attributs et des mthodes supplmentaires correspondants sa spcificit (ses propres attributs et mthodes). Elle peut y ajouter ses propres dfinitions. redfinir des mthodes (personnaliser les mthodes): exactement le mme nom et la mme signature. surcharger des mthodes: mme nom mais pas les mmes arguments (signature).
El Mostafa DAOUDI- p. 162

81

Exemple:
class ClasseDeBase { // classe mre // Dfinition des attributs et des mthodes } class ClasseDerivee extends Classedebase{ // ClasseDerivee : Sous-classe directe de la classe ClasseDeBase // Dfinition de nouveaux attributs et mthodes (propres la classe ClasseDerivee) // Adaptation des mthodes qui sont dj dfinies dans la classe mre // ClasseDerivee hrite des mthodes et attributs de la classe ClasseDeBase } class ClasseSousDerivee extends ClasseDerivee { /* ClasseSousDerivee: Sous-classe directe de la classe ClasseDerivee et sous-classe indirecte de la classe ClasseDeBase */ // Dfinition de nouveaux attributs et mthodes (propres la classe ClasseSousDerivee) // Adaptation des mthodes qui sont dj dfinies dans les superclasses directes ou indirectes // ClasseSousDerivee hrite des mthodes et attributs des superclasses. }

El Mostafa DAOUDI- p. 163

Accs depuis lextrieur: Un objet (une instance ) dune classe drive peut appeler depuis lextrieur (accs depuis lextrieur) - ses propres mthodes et attributs publics et protected. - Les mthodes et attributs publics et protected de la classe de base. Accs depuis lintrieur: - Une mthode dune classe drive a accs aux membres publics et protected de sa classe de base. - Une mthode dune classe drive na pas accs aux membres prives de sa classe de base. La classe drive ne peut accder qu'aux membres (attributs ou mthodes) publics et protgs hrits.
El Mostafa DAOUDI- p. 164

82

Remarques1: Quand on crit la classe drive on doit seulement: crire le code (variables ou mthodes) li aux nouvelles possibilits: offrir de nouveaux services. redfinir certaines mthodes: enrichir les services rendus par une classe. Remarques2:
Java, ne permet pas lhritage multiple. Il permet lhritage simple uniquement: chaque classe a une et une seule classe mre dont elle hrite les variables et les mthodes. C++ permet lhritage multiple.

El Mostafa DAOUDI- p. 165

2. Construction des classes drives


Lorsqu'on construit une instance de la classe drive, on obtient un objet : - dont une partie est construite grce la dfinition de la classe drive - et une partie grce la dfinition de la superclasse En Java, le constructeur de la classe drive doit prendre en charge lintgralit de la construction de lobjet. Le constructeur de la classe drive doit faire appel au constructeur de la classe de base en appelant explicitement la mthode super() ainsi que la liste des paramtres appropris. Remarques: les constructeurs ne sont pas hrits, mais on peut appeler ceux de la classe mre avec super() lappel du constructeur de la classe de base (appel de la mthode super()) doit tre la premire instruction dans la dfinition du constructeur de la classe drive.

El Mostafa DAOUDI- p. 166

83

Exemple 1: class ClasseDeBase{ public ClasseDeBase(int i) { // constructeur de la classe de base


System.out.println(" Classe de Base: " + i);

} } class ClasseDerivee1 extends ClasseDeBase { public ClasseDerivee1(int i, int j) { // constructeur de la classe drive 1 super(i+j); // appel du constructeur ClasseDeBase
System.out.println(" Classe drive1: " + i+ " , "+j);

} } class ClasseDerivee2 extends ClasseDerivee1{ public ClasseDerivee2(int i) { // constructeur de la classe drive 2 super(i , i+300); // appel du constructeur ClasseDerivee1
System.out.println(" Classe drive2: " + i);

} }

El Mostafa DAOUDI- p. 167

public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 objA=new ClasseDerivee2(7); } } Sortie:

Classe de Base : 314 Classe drive1: 7 , 307 Classe drive2: 7

El Mostafa DAOUDI- p. 168

84

3. Les cas possibles pour la construction des classes drives


Exemple 1: class ClasseDeBase{ public ClasseDeBase(arguments) { // Constructeur de la classe de base

} class ClasseDerivee extends ClasseDeBase { // Pas de constructeur . } On obtient une erreur de compilation. Un constructeur de la classe drive doit tre dfini et doit appeler le constructeur de la classe de base.

El Mostafa DAOUDI- p. 169

Exemple 2: class ClasseDeBase{ public ClasseDeBase(arguments1) { // constructeur de la classe de base

} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive /* Premire instruction = Appel de super(arguments1) Cest obligatoire sinon une erreur */ . } }
El Mostafa DAOUDI- p. 170

85

Exemple 3: class ClasseDeBase{ public ClasseDeBase() { // constructeur sans paramtres de la classe de base

} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive // lappel de super() nest pas obligatoire. /* si super() nest pas explicitement appel, alors le constructeur sans paramtres de la classe de base qui sera appel par dfaut. */ . } }

El Mostafa DAOUDI- p. 171

Exemple 4: class ClasseDeBase{ public ClasseDeBase(arguments1) { // constructeur de la classe de base

} public ClasseDeBase() { // constructeur sans paramtres de la classe de base

} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive // lappel de super(avec ou sans arguments) nest pas obligatoire. /* si super nest pas explicitement appel, alors le constructeur sans paramtres de la classe de base qui sera appel par dfaut. */ . } }
El Mostafa DAOUDI- p. 172

86

Exemple 5: class ClasseDeBase{ // Pas de constructeur

} class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments) { /* appel implicite du constructeur par dfaut de la classe de base */ . } } La cration dun objet de type ClasseDerivee entrane lappel du constructeur par dfaut de la clase ClasseDeBase .
El Mostafa DAOUDI- p. 173

Exemple 6: class ClasseDeBase{ // Pas de constructeur

} class ClasseDerivee extends ClasseDeBase { // Pas de constructeur . } La cration dun objet de type ClasseDerivee entrane lappel de constructeur par dfaut qui appelle le constructeur par dfaut de la classe ClasseDeBase .

El Mostafa DAOUDI- p. 174

87

Exemple pratique: class ClasseDeBase{ public ClasseDeBase(int i) {


System.out.println(" Classe de Base: " + i);

} } class ClasseDerivee1 extends ClasseDeBase { public ClasseDerivee1() { // 1re instruction obligatoire = appel explicite de super() super(4); // par exemple
System.out.println(" Classe drive1: ");

} } class ClasseDerivee2 extends ClasseDerivee1{ public ClasseDerivee2() { // Appel explicite de super() nest pas obligatoire // Appel implicite du constructeur sans paramtres de ClasseDerivee1
System.out.println(" Classe drive2: " );

} }
El Mostafa DAOUDI- p. 175

public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 objA=new ClasseDerivee2(); } } Sortie:

Classe de Base : 4 Classe drive1: Classe drive2:

El Mostafa DAOUDI- p. 176

88

Rsum: Si on n'appelle pas le constructeur de la superclasse, le constructeur par dfaut est utilis si: - aucun constructeur nest dfini - au moins un constructeur sans paramtre est dfini sinon le compilateur dclare une erreur Remarques Une classe dclare final ne peut pas avoir de classes filles. La redfinition d'une mthode public ne peut tre private Une mthode final ne peut pas tre redfinie
El Mostafa DAOUDI- p. 177

4. Notion de la Redfinition on redfinit une mthode quand une nouvelle mthode a le mme nom et la mme signature quune mthode hrite de la classe mre. la redfinition d'une mthode d'une classe consiste fournir dans une sousclasse une nouvelle implmentation de la mthode. Cette nouvelle implmentation masque alors compltement celle de la superclasse Attention: Ne pas confondre redfinition et surcharge des mthodes : on surcharge une mthode quand une nouvelle mthode a le mme nom, mais pas la mme signature, quune autre mthode de la mme classe
El Mostafa DAOUDI- p. 178

89

class ClasseDeBase{ public f(arg) { } } class ClasseDerivee1 extends ClasseDeBase { public f(arg) { // la mthode f() est redfinie dans ClasseDerivee1 } } class ClasseDerivee2 extends ClasseDeBase{ public f(arg){ // la mthode f() est redfinie dans ClasseDerivee2 . } }
El Mostafa DAOUDI- p. 179

Visibilit Lorsqu'un attribut ou une mthode ont t dfinis dans une classe et sont redfinis dans une classe drive (qui en hrite) alors les lments visibles dans la classe drive sont ceux redfinis dans cette classe. Les lments de la classe de base (hrite) sont alors masqus. Rgles On peut avoir les mmes mthodes dans des classes hritant les unes des autres. Dans ce cas, c'est la classe la plus drive de l'objet qui dtermine la mthode excuter, sans que le programmeur ait faire des tests sur le type de l'objet traiter (voir exemple suivant).
El Mostafa DAOUDI- p. 180

90

A*

Soit f() est une mthode dfinie dans la classe A. On suppose les liens dhritage suivants: - Les classes B et C hritent de A - Les classes D et E hritent de B

B C*

- La classe F hrite de C *: signifie redfinition de f(). Dans class A: la mthode f() de A Dans classe B: la mthode f() de A Dans classe D: la mthode f() de D

D*

Dans classe E: la mthode f() de A Dans classe C: la mthode f() de C Dans classe F: la mthode f() de C

El Mostafa DAOUDI- p. 181

Le mot cl super Grce au motcl super, la mthode redfinie dans la sousclasse peut rutiliser du code crit dans la mthode de la superclasse, qui n'est plus visible autrement. super a un sens uniquement dans une mthode (comme le motcl this).

El Mostafa DAOUDI- p. 182

91

Exemple: class Point { private int x,y; public void afficher(){ System.out.println(" je suis en "+ x +" et " +y); } } class PointCol extends Point { public void afficher() { // redfinition de la mthode afficher() super.afficher(); // appel de la mthode afficher() de la classe de base System.out.println (" et ma couleur est: "+ couleur); } private byte couleur; }
El Mostafa DAOUDI- p. 183

Dune manire gnrale, Soit g() une mthode dfinie dans une classe drive D. Dans la mthode g(), linstruction super. sert dsigner un membre dune classe anctre (la premire classe anctre de D contenant le membre dsign par super). Par exemple: super.f() dsigne la mthode f() dfinie dans la premire classe anctre de la classe D. La recherche de la mthode f() commence dans la classe mre de D, ensuite dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode f() qui sera alors excute Attention: Une fois la premire classe anctre trouve, on ne peut pas remonter plus haut: pas de super.super.
El Mostafa DAOUDI- p. 184

92

Exemple: class ClasseA { public String nom="Mostafa"; public void f(){ System.out.println("Je suis dans la classe de base ClasseA"); } } class A extends ClasseA { public String nom="Ali"; public void ff(){ System.out.println("Je suis dans la classe de base A"); } } class B extends A { public String nom = "Mohammed"; public void g(){ super.f(); // dsigne la mthode f() de la classe anctre: classe ClassA System.out.println( "Et je suis aussi dans la class derive B : "+nom+ " " +super.nom); // super.nom dsigne le champ nom de la classe mre : classe A. } }
El Mostafa DAOUDI- p. 185

public class TestSuper { public static void main(String[] args) { B b = new B(); b.g(); } } Affiche : ?? Je suis dans la classe de base ClasseA Et je suis aussi dans la class derive B : Mohammed Ali

El Mostafa DAOUDI- p. 186

93

5. Sous-type
Le type B est un sous-type de A si on peut affecter une expression de type B dans une variable de type A. Les type primitifs - int est un sous type de float (int i; float x=i;) - float est un sous type de double (float y; double z=y;)
-

Les objets Les sous-classes dune classe A sont des sous types de A. Dans ce cas on peut crire: A a = new B(); // la variable a est de type A, alors que // lobjet rfrenc par a est de type B. A aa; B b=new B(); aa=b; // aa de type A, rfrence un objet de type B Par contre on ne peut pas avoir: A a=new A(); B b; b=a; // erreur: on ne peut pas convertir du type A vers le type B
El Mostafa DAOUDI- p. 187

Dfinitions: - La classe relle (ou le type rel) de lobjet est la classe du constructeur qui a cr lobjet Exemple: Soit B une sous classe de A A a = new B(); // B est la classe (type) relle de lobjet a - Le type dclar (ou la clase dclare) de lobjet est le type qui est donn au moment de la dclaration de la variable qui rfrence lobjet. Exemple: Soit B une sous classe de A A a = new B(); // A est le type dclar de lobjet a

El Mostafa DAOUDI- p. 188

94

Cas des tableaux


Soit B une classe qui hrite de la classe A, alors on peut crire : A[] tab = new B[5]; Attention: Dans tab[] il faut des objets de la classe relle et non celles du type dclar (cest dire des objets de type B et non de type A). Par exemple, si on a les instructions suivantes: A[] tab = new B[5]; // A est le type dclar du tableau tab. // les lments de tab doivent tre du type rel cest des instances // de la classe B et non de de la classe A. A a = new A(); tab[0] = a; // on affecte tab[0] une instance de type A /* Passe la compilation mais provoquera une erreur lexcution car tab[0] reoit une valeur de type A et non une valeur de type B. */

El Mostafa DAOUDI- p. 189

Ch. VII. Polymorphisme


I. Exemple introductif:
Considrons lexemple suivant o ClasseB est une classe qui hrite de la classe ClasseA. Soient f() une mthode qui est redfinie dans B et g() une mthode dfinie dans A. On suppose que : class ClasseA { public void f(){ System.out.println("Mthode f(): Classe de base A"); } public void g(){ System.out.println("Mthode g(): Classe de base A"); } } class ClasseB extends ClasseA { // ClasseB hrite de la classe ClasseA public void f(){ // la mthode f() est redfinie dans ClasseB System.out.println("Mthode f(): Classe B drive de ClasseA"); } public void h(){ // la mthode h() dfinie uniquement dans ClasseB System.out.println("Mthode h(): Classe B drive de ClasseA"); } }
El Mostafa DAOUDI- p. 190

95

public class TestPolymorphisme { public static void main(String [] args ) { ClasseA a=new ClasseA(); ClasseB b = new ClasseB(); a.f(); // appelle la mthode dfinie dans ClasseA a=b; // le type dclar de a est ClasseA. Le type rel de a est ClasseB a.f(); // appelle la mthode dfinie dans ClasseB a.g(); // appelle la mthode dfinie dans ClasseA b.g(); // appelle la mthode dfinie dans ClasseA b.h(): // appelle la mthode h() dfinie dans ClasseB } } Il faut noter que la mme criture a.f(); peut correspondre des appels diffrents de la mthode f(). Ceci est ralis grce au polymorphisme.
El Mostafa DAOUDI- p. 191

- Le Polymorphisme veut dire que le mme service peut avoir un comportement diffrent suivant la classe dans laquelle il est utilis. Cest un concept fondamental de la programmation objet, indispensable pour une utilisation efficace de lhritage - Quand on manipule un objet via une rfrence une classe mre, ce sont toujours les mthodes (non statiques) de la classe effective de l'objet qui sont appeles Soit f() une mthode non static redfinie dans la classe ClasseB . ClasseA objA = new ClasseB(); objA.f(); // Appel de f() redfinie dans ClasseB (classe effective=classe // relle de lobjet), mme si objA est une rfrence de type // ClasseA (Classe dclare de lobjet).

El Mostafa DAOUDI- p. 192

96

Attention cest important: Si on a: B b = new B(); b.h(); // appelle la mthode h() dfinie dans B A a=new B(); a.h(); /* erreur la compilation mme si la classe relle possde la mthode h(). En effet la classe dclare (classe A) ne possde pas la mthode h(). */

En effet, en Java, ds la compilation on doit garantir lexistence de la mthode appele typage statique) : la classe dclare de lobjet qui reoit le message (ici la classe A ou une de ces classes anctres (polymorphisme)) doit possder cette mthode ().
El Mostafa DAOUDI- p. 193

Le polymorphisme est obtenu grce au mcanisme de la liaison retarde (tardive) late binding : la mthode qui sera excute est dtermine seulement lexcution, et pas ds la compilation par le type rel de lobjet qui reoit le message (et pas par son type dclar)

El Mostafa DAOUDI- p. 194

97

II. Mcanisme de la liaison retarde: cas des mthodes redfinies Soit ClasseB la classe relle dun objet objB (ClasseB est la classe du constructeur qui a cr lobjet objB) et soit ClasseA la classe de dclaration de lobjet objB (ClasseA objB = new ClasseB();). Si on a linstruction: objB.f(); quelle mthode f() sera appele ? 1. Si la mthode f() nest pas dfinie dans une classe anctre de la classe de dclaration (la classe ClasseA) alors erreur de compilation. 2. Si non Si la mthode f() est redfinie dans la classe ClasseB, alors cest cette mthode qui sera excute Sinon, la recherche de la mthode f() se poursuit dans la classe mre de ClasseB, puis dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode f() qui sera alors excute.

El Mostafa DAOUDI- p. 195

La mthode appele ne dpend que du type rel de lobjet et non du type dclar. - Soit B une classe qui hrite de la classe A, et soit f() une mthode dfinie dans A et redfinie dans B. - Soit C une classe qui hrite de la classe B. A a = new B(); a.f(); // La mthode f() appele est celle dfinie dans B. Maintenant si on: A a = new C(); // ok car C hrite de B qui hrite de A a.f(); Si la mthode f() est redfinie dans C alors la mthode appele est celle dfinie dans C. Si la mthode f() nest redfinie dans C alors cest la mthode f() redfinie dans B qui est appele.

El Mostafa DAOUDI- p. 196

98

III. Utilits du Polymorphisme: Le polymorphisme permet dviter les codes qui comportent de nombreux embranchements et tests. Exemple Considrons une classe ClasseA. Supposons que les classes ClasseB et ClasseC hritent de la super classe ClasseA. Dans un tableau htrogne, on range des objets de type ClasseB et ClasseC. Ensuite on affiche le contenu du tableau. instanceof (voir plus loin): Soit b une instance d'une classe B alors - (b instanceof B) retourne true : signifie que b est une instance de B. - si B est une sous classe de A alors (b instanceof A) retourne true.
El Mostafa DAOUDI- p. 197

Exemple
class ClasseA { public void f() {} // mthode vide public void g() {} // mthode vide } class ClasseB extends ClasseA { public void f() { // traitement propre ClasseB System.out.println("traitement dans Classe B "); } } class ClasseC extends ClasseA{ public void g() { // traitement propre ClasseC System.out.println("traitement dans ClasseC "); } }
El Mostafa DAOUDI- p. 198

99

public class TestPolymorphisme { public static void main(String[] args) { ClasseA [] objA = new ClasseA[3]; // objA tableau dobjets objA[0]=new ClasseB(); // cration de lobjet objA[0] objA[1]=new ClasseC(); // cration de lobjet objA[1] objA[2]=new ClasseC(); // cration de lobjet objA[2] // Pour chaque lment du tableau, faire le traitement correspondant for (int i=0; i < objA.length; i++) { if (objA[i] instanceof ClasseB) objA[i].f(); else if (objA[i] instanceof ClasseC) objA[i].g(); } }}
El Mostafa DAOUDI- p. 199

Inconvnients dans le code prcdent: 1. Si on veut rajouter une nouvelle sous classe, par exemple ClasseD, dote de la mthode h() pour faire un traitement propre la sous classe ClasseD, alors on est oblig de: - changer le code source de la classe de base aux niveaux dfinition de la classe : rajouter la mthode vide public void h() {}. - Rajouter un branchement pour la sous classe ClasseD. 2. Si on traite plusieurs sous classes, alors le code comportera plusieurs tests. En exploitant le polymorphisme, on peut amliorer le code prcdent Eviter les tests Rendre le code extensible: rajouter de nouvelles sous-classes sans toucher au code source existant).
El Mostafa DAOUDI- p. 200

100

Lexemple peut tre rcrit de la manire suivante en exploitant le polymorphisme


class ClasseA { public void f() {} // mthode vide } class ClasseB extends ClasseA { public void f() { // traitement propre ClasseB System.out.println("traitement dans ClasseB "); } } class ClasseC extends ClasseA { public void f() { // traitement propre ClasseC System.out.println(" traitement dans ClasseC"); } }
El Mostafa DAOUDI- p. 201

public class TestPolymorphisme { public static void main(String[] args) { ClasseA [] objA = new ClasseA[3]; objA[0] = new ClasseB(); objA[1] = new ClasseC(); objA[2] = new ClasseC(); for (int i=0; i < objA.length; i++) objA[i].f(); // On na pas besoin de faire des tests: la mthode appele // correspond la mthode de la classe effective de lobjet : // principe du polymorphisme. // } }
El Mostafa DAOUDI- p. 202

101

Ch. VIII. La gestion des exceptions


I. Dfinition et principe
Une exception est un mcanisme pour traiter les anomalies qui se produisent pendant l'excution. Principe Principe fondamental = sparer la dtection et le traitement des anomalies : - signaler tout problme ds sa dtection. - mais regrouper le traitement des problmes ailleurs, en fonction de leur type Plutt que de compliquer le code du traitement normal, on traite les conditions anormales part Le traitement normal apparat ainsi plus simple et plus lisible
El Mostafa DAOUDI- p. 203

II. Gestion des erreurs sans utiliser le mcanisme des exceptions

Considrons lexemple de la classe point qui a: - un constructeur a deux arguments qui permet de positionner le point dans le plan. Le programme doit sarrter si au moins une des coordonnes du point est ngative.

El Mostafa DAOUDI- p. 204

102

public class Point { private int x, y; public Point(int x, int y) { if ((x < 0) || (y < 0)) { // Dtection de lerreur (lException) System.out.println("Erreur de Construction"); /* traitement en cas derreur (traitement de lexception) */ System.exit(-1); } else { this.x = x ; this.y = y; // traitement normal } } }

El Mostafa DAOUDI- p. 205

Un 1er test public class TestException { public static void main(String[] argv) { private int i=3; // dbut du bloc susceptible de gnrer une exception Point a = new Point(6,1); Point b = new Point(3, 4); // Fin du bloc susceptible de gnrer une exception System.out.println (" Excution bien passe i= "+i); } } Sortie du programme: Excution bien passe i=3 Les appels de Point(6,1) et Point(3,4) nont gnr aucune exception..

El Mostafa DAOUDI- p. 206

103

Un 2me test public class TestException { public static void main(String[] argv) { private int i=3; // dbut du bloc susceptible de gnrer une exception Point a = new Point(6,1); Point b = new Point(-2, 4); // Fin du bloc susceptible de gnrer une exception System.out.println (" Excution bien passe i= "+i); } } Sortie du programme: Erreur de Construction Lappel de Point(6,1) na pas gnr dexception, donc il a t excut normalement. Par contre lappel de Point(-2,4) a gnr une exception et a provoqu larrt du programme (appel de System.exit(-1);). Par consquent linstruction System.out.printl() na pas t excute.
El Mostafa DAOUDI- p. 207

III. Gestion des erreurs en utilisant le mcanisme des exceptions Dans lexemple prcdent, le traitement normal, la dtection de lexception et son traitement ne sont pas spars. Java permet de sparer la dtection de lexception et de son traitement. Le traitement normal et le traitement des exceptions sont dissocis. Au lieu de compliquer le code du traitement normal, on traite les conditions anormales part. Le traitement normal apparat ainsi plus simple et plus lisible. Le traitement des exceptions (erreurs) seffectue dans une zone du programme spciale (bloc catch ).

El Mostafa DAOUDI- p. 208

104

Pratiquement:
Le code dans lequel une exception peut se produire est mis dans un bloc try, cest-dire on dlimite un ensemble dinstructions susceptibles de dclencher une exception par des blocs try {} try { /* Code dans lequel une exception peut se produire */ } La gestion des exceptions est obtenue par des blocs catch, o un bloc catch est associ une exception donne. Attention: Le bloc catch doit tre juste aprs le bloc try, sinon erreur de compilation. catch ( Type1Exception e) { // de type Type1Exception qui hrite de Exception /* code de la gestion des exceptions */ } catch ( Type2Exception e) { // de type Type2Exception qui hrite de Exception /* code de la gestion des exceptions */ } ..

El Mostafa DAOUDI- p. 209

Lorsquune exception se produit dans le bloc try, alors : un saut est effectu vers un bloc (s) catch les blocs catch sont vrifis un aprs lautre jusqu ce quon trouve un bloc correspondant lexception le code du bloc catch est excut

Exemple: On reprend lexemple prcdent

El Mostafa DAOUDI- p. 210

105

Un 1er Test public class Test { public static void main(String[] argv) { try { // dans ce bloc une exception peut se produire Point b = new Point(-2, 4); Point a = new Point(6, 1); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception // dans ce bloc on traite les exceptions System.out.println("Erreur de Construction"); System.exit(-1); } System.out.println(" Excution bien passe"); } } Sortie du programme: Erreur de Construction Lappel de Point(-2,4); gnre une exception, donc un saut est effectu vers le bloc catch(). Lexcution du code du bloc catch() a provoqu larrt du programme (appel de System.exit(-1);), par consquent lappel de Point(6,1) et les instructions aprs le bloc try {} nont pas t excutes.

El Mostafa DAOUDI- p. 211

Un 2me Test

public class Test { public static void main(String[] argv) { try { Point a = new Point(9, 5); Point b = new Point(3, 7); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); System.exit(-1); } System.out.println(" Excution bien passe"); } } Sortie du programme: Excution bien passe Les appels de Point(9,5) et Point(3,7) nont pas gnr dexceptions donc le code du bloc catch() { } na pas t excut par consquent lexcution est alle au-del du bloc try.

El Mostafa DAOUDI- p. 212

106

IV. Lancement (dclenchement) dune exception


Une mthode dclare quelle peut gnrer une exception par le mot cl throws. Ensuite la mthode lance une exception, en crant une nouvelle valeur (un objet) dexception en utilisant le mot cl throw Exemple: public Point (int x, int y) throws ErrConst { // Dclare que le constructeur Point() peut gnrer une exception if ((x <0) || (y<0)) throw new ErrConst(); // Dtection de lexception et Cration dune nouvelle valeur dexception this.x = x ; this.y = y; // traitement normal } ErrConst est une classe qui hrite de la classe Exception . Elle peut tre dfinie de la manire suivante: class ErrConst extends Exception{ } N.B. Est-ce que cette dfinition est juste ?? Si a passe la compilation, veut dire que la classe Exception nadmet aucun constructeur ou elle admet au moins un constructeur sans paramtres.
El Mostafa DAOUDI- p. 213

Un Premier exemple complet: class ErrConst extends Exception {} class Point { private int x, y; public Point(int x, int y) throws ErrConst {// dclare une exception if ((x < 0) || (y < 0)) throw new ErrConst(); // dclenche une exception this.x = x ; this.y = y; // traitement normal } } public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); Point b = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); System.exit(-1); } } }
El Mostafa DAOUDI- p. 214

107

Un Deuxime exemple complet: Supposons maintenant que la classe Point possde une mthode dplace() et que le point doit rester dans le plan positif. Dans ce cas, le constructeur Point() et la mthode deplace() doivent dclencher une exception. class ErrConstextends Exception {} class ErrDepl extends Exception {} class Point { private int x, y; public Point(int x, int y) throws ErrConst { // dclare une excption if ((x < 0) || (y < 0)) throw new ErrConst(); // dclenche une exception this.x = x ; this.y = y; } public void deplace(int dx, int dy) throws ErrDepl{ if ((x+dx < 0) || (y+dy < 0)) throw new ErrDepl(); x = x+dx ; y = y+dy; } }
El Mostafa DAOUDI- p. 215

public class Test { public static void main(String[] argv) { try { Point a = new Point(1,4); a.deplace(0,1); Point b = new Point(7, 4); b.deplace(3,-5); } catch (ErrConst e) { System.out.println("Erreur de Construction"); System.exit(-1); } catch (ErrDepl ed) { System.out.println("Erreur de Dplacement"); System.exit(-1); } } }

El Mostafa DAOUDI- p. 216

108

V. Bloc finally cest une instruction optionnelle qui est excute quelle que soit le rsultat du bloc try (cest dire quil ait dclench ou non une exception) Il permet de spcifier du code dont lexcution est garantie quoi quil arrive. try { ... } catch () { ... } finally { ... }

El Mostafa DAOUDI- p. 217

Exemple: public class TestFinally { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); } finally { System.out.println("Fin du Programme"); } } } Affichage: Erreur de Construction Fin du Programme Dans toutes les excutions (dclenchement ou non dexception), les instructions du bloc finally seront excutes.
El Mostafa DAOUDI- p. 218

109

VI. Constructeurs des exceptions La cration d'exception personnalise peut tre ralise en rajoutant des constructeurs et des membres supplmentaires. Par convention, toutes les exceptions doivent avoir au moins 2 constructeurs : un sans paramtre un autre dont le paramtre est une chane de caractres utilise pour dcrire le problme Mthodes de la classe Throwable Exception(): constructeur sans argument Exception(String): Constructeur avec Argument getMessage() retourne le message derreur dcrivant lexception printStackTrace() affiche sur la sortie standard la liste des appels de mthodes ayant conduit lexception
El Mostafa DAOUDI- p. 219

Mthode printStackTrace() class Point { private int x, y; public Point(int x, int y) throws Exception { if ((x < 0) || (y < 0)) throw new Exception(); this.x = x ; this.y = y; } }

El Mostafa DAOUDI- p. 220

110

public class ExceptionTestStack { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (Exception e) { // Erreur de type Exception System.out.println("Erreur de Construction"); e.printStackTrace(); System.exit(-1); } } } Sortie du Programme: Erreur de Construction ErrConst at Point.<init>(ExceptionTestStack.java:5) at ExceptionTestStack.main(ExceptionTestStack.java:14)
El Mostafa DAOUDI- p. 221

Mthode printStackTrace(): (avec exeption personnalise) class ErrConst extends Exception{} // exception personnalise class Point { private int x, y; public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; } }

El Mostafa DAOUDI- p. 222

111

public class ExceptionTestStack { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); e.printStackTrace(); System.exit(-1); } } } Sortie du Programme: Erreur de Construction ErrConst at Point.<init>(ExceptionTestStack.java:5) at ExceptionTestStack.main(ExceptionTestStack.java:14)
El Mostafa DAOUDI- p. 223

Mthode getMessage().
class Point { private int x, y; public Point(int x, int y) throws Exception { if ((x < 0) || (y < 0)) throw new Exception(" Erreur aux points x=" +x+" et y=" +y); this.x = x ; this.y = y; } }

El Mostafa DAOUDI- p. 224

112

public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (Exception e) { System.out.println(e.getMessage()); System.exit(-1); } } } Sortie: Erreur au point x= -2 et y=4

El Mostafa DAOUDI- p. 225

Mthode getMessage(): Exception personnalise On dfinit dans l'exception personnalise, un constructeur qui a pour argument une chane de caractres:
class ErrConst extends Exception { // lexception personnalise public ErrConst() {} public ErrConst(String msg) { super(msg); } } class Point { private int x, y; public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(" Erreur aux points x=" +x+" et y=" +y); this.x = x ; this.y = y; } }
El Mostafa DAOUDI- p. 226

113

public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { System.out.println(e.getMessage()); System.exit(-1); } } } Sortie: Erreur au point x= -2 et y=4

El Mostafa DAOUDI- p. 227

Voir TD pour dautres exemples dexceptions personnalises

El Mostafa DAOUDI- p. 228

114

V. Les classes derreurs/exceptions


La classe java.lang.Throwable (classe fille de Object) est la superclasse de toutes les erreurs et exceptions rencontres dans le langage de programmation Java. Java.lang est un package qui rassemble les classes de base de Java. Toutes les classes et interfaces de java.lang sont automatiquement importes par le compilateur.

El Mostafa DAOUDI- p. 229

Arbre dhritage des exceptions


Throwable

Error

Exception

RuntimeException

Exceptions contrles

El Mostafa DAOUDI- p. 230

115

Quelques sous-classes de RuntimeException (Exceptions non contrles par le compilateur)


NullPointerException: Tentative d'utiliser une rfrence null ClassCastException : Tentative de cast d'un objet dans un type incorrecte. IndexOutOfBoundsException : Un indice (sur un tableau, une chane) ou un intervalle dfini par deux indices ont dpass les limites infrieures ou suprieures. Ses sous-classes : ArrayIndexOutOfBoundsException, pour les tableaux (indice ngatif ou suprieur ou gal la taille du tableau). StringIndexOutOfBoundsException, pour les chanes de caractres.

El Mostafa DAOUDI- p. 231

ArrayStoreException : Tentative de stocker dans un tableau un lment qui n'est pas du type des lments du tableau ou castable dans ce type. ArithmeticException: Une exception est survenue sur une opration arithmtique, comme une division d'un entier par zro. ) NegativeArraySizeException : Tentative de crer un tableau ou une chane avec une taille ngative. IllegalArgumentException : Une mthode a t appele avec un mauvais argument ou invoque sur un mauvais objet. Sa sous-classe NumberFormatException NumberFormatException : Tentative de convertir dans un type numrique une chane de caractres mal formate.

El Mostafa DAOUDI- p. 232

116

Ch. IX Interfaces et classes abstraites Abstractions et quelques classes utiles

I. Classes abstraites
Une classe abstraite est une classe dclare avec le mot cl abstract. Elle est non instanciable . Elle sert uniquement de classe mre. Exemple: abstract class ClasseA { } Dans une classe abstraite on peut trouver: - des champs, - des mthodes , - des mthodes abstraites.
El Mostafa DAOUDI- p. 233

Une mthode abstraite est dclare avec le mot cl abstract. Dans ce cas on la dclare sans donner son implmentation (sans spcifier le corps de la mthode). On ne fournit que : - le type de la valeur de retour - et la signature (lentte de la mthode). Exemple: abstract public void f(int i, float x); abstract public double g(); Les mthodes abstraites peuvent tre implmentes par les classes filles.

El Mostafa DAOUDI- p. 234

117

Les rgles On ne peut pas instancier une classe abstraite (on ne peut pas crer une instance (un objet) dune classe abstraite).
Soit ClasseA une classe abstraite. - On peut crer une rfrence sur un objet de type ClasseA. - Mais on ne peut pas crer un objet de type ClasseA. ClasseA objA; // autoris ClasseA objA = new ClasseA(); // nest pas autoris.

Soit ClasseB une classe qui hrite de ClasseA. Si ClasseB nest pas abstraite alors on peut crire: ClasseA a = new ClasseB();

El Mostafa DAOUDI- p. 235

Une mthode static ne peut pas tre abstraite. Pourquoi ?? Une classe qui dfinit au moins une mthode abstraite doit tre obligatoirement dclare abstraite. Soit une classe fille qui hrite dune classe mre qui dfinit des mthodes abstraites. Alors la classe fille doit implmenter toutes ses mthodes abstraites sinon elle doit tre aussi dclare abstraite. Une mthode dclare abstraite doit obligatoirement tre dclare public.

El Mostafa DAOUDI- p. 236

118

Intrt des classe abstraites: Le principe est que la classe mre dfinit la structure globale dun algorithme et laisse aux classes filles le soin de dfinir des points bien prcis de lalgorithme. Par exemple quand on ne connat pas priori le comportement par dfaut dune opration commune plusieurs sous-classes

El Mostafa DAOUDI- p. 237

II. Interfaces
Une classe est purement abstraite si toutes ses mthodes sont abstraites. Une interface est une classe purement abstraite. Elle est dclare avec le mot cl interface, dont toutes les mthodes sont publiques. Une interface est une liste de noms de mthodes publiques. Dans linterface on dfinit la signature des mthodes qui doivent tre implmentes dans les classes qui les implmentent. Une interface est un modle pour une classe Exemple dinterfaces public interface Figure { public void dessineFigure(); public void deplaceFigure(int dx, int dy); }
El Mostafa DAOUDI- p. 238

119

Rgles Toutes les mthodes dune interface sont abstraites. Une interface nadmet aucun attribut. Une interface peut possder des constantes publics public interface NomInterface { public static final int CONST = 2; } Les interfaces ne sont pas instanciables. Soit I une interface: I obj; // Juste I a = new I(); // Erreur Tout objet instance dune classe qui implmente linterface peut tre dclar comme tant du type de cette interface. Supposons que la classe ClasseA implmente linterface I . Alors on peut avoir I obj = new ClasseA(); Les interfaces pourront se driver
El Mostafa DAOUDI- p. 239

Implmentation des Interfaces Les interfaces sont implmentes par des classes. Une classe implmente une interface I si elle dclare implements I dans son en-tte. Soit ClasseA qui implmente I . public class ClasseA implements I { } Une classe peut implmenter une ou plusieurs interface(s) donne(s) en utilisant une fois le mot cl implements. public class ClasseA implements I1, I2, { } Si une classe hrite dune autre classe elle peut galement implmenter une ou plusieurs interfaces public class ClasseB extends ClasseA implements I1, I3, ... {

El Mostafa DAOUDI- p. 240

120

Implmente partiellement une interface Soit une interface I et une classe ClasseA qui limplmente : public class ClasseA implements I { } ClasseA peut ne pas implmenter toutes les mthodes de I. Dans ce cas ClasseA doit tre dclare abstract (elle lui manque des implmentations). Les mthodes manquantes seront implmentes par les classes filles de ClasseA

El Mostafa DAOUDI- p. 241

III. La classe racine: classe Object


La classe Object anctre de toutes les classes. Toute classe autre que Object possde une super-classe. Toute classe hrite directement ou indirectement de la classe Object. Une classe qui ne dfinit pas de clause extends hrite de la classe Object. La classe object fournit plusieurs mthodes qui sont hrites par toutes les classes. public boolean equals(Object obj) public String toString() public int hashCode() protected Object clone() public Class getClass() Les plus couramment utilises sont les mthodes toString() et equals()
El Mostafa DAOUDI- p. 242

121

Comparer deux objets Les oprateurs == et != Soient objA et objB deux objets, objA==objB retourne true si les deux objets rfrencent la mme chose. Attention: Les tests de comparaison (== et !=) entre objets ne concernent que les rfrences et non les attributs. Classe Object - equals() public boolean equals(Object obj) Par dfaut, retourne (this==obj). Cest--dire renvoie true si lobjet obj rfrence la mme chose que lobjet qui appelle la mthode equals (objet courant this ). Elle est prvue pour tre redfinie pour comparer les contenues.
El Mostafa DAOUDI- p. 243

Exemple dutilisation: Considrons la classe Point et pA et pB deux instances de Point. Point pA=new Point(5,8); Point pB = new Point(5,8); pA.equals(pB) renvoie false car pA et pB rfrencent deux objet diffrents (appel de la mthode dfinie dans la classe Object). Si on dfinie la mthode equals dans la classe Point comme suit: public boolean equals (Point p){ return ((this.x==p.x)&&(this.y==p.y)); } Dans ce cas pA.equals(pB) renvoie true car pA et pB ont le mme contenue (pA et pB coincident). Mais attention: Que se passe t-il si on a: Object pA = new Point(2,3); Object pB= new Point (2,3) Que vaut : pA.equals(pB) ???? Voir TD pour la redfinition de la mthode equals()
El Mostafa DAOUDI- p. 244

122

Classe Object mthode toString() public String toString(); Elle renvoie une description de lobjet sous la forme dune chane de caractres de la forme: nomDeLaClasse@AdresseMmoireDelObjet Elle est prvue pour tre redfinie pour afficher le contenu. Exemple : Soit pA une instance de la classe Point, alors linstruction: System.out.println(pA) ; Est quivalente System.out.println(pA.toString()) ; // affiche par exemple Point@1a16869

El Mostafa DAOUDI- p. 245

Maintenant on la redfinit dans la classe Point comme suit: public String toString (){ return ("abcisse = "+this.x+" et ordonne = " +this.y); } Dans ce cas, si on a: Point pA=new Point(10, 32); Alors: System.out.println(pA) ; System.out.println(pA.toString()) ;
// appel de la mthode toString() redfinie dans la classe Point

affiche :

abscisse = 10 et ordonne = 32
El Mostafa DAOUDI- p. 246

123

Mthode getClass() public Class getClass() Elle renvoie un objet de type Class qui dsigne le nom de la classe relle de lobjet. Exemple : soit objA une instance de la classe ClasseA, alors linstruction: objA.getClass(); Renvoie: class ClasseA System.out.println(objA.getClass()); Affiche: class ClasseA La mthode getName() de la classe Class renvoie le nom de la classe. On peut lutiliser pour imprimer le nom de la classe : System.out.println(objA.getClass(). getName()); Affiche: ClasseA
El Mostafa DAOUDI- p. 247

LOprateur instanceof Si objA est une instance d'une classe ClasseA alors linstruction: objA instanceof ClasseA ; renvoie true. Si objB est une instance d'une sous-classe ClasseB de ClasseA alors linstruction: objB instanceof ClasseA; renvoie true. En particulier : (objA instanceof Object) renvoie true car toutes les classes hritent de la classe Object.
El Mostafa DAOUDI- p. 248

124

Mthode clone() Pour dupliquer un objet: Soit on dfinie une mthode qui retourne une copie de lobjet en ayant cr une nouvelle instance et initialis les attributs (en utilisant le constructeur). Exemple: On dfinie la mthode duplique dans la classe Point public Point duplique(){ // renvoie une rfrence un Point return new Point(this.x, this.y); }

El Mostafa DAOUDI- p. 249

Soit on utilise linterface Cloneable pour garder la compatibilit avec les autres classes de Java. On implmente la mthode protected Object clone() de linterface Cloneable class Point implements Cloneable{ . public Object clone(){ // renvoie une rfrence un Point return new Point(this.x, this.y); } } Test: Point a=new Point(19,11); Object b=a.clone(); // a et b ont le mme contenu.
El Mostafa DAOUDI- p. 250

125

IV. Classes enveloppes (classes wrappers) des types primitifs Les classes enveloppe permettent dencapsuler les types primitifs dans des objets pour pouvoir les traites comme des objets. Le paquetage java.lang fournit des classes pour envelopper les types primitifs. Les classes enveloppes numriques: - Elles drivent toutes de la classe Number et elles sont : Byte, Short, Integer , Long, Float et Double. - Elles admettent un constructeur prenant pour argument la valeur du type primitif envelopper.
El Mostafa DAOUDI- p. 251

Exemple: Pour obtenir un objet Integer partir d'un int de valeur 12 il suffit de faire : Integer nObj = new Integer (12) ; /* nObj contient la rfrence un objet de type Integer encapsulant la valeur 12 */ Pour obtenir un objet Double partir d'un double de valeur 5.67 il suffit de faire : Double xObj= new Double (5.67) ; /* xObj contient la rfrence a un objet de type Double encapsulant la valeur 5.67 */
El Mostafa DAOUDI- p. 252

126

Les mthodes : byteValue(); // renvoient la valeur de type byte shortValue(); // renvoient la valeur de type short intValue(); // renvoient la valeur de type int longValue(); // renvoient la valeur de type long floatValue(); // renvoient la valeur de type float doubleValue() ; // renvoient la valeur de type double Exemple: Integer nObj = new Integer(5); int n = nObj.intValue(); // n vaut 5 Double xObj = new Double(5.8); double x = xObj.doubleValue();

// x vaut 5.8

El Mostafa DAOUDI- p. 253

Les mthodes statiques: parsXXX parseByte(String); parseShort(String); parseInt(String); parseLong(String); parseFloat(String); parseDouble(String) Renvoient une valeur d'un type primitif partir de sa reprsentation textuelle Exemple : Soit String ch = "3587" ; Pour convertir la chane ch (format textuel dun entier) en un entier de type int, alors on utilise la mthode statique parseInt de la classe enveloppe Integer , comme ceci : int n = Integer.parseInt(ch) ;
El Mostafa DAOUDI- p. 254

127

Attention: ces mthodes peuvent gnrer une exception du type NumberFormatException et doivent donc tre places dans un bloc try/catch. Exemple dutilisation: public class Parse{ public static void main(String args[]){ String nbreChaine="455"; int n; try{ n=Integer.parseInt(nbreChaine); // n vaut 455 } catch (NumberFormatException e) { System.out.println("nbreChaine n'est pas un vrai nombre"); } } }
El Mostafa DAOUDI- p. 255

Les mthodes statiques valueOf(String) Boolean.valueOf , Byte.valueOf() , Short.valueOf(), Integer.ValueOf() , Long.valueOf(), Float.valueOf(), Double.valueOf(). Elles renvoient un objet construit partir de sa reprsentation sous forme de texte. Par exemple:

- int n = Integer.parseInt(uneChaine); Integer.ValueOf(uneChaine); - new Integer(n) ;

Exemples: Integer n = Integer.valueOf("12"); Double d = Double.valueOf("3.1459"); Boolean b = Boolean.valueOf("true");


El Mostafa DAOUDI- p. 256

128

V. Classe Math
La classe Math du paquetage java.lang reprsente la bibliothque mathmatique. Elle n'est pas destine avoir des instances : toutes ses mthodes sont statiques. On y trouve : static double E, static double PI Sytem.out.println(" Exp= " +Math.E + " et PI= "+Math.PI); affiche : Exp= 2:718281828459045 et PI = 3.141592653589793 type abs(type v) Valeur absolue ; type est un des types int, long, float ou double type max(type a, type b) Le plus grand de a et b ; type est un des types int, long, float ou double type min(type a, type b) Le plus petit de a et b ; type est un des types int, long, float ou double double floor(double v) Le plus grand entier infrieur ou gal v. double ceil(double v) Le plus petit entier suprieur ou gal v.
El Mostafa DAOUDI- p. 257

double rint(double v) L'entier le plus proche de v ; s'il y en a deux, celui qui est pair. int round(int v) L'entier le plus proche de v. La valeur de round(v) est la mme que celle de (int) floor(v + 0,5). double random() Un nombre pseudo-alatoire dans [0; 1[. double sqrt(double x) Calcul de la racine carre double exp(double x) Exponentielle double log(double x) logarithme nprien. double pow(double a, double b) Calcul de a la puissance b. double sin(double x), double cos(double x), double tan(double x) double asin(double x), double acos(double x), double atan(double x) Fonctions trigonomtriques habituelles.
El Mostafa DAOUDI- p. 258

129

VI. Package (paquetage)


Les classes Java sont regroupes en paquetages (packages en anglais) comparables aux bibliothques des autres langages comme le langage C,... Le langage Java est fourni avec un grand nombre de paquetages Dans un fichier .java, on doit indiquer quels packages appartiennent les classes quon utilise laide de la clause import, elle se place en dbut de fichier avant la dclaration de la premire classe ou interface du fichier : import nomClasse; // Importe une classe sans package import nomPackage.nomClasse; // Importer une classe d'un package import nomPackage.*; // Importer toutes les classes d'un package
El Mostafa DAOUDI- p. 259

Le package par dfaut : cest le package qui na pas de nom, et auquel appartiennent toutes les classes situes dans le mme rpertoire (ou dans les rpertoires accessibles dans la variable classpath) Exemple 1: class ClasseTest { public ClasseTest() { System.out.println(" Ceci est un exemple : "); } } public class TestPackage { public static void main(String[] args) { System.out.print("Entrer un entier nouvelle largeur : "); int i = Clavier.lireInt(); } }
El Mostafa DAOUDI- p. 260

130

Remarques:
- La compilation du fichier source TestPackage.java gnre deux fichiers .class savoir ClasseTest.class et TestPackage.class, ses deux fichiers appartiennent au mme package par dfaut (package sans nom) - La classe Clavier.class doit se trouver dans le mme rpertoire que le fichier TestPackage.class (ou dans un rpertoire dfini dans CLASSPATH), sinon le compilateur gnre une erreur.

El Mostafa DAOUDI- p. 261

Package java.lang Le package java.lang contient les classes standards telles que System, Math. Par dfaut, les classes du paquetage java.lang sont automatiquement importes. Dans un programme .java on peut faire appel toutes les classes de java.lang sans spcifier leur chemin. Exemple: On peut utiliser la classe Exception sans spcifier le chemin class SimpleException extends Exception {} qui est quivalent class SimpleException extends java.lang.Exception {} ou import java.lang.Exception; class SimpleException extends Exception {}

El Mostafa DAOUDI- p. 262

131

Accs aux package

Pour pouvoir accder aux classes d'un package partir d'une classe ne faisant pas partie du package:
il suffit de donner le chemin d'accs relatif la classe lorsquon fait appel elle. Par exemple pour appeler la classe Button du package java.awt, il suffit d'crire java.awt.Button chaque appel de la classe Button Ou d'utiliser l'instruction import, suivie du chemin de la classe. Par exemple import java.awt.Button; dans ce cas, on peut appeler la classe Button sans spcifier le chemin. Ou dimporter toutes les classes d'un package. Par exemple on importe toutes les classes du package java.awt par la syntaxe : import java.awt.*;
El Mostafa DAOUDI- p. 263

Remarque: Un paquetage peut avoir des sous-paquetages, par exemple java.awt.event est un sous-paquetage de java.awt Attention: L'instruction import java.awt.*; ne permet pas dimporter les classes des sous-paquetages de java.awt Si on veut par exemple importer les classes de java.awt et aussi celles de java.awt.event alors on devra crire: import java.awt.*; import java.awt.event.*;

El Mostafa DAOUDI- p. 264

132

Quelques paquetages du SDK (Software Development Kit) java.lang : classes de base de Java java.util : utilitaires java.io : entres-sorties java.awt : interface graphique javax.swing : interface graphique avance java.applet : applets java.net : rseau java.rmi : distribution des objets java.math: Excution de calculs arithmtiques.
El Mostafa DAOUDI- p. 265

Cration de paquetage Un package est une unit regroupant des classes. Pour crer un tel package, il suffit de commencer le fichier source contenant les classes regrouper par l'instruction package suivi du nom que l'on dsire donner au package. Ds lors, toutes les classes contenues dans le fichier feront partie du package... Attention: - un package portant le nom Pack1 doit tre stock dans un rpertoire de nom Pack1. - Pour que le compilateur puisse trouver le package, il est essentiel qu'il "connaisse" l'emplacement du package. Pour cela Java utilise une variable d'environnement appele classpath donnant la liste des chemins d'accs aux classes. - Par dfaut le compilateur (ainsi que la machine virtuelle) recherchent les classes dans le rpertoire courant et le rpertoire des classes spcifis dans classpath.
El Mostafa DAOUDI- p. 266

133

Exemple import graphics.*; public class TestPackage1 { public static void main(String[] args) { Rectangle r=new Rectangle(); r.dessineRectangle(); Cercle.dessineCercle(); // mthode de classe Triangle t=new Triangle(); t.dessineTriangle(); } }
El Mostafa DAOUDI- p. 267

// dans un fichier Rectangle.java situ dans le rpertoire ./graphics package graphics; public class Rectangle{ public void dessineRectangle() { System.out.println(" Dessine un rectangle "); } } // dans un fichier Cercle.java situ dans le rpertoire ./graphics package graphics; public class Cercle { public static void dessineCercle() { System.out.println(" Dessine un cercle .... "); } } // dans un fichier Triangle.java situ dans le rpertoire ./graphics package graphics; public class Triangle { public void dessineTriangle() { System.out.println(" Dessine un triangle.... "); } }

El Mostafa DAOUDI- p. 268

134

Ch. XII Les chanes de caractres


Une chaine de caractres (appele string) est une suite (une squence) de caractres. En Java, les chaines de caractres sont des objets des classes: String ou StringBuffer - String : chaine de caractres non modifiable - StringBuffer : chaine de caractres modifiable

El Mostafa DAOUDI- p. 269

I. La classe String : chanes non modifiables 1. Dclaration et cration: String ch; dclare que ch est une rfrence un objet de type String. Ici on a cr la rfrence mais pas lobjet. String nest pas un type primitif . Pour crer lobjet, il faut initialiser la rfrence ch. String ch; ch = new String ("bonjour"); //ch contient la rfrence un objet contenant la chaine "bonjour". On peut regrouper les deux instructions: String ch=new String ("bonjour");

bonjour

ch
El Mostafa DAOUDI- p. 270

135

On peut aussi crire tous simplement : String ch= "bonjour"; Mais: attention Java impose que si String ch1 = "bonjour"; String ch2 = "bonjour"; alors ch1 et ch2 rfrencent le mme objet (cration d un seul objet String rfrenc par les 2 variables ch1 et ch2 ) Par contre: si on a: String ch1 = "bonjour"; String ch2 = new String("bonjour"); // ou String ch2=new String (ch1) alors ch1 et ch2 rfrencent deux objets diffrents . La dclaration de ch2 provoque la cration d'un nouveau objet String (ch2 contient la rfrence un objet contenant la chaine "bonjour" ). La chaine vide: String ch= new String ( ); //ch contient la rfrence une chane vide
El Mostafa DAOUDI- p. 271

Caractristiques Un objet de type String nest pas modifiable : Il nexistera aucune mthode permettant de modifier le contenu dun objet de type String. Attention: laffectation ne modifie lobjet. Exemple : bonjour String ch; ch ch="bonjour";
bonjour ch="bonsoir";

ch

bonsoir

Lobjet na pas t modifi, mais cest la rfrence ch qui a t modifie. Aprs affectation, ch rfrence la chaine "bonsoir".
El Mostafa DAOUDI- p. 272

136

3.Mthodes dutilisation dune chaine de type String Longueur dune chaine La longueur dune chaine (le nombre de caractres que contient la chaine) est obtenue par la mthode length(). Exemple: String ch1="bonjour"; String ch2=""; // chaine vide int n1=ch1.length( ); // n1 = 7 int n2=ch2.length( ); // n2 = 0

El Mostafa DAOUDI- p. 273

Accs aux caractres dune chane : la mthode charAt() La mthode charAt( ) de la classe String permet daccder un caractre de rang donn dune chane. Le premier caractre dune chaine porte le rang 0. Exemple : String ch = "bonjour"; char c1= ch.charAt(0); char c2= ch.charAt(2);

// c1=b. // c2=n.

El Mostafa DAOUDI- p. 274

137

Concatnation de chanes On utilise la mthode concat(). Soient ch1 et ch2 deux objets de type String. String ch=ch1.concat(ch2). La chaine ch est obtenue aprs concatnation de la chaine ch1 suivi de la chaine ch2. Exemple : String ch1= "le langage"; String ch2= "java"; String ch=ch1.concat(ch2);

ch1 ch2 ch
El Mostafa DAOUDI- p. 275

Le langage java

le langage java

On peut aussi utiliser loprateur + de la manire suivante: Soient ch1 et ch2 deux objets de type String String ch = ch1+ch2; String ch=ch1.concat(ch2); Conversions des oprandes de loprateur + Java autorise le mlange de chanes et expressions dun type primitif. String s1= "bonjour" int n=26; String s=s1+ " " +n // s= "bonjour 26" Loprateur += String ch= " bonjour " ; ch+= " monsieur " ; // ch = "bonjour monsieur"
El Mostafa DAOUDI- p. 276

138

Recherche dans une chane La mthode indexOf( ) permet de rechercher, partir du dbut dune chane, la premire occurrence dun caractre donn en argument. Elle retourne La position du caractre donn en argument si une correspondance a effectivement t trouve, la valeur -1 sinon. Exemple: String ch="bonjour"; int n=ch.indexOf('j'); // n=3; int k=ch.indexOf(p'); // k=-1;
El Mostafa DAOUDI- p. 277

Comparaisons de chanes La mthode equals( ) permet de comparer les contenus de deux chanes. Attention: Les oprateurs == et != comparent les rfrences et non les contenus des objets. Exemple: String ch1="bonjour"; String ch2="bonjour"; String ch3=new String ("bonjour"); Alors, (ch1==ch2); // retourne true, car ch1 et ch2 rfrencent le mme objet. (ch1==ch3); //retourne false, car ch1 et ch2 rfrencent deux objets diffrents. ch1.equals(ch2); // retourne true. ch1.equals(ch3); //retourne true. La mthode equalsIgnoreCase( ) effectue la mme comparaison, mais sans faire de diffrence entre les majuscules et les minuscules.
El Mostafa DAOUDI- p. 278

139

La mthode compareTo( ) Permet deffectuer des comparaisons lexicographiques de chanes pour savoir laquelle des deux chanes apparat avant une autre en se basant sur lordre des caractres. Utilisation: Soient ch1 et ch2 deux chaines de type String ch1.compareTo(ch2); retourne: - un entier ngatif si ch1 arrive avant ch2; - un entier nul si ch1 et ch2 sont gales; - un entier positif si ch1 arrive aprs ch2;

El Mostafa DAOUDI- p. 279

Remplacement de caractres La mthode replace( ) cre une nouvelle chane en remplaant toutes les occurrences dun caractre donn par un autre. Exemple: String ch1="bonjour"; ch1=ch1.replace(o,a); Attention : La chaine ch1 nest pas modifie, mais cration dune nouvelle chaine qui contient "banjaur" rfrence par ch1.

El Mostafa DAOUDI- p. 280

140

Extraction de sous chane La mthode substring( ) permet de crer une nouvelle chane partir de la chane courante. String substring (int dbut) // retourne un nouveau string qui commence au caractre dindice dbut et allant jusquau dernier caractre de la chaine courante. String substring (int dbut , int fin) // retourne un nouveau String qui commence au caractre dindice dbut et allant jusquau caractre dindice (fin-1) de la chaine courante Si les indices dbut et fin sont hors les indices de la chaine qui appelle la mthode substring(), alors il y a gnration de lexception: java.lang.StringIndexOutOfBoundsException: Exemple : String ch = "bonjour"; String ch1 = ch.substring(3); // ch1 ="jour" String ch2 = ch.substring(1, 4); // ch2="onj"
El Mostafa DAOUDI- p. 281

281

Conversion en majuscule ou en minuscule


La mthode toLowerCase( ) cre une nouvelle chane en remplaant toutes les majuscules par leur quivalent en minuscules La mthode toUpperCase( ) cre une nouvelle chane en remplaant toutes les minuscules par leur quivalent en majuscules Exemple: String ch= "BonJour"; String ch1=ch.toLowerCase( ); //ch non modifie, ch1 ="bonjour" String ch2=ch.toUpperCase( ); //ch non modifi, ch2 = "BONJOUR"

12:19

El Mostafa DAOUDI- p. 282

141

Suppression des sparateurs de dbut et de fin La mthode trim( ) cre une nouvelle chane en supprimant les ventuels sparateurs de dbut et de fin (espace, tabulations, fin de ligne) String s= " \n\t separateurs avant, pendant \t\n, et aprs\n\t " ); String s1=ch.trim( ); // Suppression des sparateurs \n\t marqus au dbut et \n\t maqus // la fin de la chaine. //s1 contient la chaine "separateurs avant, pendant \t\n, et aprs");

12:19

El Mostafa DAOUDI- p. 283

Conversion dun type primitif en une chane La classe String dispose des mthodes statique pour les conversions: static String valueOf(int i) conversion int ----> String static String valueOf(long l) conversion long ----> String static String valueOf(float f) conversion float ----> String static String valueOf(double d) conversion double ----> String static String valueOf(boolean b) conversion boolean ----> String Static String valueOf(char c) conversion char ----> String Exemple: int n=427; String s1=String.valueOf(n); //s1= "427" boolean b=false; String s2=String.valueOf(b); // s2="false"
12:19
El Mostafa DAOUDI- p. 284

142

Conversion dune chane en un type primitif


Les classes : Byte, Short, Integer, Long, Float, et Doubles, disposent respectivement des mthodes statiques: parseByte() parseShort() parseInt() parseLong() parseFloat() parseDouble() qui permettent de convertir une chane en un type primitif comme suit: Exemple: String s= "3587"; int n=Integer.parseInt(s); // n=3587 s= "35.87F"; float x=Float.parseFloat(s); // x=35.87
12:19
El Mostafa DAOUDI- p. 285

Conversions entre chanes et tableaux de caractres On peut construire une chane partir dun tableau de caractres. Exemple: char mot[]={'b','o','n','j','o','u','r'}; // tableau de 7 caractres String s=new String (mot); // s contient la chane : "bonjour" ;

El Mostafa DAOUDI- p. 286

143

II. La classe StringBuffer : chanes modifiables


Un objet de type StringBuffer est une chaine quon peut modifier son contenu. Dclaration et cration: StringBuffer buf = new StringBuffer(); // Construit une chaine vide. StringBuffer buf = new StringBuffer(String s); // Construit une chaine de caractres modifiable dont le contenu est gal la chaine s de type String. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); // cr une chaine contenant "Bonjour" Attention: StringBuffer buf = "Bonjour"; nest pas valide
El Mostafa DAOUDI- p. 287

Mthodes de la classe StringBuffer La mthode length() permet dobtenir la longueur de la chaine. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); int n=buf.length(); // n=7 La mthode charAt(i); permet daccder au caractre de rang i. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); char c=buf.charAt(2); // c=n La mthode setCharAt(r,c); permet de remplacer le caractre de rang r par le caractre c. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.setCharAt(2,'L'); // remplace dans buf le caractre n par L. buf="BoLjour"
El Mostafa DAOUDI- p. 288

144

La mthode insert(r,ch) permet dinsrer la chaine de caractres ch partir du rang r. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.insert(3,"gues"); // insre dans buf la chaine "gues" partir du rang 3. buf="Bonguesjour" La mthode append(ch) permet de rajouter la chaine de caractres ch la fin Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.append("ne"); // insre la fin de buf, la chaine "ne". buf="Bonjourne" La mthode deleteCharAt(r); efface le caractre de rang r. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.deleteCharAt(2); // supprime de la chaine buf le caractre de rang 2. buf="Bojour"

El Mostafa DAOUDI- p. 289

La mhode toString() permet la conversion de StringBuffer en String Exemple: StringBuffer buf = new StringBuffer("Bonjour"); String ch = buf.toString(); // cr la chaine ch de type String partir de buf qui est de type StringBuffer. // ch ="Bonjour" La mthode substring() permet dextraire une chaine de type String partir dun StringBuffer Exemple: StringBuffer buf = new StringBuffer("Bonjour"); String ch = buf.substring(1,4); // cr la chaine ch de type String avec ch = "onj" Attention: On ne peut pas faire la concatnation avec loprateur + entre des StringBuffer. Par contre StringBuffer + String produit une nouvelle chaine de type String.
El Mostafa DAOUDI- p. 290

145

Ch. XIII. Introduction la programmation graphiques Cette partie du cours est essentiellement dvelopp partir du livre Titre: "Programmer en Java" Auteur: Claude Delannoy Edition : Eyrolles.

El Mostafa DAOUDI- p. 291

Les composant graphiques: Les interfaces graphiques sont souvent appels GUI (pour Graphical User Interface en Anglais) Il existe deux principaux types de composants susceptibles dintervenir dans une interface graphique :
les conteneurs qui sont destins contenir dautres composants, comme par exemple les fentres ; les composants atomiques qui sont des composants qui ne peuvent pas en contenir dautres, comme par exemple les boutons.

El Mostafa DAOUDI- p. 292

146

Java offre des facilits pour construire des interfaces graphiques grce aux deux bibliothques :
AWT (Abstract Window Toolkit, JDK 1.1) Swing (JDK/SDK 1.2).

Les packages principaux pour chaque bibliothque:


AWT : java.awt et java.awt.event Swing : javax.swing, javax.swing.event

Il est conseill dimporter systmatiquement toutes les classes des paquetages pour viter linterrogation sur la rpartition des classes utilises des diffrents paquetages import java.awt.*; import javax.swing.*;
El Mostafa DAOUDI- p. 293

Les fentres graphiques : la classe JFrame La classe standard Jframe , du paquetage javax.swing, permet de crer des fentres graphiques. Elle dispose de deux constructeurs : - et un constructeur avec un argument JFrame fen = new JFrame (" Ma Premiere fenetre " ); cre une fentre (un objet de type Jframe ) qui qui a pour titre " Ma Premiere fenetre " - et un constructeur sans argument JFrame fen = new JFrame (); cre une fentre sans titre.
Les instructions JFrame fen = new JFrame() ; fen.setTitle("Une fentre") ; Est quivalente l'instruction JFrame fen = new JFrame("Une fentre") ;
El Mostafa DAOUDI- p. 294

147

Lexemple suivant montre comment afficher une fentre:


import java.awt.*; import javax.swing.*; public class TestFenetre { public static void main(String[] args) { JFrame fen = new JFrame (); fen.setTitle("Ma Premiere fenetre "); fen.setSize(300,150); fen.setVisible(true); } }

El Mostafa DAOUDI- p. 295

fen.setTitle("Ma Premiere fenetre "); // Affecte le titre Ma premiere fenetre la fentre et laffiche dans la barre des titres de la fentre). fen.setSize(300,150); // Modifie la taille d'un composant. La dimension de la fentre est 300*150 pixels (largeur =300 et hauteur=150 pixels). Elle sera place dans le coin suprieur gauche de lcran. Elle est place au pixel de coordonnes (0,0). fen.setBounds(200,300,400,200); // Modifie la position et la taille d'un composant Le coin suprieur gauche de la fentre est plac au pixel de coordonnes (200, 300) et ses dimensions seront de 400 *200 pixels. fen.setVisible(true); // rend visible la fentre de rfrence fen
El Mostafa DAOUDI- p. 296

148

Remarques Une fentre de type Jframe peut tre redimensionne, dplace, et rduite une icne (comme une fente Windows). La fermeture d'une fentre de type JFrame ne met pas fin au programme, mais rend simplement la fentre invisible. Pour mettre fin au programme lorsquon ferme la fentre, on peut appeler la mthode
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Exemple: fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // met fin au programme lorsque la fentre se ferme
El Mostafa DAOUDI- p. 297

Cration dune classe fentre personnalise On notre propre classe dfinir notre propre classe, par exemple MaFenetre qui drive de la classe JFrame et crer un objet de type MaFenetre Exemple: Afficher une fentre:
import java.awt.*; import javax.swing.*; class MaFenetre extends JFrame { // classe fentre personnalise public MaFenetre() { setTitle("Ma Premiere fenetre "); //initialisation du titre de la fentre setSize(300,150); // positione la fentre lcran } } public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); // rend visible la fentre de rfrence fen } }
El Mostafa DAOUDI- p. 298

149

Programmation vnementielle
Dans la programmation squentielle les instructions du programme principal sont excutes les unes aprs les autres dans lordre de leurs criture. Dans la programmation vnementielle, le programme est dirig par les vnements Lutilisateur dirige lordre dexcution des instructions en cliquant o il veut. Le programme ragit aux actions de lutilisateur Ds que vous lancez un programme avec interface graphique : une boucle infinie est gnre le programme attend les vnements (enfoncer une touche du clavier, cliquer avec la souris etc.) Attrape et traite les vnements quand ils se produisent.

El Mostafa DAOUDI- p. 299

Une interface graphique est base sur 2 grandes composantes diffrentes :


L'aspect visuel qui comprend les cadres et les composants d'interfaces qui sont placs dessus L'interaction avec les utilisateurs (action de la souris, du clavier) c'est dire en fait la gestion des vnements.

El Mostafa DAOUDI- p. 300

150

Evnement = Objet construit par le systme en rponse une action de lutilisateur et qui contient toutes les informations concernant cette action Exemples: Action de lutilisateur dans la fentre de lapplication clic souris : connaissances des coordonnes du point de clic frappe dun caractre : connaissance du caractre frapp

El Mostafa DAOUDI- p. 301

Traitement des vnements En Java tout vnement a une source. On appelle source dun vnement lobjet qui a gnr cet vnement (exemple bouton, fentre, ...). Exemple de type dvnements Lvnement mis suite un clic souris dans une fentre est de type MouseEvent Lvnement mis suite un clic souris sur un bouton est de type ActionEvent

El Mostafa DAOUDI- p. 302

151

Ecouteurs Pour traiter un vnement, on associe la source, des objets particuliers appels couteurs. Par exemple on associe au bouton un couteur qui va couter si le bouton est cliqu ou non. En fonction des vnements quils traitent, un couteur doit implmenter une interface particulire, drive de linterface EventListener, qui correspond une catgorie dvnements. Exemple: Linterface MouseListener correspond une catgorie dvnements souris. Elle comporte cinq mthodes correspondant chacune un vnement souris particulier.
El Mostafa DAOUDI- p. 303

public interface MouseListener extends EventListener { public void mousePressed(MouseEvent e) ; /* appel lorsquun bouton de la souris est press sur un composant largument e de type MouseEvent correspond lobjet vnement gnr */ public void mouseReleased(MouseEvent e) ; /* appel lorsquun bouton de la souris est relch sur un composant */ public void mouseClicked(MouseEvent e) ; /* appel lors dun clic souris sur un composant (la souris na pas t dplace entre lappui et le relchement du bouton) */ public void mouseEntered(MouseEvent e) ; /* appel lorsque la souris passe de lextrieur lintrieur dun composant */ public void mouseExited(MouseEvent e) ; /* appel lorsque la souris sort dun composant (la souris passe de lintrieur lextrieur du composant) */ }

El Mostafa DAOUDI- p. 304

152

Gestion de clics dans une fentre, chaque clic dans la fentre, le message clic dans la fenetre saffiche. Version 1: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame { public MaFenetre () { setTitle("Gestion des clics "); setBounds(10,20,300,100); addMouseListener(new EcouteurSouris()); // la fentre fait appel un couteur dvnements souris // pour traiter les clics souris } }

El Mostafa DAOUDI- p. 305

//Lcouteur dvnements souris doit implmenter linterface MouseListener qui correspond une catgorie dvnements souris. class EcouteurSouris implements MouseListener { //Redfinition de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic dans la fenetre"); } //La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }

El Mostafa DAOUDI- p. 306

153

2me version: Largument e de type MouseEvent correspond lobjet vnement gnr dans la fentre lors dun clic souris. On peut connatre la position du click dans la fentre grce aux mthodes getX() et getY() class EcouteurSouris implements MouseListener { //Redfinition de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic au point :("+e.getX()+ "," +e.getY()+ ")" ); } //La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
El Mostafa DAOUDI- p. 307

Version 3: La classe fentre personnalise qui implmente MouseListner import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame implements MouseListener { public MaFenetre () { setTitle("Gestion des clics "); setBounds(10,20,300,100); addMouseListener(this); // la fentre est son propre couteur dvnements souris } public void mouseClicked(MouseEvent e) { //Largument e correspond lobjet vnement gnr dans la fentre lors dun clic souris. int x = e.getX() ; int y = e.getY() ; //x et y coordonnes du curseur de la souris au moment du clic System.out.println("clic dans la fenetre au point de coordonnees "+x+","+y); } // La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } }
El Mostafa DAOUDI- p. 308

154

La notion dadaptateur Pour chaque interface XXXListener (par exemple MouseListener) possdant plusieurs mthodes, Java fournit une classe particulire XXXAdapter (par exemple MouseAdpter), appele adaptateur, qui implmente toutes les mthodes de linterface avec un corps vide. Pour dfinir un couteur dvnements de type XXXEvent (par exemple MouseEvent), il suffit alors de driver l'couteur de la classe XXXAdapter (par exempe MouseAdapter) et de redfinir uniquement les mthodes voulues.

El Mostafa DAOUDI- p. 309

Exemple: class MaFenetre extends JFrame { public MaFenetre () { super("Une fenetre qui traite les clics souris") ; setSize(300, 200) ; addMouseListener(new EcouteurSouris()); } } class EcouteurSouris extends MouseAdapter { //redfinition uniquement de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic dans la fenetre") ; } }

El Mostafa DAOUDI- p. 310

155

Les composants atomiques


La classe Jcomponent est une classe abstraite drive de la classe Container qui encapsule les composants atomiques d'une interface graphique. Les principaux composants atomiques offerts par Java sont: - les boutons, - les cases cocher, - les boutons radio, - les tiquettes, - les champs de texte, - les botes de liste - et les botes de liste combine.
El Mostafa DAOUDI- p. 311

Composant zone de texte : Class JLabel

Ajout dun composant qui permet d'afficher du texte, on utilise la classe Jlabel qui reprsente un composant capable d'afficher un texte non modifiable. JLabel label = new JLabel ("Hello World !"); Container c = f.getContentPane(); c.add (label);

El Mostafa DAOUDI- p. 312

156

Afficher du text dans une fentre : On utilise le constructeur de la classe Jlabel pour afficher du texte dans une fentre . import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Fente avec du texte "); setSize(300,200); Container c=getContentPane(); c.setLayout(new FlowLayout()); monLabel = new JLabel ("Bonjour !"); Container cc = getContentPane(); c.add(monLabel); } private JLabel monLabel; }
El Mostafa DAOUDI- p. 313

public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); } }

El Mostafa DAOUDI- p. 314

157

Composant Bouton : classe JButton

Lajout dun bouton dans le contenu dune fentre se passe en trois tapes 1. Crer une instance de la classe JButton : JButton monBouton = new JButton () ; 2. On utilise la mthode getContentPane() qui retourne une rfrence, de type Container, sur le contenu de la fentre. Par exemple: Container c= fen.getContentPane(); //ou fen est rfrence une fentre 3. On ajoute un composant dans le contenu dune fentre (un objet de type Container) en utilisant la mthode add de la classe Container. Par exemple : c.add(monBouton); // permet dajouter lobjet de rfrence monBouton dans le contenu de rfrence c.
El Mostafa DAOUDI- p. 315

4. On supprime composant dans le contenu dune fentre (un objet de type Container) en utilisant la mthode remove de la classe Container. Par exemple : c.remove(monBouton); // permet de supprimer lobjet de rfrence monBouton dans le contenu de rfrence c. 5. La mthode setPreferredSize permet d'imposer une taille un composant. Exemple: monBouton.setPreferredSize(new Dimension(10, 20)) ; //bouton de largeur 10 et de hauteur 20 6. Le gestionnaire de la classe FlowLayout permet de disposer les composants un cot de lautre et ligne par ligne. La mthode setLayout(new FlowLayout()); permet dutiliser ce gestionnaire Exemple: c.setLayout(new FlowLayout()) ; //c: rfrence un Container

El Mostafa DAOUDI- p. 316

158

Ajout dun bouton dans une fentre: On utilise le constructeur de la classe JButton pour crer un bouton. Le contenu de la clase fentre qui sera modifi. La classe de la mthode main() reste inchang. import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); Container c=getContentPane(); c.setLayout(new FlowLayout()); monBouton = new JButton("Un Bouton"); c.add(monBouton); // cration dun bouton de rfrence monBouton portant ltiquette Un bouton // ou tout simplement getContentPane().setLayout(new FlowLayout()); // getContentPane().add(monBouton); } private JButton monBouton; }

El Mostafa DAOUDI- p. 317

public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); } }

El Mostafa DAOUDI- p. 318

159

Ajout de deux bouton dans une fentre: import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Plusieurs boutons "); setSize(300,200); boutJaune = new JButton("Bouton A"); boutVert = new JButton("Bouton B"); getContentPane().add(boutJaune); getContentPane().add(boutVert); getContentPane().setLayout(new FlowLayout()); boutJaune.setBackground(Color.yellow); // La couleur de fond du composant de label Bouton A devienne jaune boutVert.setBackground(Color.green); // La couleur de fond du composant de label Bouton A devienne verte } private JButton boutJaune, boutVert; }

El Mostafa DAOUDI- p. 319

Gestion des vnements sur des boutons Un bouton ne peut dclencher quun seul vnement de type ActionEvent. Linterface ActionListener ne comporte quune seule mthode actionPerformed.

Cest lintrieur de lactionPerformed que nous crirons le code qui sexcutera lors du click.

El Mostafa DAOUDI- p. 320

160

Exemple: Clic sur un bouton affiche Action sur Bouton Essai import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); monBouton = new JButton("Essai"); getContentPane().setLayout(new FlowLayout()); getContentPane().add(monBouton); monBouton.addActionListener(this); //gre laction de lutilisateur sur le bouton MonBouton } public void actionPerformed (ActionEvent ev){ System.out.println("Action sur Bouton Essai "); } private JButton monBouton; }
El Mostafa DAOUDI- p. 321

Exemple: Mme classe couteur pour tous les boutons, le clique sur un bouton affiche le mme message Action sur Bouton Essai import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Deux boutons "); setSize(300,200); getContentPane().setLayout(new FlowLayout()); monBoutonA = new JButton("Bouton A"); getContentPane().add(monBoutonA); monBoutonA.addActionListener(this); monBoutonB = new JButton("Bouton B"); getContentPane().add(monBoutonB); monBoutonB.addActionListener(this); } public void actionPerformed (ActionEvent ev){ System.out.println("Action sur un Bouton Essai"); } private JButton monBoutonA, monBoutonB; }
El Mostafa DAOUDI- p. 322

161

Exemple: Mme classe couteur pour tous les boutons. Laffiche personnalis. Laffichage dpend du bouton cliqu import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); monBoutonA = new JButton("Bouton A"); monBoutonB = new JButton("Bouton B"); Container contenu=getContentPane(); contenu.setLayout(new FlowLayout()); contenu.add(monBoutonA); contenu.add(monBoutonB); monBoutonA.addActionListener(this); monBoutonB.addActionListener(this); }
El Mostafa DAOUDI- p. 323

public void actionPerformed (ActionEvent ev){ //utilisation de la mthode getSource de la classe EventObject qui fournit une rfrence de type Object sur la source de lvnement concern if (ev.getSource()==monBoutonA) System.out.println("Action sur un BoutonA"); if (ev.getSource()==monBoutonB) System.out.println("Action sur un BoutonB"); } private JButton monBoutonA, monBoutonB; }

El Mostafa DAOUDI- p. 324

162

Exemple: Une classe couteur pour chaque bouton. Par exemple, le clic sur le bouton 1 ferme la fentre, le clic sur le bouton 2 affiche le message action sur le bouton 2 import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame{ private JButton monBouton, boutonQuitter ; public MaFenetre () { super("Plusieurs boutons") ; setSize(300, 200) ; Container contenu = getContentPane() ; boutonQuitter = new JButton(" Quitter ") ; contenu.add(boutonQuitter) ; monBouton= new JButton("Bouton ") ; contenu.add(monBouton) ; contenu.setLayout(new FlowLayout()); monBouton.addActionListener(new EcouteurBouton()); boutonQuitter.addActionListener(new EcouteurQuitter()); } }
El Mostafa DAOUDI- p. 325

class EcouteurBouton implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Action sur le bouton") ; } } class EcouteurQuitterimplements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Vous avez appuyez sur le bouton Quitter") ; System.exit(0); } }

El Mostafa DAOUDI- p. 326

163

Cration dynamique de plusieurs boutons

import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame { // implements ActionListener{ public MaFenetre() { setTitle(" Bouton Dynamic "); setSize(300,200); Container contenu=getContentPane(); contenu.setLayout(new FlowLayout()); creeBouton=new JButton ("CREATION BOUTON"); contenu.add(creeBouton); EcouteCreeBouton e=new EcouteCreeBouton (contenu); creeBouton.addActionListener(e); } private JButton creeBouton; }
El Mostafa DAOUDI- p. 327

class EcouteCreeBouton implements ActionListener { public EcouteCreeBouton (Container contenu){ this.contenu=contenu; } public void actionPerformed(ActionEvent ev) { JButton nouvBout=new JButton("Bouton"); contenu.add(nouvBout); contenu.validate(); } private Container contenu; } public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); // rend visible la fentre de rfrence fen } }
El Mostafa DAOUDI- p. 328

164

Composant cases cocher : JCheckBox


La case cocher permet lutilisateur deffectuer un choix de type oui/non.. Elle est instancie grce la classe JCheckBox . Constructeurs: - JCheckBox coche = new JCheckBox ("CASE") ; Dans ce cas, la case cocher est construite dans ltat non coch. - JCheckBox coche = new JCheckBox ("CASE", tat) ; o tat prend les valeurs: true (case coche) ou false (case non coche) CheckBox ("CASE") est quivalent lappel JCheckBox ("CASE", false). Les mthodes - La mthode isSelected de la classe AbstractButton permet de connatre ltat (true ou false) dune case cocher. - La mthode setSelected de la classe AbstractButton permet de modifier ltat dune case cocher.

Exemple: MaCase.setSelected(true) ; //coche la case de rfrence MaCase


El Mostafa DAOUDI- p. 329

Exemple import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame { private JCheckBox maCase1, maCase2, maCase3; public MaFenetre () { super("Une fenetre avec une case") ; setBounds(10,40,300,200) ; maCase1 = new JCheckBox( Case1") ;
// cration dune case cocher de rfrence maCase1 portant ltiquette Case1

getContentPane().add(maCase1) ;

maCase2 = new JCheckBox( Case2") ; getContentPane().add(maCase2) ; maCase3 = new JCheckBox( Case3") ; getContentPane().add(maCase3) ;
getContentPane().setLayout(new FlowLayout()); } }

El Mostafa DAOUDI- p. 330

165

Exemple:
import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class FenCoches extends JFrame implements ActionListener{ public FenCoches (){ setTitle ("Exemple de cases a cocher") ; setSize (400, 100) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout()) ; coche1 = new JCheckBox ("case 1") ; contenu.add(coche1) ; coche1.addActionListener (this) ; tat = new JButton ("tat") ; contenu.add(tat) ; tat.addActionListener (this) ; } public void actionPerformed (ActionEvent ev){ Object source = ev.getSource() ; if (source == coche1) System.out.println ("action case 1") ; if (source == tat) System.out.println ("tat CASES : " + coche1.isSelected()) ; } private JCheckBox coche1 ; private JButton tat ; }
El Mostafa DAOUDI- p. 331

public class TestGraphique { public static void main(String[] args) { JFrame fen = new FenCoches(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

El Mostafa DAOUDI- p. 332

166

Boutons radio : Class JRadioButto


Le bouton radio fait partie dun groupe de bouton et permet dexprimer un choix de type oui/non. Mais, contrairement aux cases cocher, il permet lutilisateur deffectuer un seul choix la fois . JRadioButton button1 = new JRadioButton ("titre"); ButtonGroup groupe = new ButtonGroup() ; On ajoute le bouton1 dans le groupe par la mthode add.groupe.add(button1) ;

El Mostafa DAOUDI- p. 333

tat dun bouton radio Ltat dun bouton radio un instant donn sobtient exactement comme celui dune case cocher, par la mthode isSelected. De mme, on peut imposer un bouton un tat donn en recourant la mthode setSelected : L encore, pour attribuer un tat initial un bouton radio, il est prfrable dutiliser le constructeur plutt que setSelected.

El Mostafa DAOUDI- p. 334

167

import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre (){ setTitle ("Exemple de boutons radio") ; setSize (400, 400) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout()) ; ButtonGroup groupe = new ButtonGroup() ; radio1 = new JRadioButton ("Radio 1", true) ; groupe.add(radio1) ; contenu.add(radio1) ; radio1.addActionListener (this) ; radio2 = new JRadioButton ("Radio 2") ; groupe.add(radio2) ; contenu.add(radio2) ; radio2.addActionListener (this) ; radio3 = new JRadioButton ("Radio 3") ; groupe.add(radio3) ; contenu.add(radio3) ; radio3.addActionListener (this) ; tat = new JButton ("tat") ; contenu.add(tat) ; tat.addActionListener (this) ; }

El Mostafa DAOUDI- p. 335

public void actionPerformed (ActionEvent ev){ Object source = ev.getSource() ; if (source == radio1) System.out.println ("action radio 1") ; if (source == radio2) System.out.println ("action radio 2") ; if (source == radio3) System.out.println ("action radio 3") ; if (source == tat) System.out.println ("tat RADIOS : " + radio1.isSelected() + " " + radio2.isSelected() + " " + radio3.isSelected()) ; } private JRadioButton radio1, radio2 ,radio3 ; private JButton tat ; }

El Mostafa DAOUDI- p. 336

168

public class TestGraphique { public static void main(String[] args) { JFrame fen = new FenCoches(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

El Mostafa DAOUDI- p. 337

Les botes combo: Class JComboBox


La bote de liste combine (bote combo) de type JComboBox associe un champs de texte et une bote de liste slection simple. Tant que le composant n'est pas slectionn, seul le champ de texte s'affiche:

L'utilisateur peut choisir une valeur dans la bote de liste qui s'affiche

El Mostafa DAOUDI- p. 338

169

Exemple: String[] couleurs = {"rouge", "bleu", "gris", "vert", "jaune", "noir" }; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; JComboBox combo = new JComboBox(couleurs) ; contenu.add(combo) ; L'utilisateur peut alors y entrer soit une valeur de la liste (en la slectionnant), soit une valeur de son choix (en la saisissant). On peut limiter le nombre dlments afficher laide de la mthode setMaximumRowCount () ; Exemple: combo. setMaximumRowCount (4) ; limite le nombre dlments afficher 4. on peut forcer la slection dun lment de rang donn par la methode setSelectedIndex () Exemple: ; combo. setSelectedIndex (2) // slection pralable de llment de rang 2
El Mostafa DAOUDI- p. 339

La mthode getSelectedItem() fournit la valeur slectionne. Elle fournit un rsultat de type Object quil faudra souvent convertir en ch Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; volution dynamique de la liste dune bote combo: La bote combo dispose de mthodes appropries sa modification. La mthode addItem permet dajouter une nouvelle valeur la fin de la liste : combo.addItem ("orange") ; // ajoute orange en fin de la liste combo La mthode removeItem permet de supprimer une valeur existante: combo.removeItem ("gris") ; // supprime orange de la liste combo
El Mostafa DAOUDI- p. 340

170

Exemple: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener, ItemListener{ public MaFenetre(){ setTitle ("Essais boite combinee") ; setSize (300, 200) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; combo = new JComboBox(couleurs) ; contenu.add(combo) ; combo.setMaximumRowCount(4) ; combo. setSelectedIndex (5); combo.addActionListener (this) ; combo.addItemListener (this); }
El Mostafa DAOUDI- p. 341

public void actionPerformed (ActionEvent e){ System.out.print ("action combo : ") ; Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; } public void itemStateChanged (ItemEvent e){ System.out.print ("item combo : ") ; Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; } private String[] couleurs = {"rouge", "bleu", "gris", "vert", "jaune", "noir" }; private JComboBox combo ; }
El Mostafa DAOUDI- p. 342

171

public class TestGraphique { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

El Mostafa DAOUDI- p. 343

Les champs de texte : Class JTextField


Un champ de texte (zone de saisie ) est une zone rectangulaire dans laquelle lutilisateur peut entrer ou modifier un texte. JTextField entree= new JTextField (20) ; // champ de taille 20, initialement vide JTextField entree2= new JTextField (texte initial",20) ; // champ de taille 15 contenant au depart le texte "texte initial" On peut prendre le texte qui existe dans le champ laide de la mthode getText(); String ch=entree.getText(); // on obtient dans la chaine ch le contenu actuel du champ de texte entree rendre le champ de texte non modifiable, on utilise la mthode setEditable(); entree.setEditable(true );
El Mostafa DAOUDI- p. 344

172

Exemple: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre () { setTitle ("Saisie de texte") ; setSize (300, 120) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; saisie = new JTextField (20) ; contenu.add(saisie) ; saisie.addActionListener(this) ; bouton = new JButton ("COPIER") ; contenu.add(bouton) ; bouton.addActionListener(this) ; copie = new JTextField (20) ; copie.setEditable(false); contenu.add(copie) ; }
El Mostafa DAOUDI- p. 345

public void actionPerformed (ActionEvent e){ if (e.getSource() == bouton){ String texte = saisie.getText() ; copie.setText(texte) ; } } private JTextField saisie, copie ; private JButton bouton ; }

El Mostafa DAOUDI- p. 346

173

Ch. XIII Les Collections


I. Dfinition Une collection est un objet qui contient dautres objets. Une collection regroupe un ensemble dobjets. Le JDK fournit plusieurs types de collections sous la forme de classes et dinterfaces. Ces classes et interfaces sont dans le paquetage java.util Une collection est plus puissante quun tableau . En effet: - Pour les tableau: il faut spcifier la taille du tableau sa cration. - Par contre, une collection adapte automatiquement sa taille (au fur et mesure). - Pour les tableaux, linsertion au milieu dun tableau, ncessite un dcalage des lments du tableau.
El Mostafa DAOUDI- p. 347

II. Classes & interfaces


1. Les interfaces Le paquet java.util contient les interfaces et les classes pour la manipulation des collections d'objets. Les interfaces sont dans 2 hirarchies principales : Collection: L' interface Collection permet de manipuler toutes les collections de faon unifie, et regroupe les mthodes communes toutes les collections . Map: Linterface des collections indexes par des cls; un lment de type V dune map est retrouv rapidement si on connat sa cl de type K.

El Mostafa DAOUDI- p. 348

174

Hirarchie des interfaces-Collections Iterable

Hirarchie des interfaces - Map

Map<K,V

Collection SortedMap<K,V> Set List Queue

SortedSet
El Mostafa DAOUDI- p. 349

2. Les classes abstraites


- AbstractCollection : implmente linterface Collection. - AbstractList: classe abstraite qui hrite de AbstractCollection et qui implmente linterface List - AbstractSequentialList: classe abstraite qui hrite de AbstractList et qui implmente linterface List - AbstractSet: classe abstraite implmente de l'interface Set AbstractMap<K,V>: classe abstraite qui implmente de l'interface Map<K,V>

El Mostafa DAOUDI- p. 350

175

3. Les Classes concrtes - ArrayList: hrite de AbstractList, implmente linterface List (tableau de taille variable) - LinkedList: hrite de AbstractSequentialList, implmente linterface List (Liste chaine) - HashSet: hrite de AbstractSet, implmente linterface Set (table de hachage) - TreeSet: hrite de AbstractSet, implmente linterface Set (arbre balance) - HashMap<K,V>: hrite de AbstractMap<K,V>,implmente linterface Map<K,V> (table de hachage) - TreeMap<K,V>, implmente linterface Map<K,V> (arbre balance)

El Mostafa DAOUDI- p. 351

4. Les classes tudies Nous tudierons essentiellement les classes ArrayList comme classe d'implmentation de Collection LinkedList comme classe d'implmentation de Collection

El Mostafa DAOUDI- p. 352

176

III. L' interface Collection Linterface Collection , correspond un objet qui contient un groupe dobjets. Ces objets ne sont pas ncessairement de mme type. Elle permet de manipuler toutes les collections de faon unifie, et regroupe les mthodes communes toutes les collections : Aucune classe du JDK nimplmente directement cette interface N.B. Toutes les collections peuvent tre parcourues l'aide d'un itrateur (interface Iterator ), un objet qui assure que tous les lments de la collection soient atteints.
El Mostafa DAOUDI- p. 353

Les mthodes de Collection


int size(); // retourne la taille de la collection: retourne le nombre dlments dans la collection. boolean isEmpty() ; // teste si la collection est vide. boolean add(Object o); boolean remove(Object o); // supprime un objet o de la collection. void clear(); // suppression de tous les lments. boolean contains(Object o); // vrifie si lobjet o est contenu dans la collection. Iterator iterator(); // permet de parcourir une collection. Object[] toArray(); // retourne un tableau qui contient tous les lment de cette collection (la collection qui appelle cette mthode ). Remarque : si la collection est vide, toArray() renvoie un tableau de taille 0 (pas la valeur null)
El Mostafa DAOUDI- p. 354

177

IV. Collections et types primitifs


Les valeurs de types primitifs (boolean, int, float, etc.) ne peuvent pas tre directement ajoutes aux collections. Il faut utiliser les classes enveloppes (les classe Warappers) correspondantes (Boolean, Integer, Float, etc.). Exemple de collection de type primitif List l = new ArrayList(); l.add(new Integer(10)); // ajouter 10 la liste Integer n = l.get(2); // l.get() retourne un objet de type Integer // Ici elle retourne llment en position 2 de la Liste int i = n.intValue(); // la mthode intValue() renvoie la valeur de type int On peut lcrire tout simplement: int i = l.get(2).intValue();
El Mostafa DAOUDI- p. 355

A partir du JDK 5, les conversions entre les types primitifs et les classes enveloppantes peuvent tre implicite. Lexemple prcdent peut scrire de manire plus simple:

int j=10; l.add(new Integer(10)); l.add(j); l.add(10); int i = l.get(0).intValue(); int i = l.get(0);

El Mostafa DAOUDI- p. 356

178

V. Linterface List
Linterface List, hrite de Collection. Elle dfinie la notion de squence: c'est--dire chaque lment de la collection a un rang. Les objets sont indexs par des numros (en commenant par 0). Les Classes qui implmentent linterface List : Vector, ArrayList; tableau taille variable (tableau dynamique) LinkedList; liste chane Choix des classes: On utilise le plus souvent Vector/ArrayList Mais si les insertions/suppressions au milieu de la liste sont frquentes, dans ce cas LinkedList est plus utile car elle vite les dcalages.

El Mostafa DAOUDI- p. 357

Les Nouvelles mthodes de List Object get(int i); // retourne llment dindice i . Object set(int i, Object o); // modifie llment en position i . void add(int i, Objet o); // insertion de lobjet o lindice i avec // dcalage vers la droite. Object remove(int index); // supprime llment dindice i avec // dcalage vers la gauche. int indexOf(Object o); // retourne lindice du 1er lment gal o // au sens de equals (ou -1). int lastIndexOf(Object obj); // retourne lindice du dernier lment gal o // au sens de equals (ou -1). ListIterator listIterator(); // construction dun itrateur pour parcourir la // liste (litrateur est positionn au dbut de la liste). ListIterator listIterator(int i); // i = indice du dbut de litrateur. List subList(int dbut, int fin); // Extraction dune sous liste allant de // debut jusqu (fin-1). dbut est inclut mais fin est exclut

El Mostafa DAOUDI- p. 358

179

V.1 Tableau dynamique: Les classes ArrayList/Vector


Construction ArrayList(); // un constructeur sans paramtres ArrayList(int taille initiale) ; peut tre utile si on connat la taille finale la plus probable (vite les oprations daugmentation de la taille). Exemples: // vecteur dynamique vide */ ArrayList v = new ArrayList () ; Dans lexemple suivant on construit un tableau dynamique qui contient des lments de type Personne et de type Livre

El Mostafa DAOUDI- p. 359

Exemple1 dArrayList: la liste contient un seul type (Personne)

import java.util.*; class Personne { // on dfini la classe Personne) private String nom; public Personne(String nom) { this.nom=nom; } public String getObjet(){ return "Personne "+nom; } }

El Mostafa DAOUDI- p. 360

180

public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) System.out.println((liste.get(i)).getObjet()); } } Ne passe pas la compilation. Pourquoi ?? liste.get(i) retourne un objet de type Object
El Mostafa DAOUDI- p. 361

Pour que a marche on doit faire des casts public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p1 = new Personne(" Mohamed"); liste.add(p1); // . on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) { System.out.println(((Personne)liste.get(i)).getObjet()); } }
El Mostafa DAOUDI- p. 362

181

Exemple2 dArrayList: la liste contient plus quun type: Dans cette exemple, on suppose que la collection contient deux types dobjets: Personne et Livre .

import java.util.*; class Personne { private String nom; public Personne(String nom) { this.nom=nom; } public String getObjet(){ return "Personne "+nom; } } class Livre { private int inv; public Livre(int inv) { this.inv=inv; } public String getObjet(){ return "Livre "+inv; } }

El Mostafa DAOUDI- p. 363

public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne(" Mohamed"); liste.add(p); Livre liv = new Livre(12); liste.add(liv); for (int i=0; i<liste.size();i++) { System.out.println((liste.get(i)).getObjet()); } } } Ne passe pas la compilation. Pourquoi ?? liste.get(i) retourne un objet de type Object

El Mostafa DAOUDI- p. 364

182

Pour que a marche on doit faire des casts public class TestCollection { public static void amain(String[] rgs) { ArrayList liste = new ArrayList(); Personne p = new Personne(" Mohamed"); liste.add(p); Livre liv = new Livre(12); liste.add(liv); for (int i=0; i<liste.size();i++) { if (liste.get(i) instanceof Personne) System.out.println(((Personne)liste.get(i)).getObjet()); if (liste.get(i) instanceof Livre) System.out.println(((Livre)liste.get(i)).getObjet()); } } }
El Mostafa DAOUDI- p. 365

V.2 Les listes chaines La classe LinkedList La classe LinkedList permet de manipuler des listes dobjets doublement chaines: chaque lment de la collection, on associe les rfrences aux lments prcdent et suivant. Une telle collection peut tre parcourue laide dun itrateur bidirectionnel de type ListIterator. La taille d'une LinkedList n'est pas fixe : on peut ajouter et enlever des lments.

El Mostafa DAOUDI- p. 366

183

El Mostafa DAOUDI- p. 367

Constructeurs La classe LinkedList possde: - un constructeur sans paramtre: cration dune liste vide LinkedList liste= new LinkedList () - un constructeur qui demande en paramtre une collection: cration dune liste qui sera initialise avec les lments de la collection fournie en paramtre. Exemple: Soi c une collection de type ArrayList LinkedList liste= new LinkedList (c); Cration de la liste liste forme de tous les lments de la collection c.

El Mostafa DAOUDI- p. 368

184

Les oprations principales sur une liste chane


add(Object o) ; // ajoute un objet o en fin de liste addFirst(Object o); // ajoute un objet o en dbut de liste addLast(Object o); // ajoute un objet o en fin de liste clear(); // vide la liste contains(Object o); // renvoie true si la liste contient l'objet o . // Sinon, elle renvoie false - getFirst() et getLast() // renvoie le premier et le dernier lment de la liste sous forme d'Object. Ne pas oublier le cast. - removeFirst() et removeLast() : retire le premier et le dernier lment de la liste. - size() : renvoie la taille de la liste

12:19

El Mostafa DAOUDI- p. 369

Exemple : public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne(" Mohamed"); liste.add(p); p = new Personne("Ali"); liste.add(p); Livre v = new Livre(123); liste.add(v); p = new Personne("Fatima"); liste.add(p); v = new Livre(542); liste.add(v); System.out.println((liste.getFirst()).getObjet()); System.out.println((liste.getLast()).getObjet()); } }

Ne passe pas la compilation ?? liste.get(i) retourne un objet de type Object


El Mostafa DAOUDI- p. 370

185

Pour que a marche on doit faire des casts public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne("Mohamed"); liste.add(p); p = new Personne("Ali"); liste.add(p); Livre v = new Livre(123); liste.add(v); p = new Personne("Fatima"); liste.add(p); v = new Livre(542); liste.add(v); v = new Livre(222); liste.add(v); System.out.println(((Personne)liste.getFirst()).getObjet()); System.out.println(((Livre)liste.getLast()).getObjet()); } }
El Mostafa DAOUDI- p. 371

Une liste chane gre une collection de faon ordonne : l'ajout d'un lment peut se faire au dbut ou la fin de la collection. L'ajout d'un lment aprs n'importe quel lment est li la position courante lors d'un parcours : Pour rpondre ce besoin, l'interface qui permet le parcours de la collection est une sous classe de l'interface Iterator : l'interface ListIterator.

El Mostafa DAOUDI- p. 372

186

VI. Linterface Iterator


Un itrateur est instance dune classe qui implmente linterface Iterator. Il permet dnumrer les lments contenus dans une collection Linterface Collection contient la mthode Iterator iterator() qui renvoie un itrateur pour parcourir les lments de la collection. Un itrateur permet de se positionner sur chaque lment de la collection. Linterface List contient en plus la mthode ListIterator listIterator() qui renvoie un itrateur de type ListIterator qui offre plus de possibilits quun itrateur de type Iterator pour parcourir une liste et la modifier.

12:19

El Mostafa DAOUDI- p. 373

Mthodes de linterface Iterator


boolean hasNext(); elle permet de tester l'existence d'un lment parcourir : retourne true sil existe un lment aprs le curseur. Object next(); Renvoie l'objet sur lequel l'itrateur est positionn et fait avancer la position courante (dplace le curseur aprs cet objet). Lance une exception NoSuchElementException lorsqu'il n'y a plus rien renvoyer. void remove() : elle supprime le dernier lment parcouru (le dernier lment renvoy par next() : c'est--dire l'lment juste avant le curseur).
El Mostafa DAOUDI- p. 374

187

Exceptions lances par les mthodes des itrateurs


next lance NoSuchElementException lorsqu'il n'y a plus rien renvoyer remove lance NoSuchOperationException si la mthode n'est pas implmente et lance IllegalStateException si next n'a pas t appele avant ou si remove a dj t appele aprs le dernier next

El Mostafa DAOUDI- p. 375

Exemple: parcours dune liste de type ArrayList sans itrateur : On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne int i=0; for ( Object e:liste) { // java 5 System.out.println(((Personne)liste.get(i)).getObjet()); i++; } }
El Mostafa DAOUDI- p. 376

188

Exemple: parcours dune liste de type ArrayList avec un itrateur: On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne Iterator it = liste.iterator(); // on cre un itrateur pour la collection liste int i=0; while (it.hasNext()){ System.out.println(((Personne)liste.get(i)).getObjet()); it.next(); i++; } } Remarque : Pour le parcours des tableaux, on utilise laccs direct par les mthodes get() ou set() au lieu des itrateurs .

El Mostafa DAOUDI- p. 377

Exemple: parcours dune liste de type LinkedList avec un itrateur: On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne Iterator it = liste.iterator(); // on cre un itrateur pour la collection liste int i=0; while (it.hasNext()){ System.out.println(((Personne)liste.get(i)).getObjet()); it.next(); i++; } }
El Mostafa DAOUDI- p. 378

189

Remarque 2:
Comme les iterator sont utiliss pour faire des mises jour dans la liste, une exception de type CurrentModificationException leve si un iterator parcours la liste alors qu'un autre fait des mises jour (ajout ou suppression d'un lment dans la liste). Pour grer facilement cette situation, il est prfrable si l'on sait qu'il y a des mises jour faire de n'avoir qu'un seul iterateur qui soit utilis. Une exception de type CurrentModificationException est aussi leve si une mise jour intervient lors du parcours de la collection.

El Mostafa DAOUDI- p. 379

VII. Linterface ListIterator


ListIterator est une sous-interface de linterface Iterator . Elle est adapte aux listes. Elle permet : - le parcours d'une liste dans les deux sens (itrateur bidirectionnel) - la modification de la liste pendant le parcours ; - d'obtenir une position courante (situe entre l'lment qui serait retourne par previous et celui retourn par next).

El Mostafa DAOUDI- p. 380

190

Les mthodes ajoutes dans cette interface sont les suivantes : boolean hasPrevious() ; // teste s'il existe un lment avant le curseur. Object previous(); // renvoie l'lment avant le curseur, s'il existe. void add(Object o); // ajoute un lment avant le curseur. int nextIndex(); // revoie l'index (le rang) de l'lment avant le curseur. int previousIndex(); // renvoie l'index (le rang) de l'lment aprs le curseur. - void set(Object o); // remplace le dernier lment, retourn par previousIndex() ou nextIndex(), par lobjet o .

El Mostafa DAOUDI- p. 381

Exemple: Parcours dune liste chaine - voici comment nous pourrons la parcourir lenvers :
ListIterator iter ; iter = l.listIterator (l.size()) ; /* position courante : fin de liste*/ while (iter.hasPrevious()) { Object o = iter.previous () ; // utilisation de lobjet courant o } - voici comment nous pourrons la parcourir du dbut vers la fin : ListIterator iter ; iter = l.listIterator () ; /* position courante : dbut de la liste */ while (iter.hasNext()) { Object o = iter.next() ; // utilisation de lobjet courant o }
El Mostafa DAOUDI- p. 382

191

VIII. Classes Gnriques La gnricit permet de rendre un programme plus stable en dtectant certaines erreurs ds la compilation. La gnricit est trs utilise avec les collections mais peut tre aussi utilise sans les collections. Exemple : une boite dans laquelle on peut mettre un objet. class Boite{ private Object o; public void add(Object o) { this.o = o; } public Object get() { return o; } }
El Mostafa DAOUDI- p. 383

Test 1: On veut se restreindre aux objets de type Personne . public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);

// On place un seul objet de type Personne. System.out.println((b.get()).getObjet()); }


} Ne passe pas la compilation on doit faire un cast car b.get() retourn un objet de type Object et non de type Personne
El Mostafa DAOUDI- p. 384

192

public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);

// On place un seul objet de type Personne. System.out.println(((Personne)b.get()).getObjet()); }


} Le cast est obligatoire

El Mostafa DAOUDI- p. 385

Test 2: Que se passe til si on fait cast non correcte. Par exempe public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);

// On place un seul objet de type Personne. System.out.println(((Livre)b.get()).getObjet()); }


} a passe la compilation. Mais provoque une erreur lexcution: Exception in thread "main" java.lang.ClassCastException: Personne cannot be cast to Livre at TestGenerique.main(TestGenerique.java:36)
El Mostafa DAOUDI- p. 386

193

- La gnricit permet de dtecter certaines erreurs ds la compilation. - La gnricit est trs utilise avec les collections. - Si la classe Boite est conue avec la gnricit, cette erreur peut tre dtecte la compilation .

El Mostafa DAOUDI- p. 387

- On peut dclarer une classe gnrique comme suit (cest utilisable aussi pour dfinir des interfaces gnriques) (Java 5). class Boite <T> { private T t; // T stands for "Type" public void (T t) { this.t = t; } public T get() { return t; } }

El Mostafa DAOUDI- p. 388

194

T est une variable qui peut reprsenter une classe ou une interface. Cest un paramtre formel de type. Chaque occurrence de Object a t remplace par T. La variable T dclare dans lentte peut tre utilise nimporte o dans la classe. Dclaration Boite<Personne> b; // Cette dclaration indique que b contiendra une rfrence une boite contenant des objets instances de Personne . // on parle de type paramtr Cration de lobjet b= new Boite<Personne>();

El Mostafa DAOUDI- p. 389

Dans ce cas peut appeler les mthodes sans faire de cast : public class TestBoite { public static void main(String[] args) { Personne p = new Personne("Mohamed"); Boite<Personne> b = new Boite<Personne>(); b.add(p); System.out.println((b.get()).getObjet()); } }

El Mostafa DAOUDI- p. 390

195

La gnricit permet de paramtrer une classe avec un ou plusieurs types de donnes On peut par exemple donner en paramtre le type des lments dun Arraylist : ArrayList<E> E est un paramtre de type formel Il pourra tre remplac par un argument de type concret pour typer des expressions ou crer des objets : ArrayList<Integer> l = new ArrayList<Integer>();

El Mostafa DAOUDI- p. 391

VIII. Collection et gnricit

les collections pouvait contenir nimporte quel objet. Il tait impossible dindiquer quune liste ne contenait que des instances dun certain type, par exemple des Livres Certaines erreurs ne pouvaient tre dtects la compilation mais seulement pendant lexcution. Il faire des castes pour pouvoir utiliser les mthodes qui ne sont pas dfinies dans la classe Object Si on veux viter ces problmes (viter les casts et vrifier les types la compilation), on utilise la gnricit.

El Mostafa DAOUDI- p. 392

196

Remarques: Avant le JDK 5.0, les collections peuvent contenir des objets de nimporte quel type. Mais partir du JDK 5.0, on peut indiquer le type des objets contenus dans une collection grce la gnricit : Exemple: List <Livre> c; // dclare que c est une collection (List) dobjets de type Livre.

El Mostafa DAOUDI- p. 393

L' interface Collection et drives Linterface Collection<E> , o E est le type des lments, correspond un objet qui contient un groupe dobjets de type E.

Les mthodes de Collection<E>


int size(); retourne la taille de la collection boolean isEmpty() ; // test si la collection est vide : boolean add(E e); // ajoute lobjet e de type E la collection : boolean remove(E e); // supprime un objet de la collection : void clear(); // suppression de tous les lments. boolean contains(E e); // vrifie si lobjet e est contenu dans la collection. Iterator<E> iterator(); // pour parcourir une collection Object[] toArray(); // conversion en tableau :

El Mostafa DAOUDI- p. 394

197

Linterface List<E> List <E>, hrite de Collection <E>, Il s'agit de la notion de squence, c'est--dire une collection o chaque lment a un rang. Les objets sont indexs par des numros (en commenant par 0) Les Classes qui implmentent cette interface : ArrayList<E>; tableau taille variable LinkedList<E>; liste chane Choix des classes: On utilise le plus souvent ArrayList<E> Mais si les insertions/suppressions au milieu de la liste sont frquentes, dans ce cas LinkedList<E> est plus utile car elle vite les dcalages.

El Mostafa DAOUDI- p. 395

Les Nouvelles mthodes de List<E> void add(int i, E e); // insertion de llment e lindice i avec dcalage vers la droite. E get(int i); // retourne llment dindice i E set(int i, E elt); // modifie llment en position i E remove(int i); // suppression de llment dindice i avec dcalage vers la gauche. int indexOf(E e); // indice du 1er lment gal e (au sens // de equals) (ou -1) int lastIndexOf(E e); // indice du dernier lment gal e (au sens // de equals) (ou -1) ListIterator<E> listIterator(); // parcours de la liste ListIterator<E> listIterator(int i); // i = indice du dbut List<E> subList(int dbut, int fin); // Extraction dune sous liste allant de debut jusqu (fin-1). dbut est inclut mais fin est exclut
El Mostafa DAOUDI- p. 396

198

La classe ArrayList<E> Exemples de construction:

vecteur dynamique vide: un constructeur sans paramtres ArrayList <E> v1 = new ArrayList <E> () ; vecteur dynamique en fixant la taille initiale ArrayList <E> v2 = new ArrayList <E> (n) ;
vecteur dynamique contenant les lments de la collection c

ArrayList <E> v2 = new ArrayList <E>(c) ;

El Mostafa DAOUDI- p. 397

Exemple: public class TestCollection { public static void main(String[] args) { ArrayList<Personne> liste = new ArrayList<Personne>(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) { System.out.println((liste.get(i)).getNom()); } } } Ici on na pas besoin de faire le caste, car lobjet retourn est de type Personne .
El Mostafa DAOUDI- p. 398

199

La classe LinkedList<E> Exemple de constructeurs

- un constructeur sans paramtre: cration dune liste vide LinkedList<E> liste = new LinkedList <E>() - un constructeur qui demande en paramtre une collection: cration dune liste qui sera initialise avec les lments de la collection fournie en paramtre. LinkedList <E> liste = new LinkedList<E> (c); Cration de la liste l1 forme de tous les lments de la collection c.

El Mostafa DAOUDI- p. 399

Exemple : LinkedList <E> listeChainee = new LinkedList<E> (); listeChainee.add("element 1"); listeChainee.add("element 2"); listeChainee.add("element 3"); listeChainee.add("element 4"); System.out.println(Premier element = "+listeChainee. getFirst()); // affiche element 1 System.out.println(dernier element = "+listeChainee. getLast()); // affiche element 4 listeChainee. removeFirst() ; listeChainee. removeLast() ; System.out.println(Premier element = "+listeChainee. getFirst()); // affiche element 2 System.out.println(dernier element = "+listeChainee. getLast()); // affiche element 3
El Mostafa DAOUDI- p. 400

200

VI. Interface Iterator <E>


Un itrateur est instance dune classe qui implmente linterface Iterator<E> . Il permet dnumrer les lments contenus dans une collection

Linterface Collection<E> contient la mthode Iterator<E> iterator() qui renvoie un itrateur pour parcourir les lments de la collection Linterface List<E> contient en plus la mthode ListIterator<E> listIterator() qui renvoie un ListIterator (offre plus de possibilits que Iterator pour parcourir une liste et la modifier)

12:19

El Mostafa DAOUDI- p. 401

Exemple : parcours d'une ArrayList avec un itrateur. ArrayList<Integer> list = new ArrayList<Integer>(); list.add (5); list.add (9); //cration dun arrayList contenant deux objet Integer Iterator<Integer> it = list.iterator(); /* cration de litrateur it qui point sur le premier lment de la collection list: le curseur est plac avant le premier lment de la collection list. */ while (it.hasNext()){ // tant quil existe un lment parcourir System.out.println (it.next()); // affiche llment courant // lment courant= lment juste aprs le curseur } Remarque 1: Pour le parcours des tableau, on utilise plus laccs direct par les mthode get() ou set() au lieu des itrateurs (voir avant).

El Mostafa DAOUDI- p. 402

201

Exemple: Parcours dune liste chaine - voici comment nous pourrons la parcourir lenvers :
ListIterator <E> iter ; iter = l.listIterator (l.size()) ; /* position courante : fin de liste*/ while (iter.hasPrevious()) { E o = iter.previous () ; // utilisation de lobjet courant o } - voici comment nous pourrons la parcourir du dbut vers la fin : ListIterator <E> iter ; iter = l.listIterator () ; /* position courante : dbut de la liste */ while (iter.hasNext()) { E o = iter.next() ; // utilisation de lobjet courant o }
El Mostafa DAOUDI- p. 403

Ch. XIV: Gestion des entres/sorties Java


I. Notions des Flux En Java, les changes de donnes, en lecture ou en criture, entre un programme et une source de donnes (fichier, clavier, mmoire, etc.) sont effectus laide des flux de donnes (streams ou flot de donnes). - En lecture (criture dans le programme partir dune source de donnes): le principe consiste : - crer un objet flux dentre (input stream) - ensuite le connecter avec une source de donnes - Accs en lecture dune source de donnes (recevoir des donnes partir de cette source de donnes). - En criture (lecture des donnes partir du programme pour les crire dans une source de donnes): le principe consiste : - crer un objet flux de sortie (output stream) - ensuite le connecter avec une source de donnes - Accs en criture dans cette source de donnes.

El Mostafa DAOUDI- p. 404

202

Le package java.io contient les classes pour grer les entres/sorties en fonction des types des flux. On distingue les flux de caractres et les flux doctets (flux binaires). Etapes suivre pour la lecture ou lcriture dun flot de donnes: Ouvrir un flux qui pointe sur une source de donne. Lire ou crire des donnes dans ce flux: Tant quil y a des donnes lire ( ou crire) on lit (ou on crit) la donne suivante dans le flot Fermer le flux.

El Mostafa DAOUDI- p. 405

II. Les flux doctets Les flux sont utiliss pour lire ou crire des octets bruts qui reprsentent des donnes codes. Les classes abstraites InputStream et OutputStream fournissent les fonctions pour les entres/sorties (lecture/criture) orientes byte. - Pour la lecture des octets, on utilise les mthodes de la sousclasse FileInputStream de la classe InputStream - Pour lcriture, on utilise les mthodes de la sous-classe FileOutputStream de la classe OutputStream savoir

El Mostafa DAOUDI- p. 406

203

1. Flux d'octets: en Lecture:


Pour la lecture des octets, on utilise les mthodes de la sous-classe FileInputStream de la classe InputStream, savoir : int read() throws IOException void close() throws IOException int read() - Lit un octet partir dune source de donne - Renvoie

l'octet lu dans le flux, ou -1 si elle a rencontr la fin du flux


La lecture est squentielle: bloque jusqu la lecture dun nouveau octet, ou la rencontre de la fin du flot, ou dune exception. void close() - Ferme la source de donne
El Mostafa DAOUDI- p. 407

Principe de lecture:
La lecture des donnes partir dun flux, se droule de la faon suivante: - Ouverture du flux : cration dun objet de la classe InputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux (par exemple un nom de fichier). Pour la sparation des noms des rpertoires et des fichiers, on utilise \\, au lieu de \. - Lecture de donnes : Elle est ralise au moyen de la mthode read(). - Fermeture du flux : Quand le flux nest plus ncessaire, il doit tre ferm par la mthode close().
El Mostafa DAOUDI- p. 408

204

Exemple: Considrons le fichier fichier_test.jpg qui reprsente une image situe dans le rpertoire D:\\Images . Le but est dafficher les pixels (des octets: des valeurs entires positives comprises entre 0 et 255) qui reprsente limage. N.B. La lecture se termine quand la mthode read() retourne la valeur -1.

El Mostafa DAOUDI- p. 409

Version sans attraper les exceptions


import java.io.*; public class TestES { public static void main(String[] argv) throws IOException { // Ouvre un flux pointant sur le fichier FileInputStream in=new FileInputStream("D:\\fichier_test.jpg"); int n; while ((n = in.read()) != -1) { // Lecture partir du fichier System.out.print(" " + n); // on affiche loctet lu } System.out.println(); in.close(); } }
El Mostafa DAOUDI- p. 410

205

Dans cette version on attrape les exceptions Il ne faut pas appeler la mthode close() l'intrieur du bloc try/catch , mais il faut lappeler dans le bloc finally (pour tre sre quon ferme le flux) . En effet, en cas d'exception, on risque de ne pas fermer le flux. import java.io.*; public class LecteurOctets { public static void main(String[] args) throws IOException { FileInputStream in = null; try { // Ouvre un flux pointant sur le fichier in = new FileInputStream("D:\\fichier_test.jpg"); int n; while ((n= in.read()) != -1) { // Lecture partir du fichier System.out.print(" " + n); } // Fin de la boucle while // ne pas mettre cet endroit linstruction in.close();
El Mostafa DAOUDI- p. 411

} catch (IOException e) { System.out.println("Impossible de lire le fichier : "+ e); System.exit(-1); } finally { try { in.close(); } catch (IOException e){ e.printStackTrace() ; } System.out.println("Lecture du fichier termine."); } } }

El Mostafa DAOUDI- p. 412

206

2. Flux d'octets: En Ecriture Pour lcriture, on utilise les mthodes de la sous-classe FileOutputStream de la classe OutputStream savoir : void write(int b) throws IOException void flush() throws IOException void close() throws IOException Remarque : avec la mthode write(int b), seul l'octet de poids faible (les 8 bits de poids faibles) de b qui est crit dans le flot.

El Mostafa DAOUDI- p. 413

Principe dEcriture: Lcriture de donnes dans flux se droule de la mme faon que la lecture dun flux dentre : - Ouverture du flux : cration dun objet de la classe OutputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux (par exemple un nom de fichier ou un autre flux). - Ecriture de donnes : les donnes sont crites vers le flux au moyen de la mthode write(). - Fermeture du flux : quand le flux nest plus ncessaire, il doit tre ferm par la mthode close(). Exemple: crire des entiers de type byte (octet) dans le fichier D:\\donnees.dat.
El Mostafa DAOUDI- p. 414

207

import java.io.*; public class TestEcritOctet { public static void main(String[] argv) throws IOException { int tab[] = {56, 257, 123, 43, 256, 37};

FileOutputStream out = null;


try { // Ouvre le fichier donnees.dat pour enregistre les donnes du tableau out = new FileOutputStream("D:\\donnees.dat"); for (int i = 0; i < tab.length; i++) out.write(tab[i]); // crit tab[i] dans le fichier donnees.dat } catch (IOException e) { System.out.println("Impossible d'crire dans le fichier :"+ e); } finally{ try{ out.close(); } catch (IOException e) { e.printStackTrace(); } } } } Question: Quelles sont les valeurs enregistres dans le fichier. // les valeurs enregistr sont : 56 1 123 43 0 37
El Mostafa DAOUDI- p. 415

Remarque: - Si le fichier "D:\\donnees.dat" nexiste pas alors il sera cr. - Si le fichier "D:\\donnees.dat" existe alors il sera cras. Si on veut rajouter la fin du fichier, on utilise un autre constructeur de la classe FileOutputStream. Syntaxe: FileOutputStream(String nom, boolean append) Si append vaut true alors on rajoute la fin du fichier. Exemple:
FileOutputStream out = new FileOutputStream("D:\\donnees.dat", true);

Permet de rajouter la fin du fichier donnees.dat sil existe.

El Mostafa DAOUDI- p. 416

208

3. Flux doctets tampon


La lecture/criture des donnes dans un flux sont effectues squentiellement : - Le programme accde au disque - Charge en mmoire un octet depuis le fichier - La mthode read() (write()) lit (crit) loctet il y a beaucoup dchange entre le disque et le programme ce qui cote trs chre. Pour minimiser le nombre d'accs au disque , Java fournit les flux tampons (buffers), qui ont le principe suivant: - ils chargent en mmoire un paquet d'octets (et non un seul octet) depuis un fichier. - Ensuite, la mthode read() (write()) lit (crit) chaque octet dans le tampon. Dans ce cas la lecture/criture est plus rapide car elle se fait dans la mmoire et non partir du disque.
El Mostafa DAOUDI- p. 417

Principe de lecture de flux tampon doctets.


Ouverture du flux : cration dun objet de la classe InputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux . Exemple: FileInputStream in = new FileInputStream("D:\\fichier_test.jpg"); Connexion du flux avec le tampon: La classe BufferedInputStream permet de remplir la mmoire tampon avec des donnes de FileInputStream. Exemple: BufferedInputStream tampon = new BufferedInputStream(in); Remarque: La taille du tampon peut tre rgle afin de rendre la lecture de fichier un peu plus rapide. Par exemple, pour affecter au tampon une taille de 1000 octets, on utilise le constructeur deux arguments : BufferedInputStream tampon = new BufferedInputStream(in, 1000);
El Mostafa DAOUDI- p. 418

209

Lecture des donnes: Les donnes sont tout d'abord transportes du FileInputStream dans le BufferedInputStream, ensuite on utilise la mthode read() pour lire les donnes partir du tampon. Remarque: Les flux tampon ne modifient pas le type de lecture ; ils la rendent seulement plus rapide.

El Mostafa DAOUDI- p. 419

//le dbut du programme reste inchang par rapport au programme prcdent FileInputStream in = null; BufferedInputStream tampon = null; try { in = new FileInputStream("D:\\fichier_test.jpg"); // Connecte les flux avec le tampon tampon = new BufferedInputStream(in); /* on peut lcrire tout simplement BufferedInputStream tampon = new BufferedInputStream( new FileInputStream("D:\\fichier_test.jpg")); */ int n; while ( ( n = tampon.read()) != -1 ) { System.out.print(" " + n); } // Fin de la boucle while // in.close(); ne pas la mettre ici }
El Mostafa DAOUDI- p. 420

210

catch (IOException e) { System.out.println( Lecture impossible :"+ e.toString()); System.exit(-1); } finally { try { tampon.close(); in.close(); } catch (IOException e){ e.printStackTrace() ; } System.out.println("Lecture du fichier termine."); } } }

El Mostafa DAOUDI- p. 421

Principe dcriture de flux tampon doctets. Les tapes sont identiques la lecture. Ouverture du flux : cration dun objet de la classe OutputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux . Exemple: FileOutputStream out = new FileOutputStream("D:\\fichier_test.jpg"); Connexion du flux avec le tampon: La classe BufferedOutputStream permet de remplir la mmoire tampon avec des donnes de FileOutputStream. Exemple: BufferedOutputStream tampon = new BufferedOutputStream(out);

El Mostafa DAOUDI- p. 422

211

Ecriture des donnes: Les donnes sont tout d'abord transportes du FileOutputStream dans le BufferedOutputStream, ensuite on utilise la mthode write() pour crire les donnes partir du tampon. Remarque: Pour s'assurer que tous les octets du tampon sont envoys au fichier, on appelle la mthode flush() (vider) lorsque l'criture dans le BufferedOutputStream est termine. Exemple: Ecrire un tableau dentiers dans un fichier

El Mostafa DAOUDI- p. 423

int tab[] = {56, 257, 123, 43, 256, 37}; FileOutputStream out = null; BufferedOutputStream tampon = null; try { out = new FileOutputStream( D:\\donnes.dat"); // Connecte les flux tampon = new BufferedOutputStream(out); for (int i = 0; i < tab.length; i++) { tampon.write(tab[i]); } } catch (IOException e) { e.printStackTrace(); } finally { try { tampon.flush(); tampon.close(); out.close(); } catch (IOException e1) { e1.printStackTrace(); } }
El Mostafa DAOUDI- p. 424

212

4. Lecture des types primitifs depuis un fichier


FileInputStream in = new FileInputStream("fichier"); // Connecte les flux avec le tampon BufferedInputStream tampon = new BufferedInputStream(in); // Connecte le tampon au flux pour les type primitif DataInputStream dis= new DataInputStream(tampon); Ou DataOutputStream dis = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("fichier"))); double d = dis.readDouble(); String s = dis.readUTF(); // Codage UTF (Unicode Text Format) int i = dis.readInt(); dis.close();
El Mostafa DAOUDI- p. 425

Exemple: Lire des donnes doubles partir dun fichier test.data et les afficher.
FileInputStream in = new FileInputStream("D:\\test1.data"); BufferedInputStream tampon = new BufferedInputStream(in); DataInputStream dis= new DataInputStream(tampon); double d; while(dis.available()!=0){ // tant quil reste des octets lire d = dis.readDouble(); System.out.println("d= "+d); } dis.close();
El Mostafa DAOUDI- p. 426

213

criture des types primitifs dans un fichier FileOutputStream out = new FileOutputStream( nom_du_fichier"); BufferedOutputStream tampon = new BufferedOutputStream(out); DataOutputStream dos = new DataOutputStream (tampon); Ou DataOutputStream dos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("fichier"))); dos.writeDouble(103.7); dos.writeUTF("Mohammed"); dos.writeInt(769); dos.close(); Pour crire des types primitifs la fin dun fichier on utilise le constructeur FileOutputStream(String nom, boolean append); Qui permet d'ajouter la fin du fichier si append est true , sinon le contenu du fichier sera cras la cration du flot
El Mostafa DAOUDI- p. 427

III. Les flux de caractres

Les flux de caractres sont utiliss pour lire ou crire des caractres Unicode. Les classes abstraites Reader et Writer fournissent les mthodes pour les entres/sorties orientes caractres. - La classe Reader et ses sous classes FileReader lit des caractres (char) dans un flot. - La classe Writer et ses sous classes FileWriter crite (envoie) des caractres dans un flot. Ces classes peuvent lire un fichier texte, soit caractre par caractre l'aide de la mthode read(), soit ligne par ligne l'aide de la mthode readLine().

El Mostafa DAOUDI- p. 428

214

1. Lecture caractre par caractre Pour la lecture, on utilise la classe Reader et ses sous classes FileReader, et on utilise la mthode read() pour lire un caractre (char) dans un flot. La mthode read() renvoie un byte qui reprsente le code du caractre lu en codage unicode. Exemple: Soit Donnes.txt un fichier texte. On dfinit la classe LecteurCaracteres qui lit le fichier Donnes.txt caractre par caractre et le programme se termine quand on arrive la fin du fichier (la mthode read() renvoi -1).

El Mostafa DAOUDI- p. 429

import java.io.*; public class LecteurCaracteres { public static void main(String[] arguments) throws IOException { FileReader monFichier = new FileReader("D:\\Donnees.txt"); int c; // c reprsente le code unicode du caractre lu while ((c= monFichier.read())!=-1) { System.out.println((char)c); // on affiche la caractre lu } // Fin du while monFichier.close(); } // Fin de la mthode main() } Question: refaire la mme classe en attrapant les exceptions
El Mostafa DAOUDI- p. 430

215

2. Flux tampon de caractre: La classe BufferedReader permet de remplir rapidement la mmoire tampon avec des donnes de FileReader. Les donnes sont d'abord transport du FileReader dans le BufferedReader, puis on utilise la mthode read() pour lire les donnes partir du buffer. La classe BufferedWriter permet dcrire rapidement partir de la mmoire tampon avec des donnes de FileWriter. Les donnes sont d'abord transport du FileWriter dans le BufferedWriter, puis on utilise la mthode write() pour crire les donnes dans le buffer. Exemple: On reprend lexemple prcdent, dans ce cas la classe LecteurCaracteres lit le fichier Donnes.txt ligne ligne et le programme se termine quand la mthode readLine() renvoie null, ce qui signifie la fin de fichier.
El Mostafa DAOUDI- p. 431

import java.io.*; public class LecteurScores { public static void main(String[] arguments) throws IOException { FileReader monFichier = null; BufferedReader tampon = null; monFichier = new FileReader("D:\\Donnees.txt"); tampon = new BufferedReader(monFichier); String ligne; while ((ligne = tampon.readLine())!=null) { // Lit une ligne de Donnees.txt et vrifie la fin de fichier System.out.println(ligne); } // Fin du while tampon.close(); monFichier.close(); } // Fin de la mthode main() } Question: refaire la mme classe en attrapant les exceptions
El Mostafa DAOUDI- p. 432

216

3. Ecriture dun fichier texte Si on (le programme) veut criure un fichier texte sur un disque, utilise la mthode write() surcharge de la classe FileWriter et lun des constructuers de la classe FileWriter Constructeur un seul argument de la classe FileWriter Syntacxe: FileWriter(Nom du fichier Fichier) - Si le fichier dont le nom est donn en argument nexiste pas, alors il sera cr. - Si le fichier dont le nom est donn en argument existe, alors il sera remplac par les nouvelles donnes chaque exuction du programme. Constructeurs deux arguments de la classe FileWriter Syntacxe: FileWriter(Nom du fichier Fichier, boolean append) Si append vaut true, alors on ajoute des donnes la fin d'un fichier existant.
El Mostafa DAOUDI- p. 433

Exemple: La classe EcrireFichierTexte crit trois lignes dans le fichier D:\Donnees.txt partir dun tableau.
import java.io.* public class EcrireFichierTexte { public static void main(String[] arguments) throws IOException { FileWriter fichierSortie = null; BufferedWriter tampon = null; String[] tab = new String[3]; // Saisi des lments du tableau tab tab[0]="Mohammed 25-12_1959"; tab[1]="Ali 30-01-2001"; tab[2]="Fatima 26-08-1940";

El Mostafa DAOUDI- p. 434

217

try { fichierSortie = new FileWriter( D:\\Donnees.txt"); tampon = new BufferedWriter(fichierSortrie); for (int i=0; i < tab.length; i++) { // Ecrit le tableau de chanes dans Donnees.txt tampon.write(tab[i]); } System.out.println("Ecriture du fichier termine."); } catch (IOException exception) { exception.printStackTrace(); } finally { try { tampon.flush(); tampon.close(); monFichier.close(); } catch (IOException e1) { e1.printStackTrace(); } } } // Fin de la mthode main() }
El Mostafa DAOUDI- p. 435

IV. Classe File (fichier)


Java dispose dune classe File du paquetage java.io qui offre des fonctionnalits de gestion de fichiers: par exemple renommer un fichier, supprimer un fichier, de vrifier si le fichier existe, etc. - La cration dun objet de type File File monFichier = new File( smi.dat"); Attention : ne pas confondre la cration de lobjet avec la cration du fichier physique Le constructeur de la classe File ne cre pas rellement un fichier, mais il cre en mmoire une instance de cet objet qui pointe sur le fichier rel. Si on veut crer un fichier sur le disque, on utilise la mthode createNewFile(). Voici quelques unes des mthodes utiles de la classe File.
El Mostafa DAOUDI- p. 436

218

Mthodes createNewFile() delete() renameTo() length() exists() list() lastModified() mkDir()

Fonctionnalits Cre un nouveau fichier, vide, du nom utilis pour l'instanciation de la classe File. Ne cre un nouveau fichier que s'il n'existe pas dj un fichier du mme nom. Supprime un fichier ou un rpertoire. Renomme un fichier. Retourne la longueur d'un fichier en octets. Retourne true si le fichier existe. Retourne un tableau de chanes contenant les noms des fichiers/rpertoires contenus dans un rpertoire donn. Retourne l'heure et la date de dernire modification du fichier. Cre un rpertoire.
El Mostafa DAOUDI- p. 437

Exemple : Ecrire un programme qui enregistre des donnes dans un fichier. Le programme affiche un message pour avertir l'utilisateur si le fichier existe dj. Etapes: - crer une instance de la classe File en lui donnant le nom du fichier. - appeler la mthode exists(). Cette mthode retourne true, si le fichier existe. File monFichier = new File( smi.txt"); if (monFichier.exists()) { // Affiche un message davertissement. }
El Mostafa DAOUDI- p. 438

219

L'extrait des instructions suivantes permet de renommer le fichier Donnees.txt en Donnees_v1.txt . File fichier = new File(" Donnees.txt"); File fichierNouveau = new File(" Donnees_v1.txt"); if (fichier.exists()) { fichier.renameTo(fichierNouveau); }

El Mostafa DAOUDI- p. 439

L'extrait des instructions suivantes permet renomme le fichier clients.txt en clients.txt.bak. Si le fichier .bak existe dj, il est remplac. File fichier = new File("clients.txt"); File sauvegarde = new File("clients.txt.bak"); if (sauvegarde.exists()) { sauvegarde.delete(); } fichier.renameTo(sauvegarde);

El Mostafa DAOUDI- p. 440

220