Vous êtes sur la page 1sur 150

Support de cours Java

Structures de donnes
Notions en Gnie Logiciel
et Programmation Oriente Objet
H. Mounier
Universit Paris Sud
1
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.
i
Table des matires
Table des matires ii
I Entre en matire 1
I.1 Quest-ce que Java, en trois lignes . . . . . . . . . . . . . . . . . 1
I.2 Exemples de Hello World en dirents langages . . . . . . . . 1
I.3 Un autre exemple . . . . . . . . . . . . . . . . . . . . . . . . . . 4
II Historique et proprits de Java 7
II.1 Proprits du langage ; Technologies disponibles . . . . . . . . . 7
II.2 Manifeste en 11 points . . . . . . . . . . . . . . . . . . . . . . . 9
III Paquetages de Java 15
III.1 Technologies et paquetages . . . . . . . . . . . . . . . . . . . . . 15
III.2 Sources de documentation externes . . . . . . . . . . . . . . . . 23
IV Bases procdurales de Java 25
IV.1 Variables et types de donnes . . . . . . . . . . . . . . . . . . . 25
IV.2 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
IV.3 Contrle de ux . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
V Notions de gnie logiciel 39
V.1 La lgende des sept singes . . . . . . . . . . . . . . . . . . . . . 39
V.2 Buts du gnie logiciel . . . . . . . . . . . . . . . . . . . . . . . . 41
V.3 Principes de gnie logiciel . . . . . . . . . . . . . . . . . . . . . 42
V.4 Stratgie de dveloppement oriente objet . . . . . . . . . . . . 47
VI Notions de programmation oriente objet 49
VI.1 POO, Objets, Classes . . . . . . . . . . . . . . . . . . . . . . . . 49
VI.2 Type ou classe ; objet . . . . . . . . . . . . . . . . . . . . . . . . 51
VI.3 Relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
ii
iii
VII Bases orientes objet de Java 61
VII.1 Classes et objets Java . . . . . . . . . . . . . . . . . . . . . . . . 61
VII.2 Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
VII.3 Surcharge, rednition . . . . . . . . . . . . . . . . . . . . . . . 69
VII.4 Paquetages et interfaces . . . . . . . . . . . . . . . . . . . . . . 77
VIIIExceptions 83
VIII.1 Fonctionnement gnral du systme dexceptions . . . . . . . . . 83
IX Classes utilitaires de base 91
IX.1 Classes Object, System, PrintStream . . . . . . . . . . . . . . . 91
IX.2 Mthode main() et classes demballage des types primitifs . . . 94
IX.3 Scanner (java.util.Scanner) . . . . . . . . . . . . . . . . . . . 95
IX.4 Classes java.applet.Applet et java.lang.String . . . . . . . 99
X java.util : Conteneurs et autres utilitaires 109
X.1 Classes de java.util ; Classes et interfaces de comparaison . . . . 109
X.2 Classes et interfaces conteneurs . . . . . . . . . . . . . . . . . . 111
X.3 Conteneurs de type Map . . . . . . . . . . . . . . . . . . . . . . 116
X.4 Conteneurs de type Collection et Listes . . . . . . . . . . . . . 125
Bibliographie 139
Index 141
Prface
Ces notes de cours rassemblent des lments de base du langage Java. Les cha-
pitres 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.
v
I Entre en matire
Rfrences bibliographiques
Java examples in a Nutshell, D. Flanagan, 2
ime
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 <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
1
2 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 3
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 Support de cours Java
import java.awt.*
import java.awt.event.*
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 5
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 excep-
tions).
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
8 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 signica-
tives. 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 9
le seul retard est le temps de transmission initial du programme.
Lorsquil y a plusieurs requtes, la 1
ere
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 byte-
code (code dont les instructions sont longues d1 ou 2 octet) est un langage
sur une machine imaginaire, une machine virtuelle. Ressemble un assem-
bleur 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


Plus simple que C
++
:
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 luti-
lisateur.
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 Ar-
chitecture),
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


Gestion des erreurs matrielles et logicielles, via un mcanisme dexceptions.
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.
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 vne-
ments).
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, ven-
tuellement 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 appa-
rat 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 De-
nition Langage ; JDK).
4. Appel de mthodes distantes au dessus du protocole Internet dinteropra-
bilit 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 gra-
phiques ou GUI builder (Java Beans ; JDK).
3. Dessin vectoriel 2D (Java2D; JDK).
4. Traitement dimages de base (Java advanced imaging ; paquetage option-
nel).
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 Autho-
rization 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 Connecti-
vity ; 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; ex-
tension 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 dinter-
faces graphiques ou GUI builder (Java Beans ; JDK)
3. Dessin vectoriel 2D (Java2D; JDK)
4. Traitement diamges de base (Java advanced imaging ; extension stan-
dard)
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 stan-
dard)
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 But
java.applet Fournit les classes ncessaires pour crer une
applet et celles quune applet utilise pour
communiquer avec son contexte.
java.awt Contient toutes les classes pour crer des in-
terfaces graphiques et pour dessiner des gra-
phiques et des images (API de base ; voir
swing plus loin).
III.1 Technologies et paquetages 17
java.awt.color Classes pour les couleurs.
java.awt.datatransfer Interfaces et classes pour le transferts de don-
nes entre applications.
java.awt.dnd Drag and Drop ou glisser-placer un l-
ment graphique laide dun pointeur (en g-
nral la souris).
java.awt.event Interfaces et classes de gestion des dirents
vnements associs aux composants AWT.
java.awt.font Interfaces et classes relies aux polices de ca-
ractres.
java.awt.geom Classes Java 2D pour dnir et raliser des
oprations sur des objets bi-dimensionnels.
java.awt.im Classes et interfaces du cadre de mthodes
dentre (input method framework). Ce cadre
permet des composants de recevoir des en-
tres clavier en Japonais, Chinois ou Coren
(pour lesquelles il faut plusieurs touches pour
un caractre).
java.awt.im.spi Interfaces permettant le dploiement den-
tres pour tout environnement dexcution
Java.
java.awt.image Classes pour crer et modier des images.
java.awt.image.renderable Classes et interfaces pour produire des images
indpendantes du rendu (du prihrique daf-
chage ou dimpression).
java.awt.print Classes et interfaces pour une API gnrale
dimpression.
java.beans Classes relies au dveloppement de compo-
sants beans (composants rutilisables pou-
vant tre dits graphiquement).
java.beans.beancontext Classes et interfaces relis un contexte de
bean (conteneur qui dnit un environne-
ment dexcution du ou des bean(s) quil
contient).
java.io Entres/sorties systmes au travers de ux de
donnes, de la srialisation et le systme de
chiers.
java.lang Classes fondamentales du langage Java.
java.lang.annotation .
java.lang.instrument Classes dagents dinstrumentation de pro-
grammes tournant sur une JVM.
java.lang.management Gestion de la machine virtuelle et du systme
dexploitation hte.
18 Support de cours Java
java.lang.ref Fournit des classes de rfrences des ob-
jets, supportant un certain degr dinterac-
tion avec le ramasse-miettes.
java.lang.reflect Classes et interfaces pour obtenir des infor-
mations de reexion sur les classes et les ob-
jets.
java.math Classes pour de larithmtique entire et d-
cimale en prcision arbitraire.
java.net Classes pour des applications rseaux via des
sockets.
java.nio Classes de tampons, conteneurs de donnes.
java.nio.channels Classes de canaux connectant des ux den-
tre/sortie comme des chiers ou des sockets.
java.nio.channels.spi Fournisseur de service pour les canaux.
java.nio.charset Classes de codage/dcodage octet/Unicode.
java.nio.charset.spi Fournisseur de service pour les co-
deurs/dcodeurs.
java.rmi Fournit le paquetage RMI (Remote Method
Invocation) dappel de procdure distante
pour des applications rseaux.
java.rmi.activation Support pour lactivation dobjets RMI.
java.rmi.dgc Classes et interfaces pour le ramasse-miettes
distribu utilis par RMI.
java.rmi.registry Une classe et deux interfaces pour le registre
RMI.
java.rmi.server Classes et interfaces de support pour les ser-
veurs RMI.
java.security Classes et interfaces pour le cadre de scurit.
java.security.acl Les classes et interfaces de ce paquetage
ont t redues obsoltes par les classes de
java.security.
java.security.cert Classes et interfaces pour analyser et grer
les certicats.
java.security.interfaces Interfaces pour gnrer des cls RSA (algo-
rithme AsymmetricCipher de Rivest, Sha-
mir et Adleman).
java.security.spec Classes et interfaces pour des spcications
de cls et des spcications de paramtres
dalgorithmes.
java.sql Fournit le paquetage JDBC.
java.text Classes et interfaces pour gre du texte, des
dates, des nombres et des messages dune ma-
nire indpendante de la langue.
III.1 Technologies et paquetages 19
java.util Contient le cadre des collections, le modle
dvnements, des utilitaires de gestion du
temps et de la date ainsi que dautres uti-
litaires divers (un analyseur lexical, un gn-
rateur de nombres alatoires et un tableau de
bits).
java.util.concurrent Classes de programmation concurrente.
java.util.concurrent.atomic Classes de programmation sans verrou adap-
tes la multiplicit des threads (lock-free
and thread-safe).
java.util.concurrent.locks Classes de verrou et dattente (distinctes
des synchronisation (synchronized) et mo-
niteurs de Hoare (wait())).
java.util.jar Classes pour lire et crire dans des chiers
JAR (Java ARchive), bas sur le standard de
chier ZIP avec un chier optionnel de mani-
feste.
java.util.logging Classes de sauvegarde en ligne (logging).
java.util.prefs Classes de sauvegarde et restauration des pr-
frences utilisateur et systme.
java.util.regexp Classes de manipulation des expressions r-
gulires.
java.util.zip Classes pour lire et crire dans des chiers
JAR (Java ARchive), bas sur les standards
de chier ZIP et GZIP.
javax.accessibility Dnit un contrat entre des composants din-
terface utilisateur et des technologies dassi-
tance (par exemple aux personnes handica-
pes).
javax.crypto Classes de cryptographie.
javax.crypto.interfaces Classes dinterfaces pour les cls de Die-
Hellman.
javax.crypto.spec Classes de spcication de cls et de para-
mtres dalgorithme.
javax.imageio Classes dentres/sorties dimages.
javax.imageio.event Classes de gestion dvenements synchrone
durant la lecture et lcriture dimages.
javax.imageio.metadata Classes de lecture et dcriture de mta-
donnes dimages.
javax.imageio.plugins.bmp Classes de plugin BMP.
javax.imageio.plugins.jpeg Classes de plugin JPEG.
javax.imageio.spi Classes de interfaces pour les lecteurs, cri-
vains, transcodeurs et ux dimages.
20 Support de cours Java
javax.imageio.stream Classes dentres/sorties image bas niveau
partir de chiers et de ux.
javax.management Classes JMX de base.
javax.management.loading Classes de chargement dynamique avanc.
javax.management.modelmbean Classes de dniton de ModelMBean.
javax.management.monitor Classes de dnition des moniteurs.
javax.management.openmbean Classes de types ouverts et descripteurs
mbean ouverts (open).
javax.management.relation Classes de dnition du service de relation.
javax.management.remote Interfaces pour laccs distant aux serveurs
MBean JMX.
javax.management.remote.rmi Connecteur pour lAPI JMX distante utili-
sant les RMI pour la transmission des re-
qutes un serveur MBean.
javax.management.timer Classes de dnition dun timer MBean.
javax.naming Classes et interfaces daccs aux services de
nommage.
javax.naming.directory Classes hritant de javax.naming pour lac-
cs aux services de rpertoires.
javax.naming.event Classes de gestion des vnements lors de
laccs aux services de nommage.
javax.naming.ldap Classes de gestion de LDPAv3.
javax.naming.spi Classes de chargement dynamique des ser-
vices de nommage.
javax.net Classes pour les applications rseaux.
javax.net.ssl Classes du paquetage de sockets scurises.
javax.print Classes de gestion dimpression.
javax.print.attribute Classes de types dattributs du service dim-
pression.
javax.print.attribute.standard Classes dattributs dimpression spciques.
javax.print.event Classes dvnements et dauditeurs pour im-
pression.
javax.rmi Classes de gestion des RMI-IIOP.
javax.rmi.CORBA Classes portables RMI-IIOP.
javax.security.auth Classes dautentication et dautorisation.
javax.security.auth.callback Classes de collecte dinformation (nom, mot
de passe, etc.) et dachage (erreurs, avertis-
sements, etc.).
javax.security.auth.kerberos Classes utilitaires relies au protocole Kerbe-
ros.
javax.security.auth.login Classes dautentication dynamiquement
chargeable.
III.1 Technologies et paquetages 21
javax.security.auth.spi Classes dinterface pour implanter des mo-
dules dautentication.
javax.security.auth.x500 Classes de gestion X500 (Principal and Pri-
vate Credentials).
javax.security.cert Classes de certicats cl publique.
javax.security.sasl Classes de gestion de SASL.
javax.sound.midi Classes et interfaces dentre/sortie, de s-
quenage et de synthse de donnes MIDI.
javax.sound.midi.spi Classes de gestion dimplantation de priph-
riques MIDI.
javax.sound.sampled Classes dacquisition, de traitement et de re-
jeu de donnes audio chantillonnes.
javax.sound.sampled.spi Classes de gestion dimplantation de priph-
riques audio.
javax.sql Classes daccs de donnes cot serveur.
javax.sql.rowset Classes de gestion de JDBC RowSet.
javax.sql.rowset.serial Classes de srialisation entre types SQL et
types Java .
javax.sql.rowset.spi Classes de gestion dimplantation de fournis-
seur de synchronisation.
javax.swing Ensemble de composants lgers (entire-
ment Java) qui se comportent de manire
quasi-identique sur toutes les plates-formes.
javax.swing.border Classes et interfaces pour acher des bodures
autour dun composant Swing.
javax.swing.colorchooser Classes et interfaces utilises par le compo-
sant JColorChooser.
javax.swing.event vnements crs par des composants Swing.
javax.swing.filechooser Classes et interfaces utilises par le compo-
sant JFileChooser.
javax.swing.plaf Une interface et plusieurs classes abstraites
utilises par Swing pour fournir des possibili-
ts de rendu adaptables (pluggable look-and-
feel capabilities).
javax.swing.plaf.basic Objets dinterface utilisateur construits
conformment au rendu standard (the Basic
look-and-feel).
javax.swing.plaf.metal Objets dinterface utilisateur construits
conformment au rendu mtallique (me-
tal look-and-feel).
javax.swing.plaf.multi le rendu (look and feel) multiplex permet
un utilisateur de combiner un rendu auxi-
liaire avec le rendu par dfaut.
22 Support de cours Java
javax.swing.plaf.synth Rendu (look and feel) dans lequel lachage
(paint) est dlgu.
javax.swing.table Classes et interfaces pour grer les
java.awt.swing.JTable.
javax.swing.text Classes et interfaces pour grer des compo-
sants textes ditables ou non.
javax.swing.text.html Classe HTMLEditorKit et ses classes de sup-
port pour crer des diteurs de texte HTML.
javax.swing.text.html.parser Classes et interfaces pour analyseur de docu-
ments HTML.
javax.swing.text.rtf Classe RTFEditorKit pour crer des diteurs
de texte au format RTF (Rich-Text-Format).
javax.swing.tree Classes et interfaces pour grer les
java.awt.swing.JTree.
javax.swing.undo Support pour les possibilits de undo/redo
dans une application (comme un diteur de
texte).
javax.transaction Trois exceptions leves par lORB pendant la
dsrialisation.
javax.transaction.xa Dnit le contrat entre le gestionnaire de
transactions et le gestionnaire de ressources
pour lenregistrement et le dsenregistrement
au sein de transactions JTA.
javax.xml Constantes des spcications XML.
javax.xml.datatype Types de donnes XML.
javax.xml.namespace Espace de nommage XML.
javax.xml.parsers Traitement de donnes XML.
javax.xml.transform Transformations de donnes.
javax.xml.transform.dom Transformations de type DOM.
javax.xml.transform.sax Transformations de type SAX2.
javax.xml.transform.stream Transformations de type ot et URI.
javax.xml.validation Validation de langage.
javax.xml.xpath API pour XPath 1.0.
org.ietf.jgss Utilisation portable dautentication, de don-
nes intgres et de donnes condentielles.
org.omg.CORBA Correspondance entre les API de lOMG
CORBA et Java, incluant la classe ORB (Ob-
ject Request Broker).
org.omg.XXXX Paquetages de lOMG (27 paquetages).
org.w3c.dom Interfaces pour DOM au sein dXML.
org.w3c.dom.bootstrap .
org.w3c.dom.ls .
org.xml.sax API pour SAX.
III.2 Sources de documentation externes 23
org.xml.sax.ext Gestionnaires SAX2 optionnels.
org.xml.sax.helpers 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 Support de cours Java
Plus de 16 000 liens sur les objets et composants
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 mi-
nuscule. 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 Description
\ddd Caractre octal ddd
\uxxxx Caractre hexadcimal unicode xxxx
\ Apostrophe
\" Guillemets
\\ Backslash (barre oblique inverse)
\r Carriage return
\n New line
\f Form feed
\t Tabulation
\b 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 double int super
boolean else interface switch
break extends long synchronized
byte final native this
case finally new throw
catch float package throws
char for private transient
class goto protected try
const if public void
continue implements return volatile
default import short while
do instanceof static
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 Taille Plage de variation
long 64 bits -9 223 372 036 854 775 808. . .
9 223 372 036 854 775 807
int 32 bits -2 147 483 648 . . .
2 147 483 647
short 16 bits -32 768 . . . 32 767
byte 8 bits -128 . . . 127
double 64 bits 1.7e-308 . . . 1.7e308
float 32 bits 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 Op. Rsultat
+ addition += assignation additive
- soustraction -= assignation soustractive
* multiplication *= assignation multiplicative
/ division /= assignation divisionnelle
% modulo %= assignation modulo
++ incrmentation dcrmentation
Les oprateurs arithmtiques fonctionnent comme en C.
Une dirence : le modulo agit galement sur les nombres virgule.
Exemple dincrmentation
IV.2 Oprateurs 31
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);
}
}
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 Op. Rsultat
- NON unaire bit--bit
& ET bit--bit &= assignation avec ET bit--bit
| OU bit--bit |= assignation avec OU bit--bit
OU exclusif bit--bit ^= assignation avec OU exclusif bit--bit
>> dcalage droite >>= assignation avec dcalage droite
>>> dcalage droite avec rem-
plissage de zros
>>>= assignation avec dcalage droite et
remplissage de zros
<< dcalage gauche <<= assignation avec dcalage gauche
Visualisation de leet de >>>
int a = -1;
32 Support de cours Java
a = a >>> 24;
donne en forme binaire
11111111111111111111111111111111 -1
>>>24
00000000000000000000000011111111 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 33
== gal
&& ET avec court circuit
!= dirent de
! NON unitaire logique
? : if-then-else ternaire
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 Sens de priorit
[] . ()
1
gauche droite
++ ! - (unaire) () (cast) new droite gauche
* / % gauche droite
+ - gauche droite
> > > > > < < gauche droite
> >= < <= instantceof gauche droite
== != gauche droite
& gauche droite
gauche droite
| gauche droite
&& gauche droite
|| gauche droite
? : gauche droite
= op= droite gauche
Priorit basse
1
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 35
break b;
System.out.println("Jamais execute");
}
System.out.println("Jamais execute");
}
System.out.println("Apres b:");
}
}
}
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 ca-
ractres)
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 Support de cours Java
"qui fait marcher le char. " +"\n"+
"On faconne largile pour en faire des vases, " +
"mais cest du vide interne " +
"que depend leur usage. " +"\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. " +"\n"+
"Tao-to king, Lao-tseu, XI \n";
static int long = text.length();
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.10
9
$, en
1990 30.10
9
$)
ceci pour un produit ni en gnral insatisfaisant :
Adquation : non correspondance aux besoins des utilisateurs
Fiabilit : logiciel tombant souvent en panne Cot : cots rare-
ment prvisibles, peru comme excessifs
Modiabilit : maintenance souvent complexe, coteuse et non able
Ponctualit : logiciel souvent en retard; livr avec des capacits in-
frieures 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 complexi-
cation (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 (ob-
jets) 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, fer-
mer. 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, fer-
mer. 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
dinformations
rendre inaccessibles des dtails qui ne doivent
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 i, elt_pile;
pile ma_pile;
ma_pile = creer_pile();
/* remplissage de la pile */
for(i = 0; i < 100; i++)
elt_pile = depiler(ma_pile);
et
int elt_pile;
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 opra-
tion 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 creer_pile();
void empiler(pile ma_pile, int i);
int depiler(pile ma_pile);
void 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 Support de cours Java
free((void *)ma_pile);
}/* detruire_pile() */
/** 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-
bilit.
Abstraction : extrait les dtails essentiels
Intgralit garantit que les lments importants sont prsents
Abstraction et intgralit : modules ncessaires et susants Ecacit am-
liore (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
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 d-
crire 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 argu-
ments
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 arbi-
traire et dpend largement de lobservateur du systme.
Les liaisons intra-composants sont gnralement plus fortes que les liai-
sons 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 lin-
teraction 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 sys-
tme 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 des-
cendante 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 dob-
jets 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 condi-
tions 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 incor-
porant le processus de dcomposition orient objets et une no-
tation 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 descrip-
tions extensives doprations (ou corps de mthodes)
Ce que lon peut rsumer par la formule suivante
TYPE (Champs,sig_meth
1
, corps_meth
1
, . . . , sig_meth
n
, corps_meth
n
)
o sig_meth
i
dsigne la signature de mthode n

i et corps_meth
i
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 sim-
pliste (c..d. sans test daucune sorte) :
VI.2 Type ou classe ; objet 53
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;
}
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 dyna-
miques) 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 eec-
tue 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 opra-
tions que les clients peuvent eectuer sur un objet sont typiquement appe-
les des mthodes, qui font partie de la classe de lobjet.
La transmission de messages est une partie de lquation qui dnit le com-
portement dun objet. Ltat dun objet inuence aussi son comportement.
Par exemple, dans le cas dun distributeur de boissons, nous pouvons d-
clencher une action (appuyer sur un bouton) pour raliser notre slection.
Si nous navons pas introduit susamment dargent, il ne se passera pro-
bablement 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 nal-
tre 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 connais-
sance que lobjet maintient et dautre part des actions quil peut raliser.
En dautres termes, Ltat et le comportement dun objet dnissent len-
semble 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,op
1
, . . . , op
n
, ref)
o etat ensemble des variables dinstance
op
i
(pointeur sur) la mthode dinstance n

i
ref (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.
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 op-
rations).
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 op-
rations). 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 sman-
tique. 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 prc-
dent 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 (hri-
tage 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 super-
classes.
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 conte-
nant 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 cer-
tains 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 m-
moire
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 lidenti-
cateur 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 Support de cours Java
...
}
Une mthode est constitue de :
un nom constitu par un identicateur
des paramtres formels : ceux-ci sont spars par des ,. Lorsque la m-
thode 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 nom; // nom du fauve
int age; // en annees
float tauxRonronnement; // entre 0 et 1
VII.1 Classes et objets Java 63
void viellir() {
age += 1;
}
int retournerAge() {
return(age);
}
}


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 in-
voque par linterprteur Java. Largument args est un tableau de String qui
correspond aux arguments de la ligne de commande lors du lancement du pro-
gramme. args[0] est le 1
er
argument, args[1] est le 2
ime
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. lenvi-
ronnement 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 ind-
pendant 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 prcis-
ment, 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(); // ligne 1
Point p2 = p; // ligne 2
p = null; // 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) r-
cupre 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 Support de cours Java
y = b;
}
}
En C, mthode sans paramtre : nommethode(void). illgal en java. Les ob-
jets 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 nom; // nom du fauve
int age; // en annees
float tauxRonronnement; // entre 0 et 1
public Chat(String sonNom,
int sonAge,
float sonTauxRonron) {
VII.1 Classes et objets Java 67
nom = sonNom;
age = sonAge;
tauxRonronnement = sonTauxRonron;
}
}
this peut-tre galement un appel un constructeur
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; // nom du fauve
int age; // en annees
Color[] couleurPelage; // ses differentes couleurs
float tauxRonronnement; // 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 1
ire
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(); // valide
gouttiere.peindre(); // 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) { // Surcharge de methode
age += n;
}
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 73
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) { // Surcharge
return distance(p.x, p.y);
}
}// class Point
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.
Slection de mthode selon le type de linstance et non selon la classe
dans laquelle la mthode courante sexcute : rpartition de mthode dyna-
mique.
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. Quasi-
ment 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 nom; // nom
int age; // annees
Color[] couleurPelage; // couleurs
float tauxRonronnement; // de 0 a 1
static int ageSevrage = 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 Support de cours Java
une unique declaration de classe publique
declarations de classes privees (optionnel)
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 Macin-
tosh).
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 79
on peut utiliser class MaDate extends java.util.Date ...
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 rien private
protected
protected public
Mme classe oui oui oui oui oui
Mme paquetage, sous classe non oui oui oui oui
Mme paquetage, non sous
classe
non oui non oui oui
Paquetage dirent, sous
classe
non non oui oui oui
Paquetage dirent, non sous
classe
non non non non 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 81
// 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 !");
}
}
}
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 lin-
terface. 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 Support de cours Java
corps-de-classe
}
Les crochets dsignent des mots optionnels
Exemple
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


On peut dclarer des variables rfrences des objets utilisant une in-
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.
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 re-
tourne 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 de-
vraient traiter.
Error : exceptions catastrophiques que normalement seul lenvironnement
dexcution devrait grer.
Une sous-classe dException, RuntimeException, pour les exceptions de len-
vironnement 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 gestion-
naire 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 2
ime
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 d-
clarer quels types dexception peuvent tre gnres (sinon, le programme
ne compile pas).
Cette rgle ne sapplique pas Error, RuntimeException ou leurs sous-
classes.
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 construc-
teur 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 89
int fd;
fd = open("readme.txt");
if (fd == -1 && errno == EEXIST)
fd = open("default.txt");
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() But
String toString() Renvoie une vue en chane de caractres
de this ; par dfaut, renvoie le nom de la
classe suivi de son code de hachage.
int hashCode() Renvoie le code de hachage associ lob-
jet.
boolean equals() Teste lgalit, la plus smatiquement
signicative possible.
protected Object clone() Renvoie une copie supercielle
(champ champ) de lobjet (throws
CloneNotSupportedException).
protected void finalize() Appele en libration mmoire (throws
Throwable).
final void notify() Relche le moniteur de lobjet et rveille
une thread bloque en attente de ce moni-
teur par un wait().
91
92 Support de cours Java
final void notifyAll() Relche le moniteur de lobjet et rveille
toutes les threads bloques en attente de
ce moniteur par un wait().
final void wait() Acquiert le moniteur de lobjet ou bloque la
thread indniment si le moniteur est dj
pris (throws InterruptedException).
final void wait(long timeout) Acquiert le moniteur de lobjet ou bloque
la thread pendant timeout millisecondes
si le moniteur est dj pris (throws
InterruptedException).
final Class getClass() Renvoie une reprsentation de la classe de
lobjet.
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 93
}
Complexe c = (Complexe)obj;
return (partieReelle == c.partieReelle &&
partieImaginaire == c.partieImaginaire);
}
}
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() But
static long currentTimeMillis() renvoie le nombre de millisecondes depuis
le 1
er
janvier 1970.
static void exit(int status) arrte la machine virtuelle java en cours
dexcution.
static void gc() demande au ramasse-miettes de rcuprer
la mmoire inutilise.
static void setIn(InputStream in) rassigne lentre standard.
static void setOut(PrintStream out) rassigne la sortie standard.
static void setErr(PrintStream err) rassigne la sortie erreur standard.
1.5 Mthodes de PrintStream
Mthodes :
methode() But
void close() Ferme le ux dentre/sortie
void flush() Vide le tampon mmoire associ au ux
(force lcriture)
94 Support de cours Java
void print(...) Ache largument sur la sortie standard.
Accepte des boolean, char, int, long,
float, double, Object et String.
void println(...) Mme eet que print(), mais rajoute un
saut de ligne
void write(int b) criture binaire dun octet sur le ux den-
tre/sortie
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
1
ier
argument args[0], 2
ime
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 carac-
tres
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) 95
arg no 2 : 4 de longueur : 1
arg no 3 : gabuzomeu de longueur : 9
arg no 4 : 7.8 de longueur : 3
arg no 4 : +&) de longueur : 3
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 correspon-
dant ; 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() But
Scanner(File source) Construit un objet de type Scanner pro-
duisant des valeurs partir du chier sp-
ci.
Scanner(InputStream source) Construit un objet de type Scanner pro-
duisant des valeurs partir du ux dentre
spci.
Scanner(Readable source) construit un objet de type Scanner pro-
duisant des valeurs partir de lentre
spcie. Cette entre doit implanter lin-
terface 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.
Scanner(String source) Construit un objet de type Scanner pro-
duisant des valeurs partir de la chane
spcie.
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 sui-
vantes : 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() ren-
voie 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 pro-
chain 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() But
void close() Ferme ce Scanner (le ux associ).
String findInLine(String pattern) Cherche la prochaine occurence du motif
pattern, en ignorant les dlimiteurs.
boolean hasNext(String pattern) Renvoie true si le prochain lexme corres-
pond au motif spci par pattern.
String next(String pattern) Renvoie le prochain lexme sil correspond
au motif spci par pattern.
Scanner skip(String pattern) saute les entres qui correspondent au motif
spci par pattern.
Scanner useDelimiter(String
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 Support de cours Java
System.out.println(s.next());
s.close();
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 99
// 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
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 Support de cours Java
void stop() Applele lorsque lapplet est masque.
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 x, y; // position du disque
protected int size; // diametre du disque
protected Color color; // couleur du disque
public Disk(int Xpos, int Ypos, int radius) {
x = Xpos; y = Ypos;
size = radius;
color = Color.red; // Initialement rouge
}
// methodes fixant des attributs (modificateurs)
public void setXY(int newX, int newY) { x = newX; y = newY;}
public void setSize(int newSize) { size = newSize; }
public void setColor(Color newColor) { color = newColor;}
// methodes accedant aux attributs (accesseurs)
public int getX() { return x; }
public int getY() { return y; }
public int getSize() { return size; }
public Color getColor() { return color; }
// Afficher le disque
public void paint(Graphics g) {
g.setColor(color);
IX.4 Classes java.applet.Applet et java.lang.String 101
g.fillOval(x-(size/2), y-(size/2), size, size);
}
}// public class Disk
Classe DiskField, qui ache le disque prcdent :
import java.applet.*;
import java.awt.*;
public class DiskField extends Applet {
int x = 150, y = 50, size = 100; // position et diametre
Disk theDisk = null;
// 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); o
indiceDeb dbute 0 pour le premier caractre de la chane.
102 Support de cours Java
Exemples :
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 modi-
cations 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 lexpres-
sion "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. appa-
rition) 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 four-
nissent 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 ".trim() ->
"Jai besoin dair"
4.14 Autres mthodes de String
methode() But
String concat(String str) Concatnation de this celle fournie en
argument.
boolean contains(String s) renvoie true si this contient la String ar-
gument.
boolean contentEquals(StringBuffer
sb)
renvoie true si this est gale (au sens du
contenu) la StringBuffer argument.
static String copyValueOf(char[]
data)
Conversion dun tableau de caractres en
String.
static String format(String format,
Object... args)
Renvoie une String formatte (voir la do-
cumentation des API pour les chanes for-
mat).
boolean matches(String regex) renvoie true si this correspond lexpres-
sion rgulire regex.
IX.4 Classes java.applet.Applet et java.lang.String 107
String[] split(String regex) 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 Support de cours Java
void getChars(int srcBegin, int srcEnd,
char [] dst, int dstBegin);
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 ha-
chage).
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 Support de cours Java
Journalisation (paquetage java.util.logging).
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 com-
patibilit :
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 dvne-
ments.
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 ob-
serve 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.
Implantations
Table de hachage Tableau
taille
variable
Arbre quilibr Liste chane
Set HashSet TreeSet
Interfaces List ArrayList LinkedList
Map HashMap TreeMap
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 collec-
tion 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 l-
ments 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 lan-
cienne 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. Ren-
voie 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 im-
muable.
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 implanta-
tions de Map et de Collection sont non synchronises.
La classe Collections contient des mthodes renvoyant des vues synchroni-
ses :
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 col-
lection,
X.2 Classes et interfaces conteneurs 115
Object next() renvoie une rfrence sur linstance suivante de la collec-
tion,
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()); // Affiche 0
i1.remove(); // modification via i1 (enleve 0)
System.out.println(i1.next()); // Affiche 1
Iterator i2 = col.iterator();
System.out.println(i2.next()); // 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
3.1 Conteneurs de type Map
Map est une interface qui reprsente un mcanisme de stockage cl/valeur.
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 Map
WeakHashTable AbstractMap
WeakHashTable AbstractMap
TreeMap SortedMap 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() But
void clear() Rinitialise et vide la table de hachage.
Object clone() 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).
boolean containsKey(Object key) Renvoie true sil existe une cl gale
key (comme dtermin par la mthode
equals()) dans la table de hachage. Ren-
voie false sinon.
boolean containsValue(Object value) Renvoie true sil existe une valeur gale
value (comme dtermin par la mthode
equals()) dans la table de hachage. Ren-
voie false sinon.
Set entrySet() Renvoie une vue de type Collection des
entres contenues dans la table.
Object get(Object key) 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.
boolean isEmpty() Renvoie true si la table de hachage est vide
et false sinon.
Set keySet() Renvoie une vue de type Set des cls conte-
nues dans la table.
Object put(Object key, Object
value)
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.
void putAll(Map t) 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.
Object remove(Object key) 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.
int size() Renvoie le nombre dentres la table de ha-
chage.
X.3 Conteneurs de type Map 119
String toString() Renvoie une forme achable dune table de
hachage. Il sagit de la liste des entres de
la table, chaque entre tant entoure dac-
colades 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.
Collection values() Renvoie une vue de type Collection des
valeurs de la table.
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 10
6
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 sim-
plement 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 mes-
sage.
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 chan-
ger 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.32
10
+ 5.32
9
+ 18.32
8
+ 25.32
7
+ 12.32
6
+ 15.32
5
+ 14.32
4
+ 7.32
3
+ 11.32
2
+ 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 121
h = cle.charAt(0);
for(int i = 1; i < cle.length(); i++)
valHach = ((valHach*32)+cle.charAt(i)) % tailleTable;
return valHach;
}
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 dim-
plantation 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 c
i
le caractre
dindice i.
Si n 15, le code de hachage est calcul par
n1

i=0
c
i
.37
i
en utilisant larithmtique des int
3.19 Hachage : recherche
Si n > 15, le code de hachage est calcul par
m

i=0
c
i.k
.39
i
en utilisant larithmtique des int, o k =

n
8

et m =

n
k

, ne prenant
(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 boo-
len 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 identi-
cateur 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 po-
sition 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 suppl-
mentaires par rapport Iterator.
methode() But
void add(Object o) insre llment spcif dans la liste.
boolean hasPrevious() teste si la liste contient un prdcesseur de
llment courant.
int nextIndex() renvoie lindice de llment renvoy par
next().
Object previous() renvoie llment prcdent de la liste.
int previousIndex() renvoie lindice de llment renvoy par
previous().
void set(Object o) remplace le dernier lment renvoy par
next() ou previous() par llment cp-
ci.
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 iden-
tiques 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() But
Object first() renvoie le 1er elt. de lensemble tri.
SortedSet headSet(Object
toElement) renvoie une vue des
lts strictement plus petits que
toElement. Object last()
renvoie le dernier elt. de lensemble tri.
SortedSet subSet(Object
fromElement, Object toElement)
renvoie une vue des lts strictement com-
pris entre toElement et fromElement.
SortedSet tailSet(Object
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() But
void add(int index, Object element) Lobjet spci par element est ajout
lendroit spci de la liste.
X.4 Conteneurs de type Collection et Listes 129
boolean add(Object o) Lobjet spci par element est ajout la
n de la liste.
boolean addAll(Collection c) Les lts. de c sont ajouts la n de la liste.
boolean addAll(int index,
Collection c)
Les lts. de c sont ajouts lendroit sp-
ci de la liste.
void clear() vide la liste.
Object clone() Renvoie un duplicata (copie supercielle)
de la liste appelante.
boolean contains(Object element) Renvoie true si element est contenu dans
la liste et false sinon.
final void ensureCapacity(int size) Fixe la capacit minimale de la liste size.
Object get(int index) renvoie lllement situ la position sp-
cie de la liste.
final int indexOf(Object element) Renvoie lindice de la 1
ire
occurrence de
element. Si lobjet nest pas dans la liste,
-1 est renvoy.
boolean isEmpty() Renvoie true si la liste ne contient aucun
lment et false sinon.
int lastIndexOf(Object element) Renvoie lindice de la dernire occurrence
de element. Si lobjet nest pas dans la
liste, -1 est renvoy.
Object remove(Object element) Enlve la premire occurrence de element
trouve dans la liste. Renvoie une rfrence
sur llment enlev.
protected void removeRange(int
fromIndex, int toIndex)
Enlve les lments situ entre les indice
fromIndex (inclus) et toIndex (exclus).
Object set(int index, Object
element)
Remplace llment la position spcie
par element.
int size() Renvoie la taille de la liste.
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.
void trimToSize() Fixe la capacit de la liste au nombre dl-
ments 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() But
void addFirst(Object o) insre llt. spci au dbut de la liste.
void addLast(Object o) ajoute llt. spci la n de la liste.
Object getFirst() renvoie le 1er lt. de la liste.
Object getLast() renvoie le dernier lt. de la liste.
Object removeFirst() enlve et renvoie le 1er lt. de la liste.
Object removeLast() 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() But
boolean empty() Renvoie true si la pile est vide et false
sinon.
Object peek() Renvoie llment du dessus de la pile, mais
ne lenlve pas.
Object pop() Renvoie llment du dessus de la pile, en
lenlvant.
Object push(Object element) Pousse element sur la pile. element est
galement renvoy.
132 Support de cours Java
int search(Object element) 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 duti-
liser Iterator la place.
Elle spcie 2 mthodes :
boolean hasMoreElements()
Object nextElement()
la 1
ire
doit renvoyer true tant quil y a encore des lments dans la collec-
tion, et la 2
ime
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() But
String getProperty(String key) 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.
String getProperty(String key,
String defaultVal)
Renvoie la valeur associe la cl key si
elle est trouve et renvoie defaultVal si-
non. Cette dernire peut tre une valeur par
dfaut ou un message derreur.
void list(PrintStream streamOut) Envoie la liste des proprits au ux de sor-
tie associ streamOut. Utilis pour la-
chage.
void load(InputStream streamIn)
thows IOException
la liste des paires cl, valeur est lue partir
du ux streamIn et est ajoute la table.
Enumeration propertyNames() Renvoie une numration des cls. Ceci in-
clut les cls trouves dans la liste des pro-
prits par dfaut. Sil y a des cls en
double, une seule est retenue.
void save(OutputStream streamOut,
String description)
crit la chane description, puis la liste
dans le ux associ streamOut.
134 Support de cours Java
Dans la lecture par load() :
Les lignes commenant par un # ou un! sont traites comme des com-
mentaires (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 java.util.Dictionary;
import java.util.Hashtable;
import java.util.Properties;
import 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 135
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 + ".");
}
}
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 Support de cours Java
} catch(FileNotFoundException e) {
// ignore missing file
}
// 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 137
number = (String) ht.get(name);
System.out.println(number);
} while(!name.equals("quit"));
}
}
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(); // hash table
map = new TreeMap(); // sorted map
// Add key/value pairs to the map
map.put("a", new Integer(1));
map.put("b", new Integer(2));
map.put("c", new 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 : Ana-
lyse & conception orientes objets, AddisonWesley France, Paris,
1994. Un classique de lingnirie du logiciel.
[Bud98] 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).
[Dij79] E. Dijkstra. Programming Considered as a Human Activity. Classics in
Software Engineering. Yourdon Press, New York, 1979. Un classique.
[Flaa] 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.
[Flab] 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.
[GHJV95] E. Gamma, R. Helm, R. Johnson, et J. Vlissides. Design Patterns.
Elements of Reusable Object-Oriented Software. Addison-Wesley, Rea-
ding, 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.
[Kob87] 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
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 intro-
duction 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, 3
e
d., 1980. Un article classique en
gnie logiciel.
[Seg91] R. Segdewick. Algorithmes en langage C. InterEditions, Paris, 1991.
Un classique en algorithmique applique. Excellent compromis entre
thorie et pratique.
[Wei98] M. A. Weiss. Data Stuctures & Problem Solving
Using Java. Addison-Wesley, Reading, MA, 1998.
http ://www.awl.com/cseng/titles/0-201-54991-3. Bon livre sur
un sujet ultra-classique.
Index
abstract, 77
break, 34
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
java.util.TreeSet, 126
java.util.WeakHashMap, 123
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 Support de cours Java
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
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
Squences dchappement, 26
static, 75
super, 69
switch, 35
Tableaux, 29
this, 66
Types primitifs, 28

Vous aimerez peut-être aussi