You are on page 1of 150

Support de cours Java

Structures de donnes Notions en Gnie Logiciel et Programmation Oriente Objet H. Mounier Universit Paris Sud

Notations
Les sigles suivants seront frquemment utiliss Point notable, auquel il faut prter attention Point positif, agrable, du langage Point ngatif, dsagrable, du langage Implication logique

Tout code source java sera crit dans une police particulire, type courier. Une notion dnie, explique ou prcise apparatra comme ceci. Des termes jugs importants apparatront comme ceci. Des termes jugs cruciaux apparatront comme ceci.

Table des matires

Table des matires I Entre en matire I.1 Quest-ce que Java, en trois lignes . . . . . . . . . . . . . . . . . I.2 Exemples de Hello World en dirents langages . . . . . . . . I.3 Un autre exemple . . . . . . . . . . . . . . . . . . . . . . . . . . Historique et proprits de Java II.1 Proprits du langage ; Technologies disponibles . . . . . . . . . II.2 Manifeste en 11 points . . . . . . . . . . . . . . . . . . . . . . .

ii 1 1 1 4 7 7 9 15 15 23 25 25 30 34 39 39 41 42 47 49 49 51 56

II

III Paquetages de Java III.1 Technologies et paquetages . . . . . . . . . . . . . . . . . . . . . III.2 Sources de documentation externes . . . . . . . . . . . . . . . . IV Bases procdurales de Java IV.1 Variables et types de donnes . . . . . . . . . . . . . . . . . . . IV.2 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV.3 Contrle de ux . . . . . . . . . . . . . . . . . . . . . . . . . . . V Notions de gnie logiciel V.1 La lgende des sept singes . . . . . V.2 Buts du gnie logiciel . . . . . . . . V.3 Principes de gnie logiciel . . . . . V.4 Stratgie de dveloppement oriente

. . . . . . . . . . . . objet

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

VI Notions de programmation oriente VI.1 POO, Objets, Classes . . . . . . . . VI.2 Type ou classe ; objet . . . . . . . . VI.3 Relations . . . . . . . . . . . . . . ii

objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

iii VII Bases orientes objet de Java VII.1 Classes et objets Java . . . . VII.2 Hritage . . . . . . . . . . . VII.3 Surcharge, rednition . . . VII.4 Paquetages et interfaces . . 61 61 68 69 77 83 83 91 91 94 95 99 109 109 111 116 125 139 141

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

VIIIExceptions VIII.1 Fonctionnement gnral du systme dexceptions . . . . . . . . . IX Classes utilitaires de base IX.1 Classes Object, System, PrintStream . . . . . . . . . . . . IX.2 Mthode main() et classes demballage des types primitifs IX.3 Scanner (java.util.Scanner) . . . . . . . . . . . . . . . . IX.4 Classes java.applet.Applet et java.lang.String . . . . X java.util : Conteneurs et autres utilitaires X.1 Classes de java.util ; Classes et interfaces de comparaison X.2 Classes et interfaces conteneurs . . . . . . . . . . . . . . X.3 Conteneurs de type Map . . . . . . . . . . . . . . . . . . X.4 Conteneurs de type Collection et Listes . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Bibliographie Index

Prface
Ces notes de cours rassemblent des lments de base du langage Java. Les chapitres I, II et III sont introductifs ; les chapitres V et VI introduisent des concepts gnraux essentiels en programmation, indpendamment de tout langage ; enn les chapitres IV, VII, VIII, IX et X fournissent de manire concrte les bases du langage. Aprs les trois premiers chapitres qui donnent des aperus gnraux sous divers angles, le chapitre IV expose les bases purement procdurales (c..d. non oriente objet) du langage. Au chapitre V des notions de gnie logiciel gnriques sont exposes. Le chapitre suivant contient des dnitions prcises de ce que sont une classe, un objet, ainsi que les relations (notamment lhritage) qui les relient. La substance concrte de ce qui est dcrit au chapitre VI fait lobjet du chapitre VII. Le mcanisme dexceptions de Java est ensuite expos au chapitre VIII. Diverses classes utilitaires simples sont donnes au chapitre IX. Enn, le chapitre X concerne les classes de Java implantant diverses structures de donnes (telles les tableaux dynamiques, les listes, les tables de hachage, les arbres) et algorithmes (tels le tri) associs.

I Entre en matire
Rfrences bibliographiques
Java examples in a Nutshell, D. Flanagan, 2ime dition [Flaa]

I.1

Quest-ce que Java, en trois lignes

Le dbut de louvrage de rfrence, The Java Language Specication par J. Gosling, B. Joy et G. Steele [GJS96] rsume fort bien lesprit dans lequel le langage a t conu ainsi que le but poursuivi : Java is a general purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve uency in the language. Java is related to C and C++ but is organized rather dierently, with a number of aspects of C and C++ ommited and a few ideas from other languages included. Java is intended to be a production language, not a research language, and so, as C.A.R. Hoare suggested in his classic paper on language design, the design of Java has avoided including new and untested features.

I.2

Exemples de Hello World en dirents langages

2.1 Avec OSF/Motif widgets


#include #include #include #include #include #include <X11/Intrinsic.h> <X11/StringDefs.h> <Xm/Xm.h> <Xm/Form.h> <Xm/Label.h> <Xm/PushB.h>

Support de cours Java

typedef struct APP_DATA { char *mtext; char *etext; } APP_DATA, *P_APP_DATA; static XrmOptionDescRec options[] = { /* options de la ligne de commande */ {"-mtext", "*mtext", XrmoptionSepArg, NULL}, {"-etext", "*etext", XrmoptionSepArg, NULL} }; static XtResource resources[] = { /* ressources */ {"mtext", "Mtext", XtRString, sizeof(String), XtOffset(P_APP_DATA, mtext), XtRString, "Maison pauvre, voie riche"}, {"etext", "Etext", XtRString, sizeof(String), XtOffset(P_APP_DATA, etext), XtRString, "Quitter"} }; static Arg args[10]; /* arguments passes aux widgets */ static void quit_action(Widget w, caddr_t client_data, XmAnyCallbackStruct *call_data); void main(int argc, char *argv[]) { APP_DATA data; Widget main_widget, form_widget, hello_message, exit_button; main_widget = XtInitialize(argv[0], "Xmhello", options, XtNumber(options), &argc, argv); XtGetApplicationResourceds(main_widget, &data, resources, XtNumber(resources), NULL, 0); form_widget = XtCreateManagedWidget("Form", xmFormWidgetClass, main_widget, NULL, 0); XtSetArg(args[0], XmNtopAttachment, XmATTACH_FORM); XtSetArg(args[1], XmNleftAttachment, XmATTACH_FORM); XtSetArg(args[2], XmNLabelString, XmStringCreateLtoR(data.etext, XmSTRING_DEFAUKT_CHARSET)); exit_button = XtCreateManagedWidget("Exit", xmPushButtonWidgetClass, form_widget, (ArgList) args, 3); XtAddCallback(exit_button, XmNactivateCallback, quit_action, NULL); XtSetArg(args[0], XmNtopAttachment, XmATTACH_WIDGET); XtSetArg(args[1], XmNtopWidget, exit_button);

I.2 Exemples de Hello World en dirents langages


XtSetArg(args[2], XmNleftAttachment, XmATTACH_FORM); XtSetArg(args[3], XmNrightAttachment, XmATTACH_FORM); XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM); XtSetArg(args[5], XmNLabelString, XmStringCreateLtoR(data.mtext, XmSTRING_DEFAUKT_CHARSET)); hello_message = XtCreateManagedWidget("Hello", xmLabelWidgetClass, form_widget, (ArgList) args, 6); XtRealizeWidget(main_widget); XtMainLoop(); } static void quit_action(Widget w, caddr_t client_data, XmAnyCallbackStruct *call_data) { XtCloseDisplay(XtDisplay(w)); exit(0); }

Avantage : souple. Dsavantages : code long, ne fonctionne que sous XWindows (pas sur

Macintosh ou Windows 98). Remarque : code 3 fois plus long en Xlib.

2.2 Hello world en Tcl/Tk


Tcl : langage de commandes interprt, peu structur. Tk : bibliothque

graphique.
Code dune fentre simple

proc helloWorld { toplevel .helloworld label .helloworld.label -text "La haine seule fait des choix" button .helloworld.button -text "Quitter" -command exit pack .helloworld.label .helloworld.button }
Avantage : codage de mini applications simple. Dsavantage : Langage de mauvaise qualit (au sens du gnie logiciel) et

lent.

2.3 Hello world en Java


Code dune fentre simple en Java

4
import java.awt.* import java.awt.event.*

Support de cours Java

class HelloWorld extends CloseableFrame { public void paint(Graphics g) { this.setLayout(new FlowLayout(FlowLayout.CENTER, 15, 15)); button b = new Button("Quitter"); this.add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent a) { System.exit(0); } }); g.drawString("Jour apres jour, cest un bon jour", 75, 100); } public static void main(String args[]) { Frame f = new HelloWorld(); f.show(); } }
Avantages :

Code trs compact (3 fois plus court quen OSF/Motif, 6 fois plus court quen Xlib). Langage de bonne qualit (en gnie logiciel). Ncessairement orient-objet. Fonctionne sans modications sous UNIX, Windows 98/NT, MacOS.

I.3

Un autre exemple

3.1 Applet de gribouillage Java


import java.applet.*; import java.awt.*; import java.awt.event.*; public class Scribble extends Applet { int last_x; int last_y; public void init() { MouseListener ml = new MyMouseListener(this); MouseMotionListener mml = new MyMouseMotionListener(this); this.addMouseListener(ml);

I.3 Un autre exemple


this.addMouseMotionListener(mml); } } class MyMouseListener extends MouseAdapter { private Scribble scribble; public MyMouseListener(Scribble s) { scribble = s; } public void mousePressed(MouseEvent e) { scribble.last_x = e.getX(); scribble.last_y = e.getY(); } } class MyMouseMotionListener extends MouseMotionAdapter { private Scribble scribble; public MyMouseMotionListener(Scribble s) { scribble = s; } public void mouseDragged(MouseEvent e) { Graphics g = scribble.getGraphics(); int x = e.getX(), y = e.getY(); g.drawLine(scribble.last_x, scribble.last_y, x, y); scribble.last_x = x; scribble.last_y = y; } }

II Historique et proprits de Java


Rfrences bibliographiques
Understanding O-O Programming with Java, T. Budd, [Bud98],

II.1

Proprits du langage ; Technologies disponibles

1.1 Oak
Originellement Oak, 1991, James Gosling, Sun Microsystems. But de Oak : langage embarqu pour des appareils de communication (tl-

phone, tlvision, ordinateurs, . . . ).


2 caractristiques cruciales de ce langage embarqu :

taille rduite ( codage compact). abilit ( fonctionnement en mode dgrad, en rponse des exceptions).

1.2 Proprits embarques


Plusieurs proprits de java retent ceci : Langage rduit et simple (notamment en ce qui concerne lesinstructions). Peut tre transform en une reprsentation interne compacte. Pointeurs et goto elimins. Traitement dexceptions partie intgrante du langage ; le programmeur est souvent FORC de grer les exceptions (cest une bonne chose !). 7

Support de cours Java

1.3 Naissance de Java


Java hrite principalement sa syntaxe (procdurale) du C. Langage gnraliste, aussi versatile que C++. Plusieurs simplications notables par rapport au C++. Trs vaste bibliothque de classes standard (plus de 3000 classes dans plus de 160 paquetages pour le JDK 1.5) A partir de 1993, chez Sun, dveloppement pour crer un langage adapt Internet. En 1995, annonce ocielle de Java (concu, entre autres, par James Gosling, Patick Naughton, Crhis Warth, Ed Frank, Mike Sheridan et Bill Joy). Milieu 1996, sortie de Java 1.02, premire version distribue par JavaSoft (liale de Sun). Dbut 1997, sortie de Java 1.1. Beaucoup damliorations signicatives. Premire version tre juge srieuse du langage. t 2004, sortie de Java 1.5 ; diverses amliorations et ajouts intressants.

1.4 Adaptation au web (I)


Pourquoi le caractre embarqu initial de java est-il bien adapt au

Web (transfert de pages HTML et excution de programmes distante via Internet) ? Le schma client/serveur classique est le suivant :[-2.5ex] envoi de requte du client vers le serveur, traitement de la requte par le serveur, envoi de la rponse du serveur au client.

1.5 Adaptation au web (II)


Inconvnients de ce schma :[-2.5ex] temps de transmission souvent lents. Les serveurs peuvent tre chargs (beaucoup de clients servir). les clients sont, par contraste, assez frquemment peu chargs.

1.6 Adaptation au web (III)


Calculs cot client via des applets : plutt que dexcuter le programme et de transmettre la rponse, le serveur transmet le programme. Le programme sexcute localement sur le client. Ainsi : [-3ex] le programme sexcute sur une machine moins charge,

II.2 Manifeste en 11 points

le seul retard est le temps de transmission initial du programme.

Lorsquil y a plusieurs requtes, la 1ere prend du temps, les suivantes ne sourent pas du transfert via Internet.

1.7 Interpteurs de bytecode


Client et serveur peuvent tre sur 2 ordinateurs (processeurs) de types dif-

frents, avec des OS dirents. Le source java doit tre traduit en un bytecode indpendant de la plate forme logicielle et matrielle. Ce bytecode (code dont les instructions sont longues d1 ou 2 octet) est un langage sur une machine imaginaire, une machine virtuelle. Ressemble un assembleur gnrique. Transformation du bytecode en code machine via : [-3ex] des interprteurs. des compilateurs juste--temps (JIT : Just In Time) de performances plus proches dun excutable C ou C++ classique. Apparition de compilateurs natifs, c..d. transformant du code source Java en code machine natif pour tel ou tel processeur (jove ; cygnus, au dessus de gcc, . . . ).

1.8 Scurit
Un programme sexcutant sur un serveur ne peut faire beaucoup de dgts

sur la machine client. Un programme sexcutant cot client peut, en thorie, avoir accs beaucoup de ressources, do un danger. gestionnaire de scurit, sur le client, limitant les actions possibles du programme envoy par le serveur. Par ex., interdiction daccder au systme de chiers ou de transmettre dautres que le client ou le processeur du serveur.

II.2

Manifeste en 11 points

2.1 White paper description


Java est un langage : simple, orient objet, rparti, interprt (ou compil), robuste,

10

Support de cours Java sr, indpendant de larchitecture, portable, ecace multitches ou multi-activits (multi-thread) et dynamique.

2.2 Java est simple

Nombreux mots cls limins. Pas de pr-processeur. Bibliothque trs tendue et directement intgre au langage. Pas de surcharge doprateurs, de fonctions indpendantes, de goto, de structures, dunions ni de pointeurs. Pas de chiers den-tte. Pas dhritage multiple ; la place, notion dinterface, venant dObjective C. Bien moins complexe. Pas de pointeurs visibles au niveau du programmeur. Bien sr, en interne, les pointeurs sont largement utiliss ; mais ceci est cach pour lutilisateur.

Plus simple que C++ :


2.3 Java est orient objet


Les langages C++ et Object Pascal ont construit des caractristiques orientes objet au dessus dun langage qui ne lest pas. En java, on est forc de faire de lorient objet et des bnces comme lencapsulation et la rutilisabilit sont faciles obtenir.

2.4 Java est rparti


Java a t construit avec Internet en tte. Riche bibiothque pour

laccs aux URL (Universal Resource Locators), la programmation client/serveur via des sockets TCP et UDP, lexcution de mthodes distantes (RMI : Remote Method Invocation). la conception dapplications rparties selon le modle despaces (issus du langage Linda) avec JavaSpaces, la gestion de serveurs Web via les Servlets, la communication dobjets distants inter-langages avec des IDL (Interface Denition Language) CORBA (Common Request Broker Architecture),

II.2 Manifeste en 11 points

11

ladministration de rseaux via SNMP (Simple Network Management Protocol) avec JMAPI.

2.5 Java est interprt (ou compil)


Le source java est ventuellement transform en un assembleur dune ma-

chine imaginaire, une machine virtuelle. Cet assembleur, ou bytecode, peut tre interprt. Dsavantage : lenteur dexcution. Notion de compilateur la vole ou juste temps. La Traduction du bytecode au langage machine est eectue juste avant lexcution. Performances avoisinant celles des langages compils classiques. Puis, apparition de compilateurs natifs, avec des performances gales celles du C.

2.6 Java est robuste

Exemples : ouverture dun chier inexistant, division par zro, cration dun point de communication rseau (socket) vers une @IP inexistante, . . . Le programmeur est forc de grer diverses exceptions. Gestion automatique de la mmoire ; prsence dun ramasse-miettes (pas de possibilit de new sans delete). Verication lexcution des compatibilits de type lors dun cast.

Gestion des erreurs matrielles et logicielles, via un mcanisme dexceptions.

2.7 Java est sr


criture mmoire errone : quasi-impossible en java, car pas de pointeurs. Indices de tableau tests avant quils soient rfrencs. Test quune variable a t assigne avant dtre utilise. Bytecode galement test avant dtre excut :

test de bon accs aux classes, tests de congestion et de famine de la pile des oprandes, test de conversion illgale de donnes, test daccs aux ressources : chiers, ...

2.8 Java est indpendant de larchitecture


Le bytecode est indpendant de la plate-forme. Les bibliothques sont intgres de manire standard au langage,

lencontre de C++.

12

Support de cours Java

2.9 Java est portable


Un mme programme peut tre compil sur une machine et excut sur une

autre, quel que soit le processeur ou lOS.


La taille des types de donnes est toujours la mme en java.

2.10 Java est ecace


Initialement, les interprteurs rendaient lexcution de programmes java

lente (environ 20 fois plus lente que du C). Les compilateurs la vole (JIT) la rendent presque aussi rapide que des programmes compils classiques. Des compilateurs natifs, fournissent du code machine natif pour tel ou tel processeur ; performances gales celles du C (jove ; cygnus, au dessus de gcc, . . . ).

2.11 Java est multitches


Lun des premiers langages possder en interne des tches, ou activits

(threads) dexcution. La coordination des activits est aise (moniteurs de Hoare et vnements).

2.12 Java est dynamique


Excution cot client dynamisme plus ais mettre en uvre que dans

dautres langages. Chargement des classes en cours dexcution, lorsque ncessaire, ventuellement travers le rseau. Chargement dynamique des classes possible grce des informations de typage consultables en cours dexcution. La liste est donne par thme, chaque lment tant suivi, entre parenthses, du nom de la technologie Java correspondante. Son ventuelle disponibilit apparat ensuite : au sein du JDK, paquetage optionnel ou extension en accs davant premire.

2.13 Technologies Rseaux


1. Flux de donnes rseau TCP et UDP par sockets (Socket, . . . ; JDK). 2. Appel de mthodes distantes (RMI ou Remote Method Invocation ; JDK).

II.2 Manifeste en 11 points

13

3. Interoprabilit rseau inter-langage via CORBA (IDL ou Interface Denition Langage ; JDK). 4. Appel de mthodes distantes au dessus du protocole Internet dinteroprabilit rseau inter-langage (RMI-IIOP ou Remote Method Invocation over Internet Inter-Orb Protocol ; paquetage optionnel). 5. Fonctions de serveurs HTTP (Java Servlets ; paquetage optionnel).

2.14 Technologies Rseaux (suite)


1. Communication distribue par espaces (JavaSpaces). 2. Applications mutli-agent rseau (JDMK, Java Dynamic Management Kit). 3. Administration distribue (Java Management ; paquetage en accs davant premire). 4. Gestion de courier (Java Mail ; paquetage optionnel). 5. Service de nommage et de rpertoires (JNDI ou Java Naming Directory Interface ; paquetage optionnel).

2.15 Technologies graphiques & sonores


1. Gestion dinterfaces graphiques (AWT ou Abstract Window Toolkit et Swing, formant les JFC ou Java Foundation Classes ; JDK). 2. Composants rutilisables, ditables au sein dun concepteur dinterfaces graphiques ou GUI builder (Java Beans ; JDK). 3. Dessin vectoriel 2D (Java2D ; JDK). 4. Traitement dimages de base (Java advanced imaging ; paquetage optionnel). 5. Synthse dimages et VRML (Java3D ; paquetage optionnel) 6. Gestion multimdia (JMF, Java Media Framework ; extension standard). 7. Synthse vocale (Java Sound).

2.17 Technologies de Scurit


1. Liste de contrle daccs ou ACLs (JDK) 2. Authentication et autorisation (JAAS ou Java Authentication and Authorization Service ; paquetage en accs davant premire) 3. Flux rseau scuris par des SSL ou Secure Socket Layer (JSSE ou Java Secure Socket Extension ; paquetage en accs davant premire) 4. Cryptographie (JCE ou Java Cryptography Extension ; extension standard)

14

Support de cours Java

2.18 Technologies de Gestion de donnes


1. Structures de donnes de base (listes, arbres, tables de hachage) et tri (Collections ; JDK) 2. Accs des bases de donnes par SQL (JDBC ou Java Database Connectivity ; JDK)

III Paquetages de Java


Rfrences bibliographiques
Voir http ://www.java.sun.com

III.1

Technologies et paquetages

1.1 Aperu des technologies disponibles


La liste est donne par thme, chaque lment tant suivi, entre parenthses, du nom de la technologie Java correspondante. Sa ventuelle disponibilit apparat ensuite : au sein du JDK extension standard ou paquetage optionnel. Rseaux : 1. Flux de donnes rseau TCP et UDP par sockets (Socket, . . . ; JDK) 2. Appel de mthodes distantes (RMI ou Remote Method Invocation ; JDK) 3. Interoprabilit rseau inter-langage via CORBA (IDL ou Interface Denition Langage ; JDK) 4. Fonctions de serveurs HTTP (Java Servlets ; extension standard) 5. Communication distribue par espaces (JavaSpaces) 6. Applications mutli-agent rseau (JDMK, Java Dynamic Management Kit) 7. Administration distribue (JMX ou Java Management eXtension ; extension standard) 8. Gestion de courier (Java Mail ; extension standard) 9. Service de nommage et de rpertoires (JNDI ou Java Naming Directory Interface ; extension standard)
Graphique, images et sons :

15

16

Support de cours Java 1. Gestion dinterfaces graphiques (AWT ou Abstract Window Toolkit et Swing, formant les JFC ou Java Foundation Classes ; JDK) 2. Composants rutilisables, ditables au sein dun concepteur dinterfaces graphiques ou GUI builder (Java Beans ; JDK) 3. Dessin vectoriel 2D (Java2D ; JDK) 4. Traitement diamges de base (Java advanced imaging ; extension standard) 5. Synthse dimages et VRML (Java3D ; extension standard) 6. Gestion multimdia (JMF, Java Media Framework ; extension standard ) 7. Synthse vocale (Java Sound)
Scurit :

1. Liste de contrle daccs ou ACLs (JDK) 2. Authentication et autorisation (JAAS ou Java Authentication and Authorization Service) 3. Flux rseau scuris par des SSL ou Secure Socket Layer (JSSE ou Java Secure Socket Extension ; paquetage optionnel) 4. Cryptographie (JCE ou Java Cryptography Extension ; extension standard)
Gestion de donnes :

1. Structures de donnes de base (listes, arbres, tables de hachage) et tri (Collections ; JDK) 2. Accs des bases de donnes par SQL (JDBC ou Java Database Connectivity ; JDK)

1.2 Paquetages du JDK 1.5


JDK : Java Development Kit, Versions de rfrence du langage, tel que produit par Sun.
Paquetage java.applet

java.awt

But Fournit les classes ncessaires pour crer une applet et celles quune applet utilise pour communiquer avec son contexte. Contient toutes les classes pour crer des interfaces graphiques et pour dessiner des graphiques et des images (API de base ; voir swing plus loin).

III.1 Technologies et paquetages


java.awt.color java.awt.datatransfer java.awt.dnd

17
Classes pour les couleurs. Interfaces et classes pour le transferts de donnes entre applications. Drag and Drop ou glisser-placer un lment graphique laide dun pointeur (en gnral la souris). Interfaces et classes de gestion des dirents vnements associs aux composants AWT. Interfaces et classes relies aux polices de caractres. Classes Java 2D pour dnir et raliser des oprations sur des objets bi-dimensionnels. Classes et interfaces du cadre de mthodes dentre (input method framework). Ce cadre permet des composants de recevoir des entres clavier en Japonais, Chinois ou Coren (pour lesquelles il faut plusieurs touches pour un caractre). Interfaces permettant le dploiement dentres pour tout environnement dexcution Java. Classes pour crer et modier des images. Classes et interfaces pour produire des images indpendantes du rendu (du prihrique dafchage ou dimpression). Classes et interfaces pour une API gnrale dimpression. Classes relies au dveloppement de composants beans (composants rutilisables pouvant tre dits graphiquement). Classes et interfaces relis un contexte de bean (conteneur qui dnit un environnement dexcution du ou des bean(s) quil contient). Entres/sorties systmes au travers de ux de donnes, de la srialisation et le systme de chiers. Classes fondamentales du langage Java. . Classes dagents dinstrumentation de programmes tournant sur une JVM. Gestion de la machine virtuelle et du systme dexploitation hte.

java.awt.event java.awt.font java.awt.geom java.awt.im

java.awt.im.spi

java.awt.image java.awt.image.renderable

java.awt.print java.beans

java.beans.beancontext

java.io

java.lang java.lang.annotation java.lang.instrument java.lang.management

18
java.lang.ref

Support de cours Java


Fournit des classes de rfrences des objets, supportant un certain degr dinteraction avec le ramasse-miettes. Classes et interfaces pour obtenir des informations de reexion sur les classes et les objets. Classes pour de larithmtique entire et dcimale en prcision arbitraire. Classes pour des applications rseaux via des sockets. Classes de tampons, conteneurs de donnes. Classes de canaux connectant des ux dentre/sortie comme des chiers ou des sockets. Fournisseur de service pour les canaux. Classes de codage/dcodage octet/Unicode. Fournisseur de service pour les codeurs/dcodeurs. Fournit le paquetage RMI (Remote Method Invocation) dappel de procdure distante pour des applications rseaux. Support pour lactivation dobjets RMI. Classes et interfaces pour le ramasse-miettes distribu utilis par RMI. Une classe et deux interfaces pour le registre RMI. Classes et interfaces de support pour les serveurs RMI. Classes et interfaces pour le cadre de scurit. Les classes et interfaces de ce paquetage ont t redues obsoltes par les classes de java.security. Classes et interfaces pour analyser et grer les certicats. Interfaces pour gnrer des cls RSA (algorithme AsymmetricCipher de Rivest, Shamir et Adleman). Classes et interfaces pour des spcications de cls et des spcications de paramtres dalgorithmes. Fournit le paquetage JDBC. Classes et interfaces pour gre du texte, des dates, des nombres et des messages dune manire indpendante de la langue.

java.lang.reflect

java.math java.net java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.rmi

java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.security java.security.acl

java.security.cert java.security.interfaces

java.security.spec

java.sql java.text

III.1 Technologies et paquetages


java.util

19
Contient le cadre des collections, le modle dvnements, des utilitaires de gestion du temps et de la date ainsi que dautres utilitaires divers (un analyseur lexical, un gnrateur de nombres alatoires et un tableau de bits). Classes de programmation concurrente. Classes de programmation sans verrou adaptes la multiplicit des threads (lock-free and thread-safe). Classes de verrou et dattente (distinctes des synchronisation (synchronized) et moniteurs de Hoare (wait())). Classes pour lire et crire dans des chiers JAR (Java ARchive), bas sur le standard de chier ZIP avec un chier optionnel de manifeste. Classes de sauvegarde en ligne (logging). Classes de sauvegarde et restauration des prfrences utilisateur et systme. Classes de manipulation des expressions rgulires. Classes pour lire et crire dans des chiers JAR (Java ARchive), bas sur les standards de chier ZIP et GZIP. Dnit un contrat entre des composants dinterface utilisateur et des technologies dassitance (par exemple aux personnes handicapes). Classes de cryptographie. Classes dinterfaces pour les cls de DieHellman. Classes de spcication de cls et de paramtres dalgorithme. Classes dentres/sorties dimages. Classes de gestion dvenements synchrone durant la lecture et lcriture dimages. Classes de lecture et dcriture de mtadonnes dimages. Classes de plugin BMP. Classes de plugin JPEG. Classes de interfaces pour les lecteurs, crivains, transcodeurs et ux dimages.

java.util.concurrent java.util.concurrent.atomic

java.util.concurrent.locks

java.util.jar

java.util.logging java.util.prefs java.util.regexp java.util.zip

javax.accessibility

javax.crypto javax.crypto.interfaces javax.crypto.spec javax.imageio javax.imageio.event javax.imageio.metadata javax.imageio.plugins.bmp javax.imageio.plugins.jpeg javax.imageio.spi

20
javax.imageio.stream javax.management javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote javax.management.remote.rmi

Support de cours Java


Classes dentres/sorties image bas niveau partir de chiers et de ux. Classes JMX de base. Classes de chargement dynamique avanc. Classes de dniton de ModelMBean. Classes de dnition des moniteurs. Classes de types ouverts et descripteurs mbean ouverts (open). Classes de dnition du service de relation. Interfaces pour laccs distant aux serveurs MBean JMX. Connecteur pour lAPI JMX distante utilisant les RMI pour la transmission des requtes un serveur MBean. Classes de dnition dun timer MBean. Classes et interfaces daccs aux services de nommage. Classes hritant de javax.naming pour laccs aux services de rpertoires. Classes de gestion des vnements lors de laccs aux services de nommage. Classes de gestion de LDPAv3. Classes de chargement dynamique des services de nommage. Classes pour les applications rseaux. Classes du paquetage de sockets scurises. Classes de gestion dimpression. Classes de types dattributs du service dimpression. Classes dattributs dimpression spciques. Classes dvnements et dauditeurs pour impression. Classes de gestion des RMI-IIOP. Classes portables RMI-IIOP. Classes dautentication et dautorisation. Classes de collecte dinformation (nom, mot de passe, etc.) et dachage (erreurs, avertissements, etc.). Classes utilitaires relies au protocole Kerberos. Classes dautentication dynamiquement chargeable.

javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi javax.rmi.CORBA javax.security.auth javax.security.auth.callback

javax.security.auth.kerberos javax.security.auth.login

III.1 Technologies et paquetages


javax.security.auth.spi javax.security.auth.x500 javax.security.cert javax.security.sasl javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.sql javax.sql.rowset javax.sql.rowset.serial javax.sql.rowset.spi javax.swing

21
Classes dinterface pour implanter des modules dautentication. Classes de gestion X500 (Principal and Private Credentials). Classes de certicats cl publique. Classes de gestion de SASL. Classes et interfaces dentre/sortie, de squenage et de synthse de donnes MIDI. Classes de gestion dimplantation de priphriques MIDI. Classes dacquisition, de traitement et de rejeu de donnes audio chantillonnes. Classes de gestion dimplantation de priphriques audio. Classes daccs de donnes cot serveur. Classes de gestion de JDBC RowSet. Classes de srialisation entre types SQL et types Java . Classes de gestion dimplantation de fournisseur de synchronisation. Ensemble de composants lgers (entirement Java) qui se comportent de manire quasi-identique sur toutes les plates-formes. Classes et interfaces pour acher des bodures autour dun composant Swing. Classes et interfaces utilises par le composant JColorChooser. vnements crs par des composants Swing. Classes et interfaces utilises par le composant JFileChooser. Une interface et plusieurs classes abstraites utilises par Swing pour fournir des possibilits de rendu adaptables (pluggable look-andfeel capabilities). Objets dinterface utilisateur construits conformment au rendu standard (the Basic look-and-feel). Objets dinterface utilisateur construits conformment au rendu mtallique (metal look-and-feel). le rendu (look and feel) multiplex permet un utilisateur de combiner un rendu auxiliaire avec le rendu par dfaut.

javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf

javax.swing.plaf.basic

javax.swing.plaf.metal

javax.swing.plaf.multi

22
javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo

Support de cours Java


Rendu (look and feel) dans lequel lachage (paint) est dlgu. Classes et interfaces pour grer les java.awt.swing.JTable. Classes et interfaces pour grer des composants textes ditables ou non. Classe HTMLEditorKit et ses classes de support pour crer des diteurs de texte HTML. Classes et interfaces pour analyseur de documents HTML. Classe RTFEditorKit pour crer des diteurs de texte au format RTF (Rich-Text-Format). Classes et interfaces pour grer les java.awt.swing.JTree. Support pour les possibilits de undo/redo dans une application (comme un diteur de texte). Trois exceptions leves par lORB pendant la dsrialisation. Dnit le contrat entre le gestionnaire de transactions et le gestionnaire de ressources pour lenregistrement et le dsenregistrement au sein de transactions JTA. Constantes des spcications XML. Types de donnes XML. Espace de nommage XML. Traitement de donnes XML. Transformations de donnes. Transformations de type DOM. Transformations de type SAX2. Transformations de type ot et URI. Validation de langage. API pour XPath 1.0. Utilisation portable dautentication, de donnes intgres et de donnes condentielles. Correspondance entre les API de lOMG CORBA et Java, incluant la classe ORB (Object Request Broker). Paquetages de lOMG (27 paquetages). Interfaces pour DOM au sein dXML. . . API pour SAX.

javax.transaction javax.transaction.xa

javax.xml javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stream javax.xml.validation javax.xml.xpath org.ietf.jgss org.omg.CORBA

org.omg.XXXX org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.ls org.xml.sax

III.2 Sources de documentation externes


org.xml.sax.ext org.xml.sax.helpers

23
Gestionnaires SAX2 optionnels. Classes daide SAX.

III.2

Sources de documentation externes

2.1 Sites importants


Le site Sun

http ://www.javasoft.com
Les API Java XX (par ex. 1.5) de Sun

http ://www.javasoft.com/products/jdk/XX/docs/api/index.html
Lalmanach Java, une liste de mini exemples pour chaque classe du langage.

Trs utile
http ://javaalmanac.com/
Divers cours sur Java, en franais

http ://java.developpez.com/cours/

2.2 Sites utiles


La documentation gnrale indique par Sun

http ://java.sun.com/docs/
Les tutoriels

http ://java.sun.com/docs/books/tutorial
Documentations ENST, dont le JDK et le Java Tutorial de Sun

http ://www-inf.enst.fr/softs/
Compilateur GNU pour Java, GCJ (compilation en code machine)

http ://gcc.gnu.org/java/
Plusieurs cours sur les rseaux de lUREC

http ://www.urec.fr/cours/
Java-Linux

http ://www.blackdown.org
Liens sur Java

http ://www.webreference.com/programming/java.html
Cours en ligne sur Java

http ://www.eteks.com
Beaucoup de liens sur Java

www.teamjava.com/links
Les RFC en HTML luniversit dOhio

http ://www.cis.ohio-state.edu/hypertext/information/rfc.html

24
Plus de 16 000 liens sur les objets et composants

Support de cours Java

http ://www.sente.ch/cetus/software.html

IV Bases procdurales de Java


Rfrences bibliographiques
The Java Language Specication, J. Gosling, B. Joy et G. Steele [GJS96], Java in a Nutshell, D. Flanagan [Flab].

IV.1

Variables et types de donnes

1.1 Identicateurs
Identicateur : suite de

lettres minuscules ou majuscules, chires, underscore (_) et dollar ($). Un identicateur ne doit pas commencer par un chire. Java distingue minuscules et majuscules (Valeur dire de VALEUR). Conventions Toute mthode publique et variable dinstance commence par une minuscule. Tout changement de mot descriptif se fait via une majuscule. Exs. : nextItem, getTimeOfDay. Variables locales et prives : lettres minuscules avec des underscores. Exs. : next_val, temp_val. Variables dites final reprsentant des constantes : lettres majuscules avec underscores. Exs. : DAY_FRIDAY, GREEN. Tout nom de classe ou dinterface commence par une majuscule. Tout changement de mot descriptif se fait via une majuscule. Exs. : StringTokenizer, FileInputStream. 25

26

Support de cours Java

1.2 Reprsentation littrale


Entiers :

les valeurs octales commencent avec un 0. Ainsi 09 gnre une erreur : 9 en dehors de la gamme octale 0 7. Ajouter un l ou L pour avoir un entier long. Nombres virgules : par dfaut des double. Ajouter un f ou F pour avoir un float. boolens : 2 valeurs possibles, true et false. true (resp. false) nest pas gal 1 (resp. 0). Chanes de caractres : doivent commencer et se terminer sur la mme ligne . . . Caractres : unicode (sur 16 bits), manipulables comme des entiers, par a, @, . . .

Squence escape \ddd \uxxxx \ \" \\ \r \n \f \t \b

Description Caractre octal ddd Caractre hexadcimal unicode xxxx Apostrophe Guillemets Backslash (barre oblique inverse) Carriage return New line Form feed Tabulation Backspace

1.3 Variables
exemple (Pythagore) :

class Variables { public static void main(String args[]) { double a = 3; double b = 3; double c; c = Math.sqrt(a*a + b*b); System.out.println("c = " + c); } }

IV.1 Variables et types de donnes

27

Rgles de visibilit usuelles pour une variable dnie lintrieur dun bloc

entre {}.
Une variable ne peut avoir le mme nom quune dclare dans un bloc

englobant :
class Scope { public static void main(String args[]) { int var = 3; { int var = 2; // Erreur de compilation } } }

1.4 Mots cls du langage


Attention a ne pas utiliser comme nom de variable un mot cl rserv, dont voici la liste :
abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static super switch synchronized this throw throws transient try void volatile while

1.5 Nature des variables


On distingue 7 natures de variables : les variables dinstance les variables de classe les variables de type tableau les paramtres des mthodes les parametres des constructeurs les variables de type exception les variables locales

28

Support de cours Java

1.6 Types primitifs


Dans certains langages 2+2 : appel de la mthode plus sur une instance

dobjet reprsentant deux, passant une autre instance de deux . . .


Pour des raisons de performance : types primitifs en java, strictement

analogues aux types correspondants dans des langages non orients objets.
Huit types primitifs :

Entiers : byte, short, int et long, tous signs. Nombres virgule ottante : float et double. Caractres : char. boolens : boolean, pour les valeurs logiques.

1.7 Types entiers et ottants


Toute assignation, explicite ou par passage de paramtres, fait lobjet

dune vrication de type.


Pas de coercition ou de conversion systmatique. Une dirence de type est

une erreur de compilation, pas un avertissement (warning).


Types de donnes entiers :

byte : nutiliser que pour des manipulations de bits. short : relativement peu utilis car sur 16 bits. int : dans toute expression avec des byte, short, int, tous sont promus des int avant calcul.

1.8 Plages de variation


Nom long int short byte double float Taille 64 bits 32 bits 16 8 64 32 bits bits bits bits Plage de variation -9 223 372 036 854 775 808. . . 9 223 372 036 854 775 807 -2 147 483 648 . . . 2 147 483 647 -32 768 . . . 32 767 -128 . . . 127 1.7e-308 . . . 1.7e308 3.4e-38 . . . 3.4e+38

IV.1 Variables et types de donnes

29

1.9 Transtypage (ou conversions, cast)


Conversions possibles en java. Conversion automatique seulement pos-

sible lorsque le compilateur sait que la variable destination est assez grande.
Si des bytes, short, int et long font partie dune expression, tout le monde

est promu long. Si une expression contient un float et pas de double, tout le monde est promu float. Sil y a un double, tout le monde est promu double. Tout littral virgule est considr comme double.

1.10 Caractres
Un caractre est cod par un entier allant de 0 65536 (selon le standard

unicode). On peut se servir des caractres comme entiers :


int trois = 3; char un = 1; char quatre = (char) (trois + un);

Dans quatre : 4. un a t promu int dans lexpression, do la conversion en char avant lassignation.

1.11 Boolens
Type renvoy par tous les oprateurs de comparaison, comme (a < b). Type requis par tous les oprateurs de contrle de ux, comme if, while

et do.

1.12 Tableaux
Cration pouvant tre faite en deux temps :

Dclaration de type, les [] dsignant le type dun tableau


int tableau_entiers[] ; Allocation mmoire, via new tableau_entiers = new int[5] ; Pour les tableaux, la valeur spciale null reprsente un tableau sans au-

cune valeur. Initialisation


int tableau_initialise[] = { 12, 34, 786 };
Vrication par le compilateur de stockage ou de rfrence en dehors des

bornes du tableau.

30

Support de cours Java

1.13 Tableaux multidimensionnels (I)


Tableaux multidimensionnels cres comme

double matrice[][] = new double[4][4];

Ce qui revient
double matrice[][] = new double[4][]; matrice[0] = new double[4]; matrice[1] = new double[4]; matrice[2] = new double[4]; matrice[3] = new double[4];

1.14 Tableaux multidimensionnels (II)


Initialisation par dfaut de tous les lments zro. Des expressions sont permises dans les initialisations de tableaux

double m[][] { { { };

= { 0*0, 1*0, 2*0 }, 0*1, 1*1, 2*1 }, 0*2, 1*2, 2*2 }

IV.2

Oprateurs

2.1 Oprateurs arithmtiques


Op. + * / % ++ Rsultat addition soustraction multiplication division modulo incrmentation Op. += -= *= /= %= Rsultat assignation additive assignation soustractive assignation multiplicative assignation divisionnelle assignation modulo dcrmentation

Les oprateurs arithmtiques fonctionnent comme en C. Une dirence : le modulo agit galement sur les nombres virgule.

Exemple dincrmentation

IV.2 Oprateurs
class IncDec { public static void main(String args[]) { int a = 1; int b = 2; int c = ++b; int d = a++; c++; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); } }

31

La sortie du programme est


Prompt > javac IncDec Prompt > java IncDec a = 2 b = 3 c = 4 d = 1

2.2 Oprateurs entiers sur les bits


On peut manipuler les bits des types entiers long, int, short, char et

byte laide des oprateurs suivants Op. & | >> >>> << Rsultat NON unaire bit--bit ET bit--bit OU bit--bit OU exclusif bit--bit dcalage droite dcalage droite avec remplissage de zros dcalage gauche Op. &= |= ^= >>= >>>= <<= Rsultat assignation avec ET bit--bit assignation avec OU bit--bit assignation avec OU exclusif bit--bit assignation avec dcalage droite assignation avec dcalage droite et remplissage de zros assignation avec dcalage gauche

Visualisation de leet de >>>

int a = -1;

32
a = a >>> 24;

Support de cours Java

donne en forme binaire


11111111111111111111111111111111 >>>24 00000000000000000000000011111111 -1 255

2.3 Oprateurs relationnels


Op. == != > < >= <= Rsultat gal dirent de strictement suprieur strictement infrieur suprieur ou gal infrieur ou gal

Tout type java, y compris les types primitifs et les rfrences des instances

dobjets peuvent tre compars avec == et != Seuls les types numriques peuvent tre compars avec les oprateurs dordre. Les entiers, ottants et caractres peuvent tre compars avec les oprateurs dordre strict. Chaque oprateur renvoie un type boolean.

2.4 Oprateurs boolens logiques


Les oprateurs suivants agissent uniquement sur des oprandes boolean

Op. & &= | |= ^ ^= ||

Rsultat ET logique assignation avec ET OU logique assignation avec OU OU exclusif logique assignation avec OU exclusif OU avec court cricuit

IV.2 Oprateurs
== && != ! ? : gal ET avec court circuit dirent de NON unitaire logique if-then-else ternaire

33

les courts circuits (&& et ||) fonctionnent comme en C (la deuxime oprande

est excute conditionnellement la valeur boolenne de la premire). Ansi le code suivant ne gnre pas derreur lexcution.
if (denom != 0 && num / denom > 10)

Les versions non court circuites donnent lieu valuation des deux oprandes. Le code suivant gnre une erreur
if (denom != 0 & num / denom > 10) java.lang.ArithmeticException : / by zero

Toujours utiliser les versions court circuites (&& et ||), nutilisant

les versions mono-caractre que dans le cas doprations bit--bit. Loprateur if-then-else ternaire ( ? :) fonctionne comme en C. Par exemple
ratio = (denom == 0 ? 0 : num / denom) ;

2.5 Priorit des oprateurs


Priorit haute [] . ()1 ++ * / % + >>>>> << > >= < == != & | && || ? : = op= Priorit basse
1

Sens de priorit ! - (unaire) () (cast) gauche droite new droite gauche gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite droite gauche

<= instantceof

Appel de mthode.

34

Support de cours Java

IV.3

Contrle de ux

3.1 Instruction if-else


Forme strictement analogue celle du C

if ( expression-booleenne ) expression1; [ else expression2; ]


expressioni peut tre une expression compose entoure de {}. expression-booleenne est toute expression renvoyant un boolean. Il est de BONNE PRATIQUE dentourer daccolades une expres-

sion mme si elle nest pas compose. Ce qui permet, lorsque lon veut rajouter une expression, de ne rien oublier, comme cest le cas ci-aprs

3.2 Instruction if-else


int octetsDisponibles; if (octetsDisponibles > 0) { CalculDonnees(); octetsDisponibles -= n; } else attendreDautresDonnees(); octetsDisponibles = n;

o la dernire ligne devrait, daprs lindentation, faire partie du bloc else.

3.3 Instruction break


Utilisation courante strictement analogue celle du C : pour sortir dun

case lintrieur dun switch.


Autre utilisation : sortie dun bloc marqu. Marquage par tiquette : un

identicateur suivi de : plac devant le bloc


class Break { public static void main(String args[]) { boolean t = true; a: { b: { c: { System.out.println("Avant le break"); if (t)

IV.3 Contrle de ux
break b; System.out.println("Jamais execute"); } System.out.println("Jamais execute"); } System.out.println("Apres b:"); } }

35

} break suivi du nom de marquage du bloc permet une sortie du bloc marqu

par cette tiquette. La sortie cran du code est


Avant le break Apres b:
On ne peut se brancher une tiquette qui nest pas dnie devant un

des blocs englobant, sinon break serait identique goto.

3.4 Instruction switch (I)


Forme strictement analogue celle du C

switch ( expression ) { case valeur1 : break; case valeurN : break; default : }


expression peut tre tout type primitif (les valeuri doivent tre du mme

type quexpression) Cest une erreur rpandue que doublier un break. Il est donc de BONNE PRATIQUE dutiliser des commentaires du type // CONTINUER. Exemple dquivalent de wc (word count, comptage du nombre de lignes, mots et caractres) Exemple dquivalent de wc (word count, comptage du nombre de lignes, mots et caractres) class WordCount { static String texte = "Trente rayons convergent au moyeu "mais cest le vide median

" + " +

36 "qui fait marcher le char. "On faconne largile pour en faire des vases, "mais cest du vide interne "que depend leur usage.

Support de cours Java " +"\n"+ " + " + " +"\n"+

"Une maison est percee de portes et de fenetres, " + "cest encore le vide " + "qui permet lhabitat. " +"\n"+ "LEtre donne des possibilites, "cest par le non-etre quon les utilise. "Tao-to king, Lao-tseu, XI static int long = text.length(); " + " +"\n"+ \n";

public static void main(String args[]) { booelan dansMot = false; int nbreCars = 0, nbreMots = 0, nbreLignes = 0; for (int i = 0; i < long; i++) { char c = texte.charAt(i); nbreCars++; switch (c) { case \n : nbreLignes++; // CONTINUER case \t : // CONTINUER case : if (dansMot) { nbreMots++; dansMot = false; } break; default : dansMot = true; } } System.out.println("\t" + nbreLignes + "\t" + nbreMots + "\t" + nbreCars); } // main() } // class WordCount

IV.3 Contrle de ux

37

3.5 Instruction return


Mme usage quen C. Cest une erreur de compilation que davoir du code inatteignable en

java.

3.6 Instructions while/do-while/for


Mmes usages et syntaxe quen C. while

[ initialisation; ] while ( terminaison ) { corps; [ iteration; ] }


do-while

[ initialisation; ] do { corps; [ iteration; ] } while ( terminaison );


for

for (initialisation; terminaison; iteration) corps;

3.7 Instruction continue


Comme pour break, possibilit davoir un nom dtiquette comme argument. Exemple de table de multiplication triangulaire.
class EtiquetteContinue { public static void main(String args[]) { englobante: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j > i) { System.out.println(""); continue englobante; } System.out.println(" " + (i * j)); } } } }

V Notions de gnie logiciel


Rfrences bibliographiques
Object-Oriented Analysis and Design with Applications, G. Booch [Boo94], Design Patterns, E. Gamma, R. Helm, R. Johnson et J. Vlissides [GHJV95], Data Structures, M.A. Weiss [Wei98]

V.1

La lgende des sept singes

1.1 Le petit singe exible


En tant que le dveloppeur vous aurez toujours cinq singes sur votre dos chacun cherchant retenir votre attention : Le singe ponctuel aggrip votre dos, les bras autour de votre cou, beuglant continuellement : tu dois respecter les chances ! Le singe adquat, sur votre tte, tambourine sur sa poitrine et crie : tu doit implanter correctement les spcications ! Le singe robuste, sautant sur le dessus de votre moniteur, hurle : robustesse, robustesse, robustesse ! Le singe performant essaie de grimper le long de votre jambe en vocifrant : noublie pas les performances ! Et de temps en temps, un petit singe, exible, pointe timidement sont nez den-dessous le clavier. ce moment l, les autres singes se taisent et ce calment. Le petit singe sort de sous le clavier, se met debout sur ses pattes, vous regarde droit dans les yeux et dit : Tu dois rendre ton code facile lire et facile modier. Sa phrase peine termine, les autres singes se remettent hurler en sautant sur le petit singe, le forant se terrer nouveau sur le clavier. Les quatre premiers singes reviennent alors leurs activits initiales. Un bon dveloppeur doit trouver un compromis pour rendre les 5 singes heureux. 39

40

Support de cours Java Deux autres singes font une apparition tapageuse de temps en temps : Le singe rutilisable dont le slogan est : Ton code doit tre rutilisable ! Le singe scuritaire : Ton Code doit tre parfaitement sr !

1.2 Un vieux constat lhistoire dAdA


Le respect des essais des chances est souvent une pression commerciale

puissante au dtriment de la qualit dun logiciel.


Linsatisfaction des clients rsultant de singes malheureux tait dj un

constat fait au dpartement de la dfense amricaine : En 1968-1970 au DoD (Departement of Defense) : cots matriels cots logiciels De 1968 1973 : accroissement de 59 % des cots informatiques et baisse trs forte des cots matriels (pour le logiciel, budget en 1970 : 3.109 $, en 1990 30.109 $) ceci pour un produit ni en gnral insatisfaisant : Adquation : non correspondance aux besoins des utilisateurs Fiabilit : logiciel tombant souvent en panne Cot : cots rarement prvisibles, peru comme excessifs Modiabilit : maintenance souvent complexe, coteuse et non able Ponctualit : logiciel souvent en retard ; livr avec des capacits infrieures celles promises Transportabilit : logiciel dun systme rarement utilisable sur un autre Ecacit : non utilisation optimale par le logiciel des ressources disponibles (temps de calcul, RAM) ce qui rend les dirents singes tous malheureux. Cot de maintenance logicielle > cot du dveloppement original. En 1975, un industriel dpense entre 40 et 75 % de son budget informatique pour la maintenance logicielle. En 1973, 450 langages gnraux au DoD. Notamment pour des logiciels embarqus, De 1975 1977, valuation de 2800 langages, aucun rellement appropri, bien que Pascal, ALGOL et PL/1 comportent des lments intressants. En 1977 appels does international, 17 rponses, 4 slectionnes, dont une de CII Honeywell Bull. En 1979 slection nale de la proposition de CII ; le langage, cr par Jean Ichbiah, prend pour nom Ada (Augusta Ada Byron, mathmaticienne ayant travaill avec Babbage sur ses machines direntielle et analytique) En 83, manuel de rfrence Ada, approuv comme norme ANSI, puis en 1987 adopte par lISO

V.2 Buts du gnie logiciel

41

V.2

Buts du gnie logiciel

2.1 Quatre buts gnraux


Pour remdier cet tat de faits, on a cherch identier diverses qualits souhaitables dun logiciel, de faon contenter les sept singes. Dans un article [RGI80], D.T. Ross, J.B. Goodenough et C.A. Irvine donnent 4 buts gnraux : modiabilit ecacit abilit intelligibilit

2.2 Modiabilit
Deux raisons de vouloir modier un logiciel : changement des spcications (par exemple daprs une demande dun client) correction dune erreur Dans un logiciel modiable, on peut introduire des changements sans complexication (ni perte de lisibilit)

2.3 Ecacit
Utilisation optimale des ressources en temps et en espace Pour des systmes

temps rel : dont la ressource en temps est prdominante. Pour des systmes embarqus, o il y a limitation de place (dans un satellite, une automobile) : ressource en espace prdominante On se proccupe souvent trop tt de lecacit, se polarisant de ce fait sur la micro-ecacit au dtriment de la macro-ecacit ; dans [RGI80] : Une bonne perspicacit retant une comprhension plus unie dun problme a beaucoup plus impact sur lecacit nimporte quel tripotage de bits dans une structure dciente

2.4 Fiabilit
Peut-tre critique (systme de navigation dun engin spatial) : La abilit doit la fois viter les dfauts de conception, dtude et de construction, et permettre de rcuprer les pannes et les dfauts de performances (cf. [RGI80]). Pour toute panne, prvisible ou non, le logiciel doit entrer en mode dgrad en douceur, sans eet de bord dangereux (par exemple, une orbite dgrade)

42

Support de cours Java

2.5 Intelligibilit
Sans doute le but le plus crucial pour bien grer la complexit dun systme

logiciel Pour quun systme soit comprhensible, il doit tre un modle exact de notre vue du monde rel Pour amliorer la comprhensiblit : Au bas niveau, lisibilit par un bon style de codage, Au plus haut niveau, il tre facile disoler les structures de donnes (objets) et les actions (oprations) correspondantes celles du monde rel. Le langage choisi est important pour cela.

V.3

Principes de gnie logiciel

3.1 Six principes de gnie logiciel


De bons principes sont ncessaires pour raliser les buts prcdents (cf. [RGI80]), nommment : abstraction dissimulation dinformations modularit localisation uniformit intgralit

3.2 Abstraction et dissimulation dinformation


Abstraction : exemple de systme de chiers

(i) chiers denregistrements (ii) disques logiques (i-noeuds, blocs) (iii) carte contrleur de disque On veut extraire les proprits essentielles en omettant les dtails qui ne le sont pas Au niveau (i) une structure (par exemple une adresse) Au niveau (ii) une suite de blocs Au niveau (iii) une suite de secteurs physiques Pour manipuler chier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture, criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau (iii) : Dplacement de ttes de lecture, lecture ou criture dune suite de bits par tte magntique. Pour manipuler chier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture,

V.3 Principes de gnie logiciel

43

criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau (iii) : Dplacement de ttes de lecture, lecture ou criture dune suite de bits par tte magntique On a donc galement une abstraction des oprations ou abstraction algorithmique. On utilise la dissimulation dinformation : Abstraction extraire les dtails essentiels dun niveau Dissimulation rendre inaccessibles des dtails qui ne doivent dinformations pas inuencer dautres parties du systme Exemple : on ne doit pas permettre un utilisateur (niveau (i)) de pouvoir crire directement sur un disque logique (niveau (ii)). On empche ainsi les modules de haut niveau de reposer directement sur des dtails de bas niveau autre exemple : une pile, code en C supposons avoir un type pile dans
pile.h typedef struct __pile { int elements[TAILLE]; /* donnees, ici un tableau int *dessus; /* bas de la pile; ne varie pas int *dessous; /* haut de la pile; variable } *pile; */ */ */

et avoir dni les oprations


creer_pile(), empiler(), depiler()

Entre ces deux parties de code :


int pile i, elt_pile; ma_pile;

ma_pile = creer_pile(); /* remplissage de la pile */ for(i = 0; i < 100; i++) elt_pile = depiler(ma_pile);

et
int pile elt_pile; ma_pile;

ma_pile = creer_pile(); /* remplissage de la pile */ elt_pile = (ma_pile->elements)[99];

la deuxime solution doit tre rejete. Si lon change la structure de donnes utilise pour une pile (par exemple une liste chane au lieu dun tableau), la dernire partie de code est dsastreuse.

44

Support de cours Java


Labstraction aide la maintenabilit et lintelligibilit en rduisant

le nombre de dtails connatre chaque niveau. La dissimulation dinformations aide la abilit (empcher toute opration non autorise).

3.3 Exemple de pile basique en C


Voici un exemple de pile avec un tableau
#include <stdio.h> #include <stdlib.h> #define TAILLE 200

typedef struct __pile { int elements[TAILLE]; /* donnees, ici un tableau int *dessus; /* bas de la pile; ne varie pas int *dessous; /* haut de la pile; variable } *pile; pile void int void creer_pile(); empiler(pile ma_pile, int i); depiler(pile ma_pile); detruire_pile(pile ma_pile);

*/ */ */

/** initialiser une pile **/ pile creer_pile() { pile nouvelle_pile = (pile) NULL; nouvelle_pile = (pile)calloc(1, sizeof(struct __pile)); if (nouvelle_pile == (pile)NULL) { fprintf(stderr, "Creation de pile impossible\n"); perror("Message systeme : "); exit(1); } /* bas de la pile */ nouvelle_pile->dessous = &(nouvelle_pile->elements)[0]; /* au debut la pile est vide */ nouvelle_pile->dessus = &(nouvelle_pile->elements)[0];

V.3 Principes de gnie logiciel

45

return(nouvelle_pile); }/* creer_pile() */

/** empiler une valeur **/ void empiler(pile ma_pile, int i) { (ma_pile->dessus)++; if( ma_pile->dessus == ((ma_pile->dessous) + TAILLE) ) { printf("Debordement de pile\n"); exit(1); } *(ma_pile->dessus) = i; }/* empiler() */

/** depiler une valeur **/ int depiler(pile ma_pile) { if(ma_pile->dessus == ma_pile->dessous) { printf("Assechement de pile\n"); exit(1); } (ma_pile->dessus)--; return(*((ma_pile->dessus)+1)); }/* depiler() */

/** destruction dune pile **/ void detruire_pile(pile ma_pile) { if (ma_pile == (pile)NULL) { fprintf(stderr, "Destruction de pile impossible\n"); return; }

46
free((void *)ma_pile); }/* detruire_pile() */

Support de cours Java

/** main() **/ void main(void) { int valeur_entree; pile une_pile; une_pile = creer_pile(); do { printf("\t\tEntrez une valeur a empiler \n \ (-1 pour sortir, 0 pour depiler) : "); scanf("%d", &valeur_entree); if(valeur_entree != 0) empiler(une_pile, valeur_entree); else printf("Valeur du dessus de pile : %d\n", depiler(une_pile)); } while(valeur_entree != -1); detruire_pile(une_pile); }/* main() */

3.4 Uniformit, intgralit, validabilit


Luniformit, style de codage uniforme, soutient directement lintelligibilit. Intgralit et validabilit soutiennent la abilit, lecacit et la modia-

Abstraction : extrait les dtails essentiels Intgralit garantit que les lments importants sont prsents Abstraction et intgralit : modules ncessaires et susants Ecacit amliore (on peut ajouter les modules de bas niveau indpendamment de ceux de niveau suprieur) La validabilit implique un dveloppement tel que le logiciel puisse tre aisment test, rendant le systme aisment modiable Validabilit et intgralit sont des proprits peu aises mettre en oeuvre. Un fort typage aide la validabilit bilit.

V.4 Stratgie de dveloppement oriente objet

47

V.4

Stratgie de dveloppement oriente objet

4.1 Modularit et localisation


Daprs Georges Miller, psychologue (1954) ltre humain ne peut grer plus

de 7 2 entits la fois au sein dun mme niveau. Un objet du monde rel devient un objet informatique ; abstraction et dissimulation dinformations sont la base de tout dveloppement orient objet Les spcications et leur passage en objets est un cycle en quasi-perptuelle volution. Il faut donc un schma cyclique o lon peut modier seulement une partie sans toucher au reste. On oprera donc comme suit : 1. Identier les objets et leurs attributs. Les objets dcoulent des groupes nominaux utiliss pour les dcrire (exemple : une pile) 2. Identier les oprations. Ce sont les verbes que lon utilise pour dcrire les actions possibles sur lobjet (exemple : creer_pile(), empiler(), depiler()) 3. tablir la visibilit. Par exemple un objet pourra avoir accs toutes les actions dune pile mais ne pourra pas voir les fonctions dallocation dont la pile se sert 4. tablir linterface. Description de chaque opration avec ses arguments 5. Implanter chaque objet.

VI Notions de programmation oriente objet


Rfrences bibliographiques
Object-Oriented Analysis and Design with Applications, G. Booch, [Boo94], Data Structures, M.A. Weiss, [Wei98].

VI.1

POO, Objets, Classes

1.1 Les 5 attributs dun systme complexe


Il existe 5 attributs communs tous les systmes complexes : La complexit prend souvent la forme dune hirarchie dans laquelle un systme complexe est compos de sous-systmes relis entre eux et ayant leur tour leurs propres sous-systmes, et ainsi de suite jusqu ce quon atteigne le niveau le plus bas des composants lmentaires. Le choix des composants primaires dun systme est relativement arbitraire et dpend largement de lobservateur du systme. Les liaisons intra-composants sont gnralement plus fortes que les liaisons inter-composants. Ceci a pour eet de sparer les dynamiques haute frquence des composants (celles qui concernent la structure interne des composants) des dynamique basse frquence (celles qui concernent linteraction entre composants). Les systmes hirarchiques sont habituellement composs dun petit nombre de genres dirents de sous-systmes qui forment des combinaisons et des arrangements varis. Un systme complexe qui fonctionne a toujours volu partir dun systme simple qui a fonctionn . . . Un systme complexe conu ex-nihilo ne fonctionne jamais et ne peut tre rapic pour quil fonctionne. Il faut tout recommencer, partir dun systme simple qui fonctionne. 49

50

Support de cours Java

1.2 Conception algorithmique


Comme le suggre Dijkstra : la technique appliquer pour matriser la

complexit est connue depuis trs longtemps : divide et impera (diviser pour rgner) [Dij79]. Lorsque lon conoit un logiciel complexe. il est impratif de le dcomposer en parties de plus en plus petites, chacune delles pouvant tre ensuite ane indpendamment. Dans la dcomposition algorithmique, on ralise une analyse structure descendante o chaque module du systme est une tape majeure de quelque processus gnral.

1.3 Conception oriente objets


Dans une dcomposition oriente objets, on partitionne le systme selon

les entits fondamentales du domaine du problme. Le monde est alors vu comme une srie dagents autonomes qui collaborent pour raliser un certain comportement de plus haut niveau. De ce point de vue, un objet est une entit tangible, qui rvle un comportement bien dni. Les objets eectuent des oprations, que nous leur demandons en leur envoyant des messages. Laquelle des deux dcompositions est-elle la plus meilleure ? Les deux sont importantes, la vue algorithmique souligne lordre des vnements, alors que la vue oriente objets met laccent sur les agents responsables dune action et sur les sujets dune opration. Mais on ne peut construire un systme logiciel complexe des 2 manires, car elles sont orthogonales. On utilise lune, avec lautre en ligrane pour exprimer lautre point de vue.

1.4 Terminologie
De manire plus prcise La programmation oriente objets est une mthode mise en oeuvre dans laquelle les programmes sont organiss comme des ensembles dobjets cooprants. Chacun reprsente une instance dune certaine classe, toutes les classes tant des membres dune hirarchie de classes unie par des relations dhritage. On dsigne donc par langage orient objets un langage rpondant aux conditions suivantes : Un langage orient objets est tel que : Il supporte des objets qui sont des abstractions de donnes avec une interface doprations nommes et un tat interne cach, les objets ont un type associ (la classe),

VI.2 Type ou classe ; objet

51

les types (les classes) peuvent hriter dattributs venant de super-types (les super-classes). La conception oriente objets est une mthode de conception incorporant le processus de dcomposition orient objets et une notation permettant de dpeindre la fois les modles logiques et physiques, aussi bien que statiques et dynamiques du systme concevoir. Lanalyse oriente objets est une mthode danalyse qui examine les besoins daprs la perspective des classes et objets trouvs dans le vocabulaire du domaine du problme.

1.5 Notion dobjet, de classe


Nous avons prcdemment parl de manire informelle dobjet comme dune

entit tangible reprsentant quelque comportement bien dni. Nous verrons quun objet a un tat, un comportement et une identit ; la structure et le comportement dobjets similaires sont dnis dans leur classe commune. Les termes instance et objet sont interchangeables. Une classe est un squelette pour un ensemble dobjets qui partagent une structure commune et un comportement commun.

VI.2

Type ou classe ; objet

2.1 Notion de type ou de classe


Un type (ou une classe) est constitue dattributs (ou champs), de d-

clarations doprations (ou signatures de mthodes) et de descriptions extensives doprations (ou corps de mthodes) Ce que lon peut rsumer par la formule suivante

TYPE (Champs,sig_meth1 , corps_meth1 , . . . , sig_methn , corps_methn )

o sig_methi dsigne la signature de mthode n i et corps_methi dsigne le corps de mthode n i. Un type est par essence une entit statique, par opposition un objet, de nature dynamique. Dune certaine manire, le type est un squelette, lobjet son incarnation.

52

Support de cours Java

2.2 Notion dattribut, ou de champ


Un attribut (ou champ) est une caractristique dun type Dans une type Matrice, le nombre de lignes et le nombre de colonnes sont

des attributs. Dans un type Point, les coordonnes sont des attributs

2.3 Exemple dattributs


Matrice 2 2 en Java
class Matrice2x2 { double a11, a12, a21, a22; ... }

Matrice n m
class Matrice { int nombreLignes, nombreColonnes; double valeurs[]; ... }

2.4 Notion de dclaration dopration (ou de mthode)


La dclaration (ou signature) dune opration (ou mthode) est constitue

du nom de la mthode suivi de ses paramtres et prcd de son type de retour. Par exemple, lopration daddition de matrices peut se dclarer comme suit :
Matrice ajouterMatrice(Matrice m1, Matrice m2)

Lopration ajouterMatrices() renvoie lobjet m1 + m2 de type Matrice

2.5 Notion de description dopration (ou de mthode)


La description extensive dune opration (ou corps de mthode) est la suite

des oprations (primitives ou non) quelle ralise. Une opration primitive est une instruction du langage.

2.6 Exemple de description dopration


Par exemple, lopration ajouterMatrices() pourrait avoir comme corps simpliste (c..d. sans test daucune sorte) :

VI.2 Type ou classe ; objet


Matrice ajouterMatrice(Matrice m1, Matrice m2) { Matrice somme = new Matrice(m1.nombreLignes, m1.nombreColonnes); for(int i = 0; i < m1.nombreLignes; i++) for(int j = 0; j < m1.nombreColonnes; j++) { (somme.valeurs)[i][j] = (m1.valeurs)[i][j] + (m2.valeurs)[i][j]; } return somme; }

53

2.7 Exemple de classe


Classe (type) dcrivant un cercle
class Cercle { // champs : rayon du cercle double r; // Constructeur : initialisation des champs Cercle(double nouvRayon) { r = nouvRayon; } // methode de calcul dune surface double calculeSurface() { return(3.1416*r*r); } }// Fin de class Cercle

2.8 Notion dtat dun objet


Ltat dun objet englobe toutes les proprits (habituellement sta-

tiques) de lobjet plus les valeurs courantes (gnralement dynamiques) de chacune de ces proprits. Une proprit est une caractristique naturelle ou discrminante, un trait, une qualit ou une particularit qui contribue rendre un objet unique. Par exemple, dans un distributeur, un numro de srie est une proprit statique et la quantit de pices quil contient est une valeur dynamique.

54

Support de cours Java

2.9 Notion de comportement dun objet


Le comportement est la faon dont un objet agit et ragit, en termes

de changement dtat et de transmission de messages. Gnralement, un message est simplement une opration quun objet eectue sur un autre, bien que le mcanisme utilis soit quelque peu dirent. Dans la suite, les termes opration et message sont interchangeables. Dans la plupart des langages orients objets et bass sur objets, les oprations que les clients peuvent eectuer sur un objet sont typiquement appeles des mthodes, qui font partie de la classe de lobjet. La transmission de messages est une partie de lquation qui dnit le comportement dun objet. Ltat dun objet inuence aussi son comportement. Par exemple, dans le cas dun distributeur de boissons, nous pouvons dclencher une action (appuyer sur un bouton) pour raliser notre slection. Si nous navons pas introduit susamment dargent, il ne se passera probablement rien. Si nous avons mis assez dargent, la machine lencaissera et nous servira une boisson (modiant ainsi son tat). Nous pouvons donc aner la notion dtat : Ltat dun objet reprsente les eets cumuls de son comportement. La majorit des objets intressants nont pas dtat entirement statique. Ils contiennent des proprits dont les valeurs sont lues et modifes en fonction des actions sur ceux-ci.

2.10 Comportement dun objet : les oprations


Une opration dsigne un service quune classe ore ses clients. En pra-

tique, nous avons constat quun client eectuait typiquement 5 sortes doprations sur un objet. Les 3 les plus courantes sont les suivantes : Modicateur une opration qui altre ltat dun objet Slecteur une opration qui accde ltat dun objet, mais qui naltre pas celui-ci. Itrateur une opration qui permet daccder toutes les parties dun objet dans un ordre bien dni. Deux autres types dopration sont courants : Constructeur une opration qui cre un objet et/ou initialise son tat. Destructeur Une opration qui libre ltat dun objet et/ou dtruit lobjet lui-mme. Avec des langages orients objets, comme Java ou Smalltalk, les oprations peuvent seulement tre dclares comme mthodes (c..d. au sein dune classe), le langage ne nous autorisant pas dclarer des procdures

VI.2 Type ou classe ; objet

55

ou des fonctions spares de toute classe. Ce nest pas le cas en C++ et en AdA, qui autorisent le programmeur crire des oprations en dehors de toute classe.

2.12 Comportement dun objet : rle et responsabilits


Lensemble des mthodes associes un objet constituent son protocole. Ce

dernier dnit la totalit des comportements autoriss pour lobjet. Il est utile de diviser ce protocole en groupes logiques de comportements. Ces groupes dsignent les rles que lobjet peut jouer ; un rle sapparente un masque port par lobjet et dnit un contrat entre une abstraction et un client. Les responsabilits dun objet sont constitues dune part de la connaissance que lobjet maintient et dautre part des actions quil peut raliser. En dautres termes, Ltat et le comportement dun objet dnissent lensemble des rles quil peut jouer, lesquels dnissent les responsabilits de labstraction. La majorit des objets jouent plusieurs rles au cours de leur existence, par exemple : Un compte bancaire peut tre crditeur ou dbiteur, ce qui inue sur le comportement dun retrait dargent. Durant une mme journe, un individu peut jouer le rle de mre, de mdecin, de jardinier.

2.13 Comportement dun objet : les objets en tant que machines


Lexistence dun tat dans un objet signie que lordre dans lequel les opra-

tions sont invoques est important. Chaque objet peut donc tre vu comme une petite machine ou un automate tat nis quivalent. Les objets peuvent tre actifs ou passifs. Un objet actif contient sa propre tche de contrle, contrairement un objet passif. Les objets actifs sont gnralement autonomes, ce qui signie quils peuvent prsenter un certain comportement sans quun autre objet agisse sur eux. Les objets passifs ne peuvent subir un changement dtat que lorsque lon agit explicitement sur eux.

2.14 Notion didentit dun objet


Lidentit est cette proprit dun objet qui le distingue de tous les

autres objets.

56

Support de cours Java


Deux objets peuvent tre dclars gaux en 2 sens dirents. Ils peuvent tre

gaux au sens de leur rfrences (les pointeurs internes qui rfrencent les donnes de lobjet en mmoire) ou au sens de leur contenu (galit de leur tat), bien quils soient situs des emplacements mmoire dirents.

2.15 Nature dun objet en Java


Un objet Java peut tre dcrit par la formule suivante :

OBJET (tat,op1 , . . . , opn , ref)

ensemble des variables dinstance (pointeur sur) la mthode dinstance n i (pointeur sur) un emplacement mmoire contenant ltat et des rfrences internes vers les oprations (pointeurs sur les mthodes) Exemple dobjet, de type tasse caf. Des attributs dune tasse caf pourront tre : sa couleur, la quantit de caf quelle contient, sa position dans le caf (la brasserie ou le bar) Tasse caf est un type et la tasse caf rouge qui contient actuellement 38 millilitres de caf et qui se trouve sur la dernire table du fond est un objet. Rouge, 38 millilitres et sur la dernire table du fond constituent ltat de cet objet. Un type, ou une classe sert de modle partir duquel on peut instancier (crer) des objets contenant des variables dinstance et des mthodes dnies dans la classe.
opi ref

o etat

VI.3

Relations

3.1 Sparation de linterface et de limplantation


Une ide cl est de sparer linterface externe dun objet de son

implantation.
Linterface dun objet est constitue des messages quil peut accepter dautres

objets. Autrement dit, cest la dclaration des oprations associes lobjet.


Limplantation dun objet se traduit par la valeur de ses attributs et son

comportement en rponse aux messages reus. Dans un monde orient-objets, un objet expose son interface aux autres objets, mais garde son implantation prive. Limplantation doit donc tre spare de linterface. De lextrieur, le seul moyen pour interagir avec

VI.3 Relations

57

un objet est de lui envoyer un message (dexcuter lune de ses oprations). La sparation de linterface et de limplantation permet aux objets davoir la responsabilit de grer leur propre tat. Les autres objets ne peuvent manipuler cet tat directement et doivent passer par des messages (ou oprations). Lobjet qui reoit un message peut dcider de changer ou non son tat. Par contre, il ne contrle pas quel instant il va recevoir des messages. Un aspect fondamental de la programmation oriente objet est que chaque objet dune classe particulire peut recevoir les mmes messages. Linterface externe dun objet ne dpend donc que de sa classe.

3.4 Relations entre classes


Il existe trois types fondamentaux de relations entre classes :

La gnralisation/spcialisation, dsignant une relation est un. Par exemple, une rose est une sorte de eur : une rose est une sous-classe plus spcialise de la classe plus gnrale de eur. Lensemble/composant, dnotant une relation partie de. Par exemple, un ptale est une partie dune eur. Lassociation, traduisant une dpendance smantique entre des classes qui ne sont pas relies autrement. Par exemple, une eur et une bougie peuvent ensemble servir de dcoration sur une table. La plupart des langages orients objets comprennent des cominaisons des relations suivantes entre classes : Association. Hritage. Agrgation. Utilisation. Instanciation. Mta-classe.

3.5 Relations dassociation entre classes


Relations dassociation.

Une association dnote une dpendance smantique. Par exemple, les objets de type Client et ceux de type Facture peuvent tre associs dans le cas dune commande dun produit. On associe souvent ce type de relation une cardinalit. Lexemple prcdent exhibe une cardinalit de 1 pour n, un client pouvant avoir plusieurs factures qui lui sont associes. On distingue les cardinalits : 1 pour 1, 1 pour n,

58

Support de cours Java n pour n. Une association 1 pour 1 est trs troite. Par exemple entre la classe Facture et la classe TransactionCarteBancaire.

3.6 Relations dhritage entre classes


Lhritage est une relation entre les classes dont lune partage la structure

ou le comportement dni dans une (hritage simple) ou plusieurs (hritage multiple) autres classes. On nomme super-classe la classe de laquelle une autre classe hrite. On appelle une classe qui hrite dune ou plusieurs classes une sous-classe. Par exemple, prenons une classe Surface2DSymetrique. Considrons les classes Pave2D et Disque hritant de Surface2DSymetrique. Lhritage dnit donc une hirarchie de la forme est un entre classes. Cest le test de vrit de lhritage. Dans une relation dhritage, les sous-classes hritent de la structure de leur super-classe. Par exemple, la classe Surface2DSymetrique peut avoir comme champs : labscisse de son centre de symtrie x lordonne de son centre de symtrie y sa taille size sa couleur color Et les classes Pave2D et Disque hriteront de ces champs. Une sous-classe peut dnir dautres champs qui viennent sajouter ceux hrits des superclasses. De plus, toujours dans une relation dhritage, les sous-classes hritent du comportement de leur super-classe. Par exemple, la classe Surface2DSymetrique peut avoir comme oprations : getSize() pour obtenir la taille de la surface getX() pour obtenir labscisse du centre de gravit getY() pour obtenir lordonne du centre de gravit setXY() pour xer la position de la surface setColor() pour xer la couleur de la surface Et les classes Pave2D et Disque hriteront de ces champs. Une sous-classe peut dnir dautres oprations qui viennent sajouter celles hrites des super-classes. En outre, une sous-classe peut rednir tout ou partie des oprations hrites des super-classes. Le polymorphisme est un mcanisme par lequel un nom peut dsigner des objets de nombreuses classes direntes, tant quelles sont relies par une super-classe commune. Tout objet dsign par ce nom est alors capable de rpondre de direntes manires un ensemble commun doprations.

VI.3 Relations

59

3.12 Relations daggrgation entre classes


Laggrgation peut se faire par inclusion physique ou smantique. Dans le cas dinclusion physique, il peut y avoir :

inclusion de valeur, auquel cas lobjet inclus ne peut exister sans linstance de lobjet englobant, inclusion de rfrence, le lien tant plus indirect ; on peut alors crer et dtruire indpendamment les instances de chaque classe. On peut avoir une reprsentation daggrgation plus indirecte, seulement smantique. Par exemple, on peut dclarer une classe Investisseur contenant une cl dans une base de donnes qui permette de retrouver les actions que possde linvestisseur. Le test de relation daggrgation est le suivant : si (et seulement si) il existe une relation ensemble/composant entre deux objets, il doit y avoir une relation daggrgation entre leurs classes respectives.

3.13 Relations dutilisation entre classes


Les relations dutilisation entre classes sont similaires aux liens dgal gal entre les instances de ces classes. Une association indique un lien smantique bidirectionnel ; une relation dutilisation est une des volutions possibles dune association. On y prcise labstraction cliente et labstraction fournisseur de certains services.

3.14 Relations dinstanciation entre classes


On veut utiliser des instances de classes distinctes qui ne sont pas relies par une super-classe commune, en eectuant des oprations de manire gnrique. Soit le langage comprend directement les types gnriques (comme par exemple C++), soit on peut (par exemple en Java) crer des classes conteneurs gnralises et utiliser du code de vrication de type (en utilisant en java la rexion) pour imposer que tous les lments contenus soient tous de la mme classe.

3.15 Relations de mta-classes


On traite ici une classe comme un objet qui peut tre manipul. On obtient donc la classe dune classe ou mta-classe. Cette notion nest pas explicite dans le langage Java, mais la technique de rexion sen rapproche.

VII Bases orientes objet de Java


Rfrences bibliographiques
The Java Language Specication, J. Gosling, B. Joy et G. Steele [GJS96], Java in a Nutshell, D. Flanagan [Flab].

VII.1

Classes et objets Java

1.1 Constitution dune classe


Rappel des notions de classe et dobjet, en deux mots (voir chapitre VI,

p. 49) : Classe : squelette ; structure de donnes et code des mthodes ; statique, sur disque Objet : incarnation ; tat, comportement, identit ; dynamique, en mmoire Une classe dnit gnralement deux choses : les structures de donnes associes aux objets de la classe ; les variables dsignant ses donnes sont appels champs. les services que peuvent rendre les objets de cette classe qui sont les mthodes dnies dans la classe. Une Classe java est dclare par le mot cl class, plac devant lidenticateur de la classe (son nom).

1.2 Champs et mthodes


Un champ correspond une dclaration de variable, le nom de la variable

suivant la dclaration de son type :


class Point { int x; int y;

61

62
... }
Une mthode est constitue de :

Support de cours Java

un nom constitu par un identicateur des paramtres formels : ceux-ci sont spars par des ,. Lorsque la mthode na pas de paramtre, contrairement au langage C , il ne faut pas prciser void. Le nombre de paramtres est xe : il nest pas possible de dnir des mthodes arguments variables. du type de retour est soit void (si la mthode ne retourne aucune valeur), soit un type primitif ou une rfrence vers un objet. du corps de la mthode. Exemple de classe dcrivant un cercle
class Cercle { // champs : rayon du cercle double r; // methode de calcul dune surface double calculeSurface() { return(3.1416*r*r); } }// Fin de class Cercle

1.3 Dclaration de classe


Un chier source java doit porter le mme nom que celui de la classe

publique qui y est dnie. Syntaxe gnrique


class NomClasse { type variableInstance1; type variableInstanceN; type nomMethode1(liste-parametres) { corps-methode; } type nomMethodeN(liste-parametres) { corps-methode; } }
Exemple

class Chat String int float

{ nom; // nom du fauve age; // en annees tauxRonronnement; // entre 0 et 1

VII.1 Classes et objets Java


void viellir() { age += 1; } int retournerAge() { return(age); } }

63

Les dclaration et implantation dune mthode sont dans le mme chier. Ceci donne parfois de gros chier source (.java), mais il est plus facile (pour la maintenance) davoir les spcication, dclaration et implantation au mme endroit.

1.4 Point dentre dun programme (main())


Un programme Java est constitu dune ou de plusieurs classes. Parmi toutes ces classes, il doit exister au moins une classe qui contient la mthode statique et publique main() qui est le point dentre de lexcution du programme.
// Fichier Bonjour.java public class Bonjour { public static void main(String args[]) { System.out.println("Bonjour ! ") ; }

Cette classe dnit une classe Bonjour qui ne possde quune seule mthode. La mthode main() doit tre dclare static et public pour quelle puisse tre invoque par linterprteur Java. Largument args est un tableau de String qui correspond aux arguments de la ligne de commande lors du lancement du programme. args[0] est le 1er argument, args[1] est le 2ime argument, . . .

1.5 Compilation
Avant de pouvoir excuter ce programme, il faut tout dabord le compiler,

par exemple avec la commande javac (sous le JDK standard, c..d. lenvironnement de base).
javac Bonjour.java

La commande javac traduit le code source en code intermdiaire (p-code) java. Ce code (une forme dassembleur gnrique) est videmment indpendant de la plate forme sur laquelle il a t compil.

64

Support de cours Java

1.6 Excution
Autant de chiers que de classes qui ont t dnies dans le chier source sont produits. Les chiers compils ont lextension .class. Enn, pour excuter ce programme, il faut utiliser linterprteur de code Java et lui fournir le nom de la classe publique que lon veut utiliser comme point de dpart de notre programme (celle contenant la mthode main(...)), ans lextension.
java Bonjour

1.7 Rfrence un objet


En Java, on ne peut accder aux objets qu travers une rfrence vers

celui-ci. Dclaration dune variable p avec pour type un nom de classe :


Point p; p : rfrence un objet de la classe Point. Lorsque lon dclare une classe comme type dune variable, cette dernire a, par dfaut, la valeur null. null est une rfrence un Object (mre de toutes les classes Java), qui na pas de valeur (distinct de 0) ; par ex. dans Point p; p a la valeur null.
En fait, rfrence un objet : pointeur. Mais larithmtique sur les poin-

teurs est impossible en java. Seule chose permise : changer la valeur de la rfrence pour pouvoir faire rfrence un autre objet. Plus prcisment, une rfrence pointe sur une structure o se trouve des informations sur le type ainsi que ladresse relle des donnes de linstance dobjet.

1.8 Oprateur new


new : cration dune instance dobjet dune classe ; retourne une rfrence

cette instance dobjet.


Point p = new Point(); Point p2 = p; p = null; // ligne 1 // ligne 2 // ligne 3

Ligne 2 : tout changement p2 aecte lobjet rfrenc par p. p2 = p : aucune copie de lobjet ou allocation mmoire. Ligne 3 : dcrochage de p de lobjet originel. p2 permet toujours dy accder. Objet qui nest plus rfrenc le ramasse-miettes (garbage collector) rcupre automatiquement la mmoire associe.

VII.1 Classes et objets Java

65

1.9 Instance dobjet


Instance : copie individuelle de prototype de la classe, avec ses propres

donnes : variables dinstance.


Une fois la classe dclare, pour pouvoir utiliser un objet de cette classe, il

faut dnir une instance (dobjet) de cette classe. Or les objets ne sont accessibles qu travers des rfrences . Donc une dnition qui spcie un objet comme une variable ayant le type de la classe choisie ne fait que dnir une rfrence vers un ventuel objet de cette classe.
Date d;

La variable d reprsente une rfrence vers un objet de type Date. En interne, cela rserve de la place pour le pointeur sous-jacent la rfrence d. Mais cela ne rserve pas de place mmoire pour une variable de type Date. Si lon veut une instance dobjet eective, il faut la crer explicitement avec le mot cl new et le constructeur de la classe Date.
Date d; d = new Date();

1.10 Mthode dinstance


On peut voir une mthode comme un message envoy une instance dob-

jet. Pour acher la date contenue dans lobjet d, on lui envoie le message imprimer : d.imprimer() ; De telles mthodes sont appeles mthodes dinstance.

1.11 Variables dinstance


Les Variables dinstance sont dclares en dehors de toute mthode

class Point { int x, y; }

1.12 Op. point (.) Dclaration de mthode


Oprateur . : accder des variables dinstance et des mthodes dun(e

instance dun) objet.


Ex. de dclaration de mthode

class Point { int x, y; void init(int a, int b) { x = a;

66
y = b; } }

Support de cours Java

En C, mthode sans paramtre : nommethode(void). illgal en java. Les objets sont passs par rfrence (rfrences dinstances un objet passs par valeur). Les types primitifs sont passs par valeur. Les mthodes java sont donc similaires aux fonctions virtuelles du C++.

1.13 Instruction this


this : rfrence linstance dobjet courante. Il est permis une variable locale de porter le mme nom quune

variable dinstance . . . Exemple dutilisation de this vitant cela


void init(int x, int y) { this.x = x; this.y = x; }

1.14 Constructeurs
Mme nom que celui de la classe. Pas de type de retour (pas mme void). Classe dcrivant un cercle

class Cercle { double r; // champs : rayon du cercle // Constructeur : initialisation des champs Cercle(double nouvRayon) { r = nouvRayon; } double calculeSurface() { return(3.1416*r*r); // methode de calcul } }// Fin de class Cercle
Exemple animalier

class Chat String int float

{ nom; // nom du fauve age; // en annees tauxRonronnement; // entre 0 et 1

public Chat(String sonNom, int sonAge, float sonTauxRonron) {

VII.1 Classes et objets Java


nom = sonNom; age = sonAge; tauxRonronnement = sonTauxRonron; } }
this peut-tre galement un appel un constructeur

67

class Point { int x, y; // constructeur exhaustif Point(int x, int y) { this.x = x; // var dinstance Point.x this.y = y; } // Appel du constructeur exhaustif Point() { this(-1, -1); // Point(int x, int y) } }

1.15 Exemple de constructeurs


Exemple animalier

class Chat { String nom; int age; Color[] couleurPelage; float tauxRonronnement;

// // // //

nom du fauve en annees ses differentes couleurs entre 0 et 1

public Chat(String sonNom, int sonAge, float sonTauxRonron, Color[] sesCouleurs) { nom = sonNom; age = sonAge; tauxRonronnement = sonTauxRonron; couleurPelage = sesCouleurs; } public Chat() { this(new String("minou"), 1, 0.5, {Color.black, Color.white});

68
} }

Support de cours Java

Technique de rutilisation : crer un constructeur exhaustif (dot de tous les

paramtres), puis crer dautres constructeurs appelant systmatiqement le constructeur exhaustif.

VII.2

Hritage

2.1 Hritage
Les descendants par hritage sont nomms des sous classes. Le parent direct

est une super classe. Une sous classe est une version spcialise dune classe qui hrite de toutes les variables dinstance et mthodes. Mot-cl extends
class Point3D extends Point { int z; Point3D(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } Point3D() { Point3D(-1, -1, -1); } }
Syntaxe gnrique

class NomClasse { type variableInstance1; type variableInstanceN; type nomMethode1(liste-parametres) { corps-methode; } type nomMethodeN(liste-parametres) { corps-methode; } }
Pas dhritage multiple, pour des raisons de performances et de com-

plexit (en maintenance). la place, notion dinterface.


Il existe une classe au sommet de la hirarchie, Object. Sans mot-cl extends,

le compilateur met automatiquement extends Object.

VII.3 Surcharge, rednition

69

De la mme manire que lon peut assigner une variable int un byte, on

peut dclarer une variable de type Object et y stocker une rfrence une instance de toute sous classe dObject.

VII.3

Surcharge, rednition

3.1 Instruction super


super rfre aux variables dinstance et aux constructeurs de la super classe.

class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); // Appel de Point(x,y). this.z = z; } }
Cet appel au constructeur de la classe mre doit tre la 1ire ligne du

constructeur. super peut galement se rfrer aux mthodes de la super classe : super.distance(x, y) appelle la mthode distance() de la super classe de linstance this. Exemple animalier (voir lexcellent ouvrage le mystre des chats peintres de Heather Busch et Burton Silver, http ://www.monpa.com/wcp/index.html)
class ChatPeintre extends Chat { // Variables dinstances String style; int coteMoyenne; // cote moyenne dune oeuvre // Constructeurs public ChatArtiste(String sonNom, int sonAge, float sonTauxRonron, Color[] sonPelage, String sonStyle, int saCote) { super(sonNom, sonAge, sonTauxRonron, sonPelage); style = sonStyle; coteMoyenne = saCote; } // Methodes public peindre() { ...

70
} }

Support de cours Java

3.2 Un artiste en pleine action

source : http ://www.monpa.com/wcp/index.html

VII.3 Surcharge, rednition

71

3.3 Sous-typage, transtypage, instanceof


Le typage dune variable lui permet de rfrencer tout sous type (classe

parente) ; la mthode miauler() est dnie dans Chat. La mthode peindre() nest dnie que dans ChatPeintre.
Chat gouttiere = new Chat("zephir", 1, 0.9); ChatPeintre moustacheDeDali = new ChatPeintre("dali", // nom de lartiste 2, // son age 0.1, // son taux rr {Color.white, Color.black}, "aLaDali",// son style 20000); // sa cote moyenne moustacheDeDali.peindre(); gouttiere.peindre(); // valide // illegal

instanceof permet de savoir si un objet est dun type donn ou non.

// true System.out.print(gouttiere instanceof Chat); // true System.out.print(moustacheDeDali instanceof Chat); // false System.out.print(gouttiere instanceof ChatPeintre); moustacheDeDali = null; // false System.out.print(moustacheDeDali instanceof ChatPeintre);
Transtypage (ou cast en anglais) permet de changer le type, lorsque cela

est permis.
Chat ch = new Chat("zephir", 1, 0.9); ChatPeintre chP; chP = ch; // Erreur de compilation if (ch instanceof ChatPeintre)// Bonnes manieres chP = (ChatPeintre)ch; // transtypage

3.4 Surcharge de mthode


Plusieurs mthodes peuvent porter le mme nom : surcharge de mthode. Direntiation sur la signature de type : le nombre et le type des para-

mtres. Deux mthodes dune mme classe de mmes nom et signature de type est illgal. Exemple de surcharge

72

Support de cours Java


class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } double distance(int x, int y) { int dx = this.x - x; int dy = this.y - y; return Math.sqrt(dx*dx + dy*dy); } double distance(Point p) { return distance(p.x, p.y); } } class PointDist { public static void main(String args[]) { Point p1 = new Point(0, 0); Point p2 = new Point(30, 40); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(60, 80) = " + p1.distance(60, 80)); }
Exemple animalier

class Chat { .... void vieillir() { age += 1; } void vieillir(int n) { age += n; } // Surcharge de methode

3.5 Rednition de mthode


Distance en perspective dans Point3D (distance 2D entre x/z et y/z)

rednir distance(x, y) de Point2D. Ex. de surcharge de distance 3D et de rednition de distance 2D


class Point { int x, y; Point(int x, int y) { this.x = x;

VII.3 Surcharge, rednition


this.y = y; } double distance(int x, int y) { int dx = this.x - x; int dy = this.y - y; return Math.sqrt(dx*dx + dy*dy); } double distance(Point p) { return distance(p.x, p.y); } }// class Point

73

// Surcharge

class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); // Appel de Point(x,y) this.z = z; } double distance (int x, int y, int z) { int dx = this.x - x; int dy = this.y - y; int dz = this.z - z; return Math.sqrt(dx*dx + dy*dy + dz*dz); } double distance(Point3D other) { // Surcharge return distance(other.x, other.y, other.z); } double distance(int x, int y) { // Redefinition double dx = (this.x / z) - x; double dy = (this.y / z) - y; return Math.sqrt(dx*dx + dy*dy); } } class Point3DDist { public static void main(String args[]) { Point3D p1 = new Point3D(30, 40, 10); Point3D p2 = new Point3D(0, 0, 0); Point p = new Point(4, 6); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6)); System.out.println("p1.distance(p) = " + p1.distance(p));

74
} }

Support de cours Java

Lachage du programme est le suivant. Pourquoi ?


Prompt > java Point3DDist p1.distance(p2) = 50.9902 p1.distance(4,6) = 2.23607 p1.distance(p) = 2.23607

Appel de distance sur un Point3D (p1) : excution de distance(Point p) hrite de la super classe (mthode non rednie). Mais ensuite appel de distance(int x, int y) de Point3D, pas de Point.
dans laquelle la mthode courante sexcute : rpartition de mthode dynamique.

Slection de mthode selon le type de linstance et non selon la classe

3.6 Rpartition de mthode dynamique


class Parent { void appel() { System.out.println("Dans Parent.appel()"); } class Enfant extends Parent { void appel() { System.out.println("Dans Enfant.appel()"); } class Repartition { public static void main(String args[]) { Parent moi = new Enfant(); moi.appel(); } }
Lors de moi.appel()

Le compilateur vrie que Parent a une mthode appel(), lenvironnement dexcution remarque que la rfrence moi est en fait vers une instance dEnfant appel de Enfant.appel() Il sagit dune forme de polymorphisme lexcution. Cela permet des bibliothques existantes dappeler des mthodes sur des instances de nouvelles classes sans recompilation.

VII.3 Surcharge, rednition

75

3.7 Instruction final


Variable dinstance ou mthode non rednissable : final. Pour des va-

riables, convention de majuscules final int FILE_QUIT = 1 ; Les sous classes ne peuvent rednir les mthodes final. Petites mthodes final peuvent tre optimises (appels en ligne par recopie du code). final pour les variables est similaire au const du C++. Il ny a pas dquivalent de final pour les mthodes en C++.

3.8 Mthode finalize()


Instance dobjet ayant une resource non java (descripteur de chier) : moyen

de la librer. Ajout dune mthode finalize() la classe. Appele chaque libration dune instance dobjet de cette classe.

3.9 Instruction static


mthode static : utilise en dehors de tout contexte dinstance. Mthode static ne peut appeler directement que des mthodes static. Ne

peut utiliser this ou super. Ne peut utiliser une variable dinstance. Variables static : visibles de toute autre portion de code. Quasiment des variables globales. utiliser avec parcimonie . . . Bloc static : excut une seule fois, au premier chargement de la classe. Exemple

class Statique { static int a = 3; static int b; static void methode(int x) { System.out.println("x = " + x + ", a = " + a + ", b = " + b); } static { System.out.print("Initialisation" + " du bloc statique"); b = a * 4; } public static void main(String args[]) { methode(42);

76
} }

Support de cours Java

Lachage est
Prompt > java Statique Initialisation du bloc statique x = 42, a = 3, b = 12

Initialisation de a et b. Excution du bloc static. Appel de main(). Appel dune variable ou mthode static par le nom de la classe
class ClasseStatique { static int a = 42; static int b = 99; static void appel() { System.out.println("a = " + a); } } class StatiqueParNom { public static void main(String args[]) { ClasseStatique.callme(); System.out.println("b = " + ClasseStatique.b); } }

Exemple animalier
class Chat { String int Color[] float static int nom; age; couleurPelage; tauxRonronnement; ageSevrage = 1; // // // // // nom annees couleurs de 0 a 1 statique

boolean estAdoptable() { if (age > ageSevrage) { return true; } else { return false; } } }

VII.4 Paquetages et interfaces

77

3.10 Instruction abstract


Partie spcication, partie implantation : classes abstraites . Certaines mthodes, sans corps, doivent tre rednies par les sous

classes : mthodes abstraites. Cest la responsabilit de sous classe. Toute classe contenant des mthodes abstraites (mot cl abstract) doit tre dclare abstraite. Les classes abstraites ne peuvent tre instancies par new. Pas de constructeurs ou de mthodes static. Une sous classe dune classe statique soit implante toutes les mthodes abstraites, soit est elle-mme abstraite. Exemple
abstract class ParentAbstrait { abstract void appel(); void moiaussi() { System.out.print("Dans ParentAbstrait.moiaussi()"); } } class EnfantConcret extends ParentAbstrait { void appel() { System.out.print("Dans EnfantConcret.moiaussi()"); } } class AbstractionMain { public static void main(String args[]) { ParentAbstrait etre = new EnfantConcret(); etre.appel(); etre.moiaussi(); } }

VII.4

Paquetages et interfaces

4.1 Paquetages
la fois un mcanisme de nommage et un mcanisme de restriction de

visibilit. Forme gnrale dun source java


une unique declaration de paquetage (optionnel) declarations dimportations (optionnel)

78
une unique declaration de classe publique declarations de classes privees (optionnel)

Support de cours Java

Pas de dclaration de paquetage : les classes dclares font partie du paque-

tage par dfaut, sans nom. Une classe dclare dans le paquetage monPaquetage le source doit tre dans le rpertoire monPaquetage (il y a distinction minuscule-majuscule). Syntaxe gnrique :
package pkg1[.pkg2[.pkg3]] ;

Par exemple package java.awt.image ; doit tre stock dans java/awt/image (sous UNIX), java\awt\image (sous Windows) ou java :awt :image (sous Macintosh). La racine de toute hirarchie de paquetage est une entre de la variable denvironnement CLASSPATH. Ayant une classe ClasseTest dans un paquetage test, il faut soit se mettre dans le rpertoire pre de test et lancer java test.ClasseTest, soit ajouter le rpertoire test la variable CLASSPATH :
CLASSPATH=.;c:\code\test;c:\java\classes

soit lancer :
java -dclasspath=.;c:\code\test;c:\java\classes ClasseTest

4.2 Instruction import


Entrer les noms complets de classes et mthodes fort long Tout ou partie

dun paquetage est amen en visibilit directe, avec import.


Syntaxe gnrique import pkg1[.pkg2].(nomclasse|*) ;. Exemple

import java.util.Date; import java.io.*;

Chargement de gros paquetages perte de performance en compilation. Pas deet lexcution. Toutes les classes livres dans la distribution java sont dans le paquetage java. Les Classes de base du langage se trouvent dans java.lang. Il y a une importation implicite de import java.lang.* Deux classes de mme nom dans 2 paquetages dirents imports avec * : le compilateur ne dit rien jusqu lutilisation dune des classes, o cest une erreur de compilation. Utilisation de noms complets. Au lieu de
import java.util.*; class MaDate extends Date { ... }

VII.4 Paquetages et interfaces on peut utiliser class MaDate extends java.util.Date ...

79

4.3 Protections daccs


4 catgories de visibilit : Sous classe dans le mme paquetage. Non sous classe dans le mme paquetage. Sous classe dans des paquetages dirents. Classes ni dans le mme paquetage, ni sous classes. Table des modicateurs de visibilit
private Mme classe Mme paquetage, sous classe Mme paquetage, non sous classe Paquetage dirent, sous classe Paquetage dirent, non sous classe oui non non non non rien oui oui oui non non private protected oui oui non oui non protected oui oui oui oui non public oui oui oui oui oui

Dclar public : peut tre vu de partout. Dclar private : ne peut tre vu en dehors dune classe. Pas de modicateur : visible des sous classes et des autres classes du

mme paquetage. Situation par dfaut.


Dclar protected : peut tre vu hors du paquetage, mais seulement des

sous classes. Dclar private protected : ne peut tre vu que des sous classes. protected pas la mme signication quen C++. Plutt similaire au friend du C++. Le protected du C++ est mul par private protected en java. Exemple animalier
class Chat { // Les differents champs sont protected (et non private), // de facon a etre visibles des sous-classes protected String nom; // nom du fauve protected int age; // en annees protected Color[] couleurPelage; // ses couleurs

80

Support de cours Java


protected float tauxRonronnement; // entre 0 et 1 protected static int ageSevrage = 1; // Champ statique

// Les constructeurs doivent etre vus de partout public Chat(String sonNom, int sonAge, float sonTauxRonron, Color[] sesCouleurs) { nom = sonNom; age = sonAge; tauxRonronnement = sonTauxRonron; couleurPelage = sesCouleurs; } public Chat() { this(new String("minou"), 1, 0.5, {Color.black, Color.white}); }

// Accesseurs public int retournerAge() { return(age); } public String retournerNom() { return(nom); } public Color[] retournerCouleurPelage() { return(couleurPelage); } public float retournerTauxRonron() { return(tauxRonronnement); } // Autres methodes public void vieillir() { age += 1; } public void vieillir(int n) { age += n; } public boolean estAdoptable() { if (age > ageSevrage) { return true; } else { return false; } }

VII.4 Paquetages et interfaces


// Methode privee private void emettreSon(String adire) { // Emulation ultra pauvre du son System.out.println(" " + adire); } // Utilisation de la methode privee public void miauler(int nbMiaulements) { for(int i + 0; i < nbMiaulements; i++) { emettreSon("Miaou !"); } } }

81

4.4 Interfaces
Interfaces : comme des classes, mais sans variable dinstance et des m-

thodes dclares sans corps.


Une classe peut implanter une nombre quelconque dinterfaces. Pour cela,

la classe doit fournir limplantation de toutes les mthodes de linterface. La signature de type doit tre respecte. Les interfaces vivent dans une hirarchie dirente de celles des classes deux classes sans aucun lien hirarchique peuvent implanter la mme interface. Les interfaces sont aussi utiles que lhritage multiple, mais donnent du code plus facile maintenir. En eet, ne repose pas sur des donnes, juste sur des mthodes. Syntaxe gnrique
interface nom { type-retour nom-methode1(liste-parametres); type nomvariable-finale = valeur; }
Toutes les mthodes implantant une interface doivent tre dclares public. Variables dclares lintrieur dune interface implicitement final.

4.5 Exemple dinterface


Syntaxe gnrique dimplantation dinterface

class nomclasse [extends superclasse] [implements interface0 [,interface1...]] {

82
corps-de-classe }
Les crochets dsignent des mots optionnels Exemple

Support de cours Java

interface Callback { void callback(int parametre) { } class Client implements Callback { void callback(int p) { System.out.println("Callback de " + p); } }

4.6 Interface & rsolution dynamique de mthode

terface comme type au lieu dune classe. Toute instance dune classe implantant cette interface peut tre stocke dans cette variable. Si lon veut appeler une mthode via une telle variable, limplantation correcte sera appelle selon linstance courante. Les classes peuvent donc tre cres aprs le code qui les appelle. Cette technique de rsolution dynamique de mthode est coteuse en temps. Aspect dencapsulation
class TestInterface { public static void main(String args[]) { Callback c = new Client(); c.callback(12); } } c ne peut tre utilis que pour accder la mthode callback() et non un autre aspect de Client.

On peut dclarer des variables rfrences des objets utilisant une in-

VIII Exceptions
Rfrences bibliographiques
The Java Language Specication, J. Gosling, B. Joy et G. Steele [GJS96]

VIII.1

Fonctionnement gnral du systme dexceptions

1.1 Gnration et gestion dexceptions


Exception : condition anormale survenant lors de lexcution. Lorsquune exception survient :

un objet reprsentant cette exception est cr ; cet objet est jet (thrown) dans la mthode ayant provoqu lerreur. Cette mthode peut choisir : de grer lexception elle-mme, de la passer sans la grer. De toutes faons lexception est capte (caught) et traite, en dernier recours par lenvironnement dexcution Java. Les exceptions peuvent tre gnres par lenvironnement dexcution Java, manuellement par du code. Les exceptions jetes (ou leves) par lenvironnement dexcution rsultent de violations des rgles du langage ou des contraintes de cet environnement dexcution.

1.2 Les 5 mots cls


Il y a 5 mots cls dinstructions ddies la gestion des exceptions : try,

catch, throw, throws et finally.

83

84

Support de cours Java


Des instructions o lon veut surveiller la leve dune exception sont mises

dans un bloc prcd de linstruction try. Le code peut capter cette exception en utilisant catch et la grer. Les exceptions gnres par le systme sont automatiquement jetes par lenvironnement dexcution Java. Pour jeter une exception manuellement, utiliesr throw. Toute exception qui est jete hors dune mthode doit tre spcie comme telle avec throws. Tout code qui doit absolument tre excut avant quune mthode ne retourne est plac dans un bloc finally.

1.3 Schma
Le schma est donc
try { // bloc de code a surveiller } catch (EceptionType1 exceptObj) { // gestionnaire dexception pour ExceptionType1 } catch (EceptionType2 exceptObj) { // gestionnaire dexception pour ExceptionType2 } ... finally { // bloc de code a executer // avant de sortir de la methode }

1.4 Types dexceptions


Une classe est au sommet de la hirarchie des exceptions : Throwable Deux sous-classes de Throwable :

Exception : conditions exceptionnelles que les programmes utilisateur devraient traiter. Error : exceptions catastrophiques que normalement seul lenvironnement dexcution devrait grer. Une sous-classe dException, RuntimeException, pour les exceptions de lenvironnement dexcution.

VIII.1 Fonctionnement gnral du systme dexceptions

85

1.5 Exceptions non gres


Considrons le code suivant o une division par zro nest pas gre par la

programme :
class ExcepDiv0 { public static void main(String args[]) { int d = 0; int a = 42 / d; } }
Lorsque lenvironnement dexcution essaie dexcuter la division, il construit

un nouvel objet exception an darrter le code et de grer cette condition derreur. Le ux de code est alors interrompu et la pile dappels (des direntes mthodes invoques) est inspecte en qute dun gestionnaire dexceptions. Nayant pas fourni de gestionnaire au sein du programme, le gestionnaire par dfaut de lenvironnement dexcution se met en route. Il ache la valeur en String de lexception et la trace de la pile dappels :
/home/mounier> java ExcepDiv0 java.lang.ArithmeticException: / by zero at ExcepDiv0.main(ExcepDiv0.java:4)

1.6 Instructions try et catch


Un bloc try est destin tre protg, gard contre toute exception suscep-

tible de survenir. Juste derirre un bloc try, il faut mettre un bloc catch qui sert de gestionnaire dexception. Le paramtre de linstruction catch indique le type et le nom de linstance de lexception gre.
class ExcepDiv0 { public static void main(String args[]) { try { int d = 0; int a = 42 / d; } catch (ArithmeticException e) { System.out.println("Div par zero"); } } }
La porte dun bloc catch est restreinte aux instructions du bloc try imm-

diatement prcdent.

86

Support de cours Java

1.7 Instructions catch multiples


On peut grer plusieurs exceptions la suite lune de lautre. Lorsquune exception survient, lenvironnement dexcution inspecte les ins-

tructions catch les unes aprs les autres, dans lordre o elles ont t crites. Il faut donc mettre les exceptions les plus spciques dabord.

1.8 Instruction throw


Elle permet de gnrer une exception, via un appel de la forme

trow

TrhowableInstance ; Cette instance peut tre cre par un new ou tre une instance dune exception dja existante. Le ux dexcution est alors stopp et le bloc try immdiatement englobant est inspect, an de voir sil possde une instruction catch correspondante linstance gnre. Si ce nest pas le cas, le 2ime bloc try englobant est inspect ; et ainsi de suite. Exemple class ThrowDemo { static void demoproc() { try { throw new NullPointerException("demo"); } catch (NullPointerException e2) { System.out.print("attrapee ds demoproc()"); throw e2; } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e1) { System.out.print("attrapee ds main()"); } } }

1.9 Instruction throws


Si une mthode est susceptible de gnrer une exception quelle ne

gre pas, elle doit le spcier, de faon que ceux qui lappellent puissent se prmunir contre lexception.

VIII.1 Fonctionnement gnral du systme dexceptions

87

Linstruction throws est utilise pour spcier la liste des exceptions quune

mthode est susceptible de gnrer. Pour la plupart des sous-classes dException, le compilateur forcera dclarer quels types dexception peuvent tre gnres (sinon, le programme ne compile pas). Cette rgle ne sapplique pas Error, RuntimeException ou leurs sousclasses.
Lexemple suivant ne compilera pas :

class ThrowsDemo1 { static void proc() { System.out.println("dans proc()"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { proc(); } }

Ce programme ne compilera pas : parce que proc() doit dclarer quelle peut gnrer IllegalAccessException ; parce que main() doit avoir un bloc try/catch pour grer lexception en question.
Lexemple correct est :

class ThrowsDemo1 { static void proc() throws IllegalAccessException { System.out.println("dans proc()"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { demoproc(); } catch(IllegalAccessException e) { System.out.println(e + "attrapee"); } } }

88

Support de cours Java

1.10 Instruction finally


Un bloc finally est toujours excut, quune exception ait t gnre ou

non. Il est excut avant linstruction suivant le bloc try prcdent.


Si le bloc try prcdent contient un return, le bloc finally est excut

avant que la mthode ne retourne.


Ceci peut tre pratique pour fermer des chiers ouverts et pour librer

diverses ressources. Le bloc finally est optionnel.

1.11 Classe Throwable


Il est possible de gnrer ses propres exceptions en crant une sous classe

dException.
On peut alors utiliser ou rednir lune des mthodes, hrite de Throwable :

Outre le constructeur sans argument, un constructeur Exception(String message) avec un message derreur disponible via getMessage(). la mthode String getMessage() qui renvoie le message fourni au constructeur prcdent. la mthode String toString(), qui fournit une chane forme du nom de la classe de lobjet courant, suivi dun :, suivi du rsultat de getMessage() la mthode fillInStackTrace() qui enregistre dans lobjet courant des informations propos de la pile dappels en cours. la mthode void printStackTrace(PrintStream stream) qui envoie sur le ux stream le rsultat de toString(), suivi de la pile dappels enregistre par la mthode fillInStackTrace(). Si stream est absent, System.err est utilis. Une autre forme, void printStackTrace(PrintWriter stream) est disponible.

1.12 Conclusion
Le code suivant

FileInputStream fis; try { fis = new FileInputStream("readme.txt"); } catch (FileNotFoundException e) { fis = new FileInputStream("default.txt"); }
est plus propre que

#include <sys/errno.h>

VIII.1 Fonctionnement gnral du systme dexceptions


int fd; fd = open("readme.txt"); if (fd == -1 && errno == EEXIST) fd = open("default.txt");

89

IX Classes utilitaires de base


Rfrences bibliographiques
Java et Internet Concepts et programmation, G. Roussel, E. Duris, N. Bedon et R. Forax [RDBF02], Java in a Nutshell, D. Flanagan, [Flab], The Java Language Specication, J. Gosling, B. Joy, G. Steele [GJS96]

IX.1

Classes Object, System, PrintStream

1.1 Mthodes de la classe Object


Racine de la hirarchie des objets java. Mthodes : methode() String toString()

But Renvoie une vue en chane de caractres de this ; par dfaut, renvoie le nom de la classe suivi de son code de hachage. Renvoie le code de hachage associ lobjet. Teste lgalit, la plus smatiquement signicative possible. Renvoie une copie supercielle (champ champ) de lobjet (throws CloneNotSupportedException). Appele en libration mmoire (throws Throwable). Relche le moniteur de lobjet et rveille une thread bloque en attente de ce moniteur par un wait().

int hashCode() boolean equals() protected Object clone()

protected void finalize() final void notify()

91

92
final void notifyAll()

Support de cours Java


Relche le moniteur de lobjet et rveille toutes les threads bloques en attente de ce moniteur par un wait(). Acquiert le moniteur de lobjet ou bloque la thread indniment si le moniteur est dj pris (throws InterruptedException). Acquiert le moniteur de lobjet ou bloque la thread pendant timeout millisecondes si le moniteur est dj pris (throws InterruptedException). Renvoie une reprsentation de la classe de lobjet.

final void wait()

final void wait(long timeout)

final Class getClass()

1.2 Mthodes toString(), hashCode()


toString() : Forme achable de lobjet par System.out.println(). La re-

dnir est de bon ton.


hashCode() : code de hachage de lobjet ; utilis dans java.util.hashMap. Contrat de la mthode hashCode() : Pour 2 Object, c1 et c2, c1.equals(c2)

impliquec1.hashCode() == c2.hashCode() Donc, si lon rednit equals(), on doit rednir galement hashCode().

1.3 Mthode equals()


Par dfaut, teste lgalit des rfrences. Il est de bon ton de la rednir

en test dgalit de contenu.


Erreur commune : surcharge au lieu de rednition ; le paramtre doit tre

de type Object.
Exemple sur des classes de nombres complexes :

public class Complexe { protected double partieReelle, partieImaginaire; public Complexe(double r, double i) { partieReelle = r; partieImaginaire = i; } public boolean equals(Object obj) { if(!(obj instanceof Complexe)) { return false;

IX.1 Classes Object, System, PrintStream


} Complexe c = (Complexe)obj; return (partieReelle == c.partieReelle && partieImaginaire == c.partieImaginaire); } }

93

Vrier que la relation binaire induite est rexive, symtrique et transi-

tive. Vrier galement lidempotence (plusieurs valuations de x.equals(y) donne toujours le mme rsultat), et que null est absorbant : x.equals(null) est toujours false.

1.4 Champs et mthodes de la classe System


Mthodes et champs utilitaires java. Champs :

static InputStream in entre standard (par dfaut le clavier) static PrintStream out sortie standard (par dfaut lcran) static PrintStream err sortie erreur standard (par dfaut lcran) Mthodes :
methode() static long currentTimeMillis() static void exit(int status) static void gc() static void setIn(InputStream in) static void setOut(PrintStream out) static void setErr(PrintStream err)

But renvoie le nombre de millisecondes depuis le 1er janvier 1970. arrte la machine virtuelle java en cours dexcution. demande au ramasse-miettes de rcuprer la mmoire inutilise. rassigne lentre standard. rassigne la sortie standard. rassigne la sortie erreur standard.

1.5 Mthodes de PrintStream


Mthodes : methode() void close() void flush()

But Ferme le ux dentre/sortie Vide le tampon mmoire associ au ux (force lcriture)

94
void print(...)

Support de cours Java


Ache largument sur la sortie standard. Accepte des boolean, char, int, long, float, double, Object et String. Mme eet que print(), mais rajoute un saut de ligne criture binaire dun octet sur le ux dentre/sortie

void println(...) void write(int b)

IX.2

Mthode main() et classes demballage des types primitifs

2.1 Mthode main() et ses arguments


Syntaxe public static void main(String args[]) ... public : la mthode peut tre appele de partout static : pas besoin de crer dobjet pour lappeler void : elle ne renvoie rien String args[] : args est un tableau de String 1ier argument args[0], 2ime argument args[1], . . . Nombre darguments : args.length Attention ! Ne pas confondre le champ length : nombre dlments dun tableau la mthode length() de la classe String : longueur de la chane de caractres Exemple dachage des arguments de la ligne de commande ainsi que de leur longueur :

class TestMain { public static void main(String args[]) { for(int i = 0; i < args.length; i++) System.out.println("arg no " + i+1 + " : " + arg[i] + " de longueur : " + args[i].length()); } }
Par un appel dans une fentre Dos (resp. une fentre terminal Unix/Linux)

de la forme java TestMain toto 4 gabuzomeu 7.8 +&) ache


arg no 1 : toto de longueur : 4

IX.3 Scanner (java.util.Scanner)


arg arg arg arg no no no no 2 3 4 4 : : : : 4 de longueur : 1 gabuzomeu de longueur : 9 7.8 de longueur : 3 +&) de longueur : 3

95

2.2 Liste des classes demballage


Permettent de disposer de mthodes utilitaires de manipulation des types

primitifs. Hritent de la classe abstraite Number. Les classes demballage des types primitifs sont : Boolean, Byte, Character, Short, Integer, Long, Float et Double. Mthode xxxValue(), o xxx est lun des noms de type primitf correspondant ; elle permet dobtenir une variable du type primitif correspondant.
Integer un = new Integer(1); int i = un.intValue();
Mthode parseXXX(String) o XXX est lun des noms de classe prcdent ;

elle permet dobtenir un objet de type numrique ou boolen partir dune chane de caractres. Par ex. parseDouble("2.5") ; renvoie un Double. Linverse est ralis par toString(). Les constantes MIN_VALUE et MAX_VALUE contiennent les valeurs minimale et maximale.

IX.3

Scanner (java.util.Scanner)

3.1 Classe Scanner : aperu


La classe Scanner permet entre autres lentre facile de types primitifs et de

String au clavier.
Il sut de crer un objet Scanner avec en argument le ux lire, puis

dappeler une mthode nextXXX() selon le type primitif XXX lire


Exemple dentre dun entier au clavier :

Scanner sc = new Scanner(System.in); // Creation dun Scanner sur // le flux System.in (le clavier) int i = sc.nextInt(); // prise dun entier sur ce flux // (au clavier)

96

Support de cours Java

3.2 Classe Scanner : constructeurs


Dirents constructeurs sont disponibles
methode() Scanner(File source)

But Construit un objet de type Scanner produisant des valeurs partir du chier spci. Construit un objet de type Scanner produisant des valeurs partir du ux dentre spci. construit un objet de type Scanner produisant des valeurs partir de lentre spcie. Cette entre doit implanter linterface Readable, qui spcie une source de caractres. titre indicatif, lensemble des classes implantant cette interface est : BufferedReader, CharArrayReader, CharBuffer, FileReader, FilterReader, InputStreamReader, LineNumberReader, PipedReader, PushbackReader, Reader, StringReader. Construit un objet de type Scanner produisant des valeurs partir de la chane spcie.

Scanner(InputStream source)

Scanner(Readable source)

Scanner(String source)

3.3 Classe Scanner : mthodes essentielles


Rappel : un ux dentre est compos de lexmes, ou atomes syntaxiques,

qui sont spars par des dlimiteurs.


Les mthodes boolean hasNextXXX() renvoient true si le prochain lexme

correspond au type attendu. La chane XXX prcdente est lune des suivantes : BigDecimal, BigInteger, Boolean, Byte, Double, Float, Int, Long, Short, Line selon le type attendu, qui sera respectivement BigDecimal, BigInteger, boolean, byte, double, float, int, long, short pour les 9 premires, et une nouvelle ligne pour la dernire. Ainsi, hasNextInt() renvoie true si le prochain lexme est un int.

IX.3 Scanner (java.util.Scanner)

97

Les mthodes YYY nextXXX() renvoient la valeur du prochain lexme selon

le type correspondant la chane XXX Ainsi, int nextInt() renvoie le prochain int, String nextLine() renvoie la prochaine ligne, int nextDouble() renvoie le prochain double, etc. La mthode boolean hasNext() renvoie true sil y a un prochain lexme. La mthode String next() renvoie le prochain lexme disponible.

3.4 Classe Scanner : autres mthodes


Voici les autres mthodes de Scanner les plus importantes
methode() void close() String findInLine(String pattern) boolean hasNext(String pattern) String next(String pattern) Scanner skip(String pattern) Scanner useDelimiter(String pattern)

But Ferme ce Scanner (le ux associ). Cherche la prochaine occurence du motif pattern, en ignorant les dlimiteurs. Renvoie true si le prochain lexme correspond au motif spci par pattern. Renvoie le prochain lexme sil correspond au motif spci par pattern. saute les entres qui correspondent au motif spci par pattern. Fixe le dlimiteur au motif spci par pattern.

3.5 Classe Scanner : Exemples


Exemple de lecture dans un chier :

Scanner sc = new Scanner(new File("myNumbers")); while (sc.hasNextLong()) { long aLong = sc.nextLong(); }


Exemple de lecture partir dune chane de caractres, avec un dlimiteur

autre quun espace


String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next());

98
System.out.println(s.next()); s.close();

Support de cours Java

La sortie produite par ce code est la suivante :


1 2 red blue

Il est possible de rcuprer les quatres lexmes dun coup :


String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input); s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)"); MatchResult result = s.match(); for (int i=1; i<=result.groupCount(); i++) System.out.println(result.group(i); s.close();

3.6 Exemple dun cercle


Exemple dune classe Cercle avec utilisation dun Scanner
import java.util.Scanner; /** * Classe representant un cercle **/ class Cercle { // champs : rayon du cercle double r; // Constructeur : initialisation des champs Cercle(double nouvRayon) { r = nouvRayon; } // methode de calcul dune surface double calculeSurface() { return(3.1416*r*r); } }// fin de class Cercle /** * Ce programme affiche la surface dun cercle dont * lutilisateur entre le rayon **/ public class CercleMain {

IX.4 Classes java.applet.Applet et java.lang.String


// methode main() : point dentree du programme public static void main(String[] args) { // pour les entrees de donnees au clavier Scanner entreeClavier = new Scanner(System.in); // capture dun double au clavier double rayon = entreeClavier.nextDouble(); // creation dun objet de type Cercle Cercle monCercle = new Cercle(rayon); // calcul de sa surface surface = monCercle.calculeSurface(); // affichage du resultat System.out.println("Voici la surface du cercle" + "de rayon " + monCercle.r + " : " + surface); } }// fin de class CercleMain

99

IX.4

Classes java.applet.Applet et java.lang.String

4.1 Notion dapplet


Applet : mini-application, dont le code est tcharg travers le rseau. Est visualise par un navigateur ou par un visualiseur dapplets (applet

viewer). Diverses restrictions de scurit. Une applet na pas de mthode main(). On tend la classe java.Applet, en rednissant diverses mthodes. Une applet nest pas sous le contrle de lactivit (thread) dexcution : elle rpond lorsque le navigateur le lui demande. Donc, pour des tches longues, lapplet doit crer sa propre activit.

4.2 Mthodes rednir


Mthodes de base dApplet : void init() Appele lors du premier chargement de lapplet. Utilise pour des initialisations, de prfrence un constructeur. void destroy() Appele lors du dchargement de lapplet. Utilise pour librer des ressources. void start() Applele lorsque lapplet devient visible. Souvent utilise avec des animations et des activits (threads).

100
void stop() Applele lorsque lapplet est masque.

Support de cours Java

Une mthode hrite de Container : public void paint(Graphics g) que le navigateur appelle pour demander lapplet sa mise a jour graphique. Autres mthodes dApplet : String getAppletInfo() Pour obtenir des informations propos de lapplet String[][] getParameterInfo() Description des paramtres de lapplet. AudioClip getAudioClip(URL url) Renvoie une rfrence une instance dobjet de type AudioClip. void play(URL url) joue lAudioClip spci ladresse url. Image getImage(URL url) Renvoie une rfrence une instance dobjet de type Image.

4.3 Exemple : un disque color


Classe Disk : surface circulaire colore
import java.awt.*; public class Disk { protected int protected int protected Color

x, y; size; color;

// position du disque // diametre du disque // couleur du disque

public Disk(int Xpos, int Ypos, int radius) { x = Xpos; y = Ypos; size = radius; color = Color.red; // Initialement rouge } // methodes public void public void public void fixant des attributs (modificateurs) setXY(int newX, int newY) { x = newX; y = newY;} setSize(int newSize) { size = newSize; } setColor(Color newColor) { color = newColor;}

// methodes accedant aux attributs (accesseurs) public int getX() { return public int getY() { return public int getSize() { return public Color getColor() { return // Afficher le disque public void paint(Graphics g) { g.setColor(color);

x; } y; } size; } color; }

IX.4 Classes java.applet.Applet et java.lang.String


g.fillOval(x-(size/2), y-(size/2), size, size); } }// public class Disk

101

Classe DiskField, qui ache le disque prcdent :


import java.applet.*; import java.awt.*; public class DiskField extends Applet { int Disk x = 150, y = 50, size = 100; theDisk = null; // position et diametre

// Initialisation de lapplet public void init() { theDisk = new Disk(x, y, size);

// Dessiner le disque public void paint(Graphics g) { // Demander au navigateur dappeler la methode paint() // pour afficher le disque theDisk.paint(g); } public void start() { ; } public void stop() { ; } }// class DiskField

Pour acher lapplet, on a besoin dun chier HTML qui la rfrence.


<APPLET code="DiskField.class" width=150 height=100> </APPLET>

4.4 Construction de String


Dans java.lang : String pour les chanes immuables et StringBuffer pour

celles qui sont modiables.


String et StringBuffer sont dclares final, de faon raliser certaines

optimisations. Le constructeur gnrique de String se dclare comme suit :


String String(char tabChars[], int indiceDeb, int nbChars); indiceDeb dbute 0 pour le premier caractre de la chane.

102
Exemples :

Support de cours Java

char desChars[] = {a, b, c, d, e, f }; String s1 = new String(desChars); String s2 = new String(desChars, 2, 3); s1 contient la chane "abcde" et s2 contient "cde". Le contenu du tableau est copi lorsque lon cre une chane partir dun tableau. Si lon modie le tableau aprs avoir cr la chane, le contenu de linstance de String restera inchang. Constructeur de recopie public String(String original). Il y a une syntaxe spciale pour les chanes qui permet une cration-initialisation rapide : String s = "abc"; System.out.println(s.length()); System.out.println("abcdef".length());

Les 2 dernires lignes vont acher respectivement 3 et 6.


Ne pas confondre la mthode length() avec la variable dinstance length

de rfrences des tableaux.

4.5 Concatnation de chanes


Java nimplante pas la surcharge doprateurs, cette technique donnant sou-

vent lieu des abus et rendant les gros programmes diciles lire. Il y a une exception cette rgle : loprateur +, qui existe galement pour les chanes. Le + agit alors comme un oprateur de concatnation, de faon augmenter la lisibilit. Par exemple :
String s = "Impossible " + "deternuer " + "les yeux ouverts.";

est nettement plus lisible que


String s = new StringBuffer("Impossible ") .append("deternuer ") .append("les yeux ouverts.") .toString();

qui est exactement ce qui se passe lorsque le code est excut. On ne peut insrer de caractres dans une String, ni changer ceux qui y sont dja. Il nest pas possible non plus de faire de la concatnation. Les modications sont alors ralises sur une insantce de la classe soeur StringBuffer. Puis, il y a conversion en une String via la mthode toString().

IX.4 Classes java.applet.Applet et java.lang.String

103

La scission en 2 classes, dont une, String, est immuable, a t opre an

davoir des performances plus grandes lors de manipulations (frquentes) de String. La priorit des oprateurs peut jouer des tours. Par exemple, la ligne suivante : String s = "quatre : " + 2 + 2 ; ne mettra pas "quatre : 4" dans s, mais "quatre : 22" ; en eet, "quatre : " + 2 est valu dabord, et le rsultat de ceci (une chane) est ensuite concatn 2. Il faut donc des parenthses : String s = "quatre : " + (2 + 2) ;

4.6 Conversion de chanes


StringBuffer utilise une version surcharge de append() pour tous les types

possibles.
append() appelle en fait la mthode valueOf(). Pour des types primitifs,

cette dernire renvoie une repsentation en chane.


Pour des objets, elle appelle la mthode toString() de lobjet. toString() est une mthode de Object, donc tout objet en hrite.

Cest une BONNE PRATIQUE que de rednir toString() pour ses propres classes. Exemple
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } public String toString() { return "Point[" + x + "," + y + "]"; } class toStringDemo { public static void main(String args[]) { Point p = new Point(20, 20); System.out.println("p = " + p); } }

4.7 Extraction
charAt() permet dextraire un caractre. Par ex. "abc".charAt(1) renvoie

b.
Pour extraire plus dun caractre, utiliser getChars(). Prototype :

void getChars(int srcBegin, int srcEnd, char [] dst, int dstBegin);

104

Support de cours Java o srcBegin et srcEnd sont les indices de dbut et de n dextraction dans la String appelante. dst est le tableau de caractres contenant les caractres extraits. dstBegin est lindice partir duquel les caractres extraits vont tre copis dans dst. On peut galement convertir une String entire en tableau de caractres, laide de la mthode toCharArray() : char [] toCharArray() Enn, on peut convertir une String en tableau de byte, loctet de poids fort tant jet. ceci est utile pour exporter une chane en environnement ASCII (chier texte de protocoles internet par ex.) : byte [] getBytes()

4.8 Comparaison
equals(String s) teste si la String appelante est forme des mmes carac-

tres que s.
equalsIngnoreCase() ralise la mme chose sans faire de distinction minuscule-

majuscule.
regionMatches() compare une rgion de la String appelante une rgion

dune autre. Son prototype est :


boolean regionMatches(int toffset, String other, int oofset, int eln);

o toffset est lindice du dbut de comparaison de la chane appelante, other est lautre String, oofset est lindice de dbut de comparaison de lautre chane et len est la longueur de compraraison. Il existe une autre forme de regionMatches() qui peut ignorer la distinction majuscule-minuscule :
boolean regionMatches(int toffset, String other, int oofset, int eln);

4.9 Extraction/Comparaison
startsWith() (resp. endsWith() teste si la chane appelante commence (resp.

nit) par la chane fournie en paramtre. "Nabuchodonosor".endsWith("nosor") et "Nabuchodonosor".startsWith("Nabu") renvoient tous deux true. On peut galement spcier lindice de dbut de comparaison. Par exemple lexpression "HoueiNeng".startsWith("Neng", 5) renvoie true.

4.10 galit
La mthode equals() et loprateur == ralisent 2 oprations distinctes. equals() teste lgalit caractre caractre. == teste lgalit des rfrences (des adresses mmoires, ou pointeurs) pour

voir si elles se rfrent la mme instance. Exemple :

IX.4 Classes java.applet.Applet et java.lang.String

105

class EgalOuPasEgal { public static void main(String args[]) { String s1 = "Bonjour"; String s2 = new String(s1); System.out.println("s1 + "equals()" + s2 " -> " + s1.equals(s2)); System.out.println("s1 + "==" + s2 " -> " + (s1 == s2)); } }

4.11 Relation dordre


compareTo() compare 2 String selon un ordre alphabtique. int compareTo(String s) renvoie un rsultat ngatif si la chane appelante

est infrieure s (le paramtre), 0 si elles sont gales et un rsultat positif sinon. Moyen mnmotechnique : caller.compareTo(parameter) renvoie un entier du mme signe que caller - parameter.

4.12 Recherche de sous-chane


Recherche de lindice doccurrence dun caractre ou dune sous-chane dans

une chane. 2 mthodes : indexOf() et lastIndexOf() sous plusieurs formes. Renvoient -1 en cas dchec.
int indexOf(int car);

int lastindexOf(int car);

renvoient lindice de la premire (resp. la deernire) occurence (c..d. apparition) du caractre car.
int indexOf(String str);

int lastindexOf(String str);

renvoient lindice du premier caractre de la premire (resp. la deernire) occurrence de la sous-chane str.
int indexOf(int car, int fromIndex);

int lastindexOf(int car, int fromIndex);

renvoient lindice de la premire (resp. la dernire) occurrence du caractre car aprs (resp. avant) formIndex.
int indexOf(String str, int fromIndex);

int lastindexOf(String str, int fromIndex);

renvoient lindice du premier caractre de la premire (resp. la dernire) occurrence de la sous-chane str aprs (resp. avant) formIndex.

106

Support de cours Java

4.13 Modications sur une copie de String


Puisque les String sont immuables, pour modier une chane, on peut soit

utiliser un StringBuffer ou utiliser lune des mthodes suivantes, qui fournissent une copie modie dune String. substring() extrait une String dune autre. Par exemple :
"Bonjour a tous".substring(8) -> "a tous" "Bonjour a tous".substring(6, 5) -> "r a t"
concat() cre un nouvel objet, la concatnate de la chane appelante et

du paramtre :
"Bonjour".concat(" a tous") -> "Bonjour a tous"
replace(char carSrc, char carDst) remplace toutes les occurrences de carSrc

par carDst :
"Bonjour".replace(o, a) -> "Bajaur"
toLowerCase() et toUpperCase() : conversion en majuscules (resp. minus-

cules)
"Grenouille".toUpperCase() -> "GRENOUILLE" "BOEuf".toLowerCase() -> "bouef"
trim() enlve les espaces avant et aprs :

" Jai besoin dair "Jai besoin dair"

".trim() ->

4.14 Autres mthodes de String


methode() String concat(String str) boolean contains(String s) boolean contentEquals(StringBuffer sb) static String copyValueOf(char[] data) static String format(String format, Object... args) boolean matches(String regex)

But Concatnation de this celle fournie en argument. renvoie true si this contient la String argument. renvoie true si this est gale (au sens du contenu) la StringBuffer argument. Conversion dun tableau de caractres en String. Renvoie une String formatte (voir la documentation des API pour les chanes format). renvoie true si this correspond lexpression rgulire regex.

IX.4 Classes java.applet.Applet et java.lang.String


String[] split(String regex)

107

Dcoupe this selon les dlimiteurs fournis en tant quexpression rgulire.

4.15 StringBuffer
Cest une chane modiable et susceptible de crotre et de dcrotre. Elle peuvent tre construites avec un constructeur :

sans paramtre ; ce qui rserve de la place pour 16 caractres ; avec un paramtre int, spciant la taille initiale du tampon ; avec un paramtre String, spciant le contenu initial et rservant de la place pour 16 caractres supplmentaires. La longueur sobtient par length() et la taille (en nombre de caractres) de la zone mmoire alloue (nomme la capacit du tampon) par capacity(). On peut pr-allouer de la place mmoire pour le tampon aprs quun StringBuffer ait t cr via ensureCapacity(). setLength() xe la taille du tampon mmoire. Si la chane tait plus longue que la nouvelle taille, elle est tronque. Si la nouvelle taille est plus longue, il y a remplissage par le caractre nul (unicode 0). charAt() renvoie un caractre n indice donn ; setCharAt() remplace un caractre un indice donn ; exemple :
class setCharAtDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Bonjour"); System.out.println("tampon avant : " + sb); System.out.println("charAt(1) avant : " + sb.charAt(1)); sb.setCharAt(1, a); sb.setLength(2); System.out.println("tampon apres : " + sb); System.out.println("charAt(1) apres : " + sb.charAt(1)); } }

qui ache
tampon avant : Bonjour charAt(1) avant : o tampon apres : Ba charAt(1) apres : a
getChars() fonctionne de la mme manire que son homologue de String.

Prototype identique :

108
void getChars(int srcBegin, int srcEnd, char [] dst, int dstBegin);

Support de cours Java

append() concatne le paramtre la chane appelante. En gnral appel

via +.
insert() insre une sous-chane n indice spci :

"Lenvie detre roi".insert(8, "de tout sauf ")

rsulte en
"Lenvie de tout sauf detre roi"

4.16 StringBuilder
Cest une chane modiable ayant les mme fonctionnalits que StringBuffer

mais sans synchronisation multi-threads. Il est conseill de lutiliser pour les applications mono-thread.

X java.util : Conteneurs et autres utilitaires


Rfrences bibliographiques
A Course in Number Theory and Cryptography, N. Koblitz [Kob87] Java in a Nutshell, D. Flanagan, [Flab], The Java Language Specication, J. Gosling, B. Joy et G. Steele [GJS96], Java et Internet Concepts et programmation, G. Roussel, E. Duris, N. Bedon et R. Forax [RDBF02], Data Structures & Problem Solving Using Java, M.A. Weiss [Wei98], Algorithms, R. Sedgewick [Seg91]

X.1

Classes de java.util ; Classes et interfaces de comparaison

1.1 Classes et interfaces de java.util


On trouve les groupes de classes suivants : Comparaison sur des objets (interfaces Comparable et Comparator). Structures de donnes conteneurs (listes chanes, arbres, tables de hachage). Expressions rgulires (paquetage java.util.regexp). Classe Date, gestion de la date. Classe EventObject Classes Timer et TimerTask Classe Observable, super classe des objets observables. Classe Random, gnrateur de nombres pseudo-alatoires. Classe Stack, pile dobjets. Classe StringTokenizer, lorsquinstancie avec un objet String, casse la chane en units lexicales spares par nimporte quel caractre. 109

110 Journalisation (paquetage java.util.logging).

Support de cours Java

Stockage de paramtres (paquetage java.util.prefs). Classe BitSet, ensemble de bits arbitrairement grand. Des classes de gestion de zone gographique, de gestion des fuseaux horaires, de gestion du calendrier. Deux classes, dprcies, qui sont encore prsentes pour des raisons de compatibilit : Classe Vector, tableau dobjets de grandeur variable. Classe Properties, extension de Hashtable permettant de lire et dcrire des paires cl/valeur dans un ot. On trouve diverses interfaces : 10 interfaces associes aux conteneurs. EventListener, interface marqueur pour tous les gestionnaires dvnements. Comparator, pour les objets dnissant une relation dordre (via compare(Object o1, Object o2) et equals(Object o)). Observer, dnit la mthode update() ncessaire pour quun objet observe des sous-classes de Observable.

1.2 Interface java.lang.Comparable


Deux ements sont comparables (implanter Comparable) si lon peut leur

appliquer public int compareTo(Object other)


Cette mthode renvoie la distance entre this et other, au sens de la relation

dordre induite.

1.3 Interface java.util.Comparator


Objets comparateurs : spcialiss dans la dnition de relations dordre. Deux mthodes implanter :

int compare(Object o1, Object o2), orant le mme service que compareTo() de java.lang.Comparable boolean equals(Object o) testant lgalit de contenu. Les mthodes de comparaison doivent en gnral tre compatibles avec le test dgalit.

X.2 Classes et interfaces conteneurs

111

X.2

Classes et interfaces conteneurs

2.1 Cadre de collections


Un cadre logiciel de collections est form de Interfaces, ou types de donnes abstraits. Implantations, classes concrtes (structures de donnes rutilisables). Algorithmes, mthodes utilitaires comme tri ou recherche, polymorphes (fonctionnalits rutilisable).

2.2 Catgories de conteneurs


Deux grandes catgories :

Type (interface) Collection, ou groupe dobjets. Type (interface) Map, table dassociation de couples cl-valeur. Dans Collection, deux sous-catgories : Type Set, ne pouvant contenir 2 fois le mme lment. Type List, lments indics par des entiers positifs. Dans Map, lobjet cl permet daccder lobjet valeur. Dans Map, couple cl-valeur : entre, de type Map.entry.

2.3 Types de conteneurs


Dirents types de conteneurs, selon linterface et la structure de donne.
Table de hachage Implantations Tableau Arbre quilibr taille variable TreeSet ArrayList TreeMap Liste chane

Interfaces

Set List Map

HashSet HashMap

LinkedList

2.4 Transitions entre conteneurs


Dans Map :

values() renvoie une Collection des valeurs de la table keySet() renvoie un Set des cls de la table entrySet() renvoie un Map.entry des entres (paires cls/valeur) de la table Ce sont des vues de la table. Une modication dune vue est faite sur la table et vice versa. Dans Collection :

112

Support de cours Java toArray() renvoie un tableau contenant tous les objets de la collection. Ce nest pas une vue qui est renvoye. Dans la classe utilitaire Arrays : toArray() renvoie un tableau contenant tous les objets de la collection. Ce nest pas une vue qui est renvoye.

2.5 Interface Collection


Rsum des mthodes :
boolean add(Object o) ajoute llment spci la collection. renvoie true

si la collection a t modie par lopration (un Set ne peut contenir 2 fois le mme lment). boolean addAll(Collection c) ajoute les lments de c la collection. void clear() vide la collection. boolean contains(Object o) teste si la collection contient o boolean containsAll(Collection c) teste si la collection contient la collection c boolean equals(Object o) teste lgalit de contenu de la collection avec o. int hashCode() renvoie le code de hachage de la collection. boolean isEmpty() teste si la collection est vide. Iterator iterator() renvoie un itrateur sur les lments de la collection. boolean remove(Object o) enlve une instance de o de la collection. boolean removeAll(Collection c) enlve de la collection tous les lments de c. boolean retainAll(Collection c) enlve de la collection tous les lments qui ne sont pas dans c (ne retient que ceux qui sont dans c). int size() renvoie le nombre dlments de la collection. Object[] toArray() renvoie un tableau contenant tous les lments de la collection. Object[] toArray(Object[] a) renvoie un tableau contenant tous les lments de la collection qui, lexcution, sont du type de a.

2.6 Interface Map


Rsum des mthodes : void clear() vide la collection.
boolean containsKey(Object key) teste si la table contient une entre avec

la cl spcie.
boolean containsValue(Object value) teste si la table contient une entre

avec la valeur spcie. Set entrySet() renvoie une vue ensembliste de la table.

X.2 Classes et interfaces conteneurs

113

boolean equals(Object o) teste lgalit de contenu de la table avec o. Object get(Object key) renvoie la valeur de la table correspondant la

cl key. int hashCode() renvoie le code de hachage de la table. boolean isEmpty() teste si la table est vide. Set keySet() renvoie une valeur ensembliste des cls de la table. Object put(Object key, Object value) associe la valeur value la cl key dans la table. Si une valeur tait dja associe, la nouvelle remplace lancienne et une rfrence vers la nouvelle est renvoye, sinon null est renvoy. void putAll(Map t) copie toutes les entres de t dans la table. Object remove(Object key) enlve lentre associe key de la table. Renvoie une rfrence sur la valeur retire ou null si elle nest pas prsente. int size() renvoie le nombre dentres (paires cl-valeur) de la table. Collection values() renvoie une vue de type Collection des valeurs de la table.

2.7 Classe Arrays


Classe de manipulation de tableaux. Mthode static List asList(Object[] a) renvoie une vue de type List de

a.
Sinon, 4 groupes de mthodes principales (en tout 54 mthodes) :

Dans ce qui suit, Type dsigne soit un type primitif, soit Object. Voir la documentation Java des API pour les signatures prcises des mthodes. static int binarySearch(Type[] a, Type key) eectuant une recherche de key dans a. static int equals(Type[] a, Type[] b) teste lgalit lt. lt. de a et b. static int fill(Type[] a, Type val) aecte tous les lments de a val. static int sort(Type[] a) trie a selon un alogrithme quicksort modi.

2.8 Conteneurs immuables


Toutes les mthodes de modication de Collection et Map sont documentes

comme optionnelles. On doit les rednir, mais le code peut juste lever une UnsupportedException. Si toutes ces mthodes lvent une telle exception, le conteneur est dit immuable.

114

Support de cours Java


Dans la classe Collections (et non dans linterface Collection), constantes

(public static final) reprsentant des collections vides : EMPTY_MAP, de type Map, EMPTY_SET de type Set et EMPTY_LIST de type List. Singletons immuables : static Set singleton(Object o), singleton de type Set, static List singletonList(Object o), singleton de type List, static Map singletonMap(Object key, Object value), singleton de type Map. Vues immuables dun conteneur : static Collection unmodifiableCollection(Collection c), static ListunmodifiableList(List list), static MapunmodifiableMap(Map m), static SetunmodifiableSet(Set s), Vues immuables tries dun conteneur : static SortedMapunmodifiableSortedMap(SortedMap m), static SortedSetunmodifiableSortedSet(SortedSet s)

2.9 Concurrence et synchronisation


Aux exceptions de Vector et Hashtable prs (existant depuis la version 1.0

du langage et conserves pour des raisons de compatibilit), les implantations de Map et de Collection sont non synchronises. La classe Collections contient des mthodes renvoyant des vues synchronises : static Collection synchronizedCollection(Collection c), static List synchronizedList(List list), static Map synchronizedMap(Map m), static Set synchronizedSet(Set s). Et, pour les collections tries : static SortedMap synchronizedSortedMap(SortedMap m), static SortedSet synchronizedSortedSet(SortedSet s).

2.10 Itration de conteneurs


Par le biais de linterface Iterator. Elle dnit des mthodes par lesquelles ont peut numrer (un la fois) des

lments dune collection. Elle spcie 3 mthodes : boolean hasNext() renvoie true sil y a encore des lments dans la collection,

X.2 Classes et interfaces conteneurs

115

Object next() renvoie une rfrence sur linstance suivante de la collection, remove() enlve llment renvoy dernirement par litrateur. Ces itrateurs sont chec rapide (fail-fast)
Collection col = new ArrayList(); for (int i = 0; i < 10; i++) col.add(new Integer(i)); Iterator i1 = col.iterator(); System.out.println(i1.next());// Affiche 0 Iterator i2 = col.iterator(); System.out.println(i2.next());// Affiche 0 i1.remove(); // modification via i1 // leve une ConcurrentModificationException System.out.println(i2.next()); Le code suivant, par contre, sexcute normalement Collection col = new ArrayList(); for (int i = 0; i < 10; i++) col.add(new Integer(i)); Iterator i1 = col.iterator(); System.out.println(i1.next()); i1.remove(); System.out.println(i1.next()); Iterator i2 = col.iterator(); System.out.println(i2.next());

// Affiche 0 // modification via i1 (enleve 0) // Affiche 1 // Affiche 1

la mme instance de litrateur, dj cr, doit tre utilise ensuite.


Un exemple typique ditration est la boucle for suivante static void filter(Collection c) { for (Iterator i = c.iterator(); i.hasNext();) if (!cond(i.next())) i.remove(); }

Noter que ce code est polymorphe (il fonctionne pour toute instance de Collection)

2.11 Squelettes dimplantation


Des classes abstraites squelettes facilitent limplantation. Les oprations (mthodes) de modication ne font rien sauf gnrer une

exception de type UnsupportedOperationException.


Par ex., pour crer une classe immuable de type Collection, il sut dhriter

de AbstractCollection et dimplanter Iterator iterator() et int size() Pour dnir des conteneurs modiables, il faut implanter boolean add(Object o) et la mthode boolean remove(Object o) de litrateur renvoy par Iterator iterator().

116

Support de cours Java


De la mme manire, on dispose des classes AbstractMap, AbstractSet,

AbstractList et AbstractSequentialList.

X.3

Conteneurs de type Map


Map est une interface qui reprsente un mcanisme de stockage cl/valeur.

3.1 Conteneurs de type Map


Une cl est un nom que lon utilise pour accder une valeur. Il sagit dune reprsentation abstraite dun tableau associatif. Les couples (cl, valeur) sont des instances de classes implantant linterface Map.entry.

3.2 Conteneurs de type Map


La hirarchie des classes est la suivante ( : hrite de,

: implante) :

LinkedHashMap HashMap AbstractMap WeakHashTable AbstractMap WeakHashTable AbstractMap TreeMap SortedMap

Map

Map

les classes WeakHaskTable, HashMap, LinkedHashMap etIdentityHashMap uti-

lisent des tables de hachage. TreeMap utilise des arbres rouges-noirs.

3.3 Classe HashMap


HashMap est la plus utilise des Map en pratique. Table de hachage : une reprsentation dune cl est utilise pour dterminer

une valeur autant que possible unique, nomme code de hachage (voir ce qui suit pour une brve description du hachage). Le code hachage est alors utilis comme indice auquel les donnes associes la cl sont stockes.

3.4 Classe HashMap


Pour utiliser une table de hachage :

On fournit un objet utilis comme cl et des donnes que lon souhaite voir lies cette cl.

X.3 Conteneurs de type Map

117

La cl est hache. Le code de hachage rsultant est utilis comme indice auquel les donnes sont stockes dans la table. Les valeurs de codes de hachage sont caches (encapsules). Une table de hachage ne peut stocker que des cls qui rednissent les mthodes hashCode() et equals() de Object.

3.5 Classe HashMap


La mthode hashCode() doit calculer le code de hachage de lobjet et le

renvoyer.
equals() compare 2 objets. Beaucoup de classes courantes de Java implantent la mthode hashCode().

Cest le cas de String, souvent utilise comme cl.

3.6 Classe HashMap


Les constructeurs de HashMap sont :

HashMap(), constructeur par dfaut, construit une table de hachage vide. HashMap(int capaciteInitiale), construit une table de hachage de taille initiale capaciteInitiale. HashMap(int capaciteInitiale, float tauxCharge), construit une table de hachage de taille initiale capaciteInitiale et de taux de remplissage tauxCharge ; ce taux, ncessairement compris entre 0.0 et 1.0, dtermine quel pourcentage de remplissage la table sera re-hache en une plus grande. Si tauxCharge nest pas spci, 0.75 est utilis.

3.7 Classe HashMap


Si lon veut utiliser ses propres classes comme cl de hachage, il faut rednir

hashCode() et equals() de Object. La valeur (int) renvoye par hashCode() est ensuite automatiquement r-

duite par une opration modulo la taille de la table de hachage.


Il faut sassurer que la fonction de hachage utilise rpartit aussi unifor-

mment que possible les valeurs renvoyes entre 0 et capaciteInitiale, la taille initiale de la table.

3.8 Classe HashMap


Mthodes de HashMap :

118

Support de cours Java

methode() void clear() Object clone()

But Rinitialise et vide la table de hachage. Renvoie un duplicata de lobjet appelant. Toute la structure de la table de hachage est copie, mais ni les cls, ni les valeurs ne le sont. Il sagit dune copie supercielle (shallow copy). Renvoie true sil existe une cl gale key (comme dtermin par la mthode equals()) dans la table de hachage. Renvoie false sinon. Renvoie true sil existe une valeur gale value (comme dtermin par la mthode equals()) dans la table de hachage. Renvoie false sinon. Renvoie une vue de type Collection des entres contenues dans la table. Renvoie une rfrence sur lobjet contenant la valeur associe la cl key. Si key nest pas dans la table de hachage, une rfrence null est renvoye. Renvoie true si la table de hachage est vide et false sinon. Renvoie une vue de type Set des cls contenues dans la table. Insre une cl et sa valeur dans la table de hachage. Renvoie null si la cl key nest pas dja dans la table de hachage, ou la valeur prcdente associe key si elle est dja dans la table de hachage. Copie toutes les entres de t dans la table. Dans le cas o une entre de mme cl tait dj prente dans la table, elle est crase par celle de t. Enlve la cl key et sa valeur. Renvoie la valeur associe key. Si key nest pas dans la table de hachage, une rfrence null est renvoye. Renvoie le nombre dentres la table de hachage.

boolean containsKey(Object key)

boolean containsValue(Object value)

Set entrySet() Object get(Object key)

boolean isEmpty() Set keySet() Object put(Object key, Object value)

void putAll(Map t)

Object remove(Object key)

int size()

X.3 Conteneurs de type Map


String toString()

119
Renvoie une forme achable dune table de hachage. Il sagit de la liste des entres de la table, chaque entre tant entoure daccolades et spare de la suivante par une virgule. Chaque entre est constitue de la forme achable (via toString()) de la cl, suivi du signe =, suivi de la forme achable (via toString()) de la valeur associe. Renvoie une vue de type Collection des valeurs de la table.

Collection values()

3.9 Hachage : principe


Une fonction de hachage est une fonction f : x h aisment calculable, qui

transforme une trs longue entre x en une sortie h nettement plus courte, (typiquement de 106 bits 200 bits) et qui a la proprit suivante : (Phach) : Il nest pas calculatoirement faisable de trouver deux entres direntes x et x telles que f (x) = f (x ). Lexpression lopration O nest pas calculatoirement faisable signie simplement tous les algorithmes actuellement connus pour raliser O sont de complexit exponentielle.

3.10 Hachage : autentication


Application lautentication de messages : Supposons que Alice veuille envoyer un message Bob, en signant son message. Les donnes quAlice veut transmettre sont constitues dun message en clair suivi de ses prnom et nom, en clair, la n du message. Nommons x cet ensemble de donnes. Alice transmet alors x, en clair, suivi de h = f (x) o f est une fonction de hachage. la rception, Bob applique la fonction de hachage f au texte en clair x et le compare h. Ainsi, Bob peut vrier non seulement que le message provient bien dAlice (que sa signature na pas t falsie), mais galement que son message, en clair, na pas t altr. Par supposition, aucun pirate naurait t capable de modier x sans changer la valeur de h = f (x).

120

Support de cours Java

3.11 Hachage : recherche


Application la recherche. Supposons avoir une cl de recherche relative-

ment longue (un entier ou une chane de caractres).


La sortie de la table de hachage sera un indice dune table dans laquelle

sont ranges les valeurs associes aux direntes cls.


Prenons le cas o la cl est une chane de caractres x et o la fonction de

hachage f choisie la transforme en h = f (x) un indice entre 1 et p (il y a p indices dirents dans la table de hachage).

3.12 Hachage : recherche


La proprit (Phach) assure que les sorties de f sont quasi-unromment

distribues, en un sens probabiliste, dans [1, p]. Prenons comme exemple de fonction de hachage simple la fonction modulo un nombre premier. Prenons alors pour p un nombre premier (par exemple 101) et considrons la cl suivante : VERYLONGKEY

3.13 Hachage : recherche


On dcompose la cl selon la base de son alphabet (ici, il y a 32 signes dans

lalphabet considr) :
22.3210 + 5.329 + 18.328 + 25.327 + 12.326 + 15.325 + 14.324 + 7.323 + 11.322 + 5.32 + 25 La fonction de hachage considre ne prend pas directement ce nombre pour

en faire lopration modulo 101, sa repsentation machine tant lourde manier ; il scrit en eet en binaire par
1011000101100101100101100011110111000111010110010111001 Il est bien plus ecace de se servir de la reprsentation dun polynme

par lalgorithme de Hrner, o VERYLONGKEY scrit, en base 32, de la faon suivante :


(((((((((22.32 + 5)32 + 18)32 + 25)32 + 12)32 + 15)32 + 14)32 + 7)32 + 11)32 + 5)32 + 25

3.14 Hachage : recherche


Lalgorithme de calcul de la fonction de hachage est alors

public final int hache(String cle, int tailleTable) { int valHach = 0;

X.3 Conteneurs de type Map


h = cle.charAt(0); for(int i = 1; i < cle.length(); i++) valHach = ((valHach*32)+cle.charAt(i)) % tailleTable; return valHach; }

121

o cle est une String dans lequel on a stock la cl.

3.15 Hachage : recherche


Pour p == 101 et cle[] valant "VERYLONGKEY", cette fonction de hachage

fournit 97.
Le calcul dun indice partir dune cl est rapide, mais rien ne garantit

que 2 cls distinctes donneront des indices distincts. On nomme collision dindice le fait que 2 cls distinctes donnent le mme indice. Il faut alors une stratgie de rsolution de collision.

3.16 Hachage : recherche


Une stratgie simple et ecace est le chanage spar. chaque fois quil y

a une collision pour lindice i, les cls sont ranges dans une liste chane n i, associe la case dindice i de la table. Les dirents lments de la liste chane peuvent tre rangs en ordre alphabtique croissant des cls, pour un accs plus rapide. Cette stratgie est bien adapte au cas o lon ne connat pas, a priori, le nombre denregistrements (de paires cls/valeurs) traiter, ce qui est le cas de la classe HashMap de Java.

3.17 Hachage : recherche


En Java, un code de hachage est gnr (via la mthode hashCode() d-

nie dans la classe Object. Elle renvoie alors en gnral une conversion de ladresse de lobjet en int, bien que ceci ne soit pas une obligation dimplantation du langage. La mthode hashCode() est rednie par les types suivants : BitSet, Boolean, Character, Date, Double, File, Float, Integer, Long, Object et String,

122

Support de cours Java

3.18 Hachage : recherche


Pour String, le code est obtenu de lune des 2 manires suivantes, selon

sa longueur. Soit n la longueur de la suite de caractres et ci le caractre dindice i. Si n 15, le code de hachage est calcul par
n1

ci .37i
i=0

en utilisant larithmtique des int

3.19 Hachage : recherche


Si n > 15, le code de hachage est calcul par
m

ci.k .39i
i=0

en utilisant larithmtique des int, o k = n et m = n , ne prenant 8 k (dans la dcomposition) que 8 ou 9 caractres de la chane. Pour les implantations des autres types, voir [GJS96].

3.20 Itration dune HashMap


Lopration ditration sur une HashMap est possible (via values()), mais

prsente 2 inconvnients : (1) Lordre ditration est indtermin. (2) La complexit de litration est linaire en la capacit de la table. Pour un conteneur adapt litration, cest une fonction linaire de la taille du conteneur.

3.21 Classe LinkedHashMap


Pour corriger les insusances en itration de HashMap, le conteneur contient

une table de hachage ainsi quune liste doublement chane de ses lments.
Litration est ainsi de complexit linaire en la taille de la table. Lordre ditration est celui dinsertion des cls. Il existe un constructeur supplmentaire par rapport HashMap, public

LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) dont le dernier paramtre spcie le type dordre daccs. Si accessOrder est

X.3 Conteneurs de type Map

123

gal false, lordre daccs est celui des cls (valeur par dfaut prise dans les autres constructeurs) ; sil est gal true, lordre ditration est lordre daccs des entres du plus ancien au plus rcent. La mthode protge removeEldestEntry(Map.Entry eldest) renvoie un boolen reprsentant une condition impliquant la destruction de lllement transmis en paramtre.
import java.util.*; public class CacheMap extends LinkedHashMap { int maxSize; // Construit un cache de taille maxSize de taille initiale // vide avec une capacite de 16 et un facteur de charge de 75% public CacheMap(int maxSize) { super(16, 0.75f, true); // true pour choisir lordre dacces this.maxSize = maxSize; } // Determine si "le plus ancien elt" doit etre jete protected boolean removeEldestEntry(Map.Entry eldest) { return (size() > maxSize); } public static void main(String args[]) { ChacheMap map = new CacheMap(3); // cache de taille 3 map.put("1", "un"); map.get("1"); map.put("2", "deux"); map.put("3", "trois"); map.put("4", "quatre"); Set entrySet = map.entrySet(); // Iteration sur le conteneur for (Iterator it = entrySet.iterator(); it.hasNext(); ) System.out.println(it.next() + " "); }
Les cls ne sont pas compares avec equals() mais par galit des rfrences

(==).
on utilise System.identityHashCode() qui utilise les rfrences et non hashCode(). On donne au constructeur la taille maximale de la table (et non la capacit

et le facteur de charge). La taille est augmente si besoin est. Utilise en srialisation, o lenvironnement dexcution associe un identicateur chaque rfrence. Lorsquon rencontre une rfrence dj prise en compte, on utilise son identicateur pour la reprsenter.

124

Support de cours Java

3.22 Classe WeakHashMap


Se comporte comme HashMap, mais les cls sont des rfrences faibles. Les cls qui ne sont rfrences que par la table sont susceptibles dtre

dtruites par le ramasse-miettes pour librer de la mmoire.

3.23 Interface SortedMap


Implantation de Map dans laquelle les entres peuvent tre ordonnes suivant

les cls.
Il faut fournir 2 constructeurs suplmentaires :

lun avec un paramtre de type SortedMap, ralisant une copie de la table fournie, avec le mme ordre. lautre avec un paramtre de type Comprarator xant lordre.

3.24 Interface SortedMap


Mthodes supplmentaires de SortedMap

Comparator comparator() renvoie le comparateur associ la table trie, ou null sil utilise lordre naturel des cls. Object firstKey() renvoie la plus petite cl de la table trie. SortedMap headMap(Object toKey) renvoie une vue de la partie de la table trie dont les cls sont strictement plus petites que toKey.

3.25 Interface SortedMap


Object lastKey() renvoie la plus grande cl de la table trie. SortedMap subMap(Object fromKey, Object toKey) renvoie une vue de la partie de la table trie dont les cls sont comprises strictement entre fromKey et toKey. SortedMap tailMap(Object fromKey) renvoie une vue de la partie de la table trie dont les cls sont strictement plus grandes que fromKey.

3.26 Classe TreeMap


Implante linterface SortedMap. structure de donnes sous-jacente : arbres rouges-noirs. Les cls sont constamment ordonnes en ordre croissant, selon lordre natu-

rel des cls, ou selon un objet de comparaison fourni la cration, selon le constructeur utilis.

X.4 Conteneurs de type Collection et Listes

125

Temps daccs en insertion, recherche, suppression (containsKey(), get(...),

put(...) et remove(...)) en O (log n) o n est la taille du conteneur.

X.4

Conteneurs de type Collection et Listes

4.1 Conteneurs de type Collection


Conventions : indentation : hritage, interface, [[classe abstraite]]
<<Collection>> <<List>> [[AbstractCollection]] (implements Collection) [[AbstractList]] (implements List) [[AbstractSequentialList]] LinkedList (implements List) ArrayList (implements List, RandomAccess) [[AbstractSet]] (implements Set) HashSet (implements Set) LinkedHashSet (implements Set) TreeSet (implements SortedSet)

4.2 Interface List


Interface pour les classes de type listes et ensemble. void add(int index, Object element) insre element la position spcie dans la liste. boolean addAll(Collection c) ajoute tous les lts. de c la n de la liste. boolean addAll(int index, Collection c) ajoute tous les lts. de c la position spcie dans la liste. void clear() vide la liste. boolean containsAll(Collection c) teste si la liste contient tous les lts. de c. Object get(int index) renvoie llt. situ la position spcie dans la liste. int hashCode() renvoie le code de hachage de cette liste. int indexOf(Object o) renvoie lindice de la 1re occurrence de o dans la liste. boolean isEmpty() test si la liste est vide.

126

Support de cours Java int lastIndexOf(Object o) renvoie lindice de la dernire occurrence de o dans la liste. ListIterator listIterator() renvoie un listIterator des lts. de cette liste. Returns a list iterator of the elements in this list (in proper sequence). ListIterator listIterator(int index) renvoie un listIterator des lts. de cette liste partir de index. Object remove(int index) enlve llt. spci de la liste. boolean removeAll(Collection c) enlve de la liste tous les lts. de c. boolean retainAll(Collection c) ne garde dans la liste que les lts. de c. Object set(int index, Object element) remplace llt. de la liste la position index par element. int size() renvoie le nombre dlts. de la liste. List subList(int fromIndex, int toIndex) renvoie une vue de la portion de liste comprise entre fromIndex inclus et toIndex, exclus. Object[] toArray() renvoie un tableau des lts. de la liste. Object[] toArray(Object[] a) renvoie un tableau des lts. de la liste. Le type du tableau renvoy est le type de a lexcution.

4.3 Itration des listes


Itrateur spcialis des listes : interface ListIterator ; Mthodes supplmentaires par rapport Iterator.
methode() void add(Object o) boolean hasPrevious() int nextIndex() Object previous() int previousIndex() void set(Object o)

But insre llment spcif dans la liste. teste si la liste contient un prdcesseur de llment courant. renvoie lindice de llment renvoy par next(). renvoie llment prcdent de la liste. renvoie lindice de llment renvoy par previous(). remplace le dernier lment renvoy par next() ou previous() par llment cpci.

4.4 Ensembles
Sous-type de Collection ne pouvant contenir 2 lts. identiques.

X.4 Conteneurs de type Collection et Listes

127

Ensembles implantent Set, ensembles ordonns implantent SortedSet. Mmes mthodes que Collection, smantique modie : pas 2 lts identiques au sens dequals(). Classe abstraite AbstractSet admet 3 sous-classes concrtes : HashSet, LinkedHashSet, TreeSet.

4.5 Classe HashSet


Contient une table de hachage. Pas de gestion de relation dordre sur les lments. iterator() renvoie les lments dans un ordre quelconque. Oprations dajout, retrait et recherche prennent un temps constant. Constructeur avec capacit at taux de charge.

4.6 Classe LinkedHashSet


Hrite de HashSet. Contient une LinkedHashMap pour stocker les ements. Permet de maintenir un ordre entre les ements. Cet ordre est ncessairement celui dinsertion dans lensemble.

4.7 Classe TreeSet


Contient un TreeMap (arbre rouge-noir) pour stocker les lments. Implante linterface SortedSet. Les cls sont constamment ordonnes en ordre croissant. Temps daccs en insertion, recherche, suppression (containsKey(), get(...), put(...) et remove(...)) en O (log n) o n est la taille du conteneur. Mthodes supplmentaires de linterface SortedSet :
methode() Object first() SortedSet headSet(Object toElement) renvoie une vue des lts strictement plus petits que toElement. Object last() SortedSet subSet(Object fromElement, Object toElement) SortedSet tailSet(Object fromElement)

But renvoie le 1er elt. de lensemble tri. renvoie le dernier elt. de lensemble tri.

renvoie une vue des lts strictement compris entre toElement et fromElement. renvoie une vue des lts strictement plus grands que fromElement.

128

Support de cours Java

4.8 Suites
Suites accs direct (dans nimporte quel ordre) : implantent RandomAccess. Suites accs squentiel (pour accder i +1, accder i dabord) : hritent de AbstractSequentialList. Suites accs direct : ArrayList. Suites accs squentiel : LinkedList.

4.9 Suites accs direct


Un telle suite possde une capacit initiale. Sil ne reste plus de place, il faut augmenter la taille de la liste, opration en O(n). Linsertion a donc une complexit au pire de O(n). En augmentant la taille astucieusement, on assure que la complexit de i insertions est en O(i). Le calcul de la taille, laccs un lment et laectation une position donne a une complexit en O(1) La suppression est en O(n).

4.10 Classe ArrayList


ArrayList est, grossirement parlant, un tableau longueur variable de

rfrences des objets. ArrayList nest pas synchronise par dfaut. Si lon dsire avoir un tableau longueur variable synchronis, utiliser
static Collection synchronizedCollection(Collection c) de la classe Collections.
On dispose de 3 constructeurs :

ArrayList() cr une liste de taille initiale 10 rfrences. ArrayList(int size) cr une liste de taille initiale size rfrences. ArrayList(Collection c) cr une liste avec les lts de c. La capacit initiale de la liste est de 110% celle de c. Les direntes mthodes sont :
methode() void add(int index, Object element)

But Lobjet spci par element est ajout lendroit spci de la liste.

X.4 Conteneurs de type Collection et Listes


boolean add(Object o) boolean addAll(Collection c) boolean addAll(int index, Collection c) void clear() Object clone() boolean contains(Object element) final void ensureCapacity(int size) Object get(int index) final int indexOf(Object element)

129

boolean isEmpty() int lastIndexOf(Object element)

Object remove(Object element)

protected void removeRange(int fromIndex, int toIndex) Object set(int index, Object element) int size() Object[] toArray() Object[] toArray(Object[] a)

void trimToSize()

Lobjet spci par element est ajout la n de la liste. Les lts. de c sont ajouts la n de la liste. Les lts. de c sont ajouts lendroit spci de la liste. vide la liste. Renvoie un duplicata (copie supercielle) de la liste appelante. Renvoie true si element est contenu dans la liste et false sinon. Fixe la capacit minimale de la liste size. renvoie lllement situ la position spcie de la liste. Renvoie lindice de la 1ire occurrence de element. Si lobjet nest pas dans la liste, -1 est renvoy. Renvoie true si la liste ne contient aucun lment et false sinon. Renvoie lindice de la dernire occurrence de element. Si lobjet nest pas dans la liste, -1 est renvoy. Enlve la premire occurrence de element trouve dans la liste. Renvoie une rfrence sur llment enlev. Enlve les lments situ entre les indice fromIndex (inclus) et toIndex (exclus). Remplace llment la position spcie par element. Renvoie la taille de la liste. renvoie un tableau des lts. de la liste. renvoie un tableau des lts. de la liste. Le type du tableau renvoy est le type de a lexcution. Fixe la capacit de la liste au nombre dlments quelle contient actuellement.

4.11 Classe ArrayList


Exemple :
import java.util.ArrayList; import java.util.Iterator;

130

Support de cours Java

class DemoArrayList { public static void main(String args[]) { // Taille initiale de 3 ArrayList l = new ArrayList(3); System.out.println("Taille initiale : " + l.size()); l.add(new Integer(1)); l.add(new Integer(2)); l.add(new Integer(3)); l.add(new Integer(4)); l.add(new Double(18.23)); l.add(new Integer(5)); System.out.println("1er element : " + (Integer)l.get(0)); System.out.println("Dernier element : " + (Integer)l.get(l.size()-1)); if (l.contains(new Integer(3))) System.out.println("l contient lentier 3"); // Listons les elements de la liste ListIterator it = l.listIterator(); System.out.println("\n Elements dans la liste : "); while (it.hasNext()) System.out.print(it.next() + " "); System.out.println(); } }

La sortie cran du programme est :


Taille initiale : 3 1er element : 1 Dernier element : 5 l contient lentier 3 Elements dans la liste : 1 2 3 4 18.23 5

4.12 Suites accs squentiel


Classe LinkedList, de structure sous-jacente une liste doublement chane.

X.4 Conteneurs de type Collection et Listes

131

Ajout/suppression en dbut de liste en temps constant (O(1)). Insertion/suppression dun lt. juste aprs un lt. donn (par ex. par un itrateur) en temps constant. Accs llt. i en O(i).

4.13 Classe LinkedList


Mthodes supplmentaires de LinkedList
methode() void addFirst(Object o) void addLast(Object o) Object getFirst() Object getLast() Object removeFirst() Object removeLast()

But insre llt. spci au dbut de la liste. ajoute llt. spci la n de la liste. renvoie le 1er lt. de la liste. renvoie le dernier lt. de la liste. enlve et renvoie le 1er lt. de la liste. enlve et renvoie le dernier lt. de la liste.

4.14 Classe Stack


Stack implante une pile (le LIFO, Last In/First Out) standard. Stack est une sous classe de Vector. Elle hrite donc de toutes les mthodes

de Vector, et en dnit cetraines qui lui sont propres. Stack nest pas une pile au sens puriste du terme . . . Il est toutefois utile davoir accs aux mthodes de Vector. Un seul constructeur, sans arguments, qui cr une pile vide.

4.15 Classe Stack


Mthodes propres de Stack : methode() boolean empty() Object peek() Object pop() Object push(Object element)

But Renvoie true si la pile est vide et false sinon. Renvoie llment du dessus de la pile, mais ne lenlve pas. Renvoie llment du dessus de la pile, en lenlvant. Pousse element sur la pile. element est galement renvoy.

132
int search(Object element)

Support de cours Java


Cherche element dans la pile. Sil est trouv, son oset par rapport au dessus de la pile est renvoy. Sinon, -1 est renvoy.

Une EmptyStackException est jete si lon appelle pop() lorsque la pile est

vide.

4.16 ((Interface Enumeration))


Elle dnit des mthodes par lesquelles ont peut numrer (un la fois) des

lments dun Vector ou dune Hashtable. Lutilisation de cette interface est dprcie. Il est recommand dutiliser Iterator la place. Elle spcie 2 mthodes : boolean hasMoreElements() Object nextElement() la 1ire doit renvoyer true tant quil y a encore des lments dans la collection, et la 2ime renvoie une rfrence sur linstance suivante de la collection.

4.17 ((Classe Vector))


Vector est, grossirement parlant, un tableau longueur variable de rf-

rences des objets.


Lutilisation de cette classe est dprcie. Il est recommand dutiliser

ArrayList la place.
La classe ArrayList nest pas synchronise par dfaut. Si lon dsire avoir

un tableau longueur variable synchronis, utiliser la mthode static Collection synchronizedCollection(Collection c) de la classe Collections.

4.18 ((Classe Dictionary))


Dictionary est une classe abstraite qui reprsente un mcanisme de stockage

cl/valeur.
Lutilisation de cette classe est dprcie. Il est recommand dutiliser

la classe AbstractMap la place.

4.19 Classe Hashtable


Hashtable est une implantation concrte de Dictionary, qui peut tre utili-

se pour stock des Objects rfrencs par dautres Objects.

X.4 Conteneurs de type Collection et Listes

133

Lutilisation de cette classe est dprcie. Il est recommand dutiliser

HashMap la place.

4.20 ((Classe Properties))


Une liste de proprits est une sous-classe de Hashtable (classe dprcie

. . . ) o la cl est une String.


Pratique lorsque lon veut une micro base de donnes. Utilis par dautres classes Java (par ex. type renvoy par System.getProperties()

qui donne les variables denvironnement).


Un champ est dni

protected Properties defaults ; qui contient une

liste de proprits par dfaut. Constructeurs : Properties(), cr un objet sans liste par dfaut. Properties(Properties defaultProp), cr un objet avec defaultProp comme liste par dfaut. Dans les 2 cas, la liste des proprits est vide. Liste des mthodes propres de Properties
methode() String getProperty(String key)

But Renvoie la valeur associe la cl key ; la recherche seectue dabord dans la liste, puis, si rien nest trouv, dans la liste par dfaut. Une rfrence null est renvoye si key ne se trouve ni dans la liste, ni dans la liste par dfaut. Renvoie la valeur associe la cl key si elle est trouve et renvoie defaultVal sinon. Cette dernire peut tre une valeur par dfaut ou un message derreur. Envoie la liste des proprits au ux de sortie associ streamOut. Utilis pour lachage. la liste des paires cl, valeur est lue partir du ux streamIn et est ajoute la table. Renvoie une numration des cls. Ceci inclut les cls trouves dans la liste des proprits par dfaut. Sil y a des cls en double, une seule est retenue. crit la chane description, puis la liste dans le ux associ streamOut.

String getProperty(String key, String defaultVal)

void list(PrintStream streamOut)

void load(InputStream streamIn) thows IOException Enumeration propertyNames()

void save(OutputStream streamOut, String description)

134

Support de cours Java

Dans la lecture par load() :

Les lignes commenant par un # ou un ! sont traites comme des commentaires (elles ne sont pas lues). Les sparateurs cl-valeur sont : =, : ou un espace. Chaque paire cl-valeur doit tenir sur une ligne, sauf si lon place un \ en n de ligne, auquel cas lentre peut se poursuivre la ligne suivante. Tous les caractres blancs en dbut de ligne sont limins. Dans lcriture par save() : Aucun lment de la table par dfaut nest crit. Si largulent description nest pas nul, il est crit, prcd en dbut de ligne par un #. Il sert donc de commentaire identicateur. Ensuite, un commentaire est toujours crit, constitu dun #, suivi de la date et de lheure et dun passage la ligne. Puis, chaque paire de la table est crite, une par ligne. La cl est dabord crite, suivi dun =, suivi de la valeur. Exemple dutilisation de la liste par dfaut :
import import import import java.util.Dictionary; java.util.Hashtable; java.util.Properties; java.util.Enumeration;

class PropDemoDef { public static void main(String args[]) { Properties defList = new Properties(); defList.put("Florida", "Tallahassee"); defList.put("Wisconsin", "Madison"); Properties capitals = new Properties(defList); Enumeration states; String str; capitals.put("Illinois", "Springfield"); capitals.put("Missouri", "Jefferson City"); capitals.put("Washington", "Olympia"); capitals.put("California", "Sacramento"); capitals.put("Indiana", "Indianapolis"); // Montrer tous les etats et capitales de la table. states = capitals.keys(); while(states.hasMoreElements()) { str = (String) states.nextElement();

X.4 Conteneurs de type Collection et Listes


System.out.println("The capital of " + str + " is " + capitals.getProperty(str) + "."); } System.out.println(); // La Floride va etre trouvee dans la liste par defaut. str = capitals.getProperty("Florida"); System.out.println("The capital of Florida is " + str + "."); } }

135

Exemple dune base de donnes simpliste de numros de tlphone.


import java.io.*; import java.util.*; class Phonebook { public static void main(String args[]) throws IOException { // Base de donnees : name et number Properties ht = new Properties(); String name, number; // Autres variables BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String finName; FileInputStream fin = null; boolean changed = false; if (args.length > 1) finName = new String(args[1]); else finName = new String("agendatel.prp"); // Essai douverture de phonebook.dat try { fin = new FileInputStream(finName);

136
} catch(FileNotFoundException e) { // ignore missing file }

Support de cours Java

// Si le fichier des nos de telephone existe, // charger les nos. existants. try { if(fin != null) { ht.load(fin); fin.close(); } } catch(IOException e) { System.out.println("Erreur de lecture de " + finName); } // Lutilisateur entre les nouveaux noms et numeros. do { System.out.println("Entrez un nouveau nom " + "(quit pour sortir) : "); name = br.readLine(); if(name.equals("quit")) continue; System.out.println("Entrez le numero : "); number = br.readLine(); ht.put(name, number); changed = true; } while(!name.equals("quit")); // Si lagenda telephoneique a change, le sauvegarder. if(changed) { FileOutputStream fout = new FileOutputStream(finName); ht.save(fout, "Agenda telephonique"); fout.close(); } // Charger des numeros en donnant un nom. do { System.out.println("Entrez le nom a trouver " + "(quit pour sortir) : "); name = br.readLine(); if(name.equals("quit")) continue;

X.4 Conteneurs de type Collection et Listes


number = (String) ht.get(name); System.out.println(number); } while(!name.equals("quit")); } }

137

4.21 Exemples : formes ditration


// For a set or list for(Iterator it=collection.iterator(); it.hasNext(); ) { Object element = it.next(); } // For keys of a map for(Iterator it=map.keySet().iterator(); it.hasNext(); ) { Object key = it.next(); } // For values of a map for(Iterator it=map.values().iterator(); it.hasNext(); ) { Object value = it.next(); } // For both the keys and values of a map for(Iterator it=map.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = (Map.Entry)it.next(); Object key = entry.getKey(); Object value = entry.getValue(); }

4.22 Exemple : utilisation dune pile


LinkedList stack = new LinkedList(); // Push on top of stack stack.addFirst(object); // Pop off top of stack Object o = stack.getFirst(); // If the queue is to be used by multiple threads, // the queue must be wrapped with code to synchronize the methods stack = (LinkedList)Collections.synchronizedList(stack);

138

Support de cours Java

4.23 Exemple : cration dune table de hachage


// Create a hash table Map map = new HashMap(); map = new TreeMap(); // Add key/value map.put("a", new map.put("b", new map.put("c", new // hash table // sorted map

pairs to the map Integer(1)); Integer(2)); Integer(3));

// Get number of entries in map int size = map.size(); // 2 // Adding an entry whose key exists in the map causes // the new value to replace the old value Object oldValue = map.put("a", new Integer(9)); // 1 // Remove an entry from the map and // return the value of the removed entry oldValue = map.remove("c"); // 3

4.24 Exemple : itration de la table de hachage


// Iterate over the keys in the map Iterator it = map.keySet().iterator(); while (it.hasNext()) { // Get key Object key = it.next(); } // Iterate over the values in the map it = map.values().iterator(); while (it.hasNext()) { // Get value Object value = it.next(); }

Bibliographie
[Boo94] G. Booch. Object-Oriented Analysis and Design with Applications. Benjamin/Cummings, Redwood City, CA, 1994. d. franaise : Analyse & conception orientes objets, AddisonWesley France, Paris, 1994. Un classique de lingnirie du logiciel. T. Budd. Understanding Object-Oriented Programming with JAVA. Addison-Wesley, Reading, MA, 1998. http ://www.awl.com/cseng. Excellent livre. Explique le pourquoi (vue comprhensive du langage) de la programmation java et pas seulement le comment (simple vue descriptive). E. Dijkstra. Programming Considered as a Human Activity. Classics in Software Engineering. Yourdon Press, New York, 1979. Un classique. D. Flanagan. Java Examples in a Nutshell. A Tutorial Companion to Java in a Nutshell. OReilly, Cambridge. Trs bon livre dexemples. Complte parfaitement le prcdent. D. Flanagan. Java in a Nutshell. A Desktop Quick Reference. OReilly, Cambridge. Excellent livre. Notamment une description synthtique des classes et paquetages trs bien faite.

[Bud98]

[Dij79] [Flaa]

[Flab]

[GHJV95] E. Gamma, R. Helm, R. Johnson, et J. Vlissides. Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA, 1995. Livre fondateur dune technique maintenant classique en gnie logiciel. [GJS96] J. Gosling, B. Joy, et G. Steele. The Java Language Specication. Addison-Wesley, Reading, MA, 1996. Description trs dtaille du langage par leurs fondateurs ; assez aride. N. Koblitz. A course in Number Theory and Cryptography, volume 114 de GTM. Springer, New York, 1987. Deuxime dition. Un livre abordable sur un sujet dicile traiter rigoureusement et simplement. 139

[Kob87]

140

Support de cours Java

[RDBF02] G. Roussel, E. Duris, N. Bedon, et R. Forax. Java et Internet Concepts et programmation. Vuibert, Paris, 2002. Tome 1 Ct client. Un excellent livre de programmation rseau. Trs bonne introduction diverse aspects du langage hors rseau. [RGI80] D.T. Ross, J.B. Goodenough, et C.A. Irvine. Software engineering : Process, principles and goals. Dans P. Freeman et A. Wasserman, diteurs, Tutorial on Software Design Techniques. Computer Society Press of the IEEE, New York, 3e d., 1980. Un article classique en gnie logiciel. R. Segdewick. Algorithmes en langage C. InterEditions, Paris, 1991. Un classique en algorithmique applique. Excellent compromis entre thorie et pratique. Data Stuctures & Problem Solving Addison-Wesley, Reading, MA, 1998. http ://www.awl.com/cseng/titles/0-201-54991-3. Bon livre sur un sujet ultra-classique. M. A. Weiss. Using Java.

[Seg91]

[Wei98]

Index
abstract, 77 break, 34 java.util.TreeSet, 126 java.util.WeakHashMap, 123

Classe Java, 61 Champ dune classe java, 61 Classes


java.util.AbstractCollection, 115 java.applet.Applet, 99 java.util.ArrayList, 128 java.util.Arrays, 113 Boolean, 95 Byte, 95 Character, 95 Double, 95 Float, 95 java.util.HashMap, 116 java.util.HashSet, 126 Integer, 95 java.util.LinkedHashMap, 122 java.util.LinkedHashSet, 126 java.util.LinkedList, 130 java.util.ListIterator, 125 Long, 95 java.util.Scanner, 95 Short, 95 java.util.Stack, 131 java.lang.String, 101 java.lang.StringBuffer, 107 java.lang.StringBuilder, 108 java.lang.System, 93 java.util.TreeMap, 124

Constructeur, 66 Conteneurs Conteneurs abstraits, 115 Conteneurs immuables, 113 Conteneurs synchroniss, 114 Itration de conteneur, 114 continue, 37 Conventions de style, 25
do-while, 37

Exception, 83 catch, 85 Classe Exception, 88 Classe Error, 84 Classe Throwable, 84 finally, 88 throw, 86 throws, 86 try, 85
final, 75 finalize(), 75 for, 37

Hritage Java (syntaxe), 68 Identicateur, 25 if-else, 34 import, 78 instanceof, 71

141

142 Interface, 81 Interfaces


java.util.Collection, 112 java.util.Comparable, 110 java.util.Comparator, 110 java.util.Iterator, 114 java.util.List, 125 java.util.Map, 112 java.util.RandomAccess, 127 java.util.Set, 126 java.util.SortedMap, 123 java.util.SortedSet, 126

Support de cours Java Squences dchappement, 26 static, 75 super, 69 switch, 35 Tableaux, 29 this, 66 Types primitifs, 28

Mthode Mthode abstraite, 77 Mthode java, 62 main, 63 Rednition de mthode, 72 Rpartition de mthode dynamique, 74 Surcharge de mthode, 71 Modicateurs modicateurs de visibilit, 79 Mots cls, 27
new, 64

Objet Instance dobjet Java, 65 Rfrence un objet, 64 Variable dinstance dobjet Java, 65 Oprateurs Oprateurs arithmtiques, 30 Oprateurs boolens logiques, 32 Oprateurs entiers sur les bits, 31 Oprateurs relationnels, 32 Priorit des oprateurs, 33 Paquetage, 77
return, 37

You might also like