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

Notations
Les sigles suivants seront frquemment utiliss

Point notable, auquel il faut prter attention

Point positif, agrable, du langage

Implication logique

Point ngatif, dsagrable, du langage

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

Table des matires

Table des matires

ii

Entre en matire
I.1
Quest-ce que Java, en trois lignes . . . . . . . . . . . . . . . . .
I.2
Exemples de Hello World en diffrents langages . . . . . . . .
I.3
Un autre exemple . . . . . . . . . . . . . . . . . . . . . . . . . .

1
1
1
4

II

Historique et proprits de Java


II.1
Proprits du langage ; Technologies disponibles . . . . . . . . .
II.2
Manifeste en 11 points . . . . . . . . . . . . . . . . . . . . . . .

7
7
9

III Paquetages de Java


III.1 Technologies et paquetages . . . . . . . . . . . . . . . . . . . . .
III.2 Sources de documentation externes . . . . . . . . . . . . . . . .

15
15
23

IV Bases procdurales de Java


IV.1 Variables et types de donnes . . . . . . . . . . . . . . . . . . .
IV.2 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IV.3 Contrle de flux . . . . . . . . . . . . . . . . . . . . . . . . . . .

25
25
30
34

.
.
.
.

39
39
41
42
47

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

49
49
51
56

Notions de gnie logiciel


V.1
La lgende des sept singes . . . . .
V.2
Buts du gnie logiciel . . . . . . . .
V.3
Principes de gnie logiciel . . . . .
V.4
Stratgie de dveloppement oriente

VI Notions de programmation oriente


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

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

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

iii
VII Bases orientes objet de Java
VII.1 Classes et objets Java . . . .
VII.2 Hritage . . . . . . . . . . .
VII.3 Surcharge, redfinition . . .
VII.4 Paquetages et interfaces . .

.
.
.
.

61
61
68
69
77

VIIIExceptions
VIII.1 Fonctionnement gnral du systme dexceptions . . . . . . . . .

83
83

IX Classes utilitaires de base


IX.1 Classes Object, System, PrintStream . . . . . . . . . . . .
IX.2 Mthode main() et classes demballage des types primitifs
IX.3 Scanner (java.util.Scanner) . . . . . . . . . . . . . . . .
IX.4 Classes java.applet.Applet et java.lang.String . . . .
X

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

java.util : Conteneurs et autres utilitaires


X.1
Classes de java.util ; Classes et interfaces de comparaison
X.2
Classes et interfaces conteneurs . . . . . . . . . . . . . .
X.3
Conteneurs de type Map . . . . . . . . . . . . . . . . . .
X.4
Conteneurs de type Collection et Listes . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

91
91
94
95
99

.
.
.
.

.
.
.
.

.
.
.
.

109
109
111
116
125

Bibliographie

139

Index

141

Prface
Ces notes de cours rassemblent des lments de base du langage Java. Les chapitres I, II et III sont introductifs ; les chapitres V et VI introduisent des concepts
gnraux essentiels en programmation, indpendamment de tout langage ; enfin
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 dfinitions 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. Enfin, le chapitre
X concerne les classes de Java implantant diverses structures de donnes (telles les
tableaux dynamiques, les listes, les tables de hachage, les arbres) et algorithmes
(tels le tri) associs.

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

I.1

Quest-ce que Java, en trois lignes

Le dbut de louvrage de rfrence, The Java Language Specification 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 fluency in the language. Java is related to C and
C++ but is organized rather differently, 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 diffrents


langages

2.1 Avec OSF/Motif widgets


#include
#include
#include
#include
#include
#include

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

Support de cours Java

typedef struct APP_DATA {


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

I.2 Exemples de Hello World en diffrents langages

XtSetArg(args[2], XmNleftAttachment, XmATTACH_FORM);


XtSetArg(args[3], XmNrightAttachment, XmATTACH_FORM);
XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM);
XtSetArg(args[5], XmNLabelString,
XmStringCreateLtoR(data.mtext,
XmSTRING_DEFAUKT_CHARSET));
hello_message = XtCreateManagedWidget("Hello",
xmLabelWidgetClass, form_widget,
(ArgList) args, 6);
XtRealizeWidget(main_widget);
XtMainLoop();
}
static void quit_action(Widget w, caddr_t client_data,
XmAnyCallbackStruct *call_data) {
XtCloseDisplay(XtDisplay(w));
exit(0);
}
Avantage : souple.
Dsavantages : code long, ne fonctionne que sous XWindows (pas sur

Macintosh ou Windows 98).


Remarque : code 3 fois plus long en Xlib.

2.2 Hello world en Tcl/Tk


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

graphique.
Code dune fentre simple

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

lent.

2.3 Hello world en Java


Code dune fentre simple en Java

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 modifications sous UNIX, Windows 98/NT, MacOS.

I.3

Un autre exemple

3.1 Applet de gribouillage Java


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

I.3 Un autre exemple


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

II Historique et proprits de Java


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

II.1

Proprits du langage ; Technologies


disponibles

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

phone, tlvision, ordinateurs, . . . ).


2 caractristiques cruciales de ce langage embarqu :

taille rduite ( codage compact).


fiabilit ( fonctionnement en mode dgrad, en rponse des exceptions).

1.2 Proprits embarques


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

Support de cours Java

1.3 Naissance de Java

Java hrite principalement sa syntaxe (procdurale) du C.


Langage gnraliste, aussi versatile que C++.
Plusieurs simplifications 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 offcielle 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
(filiale de Sun).
Dbut 1997, sortie de Java 1.1. Beaucoup damliorations significatives. Premire version tre juge srieuse du langage.
t 2004, sortie de Java 1.5 ; diverses amliorations et ajouts intressants.

1.4 Adaptation au web (I)


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

Web (transfert de pages HTML et excution de programmes distante via


Internet) ?
Le schma client/serveur classique est le suivant :[-2.5ex]
envoi de requte du client vers le serveur,
traitement de la requte par le serveur,
envoi de la rponse du serveur au client.

1.5 Adaptation au web (II)


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

1.6 Adaptation au web (III)


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

II.2 Manifeste en 11 points

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

Lorsquil y a plusieurs requtes, la 1ere prend du temps, les suivantes ne


souffrent 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 diffrents. Le source java doit tre traduit en un


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

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

sur la machine client. Un programme sexcutant cot client peut, en thorie,


avoir accs beaucoup de ressources, do un danger.
gestionnaire de scurit, sur le client, limitant les actions possibles
du programme envoy par le serveur. Par ex., interdiction daccder au
systme de fichiers 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,
efficace
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 fichiers den-tte.
Pas dhritage multiple ; la place, notion dinterface, venant dObjective
C. Bien moins complexe.
Pas de pointeurs visibles au niveau du programmeur. Bien sr, en
interne, les pointeurs sont largement utiliss ; mais ceci est cach pour lutilisateur.

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 bnfices 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 Definition Language) CORBA (Common Request Broker Architecture),

II.2 Manifeste en 11 points

11

ladministration de rseaux via SNMP (Simple Network Management


Protocol) avec JMAPI.

2.5 Java est interprt (ou compil)


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

chine imaginaire, une machine virtuelle. Cet assembleur, ou bytecode, peut


tre interprt. Dsavantage : lenteur dexcution.
Notion de compilateur la vole ou juste temps. La Traduction du
bytecode au langage machine est effectue 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 fichier 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).
Verification 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 : fichiers,
...

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 efficace


Initialement, les interprteurs rendaient lexcution de programmes java

lente (environ 20 fois plus lente que du C).


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

2.11 Java est multitches


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

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

2.12 Java est dynamique


Excution cot client dynamisme plus ais mettre en uvre que dans

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

2.13 Technologies Rseaux


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

II.2 Manifeste en 11 points

13

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

2.14 Technologies Rseaux (suite)


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

2.15 Technologies graphiques & sonores


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

2.17 Technologies de Scurit


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

14

Support de cours Java

2.18 Technologies de Gestion de donnes


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

III Paquetages de Java


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

III.1

Technologies et paquetages

1.1 Aperu des technologies disponibles


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

15

16

Support de cours Java


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

1. Liste de contrle daccs ou ACLs (JDK)


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

1. Structures de donnes de base (listes, arbres, tables de hachage) et tri


(Collections ; JDK)
2. Accs des bases de donnes par SQL (JDBC ou Java Database
Connectivity ; JDK)

1.2 Paquetages du JDK 1.5


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

java.awt

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

III.1 Technologies et paquetages


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

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

java.awt.im.spi

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

java.awt.print
java.beans

java.beans.beancontext

java.io

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

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

18
java.lang.ref

java.lang.reflect

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

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

java.security.cert
java.security.interfaces

java.security.spec

java.sql
java.text

Support de cours Java


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

III.1 Technologies et paquetages


java.util

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

java.util.concurrent.locks

java.util.jar

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

javax.accessibility

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

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

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

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

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

Support de cours Java


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

III.1 Technologies et paquetages


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

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

javax.swing.plaf.basic

javax.swing.plaf.metal

javax.swing.plaf.multi

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

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

javax.transaction
javax.transaction.xa

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

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

Support de cours Java


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

III.2 Sources de documentation externes


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

III.2

23
Gestionnaires SAX2 optionnels.
Classes daide SAX.

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 Specification, J. Gosling, B. Joy et G. Steele [GJS96],
Java in a Nutshell, D. Flanagan [Flab].

IV.1

Variables et types de donnes

1.1 Identificateurs
Identificateur : suite de

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

26

Support de cours Java

1.2 Reprsentation littrale


Entiers :

* les valeurs octales commencent avec un 0.


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

Squence escape

Description

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

Caractre octal ddd


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

1.3 Variables
exemple (Pythagore) :

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

IV.1 Variables et types de donnes

27

Rgles de visibilit usuelles pour une variable dfinie lintrieur dun bloc

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

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

1.4 Mots cls du langage


Attention a ne pas utiliser comme nom de variable un mot cl rserv, dont
voici la liste :
abstract
boolean
break
byte
case
catch
char
class
const
continue
default
do

double
else
extends
final
finally
float
for
goto
if
implements
import
instanceof

int
interface
long
native
new
package
private
protected
public
return
short
static

super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while

1.5 Nature des variables


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

28

Support de cours Java

1.6 Types primitifs


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

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


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

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

Entiers : byte, short, int et long, tous signs.


Nombres virgule flottante : float et double.
Caractres : char.
boolens : boolean, pour les valeurs logiques.

1.7 Types entiers et flottants


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

dune vrification de type.


Pas de coercition ou de conversion systmatique. Une diffrence 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

long

64 bits

int

32 bits

short
byte
double
float

16
8
64
32

bits
bits
bits
bits

Plage de variation
-9 223 372 036 854 775 808. . .
9 223 372 036 854 775 807
-2 147 483 648 . . .
2 147 483 647
-32 768 . . . 32 767
-128 . . . 127
1.7e-308 . . . 1.7e308
3.4e-38 . . . 3.4e+38

IV.1 Variables et types de donnes

29

1.9 Transtypage (ou conversions, cast)


Conversions possibles en java. Conversion automatique seulement pos-

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

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

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

unicode).
On peut se servir des caractres comme entiers :
int trois = 3;
char un
= 1;
char quatre = (char) (trois + un);

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


en char avant lassignation.

1.11 Boolens
Type renvoy par tous les oprateurs de comparaison, comme (a < b).
Type requis par tous les oprateurs de contrle de flux, 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 };
Vrification 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[][]
{
{
{
};

IV.2

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

Oprateurs

2.1 Oprateurs arithmtiques


Op.

Rsultat

Op.

Rsultat

+
*
/
%
++

addition
soustraction
multiplication
division
modulo
incrmentation

+=
-=
*=
/=
%=

assignation additive
assignation soustractive
assignation multiplicative
assignation divisionnelle
assignation modulo
dcrmentation

Les oprateurs arithmtiques fonctionnent comme en C.


Une diffrence : 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

&
|

>>
>>>

NON unaire bit--bit


ET bit--bit
OU bit--bit
OU exclusif bit--bit
dcalage droite
dcalage droite avec remplissage de zros
dcalage gauche

<<

Visualisation de leffet de >>>

int a = -1;

Op.

Rsultat

&=
|=
^=
>>=
>>>=

assignation avec ET bit--bit


assignation avec OU bit--bit
assignation avec OU exclusif bit--bit
assignation avec dcalage droite
assignation avec dcalage droite et
remplissage de zros
assignation avec dcalage gauche

<<=

32

Support de cours Java


a = a >>> 24;

donne en forme binaire


11111111111111111111111111111111
>>>24
00000000000000000000000011111111

-1
255

2.3 Oprateurs relationnels


Op.

Rsultat

==
!=
>
<
>=
<=

gal
diffrent 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, flottants 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
diffrent 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
[] .
()1
++

* /
%
+ >>>>>
<<
> >=
<
== !=
&

|
&&
||
? :
= op=
Priorit basse
1

Appel de mthode.

Sens de priorit
!

- (unaire)

<= instantceof

() (cast)

gauche droite
new droite gauche
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
gauche droite
droite gauche

34

Support de cours Java

IV.3

Contrle de flux

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

identificateur 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 flux

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 dfinie devant un

des blocs englobant, sinon break serait identique goto.

3.4 Instruction switch (I)


Forme strictement analogue celle du C

switch ( expression ) {
case valeur1 :
break;
case valeurN :
break;
default :
}
expression peut tre tout type primitif (les valeuri doivent tre du mme

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

" +
" +

36

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 flux

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 flexible


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 spcifications !
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, flexible, 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 modifier. Sa phrase peine termine, les autres singes se
remettent hurler en sautant sur le petit singe, le forant se terrer
nouveau sur le clavier. Les quatre premiers singes reviennent alors leurs
activits initiales.
Un bon dveloppeur doit trouver un compromis pour rendre les 5 singes
heureux.
39

40

Support de cours Java


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

1.2 Un vieux constat lhistoire dAdA


Le respect des essais des chances est souvent une pression commerciale

puissante au dtriment de la qualit dun logiciel.


Linsatisfaction des clients rsultant de singes malheureux tait dj un

constat fait au dpartement de la dfense amricaine :


En 1968-1970 au DoD (Departement of Defense) : cots matriels  cots
logiciels
De 1968 1973 : accroissement de 59 % des cots informatiques et baisse
trs forte des cots matriels (pour le logiciel, budget en 1970 : 3.109 $, en
1990 30.109 $)
ceci pour un produit fini en gnral insatisfaisant :
Adquation :
non correspondance aux besoins des utilisateurs
Fiabilit :
logiciel tombant souvent en panne Cot : cots rarement prvisibles, peru comme excessifs
Modifiabilit :
maintenance souvent complexe, coteuse et non fiable
Ponctualit :
logiciel souvent en retard ; livr avec des capacits infrieures celles promises
Transportabilit : logiciel dun systme rarement utilisable sur un autre
Efficacit :
non utilisation optimale par le logiciel des ressources
disponibles (temps de calcul, RAM)
ce qui rend les diffrents 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 doffes international, 17 rponses, 4 slectionnes, dont
une de CII Honeywell Bull.
En 1979 slection finale 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 diffrentielle et analytique)
En 83, manuel de rfrence Ada, approuv comme norme ANSI, puis en
1987 adopte par lISO

V.2 Buts du gnie logiciel

V.2

41

Buts du gnie logiciel

2.1 Quatre buts gnraux


Pour remdier cet tat de faits, on a cherch identifier 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 :
modifiabilit
efficacit
fiabilit
intelligibilit

2.2 Modifiabilit
Deux raisons de vouloir modifier un logiciel :
changement des spcifications (par exemple daprs une demande dun client)
correction dune erreur
Dans un logiciel modifiable, on peut introduire des changements sans complexification (ni perte de lisibilit)

2.3 Efficacit
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 lefficacit, se polarisant de ce fait sur
la micro-efficacit au dtriment de la macro-efficacit ; dans [RGI80] : Une
bonne perspicacit refltant une comprhension plus unifie dun problme
a beaucoup plus impact sur lefficacit nimporte quel tripotage de bits dans
une structure dficiente

2.4 Fiabilit
Peut-tre critique (systme de navigation dun engin spatial) : La fiabilit 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 effet de bord dangereux (par exemple, une orbite dgrade)

42

Support de cours Java

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

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

V.3

Principes de gnie logiciel

3.1 Six principes de gnie logiciel


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

3.2 Abstraction et dissimulation dinformation


Abstraction : exemple de systme de fichiers

(i) fichiers 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 fichier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture,
criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau
(iii) : Dplacement de ttes de lecture, lecture ou criture dune suite de
bits par tte magntique.
Pour manipuler fichier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture,

V.3 Principes de gnie logiciel

43

criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau (iii) :
Dplacement de ttes de lecture, lecture ou criture dune suite de bits par
tte magntique On a donc galement une abstraction des oprations ou
abstraction algorithmique.
On utilise la dissimulation dinformation :
Abstraction
extraire les dtails essentiels dun niveau
Dissimulation
rendre inaccessibles des dtails qui ne doivent
dinformations pas influencer 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 dfini les oprations


creer_pile(), empiler(), depiler()

Entre ces deux parties de code :


int
pile

i, elt_pile;
ma_pile;

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

et
int
pile

elt_pile;
ma_pile;

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

la deuxime solution doit tre rejete. Si lon change la structure de donnes


utilise pour une pile (par exemple une liste chane au lieu dun tableau),
la dernire partie de code est dsastreuse.

44

Support de cours Java


Labstraction aide la maintenabilit et lintelligibilit en rduisant

le nombre de dtails connatre chaque niveau.


La dissimulation dinformations aide la fiabilit (empcher toute opration non autorise).

3.3 Exemple de pile basique en C


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

200

typedef struct __pile {


int elements[TAILLE]; /* donnees, ici un tableau
int *dessus;
/* bas de la pile; ne varie pas
int *dessous;
/* haut de la pile; variable
} *pile;
pile
void
int
void

creer_pile();
empiler(pile ma_pile, int i);
depiler(pile ma_pile);
detruire_pile(pile ma_pile);

/** initialiser une pile **/


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

*/
*/
*/

V.3 Principes de gnie logiciel

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;
}

45

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 fiabilit, lefficacit et la modifia-

Abstraction : extrait les dtails essentiels


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

V.4 Stratgie de dveloppement oriente objet

V.4

47

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 spcifications et leur passage en objets est un cycle en quasi-perptuelle
volution. Il faut donc un schma cyclique o lon peut modifier seulement
une partie sans toucher au reste. On oprera donc comme suit :
1. Identifier les objets et leurs attributs. Les objets dcoulent des
groupes nominaux utiliss pour les dcrire (exemple : une pile)
2. Identifier les oprations. Ce sont les verbes que lon utilise pour dcrire les actions possibles sur lobjet (exemple : creer_pile(), empiler(),
depiler())
3. tablir la visibilit. Par exemple un objet pourra avoir accs toutes
les actions dune pile mais ne pourra pas voir les fonctions dallocation
dont la pile se sert
4. tablir linterface. Description de chaque opration avec ses arguments
5. Implanter chaque objet.

VI Notions de programmation oriente


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

VI.1

POO, Objets, Classes

1.1 Les 5 attributs dun systme complexe


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

50

Support de cours Java

1.2 Conception algorithmique


Comme le suggre Dijkstra : la technique appliquer pour matriser la

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

1.3 Conception oriente objets


Dans une dcomposition oriente objets, on partitionne le systme selon

les entits fondamentales du domaine du problme. Le monde est alors


vu comme une srie dagents autonomes qui collaborent pour raliser un
certain comportement de plus haut niveau. De ce point de vue, un objet
est une entit tangible, qui rvle un comportement bien dfini. Les objets
effectuent 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 filigrane pour exprimer lautre point de vue.

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

VI.2 Type ou classe ; objet

51

les types (les classes) peuvent hriter dattributs venant de super-types


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

1.5 Notion dobjet, de classe


Nous avons prcdemment parl de manire informelle dobjet comme dune

entit tangible reprsentant quelque comportement bien dfini.


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

VI.2

Type ou classe ; objet

2.1 Notion de type ou de classe


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

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

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

o sig_methi dsigne la signature de mthode n i et corps_methi dsigne le


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

52

Support de cours Java

2.2 Notion dattribut, ou de champ


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

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

2.3 Exemple dattributs


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

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

2.4 Notion de dclaration dopration (ou de mthode)


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

du nom de la mthode suivi de ses paramtres et prcd de son type de


retour. Par exemple, lopration daddition de matrices peut se dclarer
comme suit :
Matrice ajouterMatrice(Matrice m1, Matrice m2)

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

2.5 Notion de description dopration (ou de mthode)


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

des oprations (primitives ou non) quelle ralise. Une opration primitive


est une instruction du langage.

2.6 Exemple de description dopration


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

VI.2 Type ou classe ; objet

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 dynamiques) de chacune de ces proprits.
Une proprit est une caractristique naturelle ou discrminante, un trait,
une qualit ou une particularit qui contribue rendre un objet unique.
Par exemple, dans un distributeur, un numro de srie est une proprit
statique et la quantit de pices quil contient est une valeur dynamique.

54

Support de cours Java

2.9 Notion de comportement dun objet


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

de changement dtat et de transmission de messages.


Gnralement, un message est simplement une opration quun objet effectue sur un autre, bien que le mcanisme utilis soit quelque peu diffrent.
Dans la suite, les termes opration et message sont interchangeables.
Dans la plupart des langages orients objets et bass sur objets, les oprations que les clients peuvent effectuer sur un objet sont typiquement appeles des mthodes, qui font partie de la classe de lobjet.
La transmission de messages est une partie de lquation qui dfinit le comportement dun objet. Ltat dun objet influence aussi son comportement.
Par exemple, dans le cas dun distributeur de boissons, nous pouvons dclencher une action (appuyer sur un bouton) pour raliser notre slection.
Si nous navons pas introduit suffisamment dargent, il ne se passera probablement rien.
Si nous avons mis assez dargent, la machine lencaissera et nous servira
une boisson (modifiant ainsi son tat).
Nous pouvons donc affiner la notion dtat :
Ltat dun objet reprsente les effets 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 offre ses clients. En pra-

tique, nous avons constat quun client effectuait typiquement 5 sortes


doprations sur un objet. Les 3 les plus courantes sont les suivantes :
Modificateur une opration qui altre ltat dun objet
Slecteur
une opration qui accde ltat dun objet, mais qui naltre pas celui-ci.
Itrateur
une opration qui permet daccder toutes les parties dun
objet dans un ordre bien dfini.
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 dfinit 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 dfinit un contrat entre une abstraction et
un client.
Les responsabilits dun objet sont constitues dune part de la connaissance que lobjet maintient et dautre part des actions quil peut raliser.
En dautres termes, Ltat et le comportement dun objet dfinissent lensemble des rles quil peut jouer, lesquels dfinissent 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 influe 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 signifie 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 finis 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 signifie 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 diffrents. 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 diffrents.

2.15 Nature dun objet en Java


Un objet Java peut tre dcrit par la formule suivante :

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

o etat

ensemble des variables dinstance


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

VI.3

Relations

3.1 Sparation de linterface et de limplantation


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

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

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


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

comportement en rponse aux messages reus.


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

VI.3 Relations

57

un objet est de lui envoyer un message (dexcuter lune de ses oprations).


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

3.4 Relations entre classes


Il existe trois types fondamentaux de relations entre classes :

La gnralisation/spcialisation, dsignant une relation est un. Par


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

3.5 Relations dassociation entre classes


Relations dassociation.

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

58

Support de cours Java


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

3.6 Relations dhritage entre classes


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

ou le comportement dfini dans une (hritage simple) ou plusieurs (hritage multiple) autres classes. On nomme super-classe la classe de laquelle
une autre classe hrite. On appelle une classe qui hrite dune ou plusieurs
classes une sous-classe.
Par exemple, prenons une classe Surface2DSymetrique. Considrons les classes
Pave2D et Disque hritant de Surface2DSymetrique.
Lhritage dfinit 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 dfinir dautres champs qui viennent sajouter ceux hrits des superclasses.
De plus, toujours dans une relation dhritage, les sous-classes hritent du
comportement de leur super-classe. Par exemple, la classe Surface2DSymetrique
peut avoir comme oprations :
getSize()
pour obtenir la taille de la surface
getX()
pour obtenir labscisse du centre de gravit
getY()
pour obtenir lordonne du centre de gravit
setXY()
pour fixer la position de la surface
setColor() pour fixer la couleur de la surface
Et les classes Pave2D et Disque hriteront de ces champs. Une sous-classe
peut dfinir dautres oprations qui viennent sajouter celles hrites des
super-classes. En outre, une sous-classe peut redfinir 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 diffrentes, tant quelles sont relies par
une super-classe commune. Tout objet dsign par ce nom est alors capable
de rpondre de diffrentes manires un ensemble commun doprations.

VI.3 Relations

59

3.12 Relations daggrgation entre classes


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

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

3.13 Relations dutilisation entre classes


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

3.14 Relations dinstanciation entre classes


On veut utiliser des instances de classes distinctes qui ne sont pas relies par
une super-classe commune, en effectuant 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 vrification de type (en utilisant en java la rflexion) 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 rflexion sen rapproche.

VII Bases orientes objet de Java


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

VII.1

Classes et objets Java

1.1 Constitution dune classe


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

p. 49) :
Classe : squelette ; structure de donnes et code des mthodes ; statique,
sur disque
Objet : incarnation ; tat, comportement, identit ; dynamique, en mmoire
Une classe dfinit 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 dfinies dans la classe.
Une Classe java est dclare par le mot cl class, plac devant lidentificateur 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 identificateur


des paramtres formels : ceux-ci sont spars par des ,. Lorsque la mthode na pas de paramtre, contrairement au langage C , il ne faut pas
prciser void. Le nombre de paramtres est fixe : il nest pas possible de
dfinir 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 fichier source java doit porter le mme nom que celui de la classe

publique qui y est dfinie. Syntaxe gnrique


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

class Chat
String
int
float

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

VII.1 Classes et objets Java

63

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

Les dclaration et implantation dune mthode sont dans le


mme fichier. Ceci donne parfois de gros fichier source (.java), mais
il est plus facile (pour la maintenance) davoir les spcification, 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 dfinit une classe Bonjour qui ne possde quune seule mthode. La
mthode main() doit tre dclare static et public pour quelle puisse tre invoque par linterprteur Java. Largument args est un tableau de String qui
correspond aux arguments de la ligne de commande lors du lancement du programme. args[0] est le 1er argument, args[1] est le 2ime argument, . . .

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

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

La commande javac traduit le code source en code intermdiaire (p-code)


java. Ce code (une forme dassembleur gnrique) est videmment indpendant de la plate forme sur laquelle il a t compil.

64

Support de cours Java

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

1.7 Rfrence un objet


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

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


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

teurs est impossible en java. Seule chose permise : changer la valeur


de la rfrence pour pouvoir faire rfrence un autre objet. Plus prcisment, une rfrence pointe sur une structure o se trouve des informations
sur le type ainsi que ladresse relle des donnes de linstance dobjet.

1.8 Oprateur new


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

cette instance dobjet.


Point p = new Point();
Point p2 = p;
p = null;

// ligne 1
// ligne 2
// ligne 3

Ligne 2 : tout changement p2 affecte lobjet rfrenc par p. p2 =


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

VII.1 Classes et objets Java

65

1.9 Instance dobjet


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

donnes : variables dinstance.


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

faut dfinir une instance (dobjet) de cette classe. Or les objets ne sont
accessibles qu travers des rfrences . Donc une dfinition qui spcifie un
objet comme une variable ayant le type de la classe choisie ne fait que
dfinir 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 effective, 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 afficher 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 objets sont passs par rfrence (rfrences dinstances un objet passs
par valeur). Les types primitifs sont passs par valeur. Les mthodes
java sont donc similaires aux fonctions virtuelles du C++.

1.13 Instruction this


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

variable dinstance . . . Exemple dutilisation de this vitant cela


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

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

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

class Chat
String
int
float

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

public Chat(String sonNom,


int
sonAge,
float sonTauxRonron) {

VII.1 Classes et objets Java

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;
int
age;
Color[] couleurPelage;
float
tauxRonronnement;

//
//
//
//

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

public Chat(String sonNom,


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

68

Support de cours Java


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

paramtres), puis crer dautres constructeurs appelant systmatiqement le


constructeur exhaustif.

VII.2

Hritage

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

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

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

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


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

le compilateur met automatiquement extends Object.

VII.3 Surcharge, redfinition

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, redfinition

3.1 Instruction super


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

class Point3D extends Point {


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

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

70

Support de cours Java


}
}

3.2 Un artiste en pleine action

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

VII.3 Surcharge, redfinition

71

3.3 Sous-typage, transtypage, instanceof


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

parente) ; la mthode miauler() est dfinie dans Chat. La mthode peindre()


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

// valide
// illegal

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

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

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

3.4 Surcharge de mthode


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

mtres. Deux mthodes dune mme classe de mmes nom et signature de


type est illgal.
Exemple de surcharge

72

Support de cours Java


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

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

// Surcharge de methode

3.5 Redfinition de mthode


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

redfinir distance(x, y) de Point2D. Ex. de surcharge de distance 3D et de


redfinition de distance 2D
class Point {
int x, y;
Point(int x, int y) {
this.x = x;

VII.3 Surcharge, redfinition

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) {
return distance(p.x, p.y);
}
}// class Point

// Surcharge

class Point3D extends Point {


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

74

Support de cours Java


}

Laffichage 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 redfinie). 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 dynamique.

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 vrifie 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, redfinition

75

3.7 Instruction final


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

riables, convention de majuscules


final int FILE_QUIT = 1 ; Les sous classes ne peuvent redfinir 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 fichier) : moyen

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

3.9 Instruction static


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

peut utiliser this ou super. Ne peut utiliser une variable dinstance.


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

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

76

Support de cours Java


}
}

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

Initialisation de a et b. Excution du bloc static. Appel de main().


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

Exemple animalier
class Chat {
String
int
Color[]
float
static int

nom;
age;
couleurPelage;
tauxRonronnement;
ageSevrage = 1;

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

//
//
//
//
//

nom
annees
couleurs
de 0 a 1
statique

VII.4 Paquetages et interfaces

77

3.10 Instruction abstract


Partie spcification, partie implantation : classes abstraites .
Certaines mthodes, sans corps, doivent tre redfinies 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 Macintosh).
La racine de toute hirarchie de paquetage est une entre de la variable
denvironnement CLASSPATH.
Ayant une classe ClasseTest dans un paquetage test, il faut
soit se mettre dans le rpertoire pre de test et lancer
java test.ClasseTest,
soit ajouter le rpertoire test la variable CLASSPATH :
CLASSPATH=.;c:\code\test;c:\java\classes

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

4.2 Instruction import


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

dun paquetage est amen en visibilit directe, avec import.


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

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

Chargement de gros paquetages perte de performance en compilation.


Pas deffet 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 diffrents 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 diffrents.
Classes ni dans le mme paquetage, ni sous classes.
Table des modificateurs de visibilit

Mme classe
Mme paquetage, sous classe
Mme paquetage, non sous
classe
Paquetage diffrent, sous
classe
Paquetage diffrent, non sous
classe

private

rien

private
protected

protected

public

oui
non
non

oui
oui
oui

oui
oui
non

oui
oui
oui

oui
oui
oui

non

non

oui

oui

oui

non

non

non

non

oui

Dclar public : peut tre vu de partout.


Dclar private : ne peut tre vu en dehors dune classe.
Pas de modificateur : 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 signification 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 linterface. La signature de type doit tre respecte.
Les interfaces vivent dans une hirarchie diffrente 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 effet, 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 Specification, 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 spcifie comme
telle avec throws.
Tout code qui doit absolument tre excut avant quune mthode ne retourne est plac dans un bloc finally.

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

1.4 Types dexceptions


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

Exception : conditions exceptionnelles que les programmes utilisateur devraient traiter.


Error : exceptions catastrophiques que normalement seul lenvironnement
dexcution devrait grer.
Une sous-classe dException, RuntimeException, pour les exceptions de lenvironnement dexcution.

VIII.1 Fonctionnement gnral du systme dexceptions

85

1.5 Exceptions non gres


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

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

un nouvel objet exception afin darrter le code et de grer cette condition


derreur.
Le flux de code est alors interrompu et la pile dappels (des diffrentes
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 affiche la valeur en String de lexception et la trace de la pile dappels :
/home/mounier> java ExcepDiv0
java.lang.ArithmeticException: / by zero
at ExcepDiv0.main(ExcepDiv0.java:4)

1.6 Instructions try et catch


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

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

diatement prcdent.

86

Support de cours Java

1.7 Instructions catch multiples


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

tructions catch les unes aprs les autres, dans lordre o elles ont t crites.
Il faut donc mettre les exceptions les plus spcifiques 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 flux dexcution est alors stopp et le bloc try immdiatement englobant
est inspect, afin de voir sil possde une instruction catch correspondante
linstance gnre.
Si ce nest pas le cas, le 2ime bloc try englobant est inspect ; et ainsi de
suite.
Exemple
class ThrowDemo {
static void demoproc() {
try {
throw new NullPointerException("demo");
} catch (NullPointerException e2) {
System.out.print("attrapee ds demoproc()");
throw e2;
}
public static void main(String args[]) {
try {
demoproc();
} catch(NullPointerException e1) {
System.out.print("attrapee ds main()");
}
}
}

1.9 Instruction throws


Si une mthode est susceptible de gnrer une exception quelle ne

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

VIII.1 Fonctionnement gnral du systme dexceptions

87

Linstruction throws est utilise pour spcifier la liste des exceptions quune

mthode est susceptible de gnrer.


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

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

Ce programme ne compilera pas :


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

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

88

Support de cours Java

1.10 Instruction finally


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

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


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

avant que la mthode ne retourne.


Ceci peut tre pratique pour fermer des fichiers 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 redfinir lune des mthodes, hrite de Throwable :

Outre le constructeur sans argument, un constructeur Exception(String


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

1.12 Conclusion
Le code suivant

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

#include <sys/errno.h>

VIII.1 Fonctionnement gnral du systme dexceptions


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

89

IX Classes utilitaires de base


Rfrences bibliographiques
Java et Internet Concepts et programmation, G. Roussel, E. Duris, N.
Bedon et R. Forax [RDBF02],
Java in a Nutshell, D. Flanagan, [Flab],
The Java Language Specification, 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.
Renvoie le code de hachage associ lobjet.
Teste lgalit, la plus smatiquement
significative possible.
Renvoie
une
copie
superficielle
(champ champ) de lobjet (throws
CloneNotSupportedException).
Appele en libration mmoire (throws
Throwable).
Relche le moniteur de lobjet et rveille
une thread bloque en attente de ce moniteur par un wait().

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

protected void finalize()


final void notify()

91

92

Support de cours Java

final void notifyAll()

final void wait()

final void wait(long timeout)

final Class getClass()

Relche le moniteur de lobjet et rveille


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

1.2 Mthodes toString(), hashCode()


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

dfinir 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 redfinit equals(), on doit redfinir galement hashCode().

1.3 Mthode equals()


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

en test dgalit de contenu.


Erreur commune : surcharge au lieu de redfinition ; 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);
}
}
Vrifier que la relation binaire induite est rflexive, symtrique et transi-

tive. Vrifier 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 1er janvier 1970.
arrte la machine virtuelle java en cours
dexcution.
demande au ramasse-miettes de rcuprer
la mmoire inutilise.
rassigne lentre standard.
rassigne la sortie standard.
rassigne la sortie erreur standard.

static void exit(int status)


static void gc()
static void setIn(InputStream in)
static void setOut(PrintStream out)
static void setErr(PrintStream err)

1.5 Mthodes de PrintStream


Mthodes :
methode()

But

void close()
void flush()

Ferme le flux dentre/sortie


Vide le tampon mmoire associ au flux
(force lcriture)

94

Support de cours Java

void print(...)

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

IX.2

Affiche largument sur la sortie standard.


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

Mthode main() et classes demballage des


types primitifs

2.1 Mthode main() et ses arguments


Syntaxe public static void main(String args[]) ...
public : la mthode peut tre appele de partout
static : pas besoin de crer dobjet pour lappeler
void : elle ne renvoie rien
String args[] : args est un tableau de String
1ier argument args[0], 2ime argument args[1], . . .
Nombre darguments : args.length
Attention ! Ne pas confondre
le champ length : nombre dlments dun tableau
la mthode length() de la classe String : longueur de la chane de caractres
Exemple daffichage 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 +&) affiche


arg no 1 : toto de longueur : 4

IX.3 Scanner (java.util.Scanner)


arg
arg
arg
arg

no
no
no
no

2
3
4
4

:
:
:
:

95

4 de longueur : 1
gabuzomeu de longueur : 9
7.8 de longueur : 3
+&) 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 correspondant ; elle permet dobtenir une variable du type primitif correspondant.
Integer un = new Integer(1);
int i
= un.intValue();
Mthode parseXXX(String) o XXX est lun des noms de classe prcdent ;

elle permet dobtenir un objet de type numrique ou boolen partir dune


chane de caractres. Par ex. parseDouble("2.5") ; renvoie un Double. Linverse
est ralis par toString().
Les constantes MIN_VALUE et MAX_VALUE contiennent les valeurs minimale et
maximale.

IX.3

Scanner (java.util.Scanner)

3.1 Classe Scanner : aperu


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

String au clavier.
Il suffit de crer un objet Scanner avec en argument le flux 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


Diffrents constructeurs sont disponibles
methode()

But

Scanner(File source)

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

Scanner(InputStream source)

Scanner(Readable source)

Scanner(String source)

3.3 Classe Scanner : mthodes essentielles


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

qui sont spars par des dlimiteurs.


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

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

IX.3 Scanner (java.util.Scanner)

97

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

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

3.4 Classe Scanner : autres mthodes


Voici les autres mthodes de Scanner les plus importantes
methode()

But

void close()
String findInLine(String pattern)

Ferme ce Scanner (le flux associ).


Cherche la prochaine occurence du motif
pattern, en ignorant les dlimiteurs.
Renvoie true si le prochain lexme correspond au motif spcifi par pattern.
Renvoie le prochain lexme sil correspond
au motif spcifi par pattern.
saute les entres qui correspondent au motif
spcifi par pattern.
Fixe le dlimiteur au motif spcifi par
pattern.

boolean hasNext(String pattern)


String next(String pattern)
Scanner skip(String pattern)
Scanner useDelimiter(String
pattern)

3.5 Classe Scanner : Exemples


Exemple de lecture dans un fichier :

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 redfinissant 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 redfinir


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 spcifi ladresse url.
Image getImage(URL url) Renvoie une rfrence une instance dobjet de
type Image.

4.3 Exemple : un disque color


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

x, y;
size;
color;

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

public Disk(int Xpos, int Ypos, int radius) {


x
= Xpos;
y = Ypos;
size = radius;
color = Color.red;
// Initialement rouge
}
// methodes
public void
public void
public void

fixant des attributs (modificateurs)


setXY(int newX, int newY) { x = newX; y = newY;}
setSize(int newSize)
{ size = newSize; }
setColor(Color newColor)
{ color = newColor;}

// methodes accedant aux attributs (accesseurs)


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

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

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

101

g.fillOval(x-(size/2), y-(size/2), size, size);


}
}// public class Disk

Classe DiskField, qui affiche le disque prcdent :


import java.applet.*;
import java.awt.*;
public class DiskField extends Applet {
int
Disk

x = 150, y = 50, size = 100;


theDisk = null;

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

// position et diametre

// 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 afficher lapplet, on a besoin dun fichier 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 modifiables.


String et StringBuffer sont dclares final, de faon raliser certaines

optimisations.
Le constructeur gnrique de String se dclare comme suit :
String String(char tabChars[], int indiceDeb, int nbChars);
indiceDeb dbute 0 pour le premier caractre de la chane.

102

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 modifie 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 afficher 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 difficiles 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 modifications 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 afin

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 effet, "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 redfinir 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 fin 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()
Enfin, 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
(fichier 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.

finit) par la chane fournie en paramtre. "Nabuchodonosor".endsWith("nosor")


et "Nabuchodonosor".startsWith("Nabu") renvoient tous deux true. On peut
galement spcifier lindice de dbut de comparaison. Par exemple lexpression "HoueiNeng".startsWith("Neng", 5) renvoie true.

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

voir si elles se rfrent la mme instance.


Exemple :

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

105

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

4.11 Relation dordre


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

est infrieure s (le paramtre), 0 si elles sont gales et un rsultat positif


sinon.
Moyen mnmotechnique : caller.compareTo(parameter) renvoie un entier
du mme signe que caller - parameter.

4.12 Recherche de sous-chane


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

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

int lastindexOf(int car);

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

int lastindexOf(String str);

renvoient lindice du premier caractre de la premire (resp. la deernire)


occurrence de la sous-chane str.
int indexOf(int car, int fromIndex);

int lastindexOf(int car, int fromIndex);

renvoient lindice de la premire (resp. la dernire) occurrence du caractre


car aprs (resp. avant) formIndex.
int indexOf(String str, int fromIndex);

int lastindexOf(String str, int fromIndex);

renvoient lindice du premier caractre de la premire (resp. la dernire)


occurrence de la sous-chane str aprs (resp. avant) formIndex.

106

Support de cours Java

4.13 Modifications sur une copie de String


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

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

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

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

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

"
Jai besoin dair
"Jai besoin dair"

".trim() ->

4.14 Autres mthodes de String


methode()

But

String concat(String str)

Concatnation de this celle fournie en


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

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

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


String[] split(String regex)

107

Dcoupe this selon les dlimiteurs fournis


en tant quexpression rgulire.

4.15 StringBuffer
Cest une chane modifiable 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, spcifiant la taille initiale du tampon ;
avec un paramtre String, spcifiant 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() fixe 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 affiche
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 spcifi :

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

rsulte en
"Lenvie de tout sauf detre roi"

4.16 StringBuilder
Cest une chane modifiable 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 Specification, J. Gosling, B. Joy et G. Steele [GJS96],
Java et Internet Concepts et programmation, G. Roussel, E. Duris, N.
Bedon et R. Forax [RDBF02],
Data Structures & Problem Solving Using Java, M.A. Weiss [Wei98],
Algorithms, R. Sedgewick [Seg91]

X.1

Classes de java.util ; Classes et interfaces de


comparaison

1.1 Classes et interfaces de java.util


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

110

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 compatibilit :
Classe Vector, tableau dobjets de grandeur variable.
Classe Properties, extension de Hashtable permettant de lire et dcrire des
paires cl/valeur dans un flot.
On trouve diverses interfaces :
10 interfaces associes aux conteneurs.
EventListener, interface marqueur pour tous les gestionnaires dvnements.
Comparator, pour les objets dfinissant une relation dordre (via compare(Object
o1, Object o2) et equals(Object o)).
Observer, dfinit la mthode update() ncessaire pour quun objet observe des sous-classes de Observable.

1.2 Interface java.lang.Comparable


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

appliquer public int compareTo(Object other)


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

dordre induite.

1.3 Interface java.util.Comparator


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

int compare(Object o1, Object o2), offrant 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

X.2

111

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


Diffrents types de conteneurs, selon linterface et la structure de donne.
Table de hachage

Interfaces

Set
List
Map

HashSet
HashMap

Implantations
Tableau
Arbre quilibr

taille
variable
TreeSet
ArrayList
TreeMap

Liste chane

LinkedList

2.4 Transitions entre conteneurs


Dans Map :

values() renvoie une Collection des valeurs de la table


keySet() renvoie un Set des cls de la table
entrySet() renvoie un Map.entry des entres (paires cls/valeur) de la
table
Ce sont des vues de la table.
Une modification 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 spcifi la collection. renvoie true

si la collection a t modifie par lopration (un Set ne peut contenir 2 fois


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

2.6 Interface Map


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

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

avec la valeur spcifie.


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

X.2 Classes et interfaces conteneurs

113

boolean equals(Object o) teste lgalit de contenu de la table avec o.


Object get(Object key) renvoie la valeur de la table correspondant la

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

2.7 Classe Arrays


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

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

Dans ce qui suit, Type dsigne soit un type primitif, soit Object. Voir la
documentation Java des API pour les signatures prcises des mthodes.
static int binarySearch(Type[] a, Type key) effectuant 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) affecte tous les lments de a
val.
static int sort(Type[] a) trie a selon un alogrithme quicksort modifi.

2.8 Conteneurs immuables


Toutes les mthodes de modification de Collection et Map sont documentes

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

114

Support de cours Java


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

(public static final) reprsentant des collections vides : EMPTY_MAP, de


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

2.9 Concurrence et synchronisation


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

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

2.10 Itration de conteneurs


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

lments dune collection.


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

X.2 Classes et interfaces conteneurs

115

Object next() renvoie une rfrence sur linstance suivante de la collection,


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

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

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


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

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

2.11 Squelettes dimplantation


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

exception de type UnsupportedOperationException.


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

de AbstractCollection et dimplanter Iterator iterator() et int size()


Pour dfinir des conteneurs modifiables, 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, 99K : implante) :

LinkedHashMap HashMap AbstractMap 99K hhMapii


WeakHashTable AbstractMap
WeakHashTable AbstractMap
TreeMap 99K hhSortedMapii hhMapii
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 redfinissent 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 spcifi, 0.75 est utilis.

3.7 Classe HashMap


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

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()
Object clone()

Rinitialise et vide la table de hachage.


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

boolean containsKey(Object key)

boolean containsValue(Object value)

Set entrySet()
Object get(Object key)

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

void putAll(Map t)

Object remove(Object key)

int size()

X.3 Conteneurs de type Map


String toString()

Collection values()

119
Renvoie une forme affichable dune table de
hachage. Il sagit de la liste des entres de
la table, chaque entre tant entoure daccolades et spare de la suivante par une
virgule. Chaque entre est constitue de la
forme affichable (via toString()) de la cl,
suivi du signe =, suivi de la forme affichable
(via toString()) de la valeur associe.
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 106 bits 200 bits) et qui a la proprit suivante :
(Phach) : Il nest pas calculatoirement faisable de trouver deux
entres diffrentes x et x0 telles que f (x) = f (x0 ).
Lexpression lopration O nest pas calculatoirement faisable signifie simplement tous les algorithmes actuellement connus pour raliser O sont de
complexit exponentielle.

3.10 Hachage : autentification


Application lautentification de messages :
Supposons que Alice veuille envoyer un message Bob, en signant son message.
Les donnes quAlice veut transmettre sont constitues dun message en
clair suivi de ses prnom et nom, en clair, la fin 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 vrifier non seulement que le message provient bien dAlice
(que sa signature na pas t falsifie), mais galement que son message, en
clair, na pas t altr.
Par supposition, aucun pirate naurait t capable de modifier x sans changer la valeur de h = f (x).

120

Support de cours Java

3.11 Hachage : recherche


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

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


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

sont ranges les valeurs associes aux diffrentes 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 diffrents dans la table de hachage).

3.12 Hachage : recherche


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

distribues, en un sens probabiliste, dans [1, p].


Prenons comme exemple de fonction de hachage simple la fonction modulo
un nombre premier.
Prenons alors pour p un nombre premier (par exemple 101) et considrons
la cl suivante : VERYLONGKEY

3.13 Hachage : recherche


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

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

en faire lopration modulo 101, sa repsentation machine tant lourde


manier ; il scrit en effet en binaire par
1011000101100101100101100011110111000111010110010111001
Il est bien plus efficace 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 efficace 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 diffrents 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() dfi-

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

122

Support de cours Java

3.18 Hachage : recherche


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

sa longueur. Soit n la longueur de la suite de caractres et ci le caractre


dindice i.
Si n 6 15, le code de hachage est calcul par
n1
X

ci .37i

i=0

en utilisant larithmtique des int

3.19 Hachage : recherche


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

ci.k .39i

i=0

 
 
en utilisant larithmtique des int, o k = n8 et m = nk , 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 insuffisances 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 spcifie le type dordre daccs. Si accessOrder est

X.3 Conteneurs de type Map

123

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

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

et le facteur de charge). La taille est augmente si besoin est.


Utilise en srialisation, o lenvironnement dexcution associe un identificateur chaque rfrence. Lorsquon rencontre une rfrence dj prise en
compte, on utilise son identificateur 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 fixant 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 spcifie
dans la liste.
boolean addAll(Collection c) ajoute tous les lts. de c la fin de la liste.
boolean addAll(int index, Collection c) ajoute tous les lts. de c la
position spcifie 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 spcifie 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. spcifi de la liste.
boolean removeAll(Collection c) enlve de la liste tous les lts. de c.
boolean retainAll(Collection c) ne garde dans la liste que les lts. de c.
Object set(int index, Object element) remplace llt. de la liste la position index par element.
int size() renvoie le nombre dlts. de la liste.
List subList(int fromIndex, int toIndex) renvoie une vue de la portion
de liste comprise entre fromIndex inclus et toIndex, exclus.
Object[] toArray() renvoie un tableau des lts. de la liste.
Object[] toArray(Object[] a) renvoie un tableau des lts. de la liste. Le
type du tableau renvoy est le type de a lexcution.

4.3 Itration des listes


Itrateur spcialis des listes : interface ListIterator ; Mthodes supplmentaires par rapport Iterator.
methode()

But

void add(Object o)
boolean hasPrevious()

insre llment spcif dans la liste.


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

int nextIndex()
Object previous()
int previousIndex()
void set(Object o)

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 modifie : pas 2 lts identiques au sens dequals().
Classe abstraite AbstractSet admet 3 sous-classes concrtes : HashSet, LinkedHashSet,
TreeSet.

4.5 Classe HashSet

Contient une table de hachage.


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

4.6 Classe LinkedHashSet

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

4.7 Classe TreeSet

Contient un TreeMap (arbre rouge-noir) pour stocker les lments.


Implante linterface SortedSet.
Les cls sont constamment ordonnes en ordre croissant.
Temps daccs en insertion, recherche, suppression (containsKey(), get(...),
put(...) et remove(...)) en O(log n) o n est la taille du conteneur.
Mthodes supplmentaires de linterface SortedSet :
methode()

But

Object first()
SortedSet headSet(Object
toElement) renvoie une vue des
lts strictement plus petits que
toElement. Object last()
SortedSet subSet(Object
fromElement, Object toElement)

renvoie le 1er elt. de lensemble tri.


renvoie le dernier elt. de lensemble tri.

SortedSet tailSet(Object
fromElement)

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

128

Support de cours Java

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

4.9 Suites accs direct


Un telle suite possde une capacit initiale.
Sil ne reste plus de place, il faut augmenter la taille de la liste, opration
en O(n).
Linsertion a donc une complexit au pire de O(n).
En augmentant la taille astucieusement, on assure que la complexit de i
insertions est en O(i).
Le calcul de la taille, laccs un lment et laffectation 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 diffrentes mthodes sont :
methode()

But

void add(int index, Object element)

Lobjet spcifi par element est ajout


lendroit spcifi de la liste.

X.4 Conteneurs de type Collection et Listes


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

boolean isEmpty()
int lastIndexOf(Object element)

Object remove(Object element)

protected void removeRange(int


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

void trimToSize()

4.11 Classe ArrayList


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

129

Lobjet spcifi par element est ajout la


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

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)
void addLast(Object o)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()

insre llt. spcifi au dbut de la liste.


ajoute llt. spcifi la fin de la liste.
renvoie le 1er lt. de la liste.
renvoie le dernier lt. de la liste.
enlve et renvoie le 1er lt. de la liste.
enlve et renvoie le dernier lt. de la liste.

4.14 Classe Stack


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

de Vector, et en dfinit 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.
Renvoie llment du dessus de la pile, mais
ne lenlve pas.
Renvoie llment du dessus de la pile, en
lenlvant.
Pousse element sur la pile. element est
galement renvoy.

Object peek()
Object pop()
Object push(Object element)

132

Support de cours Java

int search(Object element)

Cherche element dans la pile. Sil est


trouv, son offset 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 dfinit des mthodes par lesquelles ont peut numrer (un la fois) des

lments dun Vector ou dune Hashtable.


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

4.17 ((Classe Vector))


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

rences des objets.


Lutilisation de cette classe est dprcie. Il est recommand dutiliser

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

un tableau longueur variable synchronis, utiliser la mthode static


Collection synchronizedCollection(Collection c) de la classe Collections.

4.18 ((Classe Dictionary))


Dictionary est une classe abstraite qui reprsente un mcanisme de stockage

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

la classe AbstractMap la place.

4.19 Classe Hashtable


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

se pour stock des Objects rfrencs par dautres Objects.

X.4 Conteneurs de type Collection et Listes

133

Lutilisation de cette classe est dprcie. Il est recommand dutiliser

HashMap la place.

4.20 ((Classe Properties))


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

. . . ) o la cl est une String.


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

qui donne les variables denvironnement).


Un champ est dfini

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

String getProperty(String key,


String defaultVal)

void list(PrintStream streamOut)

void load(InputStream streamIn)


thows IOException
Enumeration propertyNames()

void save(OutputStream streamOut,


String description)

134

Support de cours Java

Dans la lecture par load() :

Les lignes commenant par un # ou un ! sont traites comme des commentaires (elles ne sont pas lues).
Les sparateurs cl-valeur sont : =, : ou un espace.
Chaque paire cl-valeur doit tenir sur une ligne, sauf si lon place un \ en
fin 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 identificateur.
Ensuite, un commentaire est toujours crit, constitu dun #, suivi de la
date et de lheure et dun passage la ligne.
Puis, chaque paire de la table est crite, une par ligne. La cl est dabord
crite, suivi dun =, suivi de la valeur.
Exemple dutilisation de la liste par dfaut :
import
import
import
import

java.util.Dictionary;
java.util.Hashtable;
java.util.Properties;
java.util.Enumeration;

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

X.4 Conteneurs de type Collection et Listes


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

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);

135

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


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);

137

138

Support de cours Java

4.23 Exemple : cration dune table de hachage


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

// hash table
// sorted map

pairs to the map


Integer(1));
Integer(2));
Integer(3));

// Get number of entries in map


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

4.24 Exemple : itration de la table de hachage


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

Bibliographie
[Boo94]

G. Booch. Object-Oriented Analysis and Design with Applications.


Benjamin/Cummings, Redwood City, CA, 1994. d. franaise : Analyse & conception orientes objets, AddisonWesley France, Paris,
1994. Un classique de lingnirie du logiciel.

[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, Reading, MA, 1995. Livre fondateur dune technique maintenant classique
en gnie logiciel.
[GJS96]

J. Gosling, B. Joy, et G. Steele. The Java Language Specification.


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 difficile 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 introduction diverse aspects du langage hors rseau.
[RGI80]

D.T. Ross, J.B. Goodenough, et C.A. Irvine. Software engineering :


Process, principles and goals. Dans P. Freeman et A. Wasserman,
diteurs, Tutorial on Software Design Techniques. Computer Society
Press of the IEEE, New York, 3e d., 1980. Un article classique en
gnie logiciel.

[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.
Using Java.

Data Stuctures & Problem Solving


Addison-Wesley,
Reading,
MA,
1998.
http ://www.awl.com/cseng/titles/0-201-54991-3. Bon livre sur
un sujet ultra-classique.

Index
abstract, 77

java.util.TreeSet, 126
java.util.WeakHashMap, 123

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

141

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


Identificateur, 25
if-else, 34
import, 78
instanceof, 71

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
Redfinition de mthode, 72
Rpartition de mthode dynamique,
74
Surcharge de mthode, 71
Modificateurs
modificateurs 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