Académique Documents
Professionnel Documents
Culture Documents
Poly Bases Java HM
Poly Bases Java HM
Structures de donnes
Notions en Gnie Logiciel
et Programmation Oriente Objet
H. Mounier
Universit Paris Sud
Notations
Les sigles suivants seront frquemment utiliss
Implication logique
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.
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
7
7
9
15
15
23
25
25
30
34
.
.
.
.
39
39
41
42
47
objet
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
49
49
51
56
. . . .
. . . .
. . . .
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
I.2
<X11/Intrinsic.h>
<X11/StringDefs.h>
<Xm/Xm.h>
<Xm/Form.h>
<Xm/Label.h>
<Xm/PushB.h>
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.
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
II.1
1.1 Oak
Originellement Oak, 1991, James Gosling, Sun Microsystems.
But de Oak : langage embarqu pour des appareils de communication (tl-
1.8 Scurit
Un programme sexcutant sur un serveur ne peut faire beaucoup de dgts
II.2
Manifeste en 11 points
10
sr,
indpendant de larchitecture,
portable,
efficace
multitches ou multi-activits (multi-thread) et
dynamique.
11
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.
lencontre de C++.
12
(threads) dexcution.
La coordination des activits est aise (moniteurs de Hoare et vnements).
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.
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).
14
III.1
Technologies et paquetages
15
16
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).
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
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
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
III.2
23
Gestionnaires SAX2 optionnels.
Classes daide SAX.
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/
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
http ://www.sente.ch/cetus/software.html
IV.1
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
Squence escape
Description
\ddd
\uxxxx
\
\"
\\
\r
\n
\f
\t
\b
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);
}
}
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
}
}
}
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
28
analogues aux types correspondants dans des langages non orients objets.
Huit types primitifs :
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
29
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);
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 :
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
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];
double m[][]
{
{
{
};
IV.2
= {
0*0, 1*0, 2*0 },
0*1, 1*1, 2*1 },
0*2, 1*2, 2*2 }
Oprateurs
Rsultat
Op.
Rsultat
+
*
/
%
++
addition
soustraction
multiplication
division
modulo
incrmentation
+=
-=
*=
/=
%=
assignation additive
assignation soustractive
assignation multiplicative
assignation divisionnelle
assignation modulo
dcrmentation
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);
}
}
Rsultat
&
|
>>
>>>
<<
int a = -1;
Op.
Rsultat
&=
|=
^=
>>=
>>>=
<<=
32
-1
255
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
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
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
* /
%
+ >>>>>
<<
> >=
<
== !=
&
|
&&
||
? :
= 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
IV.3
Contrle de flux
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
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
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
" +"\n"+
" +
" +
" +"\n"+
" +
" +"\n"+
\n";
37
java.
[ initialisation; ]
while ( terminaison ) {
corps;
[ iteration; ]
}
do-while
[ initialisation; ]
do {
corps;
[ iteration; ]
} while ( terminaison );
for
V.1
40
V.2
41
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
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
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;
*/
*/
*/
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];
44
200
creer_pile();
empiler(pile ma_pile, int i);
depiler(pile ma_pile);
detruire_pile(pile ma_pile);
*/
*/
*/
return(nouvelle_pile);
}/* creer_pile() */
45
46
}/*
detruire_pile() */
V.4
47
VI.1
50
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.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),
51
VI.2
clarations doprations (ou signatures de mthodes) et de descriptions extensives doprations (ou corps de mthodes)
Ce que lon peut rsumer par la formule suivante
52
des attributs. Dans un type Point, les coordonnes sont des attributs
Matrice n m
class Matrice {
int
nombreLignes, nombreColonnes;
double valeurs[];
...
}
53
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
55
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.
autres objets.
56
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.
o etat
VI.3
Relations
implantation.
Linterface dun objet est constitue des messages quil peut accepter dautres
VI.3 Relations
57
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
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
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.
VII.1
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).
61
62
class Chat
String
int
float
{
nom;
// nom du fauve
age;
// en annees
tauxRonronnement; // entre 0 et 1
63
void viellir() {
age += 1;
}
int retournerAge() {
return(age);
}
}
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
64
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
// ligne 1
// ligne 2
// ligne 3
65
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;
jet. Pour afficher la date contenue dans lobjet d, on lui envoie le message
imprimer :
d.imprimer() ; De telles mthodes sont appeles mthodes dinstance.
class Point {
int x, y;
}
class Point {
int x, y;
void init(int a, int b) {
x = a;
66
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.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
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)
}
}
class Chat {
String nom;
int
age;
Color[] couleurPelage;
float
tauxRonronnement;
//
//
//
//
nom du fauve
en annees
ses differentes couleurs
entre 0 et 1
68
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-
69
De la mme manire que lon peut assigner une variable int un byte, on
VII.3
Surcharge, redfinition
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
71
// valide
// illegal
// 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
72
class Chat {
....
void vieillir() {
age += 1;
}
void vieillir(int n) {
age += n;
}
// Surcharge de methode
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
74
75
de la librer.
Ajout dune mthode finalize() la classe. Appele chaque libration
dune instance dobjet de cette classe.
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
Laffichage est
Prompt > java Statique
Initialisation du bloc statique
x = 42, a = 3, b = 12
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
77
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
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
import java.util.Date;
import java.io.*;
79
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
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
// 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;
}
}
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-
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.
82
interface Callback {
void callback(int parametre) {
}
class Client implements Callback {
void callback(int p) {
System.out.println("Callback de " + p);
}
}
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
83
84
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
}
85
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
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
tructions catch les unes aprs les autres, dans lordre o elles ont t crites.
Il faut donc mettre les exceptions les plus spcifiques dabord.
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()");
}
}
}
gre pas, elle doit le spcifier, de faon que ceux qui lappellent puissent
se prmunir contre lexception.
87
Linstruction throws est utilise pour spcifier la liste des exceptions quune
class ThrowsDemo1 {
static void proc() {
System.out.println("dans proc()");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
proc();
}
}
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
diverses ressources.
Le bloc finally est optionnel.
dException.
On peut alors utiliser ou redfinir lune des mthodes, hrite de Throwable :
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>
89
IX.1
But
String toString()
int hashCode()
boolean equals()
protected Object clone()
91
92
impliquec1.hashCode() == c2.hashCode()
Donc, si lon redfinit equals(), on doit redfinir galement hashCode().
de type Object.
Exemple sur des classes de nombres complexes :
93
}
Complexe c = (Complexe)obj;
return (partieReelle == c.partieReelle &&
partieImaginaire == c.partieImaginaire);
}
}
Vrifier que la relation binaire induite est rflexive, symtrique et transi-
But
But
void close()
void flush()
94
void print(...)
void println(...)
void write(int b)
IX.2
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)
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
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 ;
IX.3
Scanner (java.util.Scanner)
String au clavier.
Il suffit de crer un objet Scanner avec en argument le flux lire, puis
96
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)
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.
97
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.
But
void close()
String findInLine(String pattern)
98
99
IX.4
Classes java.applet.Applet et
java.lang.String
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.
100
x, y;
size;
color;
// position du disque
// diametre du disque
// couleur du disque
x; }
y; }
size; }
color; }
101
// 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
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
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.";
103
possibles.
append() appelle en fait la mthode valueOf(). Pour des types primitifs,
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 :
104
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
4.9 Extraction/Comparaison
startsWith() (resp. endsWith() teste si la chane appelante commence (resp.
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
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));
}
}
une chane.
2 mthodes : indexOf() et lastIndexOf() sous plusieurs formes. Renvoient
-1 en cas dchec.
int indexOf(int car);
renvoient lindice de la premire (resp. la deernire) occurence (c..d. apparition) du caractre car.
int indexOf(String str);
106
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() ->
But
boolean contains(String s)
boolean contentEquals(StringBuffer
sb)
static String copyValueOf(char[]
data)
static String format(String format,
Object... args)
boolean matches(String regex)
107
4.15 StringBuffer
Cest une chane modifiable et susceptible de crotre et de dcrotre.
Elle peuvent tre construites avec un constructeur :
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
via +.
insert() insre une sous-chane n indice spcifi :
rsulte en
"Lenvie de tout sauf detre roi"
4.16 StringBuilder
Cest une chane modifiable ayant les mme fonctionnalits que StringBuffer
X.1
110
dordre induite.
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
111
Interfaces
Set
List
Map
HashSet
HashMap
Implantations
Tableau
Arbre quilibr
taille
variable
TreeSet
ArrayList
TreeMap
Liste chane
LinkedList
112
la cl spcifie.
boolean containsValue(Object value) teste si la table contient une entre
113
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.
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.
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
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).
115
// Affiche 0
// modification via i1 (enleve 0)
// Affiche 1
// Affiche 1
Noter que ce code est polymorphe (il fonctionne pour toute instance de
Collection)
116
AbstractList et AbstractSequentialList.
X.3
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.
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.
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.
renvoyer.
equals() compare 2 objets.
Beaucoup de classes courantes de Java implantent la mthode hashCode().
118
methode()
But
void clear()
Object clone()
Set entrySet()
Object get(Object key)
boolean isEmpty()
Set keySet()
Object put(Object key, Object
value)
void putAll(Map t)
int size()
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.
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.
120
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
121
h = cle.charAt(0);
for(int i = 1; i < cle.length(); i++)
valHach = ((valHach*32)+cle.charAt(i)) % tailleTable;
return valHach;
}
fournit 97.
* Le calcul dun indice partir dune cl est rapide, mais rien ne garantit
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.
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
ci .37i
i=0
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].
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.
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
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
124
les cls.
Il faut fournir 2 constructeurs suplmentaires :
125
X.4
126
But
void add(Object o)
boolean hasPrevious()
int nextIndex()
Object previous()
int previousIndex()
void set(Object o)
4.4 Ensembles
Sous-type de Collection ne pouvant contenir 2 lts. identiques.
127
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.
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)
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
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.
But
boolean isEmpty()
int lastIndexOf(Object element)
void trimToSize()
129
130
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();
}
}
131
But
void addFirst(Object o)
void addLast(Object o)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()
But
boolean empty()
Object peek()
Object pop()
Object push(Object element)
132
Une EmptyStackException est jete si lon appelle pop() lorsque la pile est
vide.
ArrayList la place.
La classe ArrayList nest pas synchronise par dfaut. Si lon dsire avoir
cl/valeur.
Lutilisation de cette classe est dprcie. Il est recommand dutiliser
133
HashMap la place.
But
134
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();
135
136
137
138
// hash table
// sorted map
Bibliographie
[Boo94]
[Bud98]
[Dij79]
[Flaa]
[Flab]
[Kob87]
140
[Seg91]
[Wei98]
M. A. Weiss.
Using Java.
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
142
Interface, 81
Interfaces
java.util.Collection, 112
java.util.Comparable, 110
java.util.Comparator, 110
java.util.Iterator, 114
java.util.List, 125
java.util.Map, 112
java.util.RandomAccess, 127
java.util.Set, 126
java.util.SortedMap, 123
java.util.SortedSet, 126
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