Vous êtes sur la page 1sur 116

Java - Syntaxe de base

Un Abrg
Eric Lefranois
25 mars 2002
Version 1.0
Java - Syntaxe de base - 1 -
Contenu
1 CONVENTIONS DCRITURE 1
2 INSTRUCTION DAFFECTATION 2
3 OPRATEURS ++ ET -- 3
4 OPRATEURS DAFFECTATION COMPOSE += -= *= 4
5 OPRATEURS DGALIT == 4
6 AUTRES OPRATEURS LOGIQUES 4
7 OPRATEURS ARITHMTIQUES 5
8 OPRATEURS DE MANIPULATION DE BITS 5
9 OPRATEUR IF ARITHMTIQUE : ?: 6
10 OPRATEUR INSTANCEOF 6
11 INSTRUCTION COMPOSITE : LE BLOC 6
12 LA RGLE DU POINT-VIRGULE 7
13 LINSTRUCTION IF 8
14 LA PSEUDO CLAUSE ELSE IF 9
15 LINSTRUCTION SWITCH 10
16 LES BOUCLES TANTQUE ET REPETER 11
17 LA BOUCLE FOR 11
18 CONTRLER L'EXCUTION D'UNE BOUCLE: BREAK ET CONTINUE 12
e-Quest Analyse - 2 -
19 LES TYPES DE DONNES: OBJETS ET PRIMITIFS 13
19.1 PRIMITIFS 13
19.2 OBJETS 14
20 CYCLE DE VIE DUN OBJET 16
21 LES TABLEAUX 17
21.1 DCLARATION D'UN TABLEAU 17
21.2 CRATION DYNAMIQUE DES OBJETS TABLEAU 18
21.3 ACCS AUX LMENTS D'UN TABLEAU 18
21.4 LA TAILLE D'UN TABLEAU 19
21.5 UN TABLEAU COMME ARGUMENT DE MTHODE 19
21.6 UN TABLEAU COMME TYPE DE RETOUR 19
21.7 TABLEAUX DIMENSIONS MULTIPLES 20
22 LES CHANES DE CARACTRES (STRING) 21
23 LES ARTICLES ( RECORDS ) 23
24 LE TYPE INTERVALLE 23
25 LE TYPE NUMR 24
26 CONVERSIONS DE TYPES 25
26.1 PRIMITIFS - PRIMITIFS 25
26.2 PRIMITIFS NUMRIQUES - STRINGS 26
26.3 CHAR - STRING 26
26.4 BOOLEAN - STRING 26
26.5 PRIMITIFS - OBJET 26
26.6 OBJET - OBJET 27
27 PROCDURES, FONCTIONS ET ENVOI DE MESSAGE 28
28 POUR SENVOYER UN MESSAGE: THIS 29
29 MTHODES DINSTANCE ET MTHODES DE CLASSE 29
30 DCLARATION DUNE MTHODE 31
30.1 DCLARATION DUNE FONCTION 31
30.2 DCLARATION DUNE PROCDURE 32
31 INVOQUER UNE FONCTION 32
32 INVOQUER UNE PROCDURE 33
e-Quest Analyse - 3 -
33 MCANISME DE PASSAGE DES PARAMTRES 34
33.1 POUR LES PRIMITIFS, IL SAGIT DUN PASSAGE PAR VALEUR (MODE IN ) 34
33.2 POUR LES OBJETS, IL SAGIT DUN PASSAGE PAR RFRENCE
(MODE IN OUT )35
34 IMBRICATION DES MTHODES 35
35 RCURSIVIT 36
36 SURCHARGE DES MTHODES 36
36.1 SURCHAGE DES OPRATEURS 37
36.2 LA SURCHARGE DES MTHODES EST UN VILAIN DFAUT 37
37 TRAITEMENT DES EXCEPTIONS 38
37.1 CLASSIFICATION DES EXCEPTIONS 39
37.2 PROPAGER UNE EXCEPTION 40
37.3 RCUPRER UNE EXCEPTION 41
37.4 DIFFRENCIER LES TYPES DEXCEPTIONS (CASCADE DE CATCH ) 41
37.5 LA CLAUSE FINALLY 42
37.6 CAS PARTICULIER : LES EXCEPTIONS DE TYPE RUNTIMEEXCEPTION 43
37.7 LEVER UNE EXCEPTION 43
37.8 CRER SON PROPRE TYPE DEXCEPTION 44
38 LES PAQUETAGES 44
38.1 DFINITION ET UTILISATION DUN PAQUETAGE 45
38.2 UTILISATION ET IMPORTATION DUN PAQUETAGE 45
38.3 LES HIRARCHIES DE PAQUETAGES 46
38.4 RELATIONS AVEC LE SYSTME DE GESTION DE FICHIERS 46
39 STRUCTURE DUNE APPLICATION JAVA 47
39.1 COMPOSITION DUN PAQUETAGE 47
39.2 COMPOSITION DUN FICHIER 47
39.3 AMORCE DE LAPPLICATION: LA CLASSE PRINCIPALE (main) 48
39.4 FONCTION main, PARAMTRES EN LIGNE DE COMMANDE 48
40 LOCALISATION DES CLASSES ET COMPILATION 49
40.1 COMPILATION DU PROGRAMME 49
40.2 EXCUTION DU PROGRAMME PAR LA MACHINE VIRTUELLE 50
40.3 LES FICHIERS DARCHIVES JAR 51
40.4 STRUCTURE DUNE CLASSE 51
e-Quest Analyse - 4 -
40.5 LES MODIFICATEURS DE CLASSE 53
40.6 EXTENDS : HRITAGE 54
40.7 IMPLEMENTS : IMPLMENTATION DINTERFACE 54
41 VISIBILIT DES ENTITS AU SEIN DUNE CLASSE 55
42 LES CONSTRUCTEURS 56
42.1 RLE DTAILL D'UN CONSTRUCTEUR 57
42.2 ENCHANEMENT DES CONSTRUCTEURS 57
42.3 LE CONSTRUCTEUR PAR DFAUT 59
42.4 LE CONSTRUCTEUR DE CLASSE 59
43 LES DESTRUCTEURS 60
44 VARIABLES DE CLASSES ET VARIABLES DINSTANCE 60
44.1 INITIALISATION D'UNE VARIABLE DE CLASSE 62
44.2 ACCDER AUX VARIABLES DE CLASSE ET AUX VARIABLES DINSTANCES 63
44.3 LE CONSTRUCTEUR DE CLASSE 63
45 DCLARER DES CONSTANTES SYMBOLIQUES : FINAL 64
46 PARTAGE DOBJETS, COPIE SUPERFICIELLE ET COPIE PROFONDE 64
46.1 RETOUR SUR LAFFECTATION 64
46.2 COPIE DOBJETS 65
46.3 LA MTHODE CLONE : COPIE SUPERFICIELLE 67
47 ANNEXE A - LES APPLETS 69
47.1 UN BREF APERU 69
47.2 LE CYCLE DE VIE DUNE APPLET 71
47.3 DESSINER DANS UNE APPLET, AJOUT DE COMPOSANTS GUI 74
47.4 LES THREADS ET LES APPLETS 77
47.5 LA SCURIT ET LE DROIT DES APPLETS 79
47.6 CE QUI EST INTERDIT AUX APPLETS 83
47.7 CE QUI EST PERMIS AUX APPLETS 84
47.8 COMMENT MANIPULER LES RESSOURCES WEB DANS UNE APPLET ? 85
47.9 LA BALISE <APPLET> ET LES PARAMTRES 88
47.10 POINTS DIVERS 91
48 ANNEXE B - LISTE DES OPRATEURS AVEC PRIORIT 94
49 ANNEXE C CRATION DARCHIVES JAR 96
e-Quest Analyse - 5 -
49.1 QUELQUES CONSIDRATIONS SUR LE TEMPS DE CHARGEMENT DES APPLETS96
49.2 COMPRESSER ET AGGLOMRER LES FICHIERS TLCHARGER 97
49.3 LE FORMAT JAR 97
49.4 COMMENT UTILISER UN JAR DANS UNE APPLET ? 97
49.5 SYNTAXE DE LA COMMANDE JAR 98
49.6 LES JAR EXCUTABLES 100
49.7 SIGNATURE DUN FICHIER DARCHIVE 100
50 ANNEXE D - LES PRINCIPAUX PAQUETAGES 102
e-Quest Analyse - 6 -
ELS - 16 avril 2002 23:14
Java - Un abrg - 1 - Conventions dcriture
En prliminaire
Tous les points qui sappliquent C ++ comportent la mention C ++ .
Les points qui sappliquent Java comportent la mention Java .
On trouvera dans cet abrg lessentiel de la syntaxe de base du langage Java. Ne sont
pas traits :
Hritage et polymorphisme,
Objets actifs (concurrence),
Concept dinterface,
Applets,
Librairies du JDK
1 Conventions dcriture
Java On utilise plutt des minuscules
Les noms commencent par des minuscules, sauf :
identificateurs de classe : Fr ame, But t on, St r i ng, ..
constantes symboliques : st at i c f i nal doubl e PI = 3. 14 ;
Noms composs : getBack, taxMan, comeTogether, ..
Les chanes de caractres doivent tre crites sur une seule ligne
Syst em. out . pr i nt l n ( " Cou
Cou" ) ; / / Ref us ! !
Concatnation de textes: symbole +
Syst em. out . pr i nt l n ( " Cou" +
" Cou") ; / / OK
i nt age = 20;
Syst em. out . pr i nt l n ( " J ' ai " + 20 + " ans" ) ;
Les caractres sont cods sur 16 bits !
Il sagit du jeux de caractres UNICODE qui comprend la plupart des alphabets
du monde. Ainsi, il est possible dcrire les identificateurs avec des lettres
accentues : ouvr i r Fent r e, commencer LaFt e, ..
Ne pas crire le nom des classes avec des accents. Chaque classe correspondra un
fichier (un fois le programme compil), et les systmes dexploitation actuels ne reconnaissent
pas forcment les accents dans les noms de fichiers.
Java - Un abrg - 2 - Instruction daffectation
ELS - 16 avril 2002 23:14
Commentaires
// comment ai r e cour t se t er mi nant l a f i n de l a l i gne
/*
Comment ai r e l ong.
I mbr i cat i on non possi bl e.
A n ut i l i ser que pour masquer des par t i es de pr ogr amme
( debuggi ng) , ou pour l ent t e.
*/
Un commentaire long peut tre utilis aussi pour des commentaires trs trs
courts au milieu dune instruction !
Syst em/* blabla*/ . out . pr i nt l n ( bl a bl a) ;
2 Instruction daffectation
C ++
Java
Exemple:
ada a : = b : = c : = 3 ; I NCORRECT
j ava a = b = c =3 ; CORRECT
En Java, loprateur daffectation a une associativit de type R (voir [Annexe
A]) : cet oprateur sexcute donc de la droite (Right) vers la gauche.
a = 3
Oprateur d'affectation
1) donne une nouvelle valeur la variable,
2) retourne la valeur affecte
a = b = c = 3 ;
a = b = 3 ;
a = 3 ;
S'excute en premier
1) "c" vaut 3
2) retourne 3
Retourne encore "3", mais cette fois-ci, cette valeur
n'est plus utilise.
ELS - 16 avril 2002 23:14
Java - Un abrg - 3 - Oprateurs ++ et --
3 Oprateurs ++ et --
C ++
Java
A lvaluation de ces oprateurs, deux actions sont ralises :
1/ ils modifient la valeur de la variable,
2/ ils retournent une valeur
Exemples :
a = 1 ;
b = a++ ;
c = ++a ;
c = a++ + ++a + b + c;
Que vaut a ? 5
Que vaut c ? 12
Pour dterminer les nouvelles valeurs de a et de c, il nous faut connatre
les rgles de priorit des oprateurs (voir [Annexe A]):
++a
a++
Augmente a de 1
- - a
a- -
Diminue a de 1
++a
- - a
retournent la nouvelle valeur de a
a++
a- -
retournent lancienne valeur de a
(avant lopration)
Oprateur Priorit Java
(le 1 est le plus prioritaire)
++ 1R
/ 3L
+ 4L
Java - Un abrg - 4 - Oprateurs daffectation compose += -= *=
ELS - 16 avril 2002 23:14
4 Oprateurs daffectation compose += -= *=

C ++
Java Exemples
a *= 2 a = a * 2
a += 4 a = a + 4
Forme gnrale
a op= b a = a op b
o op peut valoir + - * / % etc..
Ces oprateurs retournent la nouvelle valeur de la variable affecte.
5 Oprateurs dgalit ==
C ++
Java Exemple : i f ( x==0) . .
Cet oprateur retourne un boulen : t r ue ou f al se .
Notons qu la diffrence de Java, le type boolen nexiste pas en C++
En C++, loprateur dgalit retourne 0 ( f al se ) ou 1 ( t r ue ).
6 Autres oprateurs logiques
C ++
Java Tous les oprateurs qui suivant retournent le boulen t r ue ou f al se :
Exemple Equivalent
Ada
! = diffrent i f ( x != 0) . . / =
&& ET logique i f ( a>b && b>c) and t hen
ELS - 16 avril 2002 23:14
Java - Un abrg - 5 - Oprateurs arithmtiques
Java
7 Oprateurs arithmtiques
C ++
Java
Java
L'oprateur + est utilis pour concatner les chanes de caractres. Additionner un
nombre avec une chane vide est une astuce qui permet trs facilement de convertir un
nombre en chane de caractres.
8 Oprateurs de manipulation de bits
Java Ca existe pour les curieux, voir le manuel java p. 138
OU logique i f ( a<10 a>20) . . or el se
& ET i f ( a>b & b>c) and
>
<
>=
<=
comparaison i f ( x >= 3) >
<
>=
<=
OU i f ( a<10 a>20) . . or
! ngation i f ( !(x==0) ) . . not
Exemple Rsultat Equivalent
Ada
+ addition 3 + 5 8 +
- Soustraction 5 - 3 2 -
* Multiplication 5 * 3 15 *
/ Division 5 / 3
5. 0 / 3. 0
1
1. 66666
/
% Modulo
(reste de la
division entire)
5 %3 2 mod, r em
+ concatnation " Hel l o" + "
Mar t i n"
123 + " "
" Hel l o Mar -
t i n"
" 123"
&
Java - Un abrg - 6 - Oprateur if arithmtique: ?:
ELS - 16 avril 2002 23:14
9 Oprateur if arithmtique : ?:
C ++
Java Cet oprateur permet dviter une instruction i f dans certains cas..
Exemple : une fonction qui retourne le maximum de deux entiers
publ i c i nt max ( i nt a, i nt b) {
i f ( a>b) {
r et ur n a;
}
el se {
r et ur n b;
}
}
donnera avec un if arithmtique
publ i c i nt max ( i nt a, i nt b) {
r et ur n a > b ? a : b;
}
Syntaxe : test ? valeurRetourneSiVrai : valeurRetourneSiFaux
10 Oprateur instanceof
Java Cet oprateur permet de contrler le type dun objet.
Exemple : i f ( unObj et instanceof X)
Cet oprateur retourne le boolen t r ue si lobjet unObj et est de type X.
En loccurrence, il retournera t r ue dans les cas suivants :
1/ si unObj et est une instance de X (cr par new X( ) )
2/ si unObj et est une instance dune sous-classe de X (hritage)
3/ si unObj et est une instance dune classe qui implmente X, au cas o X
est une interface
11 Instruction composite : le bloc
C ++
Java Ce mcanisme permet de fabriquer une instruction partir dune squence dinstruc-
tions, au moyen dune paire daccolades.
ELS - 16 avril 2002 23:14
Java - Un abrg - 7 - La rgle du point-virgule
Par exemple, une procdure est constitue dune en-tte et dun bloc :
publ i c voi d af f i cher X( ) {
Syst em. out . pr i nt l n ( x) ;
}
Syntaxe dune procdure : en-tte uneInstruction
Autre exemple: un bloc pour crire des i f qui contiennent plusieurs instructions.
Exemple
i f ( x > 3) x=3;
I dentique
i f ( x > 3) {
x = 3;
autres instructions possibles..
}
Syntaxe du i f : i f ( test) uneInstruction
12 La rgle du point-virgule
C ++
Java Le point-virgule doit obligatoirement terminer chacune des instructions.
Une exception.. il nest pas ncessaire de terminer les blocs par un point-virgule
(laccolade suffit !)
{
i nst r uct i on ;
i nst r uct i on ;
;
i nst r uct i on ;
}
Ceci constitue une seule instruction
Java - Un abrg - 8 - Linstruction if
ELS - 16 avril 2002 23:14
13 Linstruction if
C ++
Java Premire forme
if (t est ) uneInstruction
Deuxime forme
if (t est )
uneI nst r uct i on
else
uneAut r eI nst r uct i on
le test doit tre crit dans une paire de parenthses
il est fortement recommand dutiliser des blocs {. . } pour crire les ins-
tructions du i f , mme si les blocs ne contiennent quune seule instruction
Java Le test doit retourner un boolen : cest vrifi par le compilateur
Note C++ En C++, le type boolen nexiste pas !
Ce qui est gal 0 est considr comme faux, tout entier diffrent de 0 est considr
comme vrai ..
Exemple no1 Exemple no2
i nt x, y1, y2 ;
x=1 ;
i f ( x==0)
y1 = x;
y2 = x;
x = y2;
que vaut x ? rponse : 1
i nt x, y1, y2 ;
x=1 ;
i f ( x==0) {
y1 = x;
y2 = x;
}
x = y2;
que vaut x ? rponse : 0
ELS - 16 avril 2002 23:14
Java - Un abrg - 9 - La pseudo clause else if
Ainsi, excutez (dans votre tte) le programme C++ suivant.. que vaut x pour finir ?
i nt x = 3 ;
i f ( x=4) x++ ;
x ? rponse : 5
Essayez en Java, ce code sera refus par le compilateur !
14 La pseudo clause else if
C ++
Java La clause el si f nexiste pas, ni en C++, ni en Java.
Mais il est possible de simuler cette clause..
En effet, la syntaxe de linstruction i f permet dcrire la chose suivante :
if ( x==0) {
act i on1 ;
}
else if ( x==1) {
act i on2;
}
else if ( x==3) {
act i on3;
}
else {
act i on4;
}
Voici le mme programme crit avec une autre indentation :
if ( x==0) {
act i on1 ;
}
else if ( x==1) {
act i on2;
}
else if ( x==3) {
act i on3;
}
else {
act i on4;
}
Java - Un abrg - 10 - Linstruction switch
ELS - 16 avril 2002 23:14
15 Linstruction switch
C ++
Java Supposons linstruction suivante en Ada..
case x i s
when 1. . 2 => y : = 1;
when 4, 6 => y : = 2;
when 5 => y : = 3;
when ot her s => y : = 4;
end case;
La mme chose en Java, C++
Les instructions du switch sont excutes en squence. Comme pour une autoroute, il y
a plusieurs entres possibles, et plusieurs sorties possibles.. Pour les adaistes, attention
ne pas louper la sortie !
switch ( x) {
case 1 :
case 2 : y = 1 ;
break ;
case 4 :
case 6 : y = 2 ;
break ;
case 5 : y = 3 ;
break ;
default : y = 4 ;
}
autoroute
entres sorties
un entier ou
un caractre
ELS - 16 avril 2002 23:14
Java - Un abrg - 11 - Les boucles TANTQUE et REPETER
16 Les boucles TANTQUE et REPETER
C ++
Java
Un exemple
Voir le point suivant ([Boucle f or ]).
17 La boucle for
C ++
Java La boucle f or est un whi l e dguis..
Syntaxe
for ( initialisation ; condition_ditration ; enchanement)
uneI nst r uct i on
TANTQUE Test FAI RE
I nst r uct i ons
FI N_TANTQUE
while(t est )
uneI nst r uct i on;
ou (avec un bloc)
while(t est ) {
i nst r uct i on 1;
i nst r uct i on 2;
. .
}
REPETER
I nst r uct i ons
TANTQUE Test
do
uneI nst r uct i on;
while (t est );
ou (avec un bloc)
do{
i nst r uct i on 1;
i nst r uct i on 2;
. .
}
while(t est );
Test
Instructions
Non
Oui
Test
Instructions
Non
Oui
Java - Un abrg - 12 - Contrler l'excution d'une boucle: break et continue
ELS - 16 avril 2002 23:14
quivalent
initialisation ;
while(condition_ditration) {
uneInstruction;
enchanement ;
}
Exemple : afficher lalphabet lenvers
for (char c = Z ; c >= A ; c- - ) {
Syst em. out . pr i nt ( c) ;
}
Mme chose avec un whi l e
char c = ' Z' ;
while (c >= ' A' ) {
Syst em. out . pr i nt ( c) ;
c- - ;
}
Encore une dernire fois avec do
char c = ' Z' ;
do {
Syst em. out . pr i nt ( c) ;
c- - ;
}
while (c >= ' A' );
Java A la diffrence de C++, - et de manire identique Ada -, si la boucle f or contient
dans sa partie dinitialisation une dclaration de variable, il sagit dune dclaration
locale la boucle : la variable nexiste plus aprs excution de la boucle, sa porte est
limite la boucle.
18 Contrler l'excution d'une boucle: break et continue
C ++
Java Linstruction break termine une instruction itrative (lquivalent du exi t de
Ada):
whi l e ( t r ue) {
. .
. .
i f ( x > 0) break ;
. .
}
ELS - 16 avril 2002 23:14
Java - Un abrg - 13 - Les types de donnes: objets et primitifs
Linstruction continue termine litration en cours, mais la boucle continue de
sexcuter avec litration suivante.
whi l e ( ! l i st eCar act er es. f i nLi st e( ) ) {
ch = l i st e. next El ement ( ) ;
i f ( ch ! = ) continue; / / i gnor er
/ / l e car act r e
. . ;
}
19 Les types de donnes: objets et primitifs
Java Java distingue deux types de donnes:
19.1 PRIMITIFS
Le nom commence par une minuscule.
entiers
i nt (32 bits), l ong (64 bits), shor t (16 bits) et byt e(8 bits).
Par dfaut: i nt
1
rels
f l oat et doubl e (double prcision, x chiffres significatifs)
Par dfaut: doubl e
2
caractres
char (16 bits, selon le code UNICODE, qui comprend au dpart le code
ASCII)
boolens
bool ean (8 bits)
1. Si on crit 3, ce 3 est considr comme une entit de type i nt .
2. Si on crit 3. 0, ce 3. 0 est considr comme une entit de type doubl e.
Java - Un abrg - 14 - Les types de donnes: objets et primitifs
ELS - 16 avril 2002 23:14
19.2 OBJETS
Instances de classes dont le nom commence par une majuscule.
t abl eaux
St r i ng
Fr ame
But t on
etc..
19.2.1 Manipulation par valeur, manipulation par rfrence
Les primitifs sont manipuls par valeur, et les objets par rfrence (pointeurs) !
Exemple
i nt x = 3;
i nt y;
y = x;
y = 4;
Que vaut x ? .. toujours 3 !
Les primitifs sont en effet manipuls par valeur. Laffectation dun primitif opre une
copie de valeur : laffectation y=x copie la valeur de x dans y.
Le mme exemple avec des objets..
But t on b2 = new But t on ( " OK" ) ;
But t on b1; / / Dclaration dune variable
b1 = b2; / / Affectation de la variable
b1. set Label ( " Cancel " ) ;
Quel est le label du bouton b2 ? "Cancel ". En modifiant b1, b2 a t modifi par
la mme occasion..
POURQUOI ?
Au contraire des primitifs, les objets sont manipuls par rfrence: les objets sont
toujours crs dynamiquement, et les variables qui les dsignent ne sont que des poin-
teurs sur les objets.
Lorsque l'on dclare une variable de type objet, la variable est initialise avec la
valeur null (pointeur qui pointe sur rien du tout);
ELS - 16 avril 2002 23:14
Java - Un abrg - 15 - Les types de donnes: objets et primitifs
Button b1 ;
Le programmeur a l'obligation de crer lui-mme l'objet au moyen de l'opra-
teur new;
But t on b2 = new But t on ( "OK" ) ; / / Dclaration + cration
ou
But t on b2; // Dclaration
b2 = new But t on( " OK" ) ; // Cration
Le mme objet peut tre point par plusieurs variables, et peut tre manipul au
travers de l'une ou l'autre des variables.
b1 = b2;
Au contraire des primitifs, laffectation opre un partage dobjets plutt
quune copie de valeur.
Comment oprer une copie dobjets ? voir le point 46, page64
Le programmeur n'a pas besoin de dtruire l'objet: il sera dtruit automatique-
b1
" OK"
objet
b2
b1
" OK"
objet
b2
Java - Un abrg - 16 - Cycle de vie dun objet
ELS - 16 avril 2002 23:14
ment par le garbage collector de la machine virtuelle ds lors que cet objet
ne sera plus point par une variable quelconque.
Exemple
publ i c voi d p( ) { // Une procdure..
But t on b = new But t on( " OK" ) ; // Variable locale
la procdure
:
:
} Fin d'excution de la procdure
La variable locale b est dtruite
L'objet sera dtruit par le garbage collecteur (ramasse-miettes)
19.2.2 Valeur d'initialisation
Contrairement aux langages Ada ou C++, les primitifs et les objets reoivent une valeur
d'initialisation:
Les primitifs sont initialiss avec la valeur 0
entiers 0
rels 0. 0
boolens f al se
caractres caractre nul (dont le code UNICODE vaut 0)
Les variables de type objet sont des pointeurs initialiss avec la valeur null
20 Cycle de vie dun objet
Considrons par exemple linstruction: unObj et = new Xxx( ) ;
La cration de lobjet unObj et comprend 3 tapes :
1/ allocation d'une zone mmoire
Afin de contenir les variables d'instance de l'objet. Ces variables d'instances
sont initialises avec leurs valeurs par dfaut ou par la valeur d'initialisation
spcifie par le programmeur lors de la dclaration de la variable.
Par exemple :
i nt i ; / / "i" est initialise 0 (par dfaut)
i nt j = 3 ; / / "j" est initialise avec 3
ELS - 16 avril 2002 23:14
Java - Un abrg - 17 - Les tableaux
2/ invocation du constructeur (Xxx())
Lors de cette opration, de nouvelles valeurs peuvent tre affectes aux va-
riables d'instance et aux variables de classe. Voir aussi le point [Les construc-
teurs].
3/ retour de la rfrence
Loprateur new retourne pour finir la rfrence lobjet, qui sera affecte
dans notre cas la variable unObj et .
La destruction de lobjet est opre par le ramasse-miettes (garbage collector). Cette
opration est susceptible darriver ds linstant o lobjet nest plus rfrenc par
aucune variable.
Avant mme de dtruire lobjet, le garbage collector envoie le message finalize()
cet objet, lui donnant ainsi loccasion daccomplir ses dernires volonts. Lutilisa-
tion de finalize(), qui joue le mme rle que le destructeur de C++, est effectue
trs rarement en Java, du fait de lexistence mme du garbage collector.
Le programmeur peut la redfinir ainsi :
publ i c voi d finalize ( ) {
. . . / * dernires volonts . . */
}
Voir aussi le point [Les destructeurs].
21 Les tableaux
C ++
Java Les tableaux de Java sont avant toute chose des objets. A ce titre, ils jouissent des par-
ticularits propres aux objets:
ils sont manipuls par rfrence,
ils sont allous dynamiquement au moyen de l'oprateur new,
ils sont rcuprs automatiquement par le ramasse-miettes (le garbage
collector ) quand ils ne sont plus rfrencs,
ils hritent de la classe Obj ect .
Toutefois, la diffrence des vrais objets, il nexiste pas de classe correspondante
(la classe Ar r ay nexiste pas !).
21.1 DCLARATION D'UN TABLEAU
i nt t abEnt i er s[]; / / en utilisant la syntaxe de C/C++
/ / ou,
i nt [] t abEnt i er s; / / en utilisant une syntaxe propre Java
Java - Un abrg - 18 - Les tableaux
ELS - 16 avril 2002 23:14
i nt [][] deuxDi mensi ons; // tableau deux dimensions
i nt t r oi sDi mensi ons [][][]; // tableau trois dimensions
Les 3 tableaux dclars ci-dessus sont de simples rfrences initialises null. Les
tableaux eux-mmes (des objets) ne sont pas encore crs. C'est au moment de leur
allocation dynamique que l'on pourra spcifier leur taille.
21.2 CRATION DYNAMIQUE DES OBJETS TABLEAU
La cration d'un objet de type tableau peut tre ralise de deux manires:
Avec l'oprateur new, en indiquant le nombre de cases du tableau
i nt [ ] t abEnt i er s; // Dclaration
t abEnt i er s = new i nt [ 4] ; // Cration: 4 entiers
// initialiss 0
/ / OU,
i nt [ ] t abEnt i er s = new i nt [ 4] ; // en une seule
// instruction..

Les lments d'un tableau reoivent une valeur initiale qui correspond la
valeur par dfaut du type des lments du tableau : (0 pour un tableau
d'entiers, null pour des objets ou des tableaux, ..
Au moyen d'un initialiseur .
i nt x = 4 ;
i nt [ ] t abEnt i er s = {1, x, 2*x, 4};
// Tableau de 4 entiers, initialiss 1, 4, 8 et 4
L'initialiseur doit tre utilis au moment de la dclaration. Il est interdit dans le
cadre d'une affectation. L'instruction ci-aprs est illgale.
i nt [ ] t ab ;
t ab = {1, 2} ; // Illgal !!
21.3 ACCS AUX LMENTS D'UN TABLEAU
Les tableaux sont indexs par des valeurs de type i nt , en commenant 0. Des
indices de type l ong ne sont pas autoriss. La taille des tableaux est donc limite
32 bits !
t abEnt i er s [ 3] = 4;
Syst em. out . pr i nt l n ( t abEnt i er s [ 0] ) ;
ELS - 16 avril 2002 23:14
Java - Un abrg - 19 - Les tableaux
A l'excution, si l'indice sort des limites du tableau, le noyau Java lve l'exception :
Ar r ayI ndexOut Of BoundsExcept i on.
21.4 LA TAILLE D'UN TABLEAU
Les tableaux sont des objets, et ils disposent d'un attribut (un seul) qui caractrise leur
taille : l'attribut length.
Voici un fragment de programme qui initialise tous les lments du tableau t ab avec la
valeur 2 :
f or ( i nt cpt = 0 ; cpt < tab.length ; cpt ++) {
t ab [ cpt ] = 2 ;
}
Attention ! rappelons que l'indice d'un tableau commence par 0.
Ainsi, l'instruction t ab[ t ab. l engt h] =3; lvera l'exception Ar r ayI n-
dex- Out Of BoundsExcept i on
La taille d'un tableau est statique
1
: le nombre des lments ne peut pas tre aug-
ment ni diminu dynamiquement, au grs des besoins.
21.5 UN TABLEAU COMME ARGUMENT DE MTHODE
Un paramtre formel de type tableau sera spcifi en utilisant la mme syntaxe que
pour la dclaration d'un tableau :
void unePr ocdur e ( int [] t abEnt i er s) {
/ / Cet t e pr ocdur e di mi nue de 1 t ous l es l ment s
/ / du t abl eau
for( int cpt =0; cpt < t abEnt i er s. l engt h ; cpt ++) {
tabEntiers [cpt] --;
}
}
21.6 UN TABLEAU COMME TYPE DE RETOUR
Une fonction peut retourner un tableau. Voici par exemple l'entte d'une telle fonction :
int [] uneFonct i on ( ) {
/ / Fonct i on r et our nant un t abl eau d' ent i er s
:
1. La classe Vect or du paquetage j ava. ut i l met en uvre des listes dynamiques et
permet ainsi de manipuler des tableaux de taille variable
Java - Un abrg - 20 - Les tableaux
ELS - 16 avril 2002 23:14
r et ur n unTabl eauDEnt i er s ;
}
21.7 TABLEAUX DIMENSIONS MULTIPLES
Les initialiseurs de tableaux peuvent tre imbriqus :
int [][] deuxDi mensi ons = { {1, 2}, {3, 4}, {5, 6} } ;
quivalent :
int [][] deuxDi mensi ons = new int [3][2] ;
deuxDi mensi ons [ 0] [ 0] = 1 ;
deuxDi mensi ons [ 0] [ 1] = 2 ;
deuxDi mensi ons [ 1] [ 0] = 3 ;
. . .
deuxDi mensi ons [ 2] [ 1] = 6 ;
La cration d'un tableau dimensions multiples peut tre opre en une tape
int [][] t ab = new i nt [2][3] ;
ou en plusieurs tapes :
i nt [ ] [ ] t ab = new i nt [ 2] [ ] ;
// Cration d'un tableau de deux lments dont le type
// est "int []", initialiss "null" pour l'instant
tab
0 0
0 0
0
0
tab
ELS - 16 avril 2002 23:14
Java - Un abrg - 21 - Les chanes de caractres (String)
t ab[ 0] = new i nt [ 3] ;
t ab[ 1] = new i nt [ 4] ;
// On remarque dans cet exemple que ce tableau deux
// dimensions n'est pas une matrice carre ! !
t ab [ 0] [ 2] = 120 ;
// Accs un lment du tableau deux dimensions
// Le raccourcit "tab [0, 2]" la "pascal" n'est pas
// prvu dans Java.
22 Les chanes de caractres (String)
En Java, les chanes de caractres ne sont pas des tableaux de caractres !
En Java, on sait simplement que les chanes sont des objets, des instances de la classe
j ava. l ang. St r i ng .
En tant que chanes, ces objets jouissent toutefois de deux particularits :
Il est possible de les crer au moyen d'un initialiseur (texte crit entre guille-
mets), sans passer par l'oprateur new.
St r i ng t xt = " Sal ut " ;
Java dfinit un oprateur de concatnation: l'oprateur +
Syst em. out . pr i nt l n ( " 2 + 3 = " + ( 2+3) + " ! ") ;
Dans une expression qui comprend l'addition de plusieurs oprandes, il suffit que
l'un d'entre eux soit de type St r i ng, pour que les autres oprandes soient automati-
quement convertis en St r i ng (si cette conversion est possible).
tab
0 0 0
0 0 0 0
tab
0 0 120
0 0 0 0
Java - Un abrg - 22 - Les chanes de caractres (String)
ELS - 16 avril 2002 23:14
Voici quelque mthodes proposes par la classe St r i ng:
Soit la chane s : St r i ng s = " Sal ut " ;
s. length( )
Retourne le nombre de caractres de s
s. charAt( 1)
Retourne a, le caractre de rang 1. Le rang d'un caractre va de 0
(s. l engt h( ) - 1)
s. equals( uneAutreChane)
Retourne t r ue si les deux chanes ont la mme valeur
s. compareTo( uneAutreChane)
Retourne -1 (si plus petite que..), 0 ou 1
s. indexOf ( uneSousChane, depuisUnIndex)
Retourne la position de la sous-chane
s. concat ( uneAutreChane)
Retourne une chane rsultant de la concatnation avec une autre chane
s. trim ( )
Retourne une chane sans les espaces de dbut et de fin
s. toUpperCase ( )
Retourne une chane transforme en majuscules
Pour comparer le contenu de deux chanes de caractres, utiliser la fonction
equals : i f ( s1. equals( s2) )
Une simple comparaison ne marchera pas : i f ( s1==s2) . . (comparaison de
pointeurs !!)
Une chane de caractres est un objet non mutable : son contenu est dfini une
fois pour toutes par linitialiseur.
ELS - 16 avril 2002 23:14
Java - Un abrg - 23 - Les articles (records)
23 Les articles ( records )
C++
Java Un article sera dfini au moyen dune classe.
Fondamentalement, une classe est un type article amlior, offrant en plus la possibi-
lit de rassembler la dfinition de la structure de donnes avec les mthodes de manipu-
lation de la dite structure.
Comme exemple, considrons la dfinition dun nombre complexe.
En Ada
En Java
En C++
24 Le type intervalle
Java Dsol, mais les types dfinis par le programmeur sont limits aux tableaux et aux clas-
ses. Le type Intervalle nexiste pas non plus en C++.
En consquence de quoi, si on tient absolument au type intervalle, il est toujours possi-
ble de crer une classe correspondante.
record TCompl exe is
r e: f l oat ;
i m: f l oat ;
end r ecor d;
c : TCompl exe ;
begi n
c. r e : = 3. 5 ;
et c. .
class Compl exe {
publ i c doubl e r e;
publ i c doubl e i m;
}
Compl exe c ;
c. r e = 3. 5 ;
et c. .
class Compl exe {
publ i c :
doubl e r e;
doubl e i m;
}
ou
struct Compl exe {
doubl e r e, i m;
}
Compl exe c ;
c. r e = 3. 5 ;
et c. .
Java - Un abrg - 24 - Le type numr
ELS - 16 avril 2002 23:14
Par exemple, pour un intervalle dentiers, on peut dclarer la classe suivante:
class MonI nt er val l e {
private i nt mi n = 100 ;
private i nt max = 200 ;
private i nt val eur ;
public void set Val eur ( i nt val ) {
i f ( val < mi n val > max)
throw new RunTi meExcept i on( ) ;
val eur = val ;
}
et c. .
}
Mais, videmment, cest lourdingue..
25 Le type numr
Java Dsol, mais les types dfinis par le programmeur sont limits aux tableaux et aux clas-
ses.
Pourtant, C++ connat les types numrs.. Ici, Java est victime de sa volont de sim-
plification.
Comment simuler un type numr en Java ?
en utilisant les concepts de classe et de COPIER-COLLER, et en remarquant que la
dclaration dun type numr revient dclarer un ensemble de constantes globales.
Dans lexemple qui suit, le mot-cl final indique quil sagit de constantes (voir le
point 45, page64) et le mot-cl static indique quil sagit de variables de classe
(voir le point 44, page60).
cl ass Semai ne {
publ i c static final Samedi = 0;
publ i c static final Di manche = 1;
publ i c static final Lundi = 2;
et c. .
}
Utilisation
i nt j our = Semai ne. Samedi ;
j our += 1 ; / / j our == Di manche ;
i f ( j our >= Semai ne. Lundi && j our <= Semai ne. Vendr edi )
{
/ / Si c est un j our de semai ne. .
ELS - 16 avril 2002 23:14
Java - Un abrg - 25 - Conversions de types
. . .
}
Mais, videmment, cest lourdingue..
26 Conversions de types
26.1 PRIMITIFS PRIMITIFS
Toutes les conversions sont autorises, sauf celles qui font intervenir le type bool ean.
Les conversions qui entranent un rtrcissement comme par exemple :
une perte de prcision: rel entier
une rduction du nombre de bits: i nt (32 bits) shor t (16 bits), etc..
rclament obligatoirement une coercition de type: (t ype). La coercition de type
est une espce davertissement au programmeur : elle nempchera pas le programme
de planter l'excution le cas chant, voir ci-aprs.
Les conversions sans risque, celles qui n'entranent pas de rtrcissement, sont opres
automatiquement.
entier entier
i nt i = s; // Avec "s" de type short
// c pas de rtrcissement
shor t s = (short) i ; // Rduction du nombre de bits !
// Plante lexcution si "i" utilise plus de 16 bits
et c. .
rel entier
doubl e d = i ; // Avec "i" de type entier pas de rtrcissement
i nt i = (int)d; // Rtrcissement avec troncation des chiffres
// aprs la virgule
int (32 bits) char (16 bits unicode)
i nt i = ' A' ; // Unicode de 'A' (65) affect "i"
Java - Un abrg - 26 - Conversions de types
ELS - 16 avril 2002 23:14
char c = (char)65; // Valeur 'A' affecte "i"
// Coercition obligatoire car rduction
// du nombre de bits !
etc..
26.2 PRIMITIFS NUMRIQUES STRINGS
Strings
St r i ng s = unNumrique + " " ; Concatnation avec un texte vide
ou: St r i ng s = St r i ng. val ueOf ( unNumrique) ;
Numriques
i nt i = ( new I nt eger ( unString) ) . i nt Val ue( ) ;
doubl e d = ( new Doubl e( unString) ) . doubl eVal ue( ) ;
f l oat f = ( new Fl oat ( unString) ) . f l oat Val ue( ) ;
et c. .
26.3 CHAR STRING
St r i ng s = new St r i ng ( c) ; / / avec " c" de t ype char
char c = s. char At ( i ndi ce) ; / / avec " s" de t ype St r i ng
26.4BOOLEAN STRING
bool ean b = Bool ean. get Bool ean ( unSt r i ng) ;
St r i ng s = St r i ng. val ueOf ( unBool en) ;
26.5 PRIMITIFS OBJET
Cette conversion utilise les classes "wrappers" spcifiques, qui permettent d'encapsuler
le primitif correspondant.
primitif classe wrapper correspondante
int Integer
double Double
char Character
ELS - 16 avril 2002 23:14
Java - Un abrg - 27 - Conversions de types
Primitif Wrapper
I nt eger i i = new Integer ( i ) ; // avec i de type int
Doubl e dd = new Doubl e ( d) ; // avec d de type double
etc..
Wrapper Primitif
i nt i = i i . i nt Val ue( ) ; // avec ii de type Integer
doubl e d = dd. doubl eVal ue( ) ; // avec dd de type Double
etc..
26.6OBJET OBJET
La conversion Objet Objet nexiste pas au niveau du langage. Si le programmeur
prouve le besoin doprer de telles conversions, cest lui de les implmenter ! Ce
cas n'arrive de toute manire que trs rarement et le mode de conversion dpend tou-
jours du problme et des types dobjets convertir l'un vers l'autre.
Lors d'une affectation, le compilateur peut exiger du programmeur qu'il opre explici-
tement une coercition de type !
Par exemple:
soit a une variable dsignant un objet de type A (type de dclaration )
soit b une variable dsignant un objet de type B (type de dclaration )
L'affectation a = b sera accepte par le compilateur si tous les messages du type
A, susceptibles d'tre envoys a, sont prvus galement au niveau du type B.
Autrement dit, cette affectation sera accepte :
si le type B est identique au type A,
si le type B est une sous-classe de A (hritage)
boolean Boolean
byte Byte
short Short
long Long
Java - Un abrg - 28 - Procdures, fonctions et envoi de message
ELS - 16 avril 2002 23:14
ou encore si le type B implmente A (si A est une interface)
Au contraire, si B est une super-classe de A (hritage), l'affectation sera accepte si le
programmeur crit une coercition de type:
a = (A)b;
Toutefois, cette affectation ne passera l'excution (sans lever d'exception) que si le
type courant de l'objet b est de type A ou d'un type driv de A par hritage.
27 Procdures, fonctions et envoi de message
C ++
Java Les procdures et fonctions sont des regroupements dinstructions sous le mme nom.
En POO, les fonctions et procdures sont regroupes sous un seul terme : on parle de
mthodes.
Pour excuter les instructions dune mthode, il nous faut invoquer cette dernire en
envoyant le message correspondant lobjet sur lequel opre la mthode:
obj et . message( par amt r es)
A
B
B
A
C D
type dclar de b
type courant de b
ELS - 16 avril 2002 23:14
Java - Un abrg - 29 - Pour senvoyer un message: this
Pour envoyer un message, il faut :
1/ crire le nom de lobjet,
2/ crire un point,
3/ crire le nom de la mthode, en crivant les paramtres entre parenthses.
En C++ comme en Java, les parenthses sont obligatoires, mme sil ny a pas de para-
mtre crire.
Exemples
unRect angl e. get Lar geur () ;
unePi l e. vi der ()
28 Pour senvoyer un message: this
Si on omet dcrire le nom de lobjet, cela signifie que le mot t hi s est sous-
entendu : le message est envoy lui-mme (un message est toujours envoy par
un objet un objet).
Exemple:
vi der ( ) ;
quivalent :
this. vi der ( ) ;
29 Mthodes dinstance et mthodes de classe
Java Dans la majorit des cas, les messages sont envoys des objets (des instances de
classes).
Certains messages seront toutefois envoys la classe elle-mme directement.
Ces dernires mthodes sont appeles mthodes de classe, les autres tant dsignes
par le terme mthodes dinstance. La dclaration d'une mthode de classe comporte le
mot-cl static.
Un premier exemple : la fonction main dans un programme avec 2 classes
cl ass Y {
publ i c voi d yP1( ) {
Java - Un abrg - 30 - Mthodes dinstance et mthodes de classe
ELS - 16 avril 2002 23:14
Syst em. out . pr i nt l n( " yP1: j e sui s une met hode d' i nst ance " ) ;
yP2( ) ; / / Cor r ect
}
publ i c static voi d yP2( ) {
Syst em. out . pr i nt l n( " yP2: j e sui s une met hode de cl asse" ) ;
yP1( ) ; / / REFUSE ! (voir ci-aprs)
}
}
publ i c cl ass X {
publ i c voi d xP1( ) {
Syst em. out . pr i nt l n( " xP1: j e sui s une met hode d' i nst ance " ) ;
xP2( ) ; / / Cor r ect
}
publ i c static voi d xP2 ( ) {
Syst em. out . pr i nt l n( " xP2: j e sui s une met hode de cl asse" ) ;
xP1( ) ; / / REFUSE !(voir ci-aprs)
}
publ i c static voi d mai n ( St r i ng [ ] ar g) {
/ / " mai n" est une mt hode de cl asse
Y unObj et = new Y( ) ;
unObj et . yP2( ) ; / / I nvocat i on d' une mt hode d' i nst ance
Y. yP1( ) ; / / I nvocat i on d' une mt hode de cl asse
xP1( ) ; / / REFUSE ! (voir ci-aprs)
xP2( ) ; / / Cor r ect
}
}
Invocation des mthodes d'une classe depuis l'extrieur de la classe
Invocation d'une mthode d'instance (yP1)
Y uneI nst ance = new Y( ) ;
uneI nst ance. yP1( ) ;
Invocation d'une de mthode de classe ( yP2)
Y. yP2( ) ;
Par exemple, au lancement du programme, la machine virtuelle envoie le mes-
sage mai n directement la classe X: X.mai n( arguments)
ELS - 16 avril 2002 23:14
Java - Un abrg - 31 - Dclaration dune mthode
Invocation des mthodes d'une classe depuis l'intrieur de la classe
Une mthode d'instance peut invoquer des mthodes d'instance ou des mthodes de
classe
Une mthode de classe ne peut invoquer que des mthodes de classe !
POURQUOI CETTE LIMITATION ? ce stade, cela peut paratre curieux..
Ainsi, la fonction main ne peut pas invoquer de mthode dinstance !
nous reprendrons la question dans le point [Variables de classes et variables dinstance].
Un deuxime exemple : la fonction sin
Les fonctions mathmatiques usuelles sont rassembles dans la classe
j ava. l ang. Mat h .
Pour faciliter leur utilisation, elles sont proposes sous la forme de mthodes de clas-
ses:
cl ass Mat h {
publ i c static doubl e si n( doubl e x) {. . . }
publ i c static doubl e cos( doubl e x) {. . . }
et c. .
}
Ainsi, pour utiliser la fonction si n, il est inutile de crer une instance de la classe
Mat h ! On crira par exemple :
doubl e y = Math. si n( x) ;
30 Dclaration dune mthode
C ++
Java 30.1 DCLARATION DUNE FONCTION
En ada
f unct i on Somme ( n1, n2 : i nt eger ) return i nt eger i s
begi n
return n1 + n2 ;
end Somme ;
Java - Un abrg - 32 - Invoquer une fonction
ELS - 16 avril 2002 23:14
En Java, C++
i nt somme ( i nt n1, i nt n2) {
return n1 + n2 ;
}
Lentte de la fonction commence par indiquer le type de la valeur qui sera retourne
par la fonction (dans notre exemple, il sagit du type i nt ).
Linstruction r et ur n est obligatoire. Elle termine lexcution de la fonction.
30.2DCLARATION DUNE PROCDURE
En ada
procedure Af f i cher Tabl eau ( t ab: ar r ay of i nt eger ) i s
begi n
f or cpt i n 1. . t ab l engt h l oop
put ( t ab( cpt ) ) ;
end l oop;
end Af f i cher Tabl eau ;
En Java, C++
void af f i cher Tabl eau ( i nt [ ] t ab) {
f or ( i nt cpt = 0 ; cpt < t ab. l engt h ; cpt ++)
Syst em. out . pr i nt ( t ab[ cpt ] ) ;
}
Les procdures sont en ralit de simples fonctions qui ne retournent rien (cest dire
void )
En principe, une procdure ne contient pas dinstruction return
Linstruction return ; , utilise dans une procdure, a pour effet de terminer
lexcution de la procdure. On opre trs rarement ainsi.
31 Invoquer une fonction
C ++
Java On invoque une fonction pour interroger un objet : lobjet qui reoit le mes-
sage opre un calcul et rpond en retournant la valeur du rsultat.
ELS - 16 avril 2002 23:14
Java - Un abrg - 33 - Invoquer une procdure
En principe, lobjet que lon interroge ne change pas de valeur !!
Le nom donn une fonction est celui dun nom commun ou dun adjectif, qui
caractrise la nature de la valeur retourne.
Nous adopterons les conventions suivantes :
Les noms des fonctions qui retournent la valeur dun attribut de lobjet seront
nommes getNomAttribut( ) :
getSommet ( ) , getLar geur ( ) , getMaxi mum( ) ,
Les noms des fonctions qui testent ltat dun objet en retournant un boolen
seront nommes isNomEtat , ou estNomEtat en franais :
estRouge( ), estVi de( ) , estEnMar che( ) ,
Une invocation de fonction est une valeur, que lon peut utiliser au sein dune
expression :
i nt x = 3 + unRect angl e. getLargeur( ) ;
i f ( unePi l e. estVide( ) ) {. . }
Dans la majorit des cas, le fait de ne pas utiliser la valeur retourne par une fonc-
tion na pas de sens, mme si cest accept par le compilateur :
unRect angl e. getLargeur( ) ; // cette instruction na pas de sens !
32 Invoquer une procdure
C ++
Java On invoque une procdure pour donner un ordre lobjet, lui demander
daccomplir une action : lobjet accomplit laction et ne retourne aucune valeur.
Lobjet qui lon demande daccomplir une action peut changer de valeur !!
(diffrence avec les fonctions).
Le nom donn une procdure est celui dun verbe linfinitif, qui dnote une
action.
Java - Un abrg - 34 - Mcanisme de passage des paramtres
ELS - 16 avril 2002 23:14
Nous adopterons les conventions suivantes :
Les noms des procdures utilises pour mettre jour la valeur dun attribut de
lobjet seront nommes setNomAttribut :
setLar geur ( 15) , setCoul eur ( Col or . bl ue) , . .
Les autres, qui demandent lobjet daccomplir une action, seront simplement
nommes au moyen dun verbe linfinitif :
empi l er ( . . ) , dessi ner ( ) , aj out er ( . . ) , . .
Une invocation de procdure constitue une instruction du programme part
entire (au contraire des fonctions):
unDessi n. afficher ( ) ;
unePi l e. empiler ( 4) ;
unRect angl e. deplacer( n1, n2) ;
33 Mcanisme de passage des paramtres
Java En C++, le programmeur a le choix entre un mcanisme de passage par valeur et un
mcanisme de passage par rfrence. En Java, il ny a pas le choix..
33.1 POUR LES PRIMITIFS, IL SAGIT DUN PASSAGE PAR VALEUR
(MODE IN)
Donc, la valeur du paramtre effectif est constante : elle ne sera jamais modifie par
linvocation de la mthode.
Le paramtre formel est une variable qui contient une copie de la valeur de loriginal
(loriginal tant le paramtre effectif).
Ainsi, mme si la valeur du paramtre formel est modifi par les instructions de la pro-
cdure, la valeur du paramtre effectif reste intacte.
Voir le paramtre formel x dans lexemple ci-aprs
ELS - 16 avril 2002 23:14
Java - Un abrg - 35 - Imbrication des mthodes
33.2 POUR LES OBJETS, IL SAGIT DUN PASSAGE PAR RFRENCE
(MODE IN OUT)
Le paramtre formel et le paramtre effectif sont des variables qui dsignent le mme
objet.
Ainsi, si le paramtre effectif est un objet, sa valeur peut tre modifie par linvocation
de la mthode.
Voir le paramtre formel b1 dans lexemple ci- aprs,
Par contre, la variable elle-mme (cest dire la rfrence) est passe par
valeur : si la mthode modifie cette rfrence (pour que le paramtre formel dsigne
un autre objet), la variable correspondant au paramtre effectif ne sera pas modifie et
dsignera toujours le mme objet.
Voir le paramtre formel b2 dans lexemple ci- aprs
Exemple
import j ava. awt . *;
public class Essai {
public static void uneMet hode( i nt x, But t on b1, But t on b2)
{
x = x + 1; // Modification de la valeur
b1. set Label ( " Bye Bye" ) ; // Modification de la valeur
b2 = new But t on ( " Bye Bye" ) ; // Modification de la rfrence
}
public static void mai n ( St r i ng [ ] ar g) {
But t on b1 = new But t on ( "Hel l o B1" ) ;
But t on b2 = new But t on ( "Hel l o B2" ) ;
i nt val eur = 1;
uneMet hode( val eur , b1, b2) ;
Syst em. out . pr i nt l n ( " Resul t at = " +
val eur + " - " +
b1. get Label ( ) + " - " +
b2. get Label ( )
) ;
// Affiche: Resultat = 1-Bye Bye-Hello B2
}
}
34 Imbrication des mthodes
C ++
Java Dsol, mais la dclaration de mthodes l'intrieur d'une mthode n'est pas prvu !
Java - Un abrg - 36 - Rcursivit
ELS - 16 avril 2002 23:14
Ce mcanisme, que l'on trouve par exemple en Ada, est propre aux langages prvus
pour la programmation procdurale afin dencourager la dcomposition fonctionnelle.
En POO, les mthodes sont en gnral trs courtes et ne ncessitent pas de dcomposi-
tion fonctionnelle.
En revanche, Java et C++ permettent la dcomposition d'objet en proposant le concept
de classe imbrique (ou classe interne ).
35 Rcursivit
C++
Java Cest possible en Java ou en C++ : une mthode peut sappeler elle-mme.
A titre dexemple, la fameuse fonction factoriel
publ i c st at i c i nt f act or i el ( i nt n) {
i f ( n > 1)
r et ur n n*factoriel( n- 1) ;
el se r et ur n 1 ;
}
36 Surcharge des mthodes
C++
Java On peut donner le mme nom deux ou plusieurs mthodes qui accomplissent en
principe la mme fonction logique.
Voici un exemple avec deux exemplaires de la fonction Max
cl ass Mat hemat i ques {
publ i c st at i c voi d doubl e Max ( doubl e a, doubl e b)
{
r et ur n a > b ? a : b ;
}
publ i c st at i c voi d i nt Max ( i nt a, i nt b) {
r et ur n a > b ? a : b ;
}
}
ELS - 16 avril 2002 23:14
Java - Un abrg - 37 - Surcharge des mthodes
Utilisation de Max
doubl e x = Mat hemat i ques. Max( 3. 2, 4. 5) ; //Premire mthode
i nt x = Mat hemat i ques. Max ( 3, 4) ; // Deuxime mthode
O surcharger les mthodes ?
Il est possible de surcharger des mthodes, soit dans une mme classe, soit dans une
classe hritire qui surchargera alors des mthodes de ses classes parentes.
Condition respecter : signature diffrente
La surcharge est effective ds lors qu'il y a modification des arguments de la mthode
surcharge. Les diffrentes versions doivent avoir des signatures diffrentes.
Rappelons que la signature d'une mthode comprend son nom et ses paramtres, mais
ne comprend pas le type retourn. Une distinction limite au type seulement entrane-
rait des ambiguts.
36.1 SURCHAGE DES OPRATEURS
Java Dsol, mais la surcharge des oprateurs nest pas prvue en Java. Ce concept est
pourtant propos par C++ et Ada, et il est trs pratique aux yeux de certains. Malgr
tout, les auteurs de Java ne lont pas retenu en invoquant des raisons qui tiennent du
Gnie Logiciel : la surcharge des oprateurs diminue la lisibilit des programmes.
36.2 LA SURCHARGE DES MTHODES EST UN VILAIN DFAUT
Java Pour assurer une certaine lisibilit des programmes, la surcharge des oprateurs
nest pas autorise en Java. Au mme titre, les auteurs de Java recommandent vive-
ment de ne pas abuser de la surcharge des mthodes . Dailleurs, les lecteurs familiers
des librairies du JDK auront certainement remarqu que la surcharge des mthodes y
est rarement utilise.
Ainsi, les classes ddies aux entres/sorties comme Dat aOut put St r eam, Obj ec-
t Out put , etc.. nhsitent pas donner des noms diffrents aux diffrentes procdures
dcriture : wr i t eObj ect , wr i t eI nt , wr i t eBool , wr i t eChar , etc.. alors que
le nom wr i t e aurait pu tre prvu pour toute ces procdures !
Toutefois, la surcharge est utilise dans les librairies Java. Cest le cas par exemple des
constructeurs..
Pour mieux comprendre la philosophie de Java, remarquons que le langage, - linstar
de C++ -, ne connat pas la notion de paramtres avec valeur par dfaut. Ce concept
Java - Un abrg - 38 - Traitement des exceptions
ELS - 16 avril 2002 23:14
est propos par Ada. Encore une fois, Java sappuie sur la lisibilit pour justifier son
choix : plutt que de prvoir une seule procdure dont les paramtres ont des valeurs
par dfaut, Java prfre utiliser le concept de surcharge et dclarer une collection de
mthodes qui se distinguent par le nombre de leur paramtres, suivant que certains ont
ou non des valeurs par dfaut.
Ce principe est utilis avec les constructeurs !
A titre dexemple, citons les diffrents constructeurs du gestionnaire de disposition
Fl owLayout :
FlowLayout()
Constructs a new Flow Layout with a centered alignment and a default 5-unit
horizontal and vertical gap.
Fl owLayout ( i nt al i gn)
Constructs a new Flow Layout with the specified alignment and a default 5-unit
horizontal and vertical gap.
Fl owLayout ( i nt al i gn, i nt hgap, i nt vgap)
Creates a new flow layout manager with the indicated alignment and the indi-
cated horizontal and vertical gaps.
37 Traitement des exceptions
C++
Java Principe en gros identique en C++, mais avec une syntaxe diffrente
Le mcanisme des exceptions est prvu pour traiter les erreurs dtectes pendant lex-
cution du programme. Il permet en outre de distinguer clairement lendroit du pro-
gramme o lerreur peut arriver de lendroit du programme o lerreur est traite.
Avec le mcanisme des exceptions, le programmeur a la possibilit :
1/ de traiter lerreur directement par la mthode dans laquelle lerreur sest
produite, on dit que lerreur est rcupre,
2/ ou alors, de propager lerreur pour tre traite au niveau suprieur (la m-
thode appelante), et ainsi de suite. On utilise la propagation derreur au cas
o la mthode dans laquelle lerreur a t constate nest pas comptente
pour faire son traitement. En remontant les tages, si aucune mthode du
programmeur ne rcupre lexception, cette dernire est alors traite auto-
ELS - 16 avril 2002 23:14
Java - Un abrg - 39 - Traitement des exceptions
matiquement et conduit en gnral une erreur fatale
37.1 CLASSIFICATION DES EXCEPTIONS
Les exceptions sont des objets, instances de la classe Except i on ou de classes dri-
ves de Except i on. La classe Except i on hrite elle-mme de la classe gnrale
Thr owabl e. De ce fait, toutes les exceptions sont caractrises par un attribut de
type St r i ng, un texte qui spcifie le message derreur associe lexception. Ce
message derreur peut tre spcifi grce au paramtre du constructeur de la classe Ex-
cept i on.
Considrons la hirarchie des classes dexception offerte en standard par lenvironne-
ment Java :
La classe Throwable contient un autre attribut remarquable. Ce dernier contient
une photo de la pile dexcution au moment o lerreur a t signale. Cette pile
dexcution, - qui mmorise la file des appels de mthodes -, permet de dterminer les
circonstances dans lesquelles lerreur sest produite. Si, - daventure -, lapplication
Java plantait , cette pile dexcution serait alors affiche automatiquement dans la
fentre dexcution.
La classe Exception dfinit lensembles des exceptions pouvant tre gres direc-
tement par le programmeur. De cette classe sont drives de nombreuses classes stan-
dard.
Thr ow abl e
Obj ec t
Ex c ept i on
RunTi meEx c ept i on
Er r or
Erreurs systme
Les "Exceptions" constituent une
catgorie d'erreurs susceptibles d'tre
rcupres par les programmes.
Superclasse de toutes les "Errors" et de toutes les
"Exceptions" gnres par l'excution d'un programme Java.
I OEx c ept i on
Nul l Poi nt er Ex c ept i on
I ndex Out Of BoundsEx c ept i on
Ar i t hmet i c Ex c ept i on
Fi l eNot FoundEx c ept i on
Soc k et Ex c ept i on
Java - Un abrg - 40 - Traitement des exceptions
ELS - 16 avril 2002 23:14
Citons notamment la classe I OExcept i on qui regroupe les erreurs dentres/sor-
ties. Comme par exemple la classe Socket Except i on qui reprsente les erreurs
de connexion sur le rseau Internet.
Citons encore la classe RunTimeException qui regroupe les erreurs classiques
de programmation, comme :
Nul l Poi nt er Except i on
Envoi de message une rfrence nul l
I ndexOut Of BoundsExcept i on
Accs un tableau en dehors des limites
Ar i t hmet i cExcept i on
Division par zro, dpassement de capacit dun entier
37.2 PROPAGER UNE EXCEPTION
Considrons lentte de la mthode setRayon :
publ i c voi d set Rayon ( i nt val eur ) throws RayonException {

}
Len-tte de cette mthode comporte une clause spciale : throws RayonExcep-
tion, qui signale que lexcution de cette mthode est susceptible de lever une
exception.
La double utilit de la clause throws:
1/ Elle amliore la lisibilit du programme en indiquant que lexcution de cet-
te mthode est susceptible de lever une exception ;
2/ Elle indique au compilateur que toute mthode qui envoie le message se-
t Rayon doit traiter lexception :
soit en la rcuprant au moyen dun catch (voir plus loin),
soit en la propageant, cest--dire en renvoyant le traitement de
lexception sa propre mthode appelante, comme par exemple le cons-
tructeur de la classe Cer cl e :
publ i c set Cer cl e ( i nt x, i nt y,
i nt r ayon) throws RayonException {
setRayon( r ayon) ;
t hi s. x = x ; t hi s. y = y ;
ELS - 16 avril 2002 23:14
Java - Un abrg - 41 - Traitement des exceptions
}
Dans un tel cas, lcriture de la clause throws est obligatoire : le com-
pilateur le vrifie
1
.
37.3 RCUPRER UNE EXCEPTION
Linstruction t r y.. cat ch permet de rcuprer la leve dune exception en cri-
vant un code de traitement, comme par exemple :
void uneMt hode ( ) {
Cer cl e c ; Dclaration dun objet de type Cercle
int l eRayon ;
/ *
Bout de programme permettant de saisir les valeurs du rayon,
de x et de y
. .
*/
try {On essaye ..
Peut-tre quune exception sera leve
c = new Cercle ( 100, 100, l eRayon) ;
Lexception na pas t leve, le programme continue ici
..
}
catch ( RayonExcept i on e) {
Une exception a t leve
Le paramtre e est lobjet qui correspond lexception
Par exemple, voici une utilisation de cet objet en affichant le
message derreur associ cette exception
Syst em. out . pr i nt l n( e. getMessage( ) ) ;
Ici, on crit le traitement de lexception
. .
}
On arrive cet endroit de la mthode quil y ait eu ou non une
leve dexception
}
37.4 DIFFRENCIER LES TYPES DEXCEPTIONS (CASCADE DE
CATCH )
Pour distinguer les exceptions et leur affecter un traitement particulier, il est possible
dcrire plusieurs clauses cat ch, comme ci-dessous :
t r y {
On essaye ..
..code pouvant lever une exception ..
1. Sauf pour les exceptions de type Runt i meExcept i on, voir plus loin
Java - Un abrg - 42 - Traitement des exceptions
ELS - 16 avril 2002 23:14
}
catch ( Nul l Poi nt er Except i on e) {
Traitement de lerreur NullPointerException
}
catch ( I ndexOut Of BoundsExcept i on e) {
Traitement de lerreur IndexOutOfBoundsException
}
catch ( I OExcept i on e) {
Traitement de lerreur IOException
}
Le principe est le suivant : quand une exception est leve, le gestionnaire dexception
analyse les clauses cat ch les unes aprs les autres en commenant par la premire.
La premire clause dont le type correspond lexception capture lexception. Si
aucune clause ne correspond, lexception nest pas capture et sera propage.
En gnral, les premires clauses catch correspondent des exceptions trs prcises,
alors que les dernires sont plus gnrales.
37.5 LA CLAUSE FI NALLY
On utilisera la clause f i nal l y (optionnelle) si lon dsire effectuer un traitement
dans tous les cas, mme si elle est propage.
t r y {
On essaye ..
..code pouvant lever une exception ..
}
cat ch ( Nul l Poi nt er Except i on e) {
Traitement de lerreur NullPointerException
}
cat ch ( I ndexOut Of BoundsExcept i on e) {
Traitement de lerreur IndexOutOfBoundsException
}
cat ch ( I OExcept i on e) {
Traitement de lerreur IOException
}
finally {
Ecrire ici le code qui sera excut dans tous les cas,
que lexception soit ou non leve, que lexception soit rcupre
ou propage.
}
Notamment, il est possible dutiliser la clause f i nal l y pour remettre de
lordre . Par exemple, pour fermer un fichier qui aurait t ouvert dans la clause
t r y.
ELS - 16 avril 2002 23:14
Java - Un abrg - 43 - Traitement des exceptions
37.6 CAS PARTICULIER : LES EXCEPTIONS DE TYPE
RUNTI MEEXCEPTI ON
Toute mthode susceptible de propager une exception doit le signaler au moyen dune
clause throws .. En fait, a nest pas tout fait vrai : les exceptions dites non
contrles chappent cette rgle.
Appartiennent cette catgorie les exceptions de type RunTi meExcept i on. Ainsi,
les erreurs de programmation telles que Nul l Poi nt er Except i on, Ar r ayOu-
t Of BoundsExcept i on, Ar i t hmet i cExcept i on, etc.. peuvent tre
ignores par le programmeur. Ignorer de telles exceptions signifie quelles seront
propages, sans mme que le programmeur ait eu la ncessit de le signaler au moyen
dune clause t hr ows.
Ouf ! cette absence de contrle allge quelque peu lcriture des programmes. En effet,
tout envoi de message est susceptible de lever lexception Nul l Poi nt er -
Except i on ; imaginons alors un programme qui samuse traiter toutes les excep-
tions de ce type
Les exceptions de type Er r or , - les erreurs systme -, sont galement non contr-
les.
37.7 LEVER UNE EXCEPTION
Sopre au moyen de loprateur throw.
Considrons par exemple lcriture de la mthode setRayon :
publ i c voi d set Rayon ( i nt val eur )
throws RayonExcept i on {
i f ( val eur <= 0) {
throw new Except i on( " l e r ayon doi t t r e >= 0" ) ;
Lexcution de la mthode sarrte, lexception est propage
au code appelant
}
Valeur du paramtre correcte, suite du code de la mthode
:
}
Java - Un abrg - 44 - Les paquetages
ELS - 16 avril 2002 23:14
37.8 CRER SON PROPRE TYPE DEXCEPTION
On peut crer une nouvelle classe dexception, comme par exemple :
class RayonExcept i on extends Except i on {
public RayonExcept i on( ) {
super ( "l e r ayon doi t t r e >= 0" ) ;
Invocation du constructeur de la superclasse(classe Exception)
}
}
Utilisation (comparer avec le paragraphe prcdent)
publ i c voi d set Rayon ( i nt val eur )
throws RayonExcept i on {
i f ( val eur <= 0) {
throw new RayonExcept i on ( ) ;
Lexcution de la mthode sarrte, lexception est propage au
code appelant
}
Valeur du paramtre correcte, suite du code de la mthode
:
}
Pour quel bnfice ?
En dclarant la classe RayonExcept i on comme nous lavons fait, nous avons
spcialis la superclasse Except i on en dfinissant un message derreur spcifi-
que. Autre bnfice, notre traitement derreur gagnera en prcision, et nous serons
capables notamment grce linstruction t r y- cat ch de diffrencier l'exception
RayonExcept i on de toutes les autres (voir prcdemment sous [Diffrencier les
types dexceptions]).
38 Les paquetages
Java Comme certaines applications Objet manipulent un nombre de classes gigantesque, le
programmeur en arrive trs vite sarracher les cheveux. Comment mettre de lordre?
Java sinspire directement de la conception des systmes de fichiers : les classes seront
organises en rpertoires que lon appelle des paquetages (il contiendront chacun un
paquet de classes).
Un paquetage Java est un ensemble de classes et dinterfaces plus ou moins affilies les
unes aux autres, et souvent destines cooprer dans le cadre dune mme application
ou dune mme fonctionnalit de lapplication; ainsi, le paquetage j ava.awt ras-
ELS - 16 avril 2002 23:14
Java - Un abrg - 45 - Les paquetages
semble tous les lments de Java pouvant tre affichs dans le cadre dune interface
graphique.
Un avantage du groupage de classes en paquetage est que le risque de collisions de
noms sen trouve rduit : chaque paquetage dispose de son propre espace de
noms , permettant ainsi de trouver des classes de mme nom dans des paquetages dif-
frents.
38.1 DFINITION ET UTILISATION DUN PAQUETAGE
On dfinit un paquetage en utilisant le mot rserv package, suivi du nom de ce
paquetage.
package MonPaquetage;
publ i c cl ass Cl asseA { . . . }
cl ass Cl asseB { . . . }
Dans cet exemple, les deux classes Cl asseA, et Cl asseB font partie du
paquetage MonPackage.
Le mot-reserv package, sil figure dans un fichier, doit tre le premier mot de la
premire ligne significative (ni vide, ni commentaire) du fichier source. Si aucun
paquetage nest mentionn, un paquetage anonyme est dfini par dfaut par le compila-
teur, nomm unnamed. Ainsi, les classes dun mme fichier ne peuvent appartenir
qu un seul paquetage.
38.2UTILISATION ET IMPORTATION DUN PAQUETAGE
Seuls les lments exportables dun paquetage peuvent tre utiliss. En loccurren-
ce, il sagit des classes et des interfaces dclares au sein du paquetage avec le mot-cl
public, ainsi que de ses sous-paquetages.
Pour utiliser une classe publique (ou une interface publique) dun paquetage, il suffit de
prfixer lidentificateur par son nom de paquetage.
Ainsi, on peut utiliser Cl asseA de la manire suivante :
cl ass Test {
voi d uneMet hode( ) {
MonPackage. Cl asseA mpA = new MonPackage. Cl asseA( ) ;
i nt i = mpA. uneMet hodeDeA( ) ;
}
}
Un inconvnient vident est quil faut retaper le nom du paquetage chaque fois.
Java - Un abrg - 46 - Les paquetages
ELS - 16 avril 2002 23:14
Java permet dviter cet excdent de texte au moyen du mot rserv import, qui
permet douvrir le contexte dun paquetage, et dviter ainsi la rptition fastidieuse du
nom des paquetage utiliss. Ainsi, le petit exemple ci-dessus peut scrire :
import MonPackage. Cl asseA;
cl ass Test {
voi d uneMet hode( ) {
Cl asseA mpA = new Cl asseA( ) ;
i nt i = mpA. uneMet hodeDeA( ) ;
}
}
Il est galement possible douvrir le contexte du paquetage entier, et de dfinir ainsi
toutes les classes du paquetage comme importes; la syntaxe est alors la suivante :
import MonPackage. *;
import j ava. awt . *;
En cas dambigut, il est ncessaire dadresser de manire explicite des classes ayant
le mme nom dans des paquetage diffrents.
Il nest pas ncessaire dimporter le paquetage dont fait partie la classe que lon utilise:
cette importation est automatique. Il nest pas non plus utile dimporter
j ava. l ang car cette importation est ralise automatiquement; ce paquetage est
tellement fondamental quaucune application java ne pourrait sexcuter sans son con-
cours.
38.3LES HIRARCHIES DE PAQUETAGES
Pour organiser les classes, nous regrouperons ces dernires en paquetages qui eux m-
mes pourront contenir dautres paquetages plus spcialiss et ainsi de suite. Nous rali-
serons ainsi une hirarchie de paquetages la manire des hirarchies de rpertoires
dans les systmes de fichiers.
Limportation dune class Xxx situe dans le sous-paquetage Bbb du paquetage Aaa
scrira ainsi, en explicitant le chemin daccs:
import Aaa. Bbb. Xxx ;
38.4RELATIONS AVEC LE SYSTME DE GESTION DE FICHIERS
Il existe une correspondance rigide entre les dnominations de classes et de paquetages
et les noms de fichiers utiliss.
ELS - 16 avril 2002 23:14
Java - Un abrg - 47 - Structure dune application Java
Les rgles respecter..
Entre la classe publique dcrite dans un fichier et le nom de ce fichier : la
classe et le fichier portent le mme nom, lextension . j ava prs.
Les paquetages obissent une rgle similaire. Les fichiers dun mme paque-
tage sont placs dans un rpertoire unique, dont le nom correspond celui du
paquetage.
Ainsi, une hirarchie de paquetages devra en principe mise en place en labo-
rant une hirarchie correspondante de rpertoires dans le systme de fichiers.
39 Structure dune application Java
Comme une application Java peut contenir un nombre relativement norme de classes,
loutil naturel qui soffre au programmeur et dorganiser ces classes au sein dune ou de
plusieurs hirarchies de paquetages : nous trouverons dans un mme paquetage toutes
les classes qui collaborent une mme fonctionnalit.
Chaque paquetage sera plac dans un rpertoire du systme de fichiers, rpertoire qui
portera le mme nom que le paquetage lui-mme.
39.1 COMPOSITION DUN PAQUETAGE
Les classes et les interfaces qui composeront le paquetage seront crites dans des fi-
chiers portant lextension .j ava. Ces fichiers seront tous placs dans le mme r-
pertoire, celui du paquetage.
39.2 COMPOSITION DUN FICHIER
En gnral, chaque fichier contiendra une seule classe publique (ou une seule inter-
face publique). Si le mot publ i c nest pas mentionn, cette classe (ou interface) ne
sera visible qu lintrieur du paquetage. Tout lment exportable doit tre dsign
par le mot-cl publ i c.
Un fichier peut contenir un nombre indtermin de classes et dinterfaces !
Le rle du fichier est de mettre disposition une classe ou une interface qui sera utili-
se par les autres composants de lapplication.
Si la mise en oeuvre de cette classe (ou interface) ncessite lcriture dautres classes
ou interfaces, crits dans le seul but de prendre en charge une partie du travail, le pro-
grammeur les placera naturellement dans le mme fichier.
Java - Un abrg - 48 - Structure dune application Java
ELS - 16 avril 2002 23:14
Un seul composant public par fichier !
Les composants secondaires , ncessaires la mise en oeuvre du composant princi-
pal public, ne seront jamais visibles en dehors du paquetage. En effet, Java impose que
chaque fichier ne contienne quun seul lment exportable.
Rappelons que le nom du fichier devra correspondre exactement au nom du composant
principal, accompagn de lextension . j ava.
39.3 AMORCE DE LAPPLICATION: LA CLASSE PRINCIPALE (mai n)
Parmi les classes publiques, une au moins
1
comportera une fonction mai n qui sera
invoque au moment du lancement du programme :
> java Xxx
Ceci provoque lexcution de la machine virtuelle Java, qui invoque la fonction
mai n de la classe Xxx (qui doit tre une classe publique).
39.4FONCTION mai n, PARAMTRES EN LIGNE DE COMMANDE
La fonction mai n doit avoir obligatoirement l'allure suivante :
publ i c static void main ( St r i ng[ ] ar gs) {
/ / cor ps de l a f onct i ons mai n
:
}
Les paramtres passs la fonction mai n sont les paramtres spcifis par l'utilisa-
teur du programme dans la ligne de commande lorsque le programme est lanc.
Un programme peut par exemple lanc ainsi :
RepertoireCourant> j ava Xxx 10 Bonj our Al f r ed
Le noyau Java transmet les paramtres la fonction main sous forme de chanes de
caractres. Ainsi, le paramtre args de la fonction main est un tableau de chanes
de caractres (St r i ng). Dans notre exemple, la premire case de ce tableau
(ar gs[ 0] ) contiendrait le texte 10.
1. Plusieurs classes peuvent comporter une fonction mai n (ce qui permet de les tester ind-
pendamment les unes des autres).
ELS - 16 avril 2002 23:14
Java - Un abrg - 49 - Localisation des classes et compilation
Voici une fonction main qui affiche le ou les paramtres passs par l'utilisateur dans
la ligne de commande:
publ i c st at i c voi d mai n ( St r i ng[ ] ar gs) {
i f ( ar gs. l engt h >= 1) {
Syst em. out . pr i nt l n
( ' \ n' + " Appel avec " + ar gs. l engt h + c par amet r es: " ) ;
f or ( i nt cpt = 0; cpt < ar gs. l engt h; cpt ++) {
Syst em. out . pr i nt l n ( cpt + " > " + ar gs[ cpt ] ) ;
}
}
}
Notons pour finir que chaque classe Java peut tre dote d'une fonction main, ce qui
l'autorise fonctionner en tant qu'application standalone. Ceci est trs pratique pour
tester toutes les mthodes de la classe dans la phase de mise au point.
40 Localisation des classes et compilation
Voyons comment rendre nos classes accessibles aux programmes qui les utiliseront..
Pour simplifier le langage, nous utiliserons le terme librairie pour dnoter une hirar-
chie de paquetages, comprenant un paquetage principal, lui-mme compos de sous-
paquetages etc..
Supposons que nos classes soient places dans un ou plusieurs rpertoires spciaux,
correspondant chacun une librairie. Comme par exemple :
/home/projetX/mesclasses1
/home/projetX/mesclasses2
/home/lib
Notons que chacun de ces 3 rpertoires est un rpertoire de base pour chaque arbores-
cence de paquetages.
40.1 COMPILATION DU PROGRAMME
Pour compiler le programme, il nous faut maintenant dfinir le classpath , cest--
dire le chemin des classes, qui est la collection de tous les rpertoires de base.
Si on utilise lenvironnement Java SDK pour compiler, deux solutions soffrent nous
pour dfinir le chemin des classes :
1/ Dfinir la variable denvironnement CLASSPATH au niveau du systme
dexploitation ;
2/ Ou (solution la plus souple et la plus courante), utiliser loption classpath
du compilateur javac.
Java - Un abrg - 50 - Localisation des classes et compilation
ELS - 16 avril 2002 23:14
Par exemple, sous Windows, la deuxime solution scrirait ainsi, sur une seule ligne :
>j avac classpath .;c: \ home\ pr oj et X\ mescl asses1;
c: \ home\ pr oj et X\ mescl asses1;c: \ home\ l i b MonPr o-
gr amme. j ava
Sous Linux, le point-virgule est remplac par : et les \ deviennent des /, ce qui
donnerait :
>j avac classpath .:/ home/ pr oj et X/ mescl asses1:/ home/
pr oj et X/ mescl asses1:/ home/ l i b MonPr ogr amme. j ava
Dans les deux cas, le point . dsigne le rpertoire courant, l o se trouve gnra-
lement le programme compiler (MonPr ogr amme. j ava). Par dfaut, si on ne pr-
cise pas loption -classpath, le compilateur javac cherche les classes dans le rpertoire
courant.
La recherche des classes sopre de rpertoire de base en rpertoire de base, dans
lordre dfini par loption classpath.
La compilation est partielle : le compilateur ne compile que les classes qui mri-
tent une compilation ! A cette fin, il consulte tout dabord le fichier source pour voir si
la source est plus rcente que le fichier classe. Si oui, une compilation est opre.
Et si les sources ne sont pas situes au mme endroit que les classes ?
Il suffit pour cela dutiliser loption sourcepath du compilateur, en indiquant le chemin
des sources (de manire identique au chemin des classes) . Considrons par exemple le
cas o le rpertoire courant contient deux sous-rpertoires : src pour les sources et clas-
ses pour les classes. La compilation scrira sur une seule ligne:
>j avac classpath .\classes;cheminDesLibrairies sour-
cepath .\src MonPr ogr amme. j ava
40.2EXCUTION DU PROGRAMME PAR LA MACHINE VIRTUELLE
Le principe est le mme que pour la compilation. Ainsi, en optant pour la deuxime
solution, on crira sous Windows :
>j ava classpath .;c: \ home\ pr oj et X\ mescl asses1;
c: \ home\ pr oj et X\ mescl asses1; c: \ home\ l i b MonPr ogr amme
ELS - 16 avril 2002 23:14
Java - Un abrg - 51 - Localisation des classes et compilation
Il est possible toutefois dcrire cp en lieu et place de - cl asspat h.
40.3LES FICHIERS DARCHIVES JAR
Une archive JAR contient plusieurs classes, plusieurs paquetages hirarchiss ou
non dans un seul fichier. Les donnes y sont compresses au format ZIP. Ainsi, lutili-
sation dune archive JAR est une conomie despace et de temps daccs (un seul accs
fichier).
Par exemple, les milliers de classes de la bibliothque dexcution du JDK se trouvent
rassembles dans larchive rt.jar, qui se trouve place dans le rpertoire jre/lib de lenvi-
ronnement Java SDK.
En tant que dveloppeur, on peut utiliser lutilitaire jar pour crer nos propres archives.
Ce dernier est fourni avec lenvironnement Java SDK. Voir ce propos lannexe au
point 40.3, page51.
Par exemple, supposons que lon ait cr larchive ar ch. j ar , place dans le rper-
toire de base c:\home\archives, partir des deux librairies classes1 et classes2 de lexem-
ple prcdent. Il faudra mettre jour le chemin de classes aussi bien pour la
compilation que pour lexcution, comme par exemple :
>j avac classpath .;c:\home\archi-
ves\arch.jar;c: \ home\ l i b MonPr ogr amme. j ava
Par dfaut, les classes sont toujours recherches dans les fichiers de bibliothque
dexcution (rt.jar) et les autres JAR dans les rpertoires jre/lib et jre/lib/ext, que ce soit
pour la compilation comme pour lexcution.
40.4STRUCTURE DUNE CLASSE
Java La dclaration d'une classe obit la syntaxe suivante :
[ Modificateurs de classe] class NomDeLaCl asse
[ extends nomDeLaSuper cl asse]
[ implements i nt er f ace1, i nt er f ace2, . . ]
{
[ Variables]
[ Constructeurs]
Java - Un abrg - 52 - Localisation des classes et compilation
ELS - 16 avril 2002 23:14
[ Mthodes]
}
Notons que les variables, constructeurs et mthodes peuvent tre dclars dans
nimporte quel ordre. Par convention, on prfre commencer par dclarer les variables,
puis les constructeurs pour finir par les mthodes.
Un exemple ..
public cl ass Cr eat ur eMyt hi que
extends Cr eat ur e
implements Runnabl e {
/ / Variables de classe(voir plus loin, le point [Variables de classe] )
pr i vat e st at i c i nt dur eeSi est e ;
/ / Variables d'instance
pr i vat e i nt age ; // Age de la crature
pr i vat e St r i ng nom; // Nom de la crature
pr i vat e est Magi que ; // Existence de pouvoirs magiques
pr i vat e Thr ead ; // Activit propre (objet actif)
/ / Constructeurs
publ i c st at i c {
/ / Constructeur de classe, pour initialiser les variables de classe
dur eeSi est e = 1000;
}
publ i c Cr eat ur eMyt hi que ( St r i ng nom,
i nt age,
bool ean est mMagi que) {
/ / Constructeur dinstance, pour initialiser les variables dinstance
t hi s. age = age ;
t hi s. nom= nom;
t hi s. est Magi que = est Magi que;
act i vi t e = new Thr ead( t hi s) ;
act i vi t e. st ar t ( ) ;
}
/ / Mthodes
publ i c st at i c voi d set Dur eeSi est e ( i nt dur ee) {
/ / Une mthode de classe
dur eeSi est e = dur ee;
}
publ i c voi d set Age ( i nt age) {
/ / Une mthode dinstance
t hi s. age=age;
}
ELS - 16 avril 2002 23:14
Java - Un abrg - 53 - Localisation des classes et compilation
publ i c voi d r un( ) {
/ / Implmentation de linterface Runnable
whi l e( t r ue) {
Syst em. out . pr i nt l n ( " Bouh ! ! " ) ;
t r y {Thr ead. sl eep( dur eeSi est e) ; }
cat ch ( I nt er r upt edExcept i on e) {}
}
}
}
40.5LES MODIFICATEURS DE CLASSE
Les modificateurs de classe sont des mot-cls optionnels qui prcdent le mot-cl
cl ass. Ces modificateurs spcifient la porte ainsi que le statut de la classe au sein
du programme.
Le langage prvoit 3 modificateurs de classe : abst r act f i nal et publ i c .
Le modificateur public annonce que cette classe peut tre utilise -
notamment instancie ou hrite - partout dans le mme paquetage (pac-
kage) ou alors dans tout autre paquetage qui importerait cette classe. Pour
plus de dtails, le lecteur est renvoy au point 38, page44.
Toute classe publique doit tre dclare dans son proche fichier qui
doit porter obligatoirement le nom de la classe publique : <nomDeLa-
Cl asse>. j ava. Un fichier ne peut contenir qu'une seule classe publique. Un
paquetage peut tre compos de plusieurs fichiers.
Si le mot-cl publ i c n'est pas utilis, le mode package est sous-
entendu : la classe est considre simplement comme une classe amie, qui ne
peut tre utilise qu' l'intrieur du mme paquetage, mais qui ne peut tre utili-
se ailleurs, mme par le biais d'une importation.
Le modificateur abstract annonce qu'il s'agit d'une classe abstraite,
qui dfinit un comportement commun une hirarchie de classes drives par
hritage. Le concept dhritage nest pas dcrit dans le cadre de ce rsum.
Le modificateur final annonce que la classe ne peut pas avoir de sous-
classes: aucune classe peut en hriter des fins de spcialisation.
Java - Un abrg - 54 - Localisation des classes et compilation
ELS - 16 avril 2002 23:14
40.6EXTENDS : HRITAGE
Le concept dhritage nest pas dcrit dans le cadre de ce rsum.
Ce mot-cl est optionnel.
Pour clairer le lecteur, disons simplement que le mot-cl ext ends indique que la
classe hrite de la classe Cr eat ur e. Grce cet hritage, toutes les oprations
applicables aux objets de la classe Cr eat ur e s'appliquent automatiquement aux
objets de la classe Cr eat ur eMyt hi que.
Si le programmeur omet le mot-cl ext ends lors de la dclaration d'une classe,
le compilateur Java assume que la nouvelle classe hrite directement de la classe
Obj ect . Tout en haut de la hirarchie, on trouve donc la superclasse Obj et dont
hrite toutes les classe Java.
40.7 I MPLEMENTS : IMPLMENTATION DINTERFACE
Le concept dinetrface nest pas dcrit dans le cadre de ce rsum.
Ce mot-cl est optionnel.
Pour clairer le lecteur, disons simplement quune peut implmenter une interface,
voire mme plusieurs... Une interface est une liste de mthodes dcrites uniquement
par leur entte.
Dans lexemple prsent plus haut, il est fait mention de linterface Runnabl e, une
interface de la librairie Java, spcifie comme suit :
interface Runnabl e {
publ i c voi d run( ) ;
}
Une classe qui implmente une interface sengage fournir le code de toutes les mtho-
des dcrites dans linterface. Cest ainsi que nous retrouvons la mthode r un( ) avec
ses instructions au sein mme de la classe Cr eat ur eMyt hi que.
En loccurrence, les objets de type Runnabl e sont appels des objets actifs, carac-
triss par un flot d'excution concurrent au reste du programme. La mthode r un
qui les caractrise contient le code de l'activit concurrente.
ELS - 16 avril 2002 23:14
Java - Un abrg - 55 - Visibilit des entits au sein dune classe
41 Visibilit des entits au sein dune classe
Commenons par un exemple illustrant la visibilit des variables (le concept est gn-
ralisable aux mthodes):
publ i c cl ass UneCl asse {
private i nt v1 ; // une variable dinstance priv, visible:
. partout lintrieur de la classe
. et cest tout..
protected i nt v2 ; // une variable dinstance protge, visible :
. partout lintrieur de la classe
. dans les classes extrieures de la mme hirarchie
dhritage
. dans les classes extrieures du mme paquetage
public i nt v3 ; // une variable dinstance publique, visible :
. partout lintrieur de la classe
. dans toutes les classes extrieures
i nt v4 ; // mode package, par dfaut ..
une variable dinstance protge, visible :
. partout lintrieur de la classe
. dans toutes les classes extrieures du mme paquetage
publ i c voi d uneMet hode( i nt p) {
/ / Le paramtre formel p est local la mthode : il nest visible
qu lintrieur de la mthode
i nt v ; // Variable locale la mthode : visible uniquement
lintrieur de la mthode, partir de lendroit /o cette
variable est dclare
.. suite de la mthode ..
}
}
Dans ce qui suit, le terme lment dnote une variable (variable dinstance ou
variable de classe) ou une mthode (mthode dinstance ou mthode de classe).
Concernant les lments dfinis au sein mme de la classe
En ada, la visibilit dun identificateur commence partir de lendroit o se
trouve dclar lidentificateur en question.
En java, la visibilit est globale toute la classe : les variables et les
mthodes peuvent tre utilises avant davoir t dclares !
Java - Un abrg - 56 - Les constructeurs
ELS - 16 avril 2002 23:14
Concernant les lments dfinis par une classe extrieure
Leur accs est contrl par leur mode daccs publ i c, pr i vat e, pr ot ec-
t ed ou encore package (le mode daccs par dfaut , quand rien
nest prcis).
Sont accessibles les lments dont le mode daccs est public, ou encore
protected si la classe en question est une superclasse (hritage..).
Si la classe extrieure appartient au mme paquetage, sont accessibles gale-
ment les lments dont le mode daccs est package .
Etre attentif au fait que les lments dune classe extrieure ne sont
visibles que si la dite classe est elle-mme visible ! Une classe extrieure est
visible:
si elle appartient au mme paquetage ;
ou alors sil sagit dune classe publique importe (depuis un autre
paquetage, voir le point 38, page44).
Concernant les paramtres formels et les variables locales dune mthodes
Ces derniers ne sont visibles quau sein mme de la mthode, invisibles
lextrieur de la mthode (concept identique ada).
42 Les constructeurs
Java Un constructeur est une mthode un peu spciale utilise pour initialiser les objets lors
de leur cration. Un constructeur est invoqu automatiquement lorsque l'oprateur
new est excut.
Voici par exemple la classe Cr eat ur eMyt hi que, pourvue de trois constructeurs :
cl ass Cr eat ur eMyt hi que ext ends Cr eat ur e {
/ / Variables d'instance
pr i vat e i nt age ; // Age de la crature
pr i vat e St r i ng nom; // Nom de la crature
pr i vat e est Magi que ; // Existence de pouvoirs magiques
/ / Constructeurs
publ i c Cr eat ur eMyt hi que ( ) {
// Premier constructeur: un constructeur sans paramtre
nom= " Anonyme" ;
}
publ i c Cr eat ur eMyt hi que ( St r i ng nom,
ELS - 16 avril 2002 23:14
Java - Un abrg - 57 - Les constructeurs
i nt age,
bool ean est mMagi que) {
// Un deuxime constructeur, avec paramtres
t hi s. age = age ;
t hi s. nom= nom;
t hi s. est Magi que = est Magi que;
}
publ i c Cr eat ur eMyt hi que ( Cr eat ur eMyt hi que cr ) {
/ / Un troisime constructeur : un constructeur de copie
this( cr . age, cr . monNom, cr . est Magi que) ;
/ / Le mot-cl this permet dinvoquer un
autre constructeur de la mme classe (en loccurrence,
le deuxime constructeur)
}
:
:
}
Attention aux points suivants :
Le nom du constructeur doit tre rigoureusement identique celui de la classe
elle-mme.
Un constructeur ne retourne aucune valeur. Un constructeur se comporte
comme une procdure : le mot-cl voi d est sous-entendu.
Un constructeur n'admet que l'un ou l'autre des 3 modificateurs daccs
publ i c, pr ot ect ed ou pr i vat e. Les modificateurs abs-
t r act , f i nal ou st at i c ne sont pas utilisables.
42.1 RLE DTAILL D'UN CONSTRUCTEUR
Voir le point 20, page16
42.2 ENCHANEMENT DES CONSTRUCTEURS
Le constructeur est une mthode qui sert principalement initialiser les variables d'ins-
tance. Qu'en est-il des variables d'instance hrites : comment et avec quelles valeurs
sont-elles initialises ?
Java - Un abrg - 58 - Les constructeurs
ELS - 16 avril 2002 23:14
Lors de la cration d'un objet, l'invocation des constructeurs s'enchane en com-
menant par le constructeur de plus haut niveau : celui de la classe Object. Ceci
entrane l'initialisation de toutes les parties hrites de la classe.
Pour ce faire, un constructeur commence toujours par invoquer le constructeur de la
superclasse, et ainsi de suite..
Cette invocation doit constituer la toute premire instruction d'un
constructeur !
Comment invoquer le constructeur de la superclasse ?
En Java, le mot-cl super permet d'invoquer le constructeur de la superclasse.
Pour une classe nomme Xxx, le programmeur crira un ou plusieurs constructeurs
qui auront typiquement l'allure suivante :
public Xxx ( paramtres) {
super( paramtres) ; // Invocation du constructeur
// de la superclasse
. . initialisation des variables de la classe Xxx . .
}
Insistons sur le fait que linvocation du constructeur de la superclasse doit obligatoire-
ment constituer la toute premire instruction !
Invocation implicite du constructeur de la superclasse
Le programmeur peut omettre l'invocation au constructeur de la superclasse. Cette
invocation sera opre automatiquement par Java au moyen de l'instruction :
super( ) ;
ELS - 16 avril 2002 23:14
Java - Un abrg - 59 - Les constructeurs
Attention toutefois.. Cette omission est possible uniquement si la superclasse possde
un constructeur sans paramtre (ce qui permet au noyau Java de l'invoquer sans
avoir rflchir ..)
Dans le cas contraire, le programmeur est tenu par le compilateur d'oprer une invoca-
tion explicite lui permettant de prciser la valeur des paramtres. Le compilateur le
vrifie.
42.3 LE CONSTRUCTEUR PAR DFAUT
Si le programmeur a crit une classe sans y avoir spcifi aucun constructeur, le compi-
lateur gnre automatiquement un constructeur par dfaut , sans paramtre, qui ne fait
rien d'autre que d'invoquer le constructeur sans paramtre de la superclasse.
Pour une classe nomme Xxx, ce constructeur par dfaut aurait l'allure suivante:
publ i c Xxx ( ) {
super( ) ; // Invocation du constructeur sans paramtre
de la superclasse
}
On peut se rendre compte que la gnration automatique d'un constructeur par dfaut
n'est possible que si la superclasse dispose d'un constructeur sans paramtre.
Dans le cas contraire, le programmeur est invit par le compilateur corriger son
erreur: il doit dclarer explicitement au moins un constructeur avec ou sans paramtre.
Notons enfin qu' partir du moment o le programmeur a dfini un constructeur avec
ou sans paramtre, le compilateur ne gnre aucun constructeur par dfaut. C'est la rai-
son pour laquelle une classe ne possde pas forcment de constructeur sans paramtre.
42.4LE CONSTRUCTEUR DE CLASSE
L'quivalent du constructeur existe pour les variables de classe.
Un tel constructeur est dsign par le mot-cl static. Ce constructeur sera invoqu
au moment du chargement de la classe.
Par exemple :
st at i c {
:
v = 20 ; // Initialisation d'une variable de classe
:
}
Java - Un abrg - 60 - Les destructeurs
ELS - 16 avril 2002 23:14
A l'instar des mthodes de classe, le constructeur de classe ne peut accder qu'aux
variables de classes. L'accs aux variables d'instance (informations propres aux objets)
lui est interdit.
43 Les destructeurs
Java Les destructeur est optionnel. En Java, l'utilisation d'un destructeur est assez rare. En
effet, le rle accompli par le garbage collector est suffisant dans la plupart des cas.
Si le programmeur dsire effectuer certaines actions (des librations ou autres..) au
moment ou l'objet est dtruit par la machine Java, il a la possibilit de redfinir la
mthode f i nal i ze qui devra tre dclare ainsi :
publ i c voi d finalize ( ) {
. . mes dernires volonts . .
}
Cette mthode est appele par le garbage collector juste avant que l'objet ne soit dtruit.
Note C ++ En C++, le destructeur est trs important (pas de garbage collector !). Ce dernier porte
le mme nom que le constructeur lexception prs dun ~ plac juste devant le
nom.
44 Variables de classes et variables dinstance
Java Les variables de classe sont utilises pour mmoriser des informations globales qui
concernent la classe elle-mme et qui sont partages par toutes les instances.
Une variable de classe est introduite par le mot-cl static.
En mmoire, une variable de classe nexiste quen un seul exemplaire, quel que soit le
nombre objets instancis.
Les variables dinstances sont, - comme leur nom lindique -, propres chaque
instance : un jeux de variables dinstance existera en mmoire pour chaque instance
cre.
cl ass MaCl asse {
pr i vat e static i nt vdc ; // une variable de classe
ELS - 16 avril 2002 23:14
Java - Un abrg - 61 - Variables de classes et variables dinstance
pr i vat e i nt vdi ; // une variable dinstance
publ i c static {
/ / Constructeur de classe: pour initialiser les variables de classe
vdc = 20 ;
}
publ i c MaCl asse( ) {
/ / Constructeur classique: pour initialiser les variables dinstance
vdi = 40 ;
}
publ i c static voi d mdc ( ) {
/ / une mthode de classe
vdc++;
vdi ++; // une mthode de classe ne
peut pas accder aux
variables dinstances
}
publ i c voi d mdi ( ) {
/ / une mthode dinstanceclassique
vdc++;
vdi ++;
}
}
Imaginons les quelques lignes de code suivantes:
MaCl asse o1 = new MaCl asse( ) ;
MaCl asse o2 = new MaCl asse( ) ;
MaCl asse. mdc( ) ; // Invocation de la mthode de classe
o1. mdi ( ) ; // Invocation de la mthode dinstance
En mmoire, nous obtenons le schma suivant :
Java - Un abrg - 62 - Variables de classes et variables dinstance
ELS - 16 avril 2002 23:14
Comme deuxime exemple, voici une classe qui compte ses instances : chaque cra-
tion d'objet, le constructeur, qui est invoqu automatiquement, incrmente la variable
d'instance nombr eDI nst ances.
publ i c cl ass MesI nst ancesSont Compt ees {
/ / Variable de classe comptant le nombre d'instances
pr i vat e static i nt nombr eDI nst ances = 0;
MesI nst ancesSont Compt ees ( ) {
/ / Constructeur
/ / Incrmente le compteur chaque cration d'instance
nombr eDI nst ances++ ;
}
publ i c static i nt nbI nst ances ( ) {
/ / Mthode d'accs la variable de classe
r et ur n nombr eDI nst ances;
}
}
44.1 INITIALISATION D'UNE VARIABLE DE CLASSE
De manire identique aux variables d'instance, la dclaration d'une variable de classe
peut comporter un initialiseur :
vdc
mdc
MaClasse
vdi
mdi
o1
vdi
mdi
o2
22 21 20
41 40
40
new
new
ELS - 16 avril 2002 23:14
Java - Un abrg - 63 - Variables de classes et variables dinstance
st at i c i nt v = 10 ;
Cette initialisation aura lieu au moment du chargement de la classe, c'est dire ds
l'instant que la classe est utilise.
44.2ACCDER AUX VARIABLES DE CLASSE ET AUX VARIABLES
DINSTANCES
Les variables dinstance ne peuvent tre accdes que par les mthodes
dinstance. En effet, comme le montre la figure du premier exemple (voir plus haut),
ce sont les mthodes dinstance qui peuvent agir directement sur les instances.
Par contre, une mthode de classe ne peut agir quau niveau de la classe : elle na pas
accs aux variables dinstance qui existent en plusieurs exemplaires, avec un exem-
plaire par instance.
Notons que les variables de classe sont accessibles aussi bien par les mthodes de
classe que par les mthodes dinstance. Une variable de classe est ainsi partage par
toutes les instances.
44.3LE CONSTRUCTEUR DE CLASSE
Lquivalent du constructeur existe pour les variables de classe.
Un tel constructeur est dsign par le mot-cl static. Ce constructeur sera invoqu
au moment du chargement de la classe. Comme ci-aprs :
static {
:
v = 20 ; // Initialisation d'une variable de classe
:
}
A l'instar des mthodes de classe, le constructeur de classe ne peut accder qu'aux
variables de classe. L'accs aux variables d'instance (informations propres aux objets)
lui est interdit.
Java - Un abrg - 64 - Dclarer des constantes symboliques: final
ELS - 16 avril 2002 23:14
45 Dclarer des constantes symboliques : final
Les constantes symboliques (comme PI = 3.14) sont dclares comme des variables
(eh oui !) qui comportent une valeur dinitialisation non modifiable.
Il suffit donc de dclarer une variable en prcisant quelle est non modifiable au moyen
du mot-cl final.
cl ass MaCl asse {
. .
final doubl e PI = 3. 14 ;
. .
}
Par convention dcriture, les constants symboliques sont crites en majuscules
Pour conomiser la mmoire vive, les constantes symboliques sont le plus souvent
dclares en tant que variables de classe afin de ne pas tre dupliques inutilement au
sein de chacune des instances de la classe (voir le point 44, page60):
cl ass MaCl asse {
. .
static final doubl e PI = 3. 14 ;
. .
}
46 Partage dobjets, copie superficielle et copie profonde
Ces diffrents concepts sont propres la programmation Objet et ils sont tout particu-
lirement importants en Java, un langage qui manipule les objets de manire dynami-
que.
46.1 RETOUR SUR LAFFECTATION
1/ avec les primitifs : la copie de valeur
ELS - 16 avril 2002 23:14
Java - Un abrg - 65 - Partage dobjets, copie superficielle et copie profonde
2/ avec les objets : le partage dobjet
46.2COPIE DOBJETS
En Java, la copie dobjets ncessite lcriture de mthodes spcifiques. En effet, le
concept nest pas aussi immdiat quil ny parat de prime abord et le programmeur
devra dterminer lui-mme le type de copie quil dsire mettre disposition:
une copie superficielle ( shallow copy ),
ou une copie profonde ( deep copy ) qui opre de manire rcursive en
effectuant galement une copie profonde des sous-objets,
ou encore un intermdiaire entre ces deux types ..
Exemple : les classes MyPoi nt et MyRect angl e
Laffectation de types primitifs
opre une copie de valeur ;
Par ailleurs, les valeurs des
deux variables restent indpen-
dantes lune de lautre : la
modification de y ne concerne
en rien la valeur de x.
Laffectation dobjets opre
un partage dobjets : le
mme objet est rfrenc par
deux variables diffrentes.
Par la suite, la valeur de
lobjet peut tre modifie en
passant par lune ou lautre
des deux variables
0
x
0
y int x, y;
x = 3; 3
x
0
y
y = x; 3
x
3
y
y = 5; 3
x
5
y
p1
Point p1, p2;
p2
p1 = new Point (4, 5);
p1 p2
4 5
p2 = p1;
p1 p2
4 5
p2.x = 10; p1 p2
10 5
Java - Un abrg - 66 - Partage dobjets, copie superficielle et copie profonde
ELS - 16 avril 2002 23:14
cl ass MyPoint {
publ i c i nt x, y;
publ i c MyPoi nt ( i nt x, i nt y) {
t hi s. x = x; t hi s. y = y;
}
publ i c MyPoi nt deepCopy( ) {
r et ur n new MyPoi nt ( t hi s. x, t hi s. y) ;
}
}
cl ass MyRectangle {
publ i c MyPoi nt p1, p2;
publ i c MyRect angl e ( MyPoi nt p1, MyPoi nt p2) {
t hi s. p1 = p1; t hi s. p2 = p2;
}
publ i c MyRect angl e shallowCopy( ) {
// Copie superficielle
r et ur n new MyRect angl e( t hi s. p1, t hi s. p2) ;
}
publ i c MyRect angl e deepCopy( ) {
// Copie profonde
r et ur n new MyRect angl e( t hi s. p1. deepCopy( ) ,
t hi s. p2. deepCopy( ) ) ;
}
}
ELS - 16 avril 2002 23:14
Java - Un abrg - 67 - Partage dobjets, copie superficielle et copie profonde
46.3LA MTHODE CLONE : COPIE SUPERFICIELLE
Au cas o la copie superficielle convient aux besoins du programmeur, la classe
Obj ect met disposition la mthode suivante :
pr ot ect ed Obj ect clone( ) t hr ows Cl oneNot Suppor t edExcept i on;
La mthode clone( ) permet d'oprer des copies d'objets bit bit, et sutiliserait par
exemple ainsi :
obj et = (Point)unPoi nt . clone( ) ;
Toutefois, les choses ne sont pas si simples, et linstruction crite ci-dessus sera refu-
se par le compilateur !! En effet, la mthode clone propose par la classe Obj ect
un mode daccs protg (pr ot ect ed) : seule la classe Poi nt peut cloner des
objets de type Poi nt !
Pourquoi compliquer les choses ?
Comme la duplication dobjet est une chose dlicate (copie superficielle ? copie
profonde ? ..), Java invite le programmeur dfinir ses propres mthodes de clonage,
dment rfchies...

publ i c cl ass Obj ect Copy {
publ i c st at i c voi d mai n ( St r i ng [ ] ar g) {
MyPoi nt p1 = new MyPoi nt ( 5, 5) ;
MyPoi nt p2 = new MyPoi nt ( 10, 10) ;
MyRect angl e r 0, r 1, r 2, r 3;
r 0 = new MyRect angl e ( p1, p2) ;
r 1 = r 0;

/ / Par t age d' obj et s
r 2 = r 0. shallowCopy ( ) ;
/ / Copi e super f i ci el l e
/ / ( l i mi t e 1 ni veau)

r 3 = r 0.
deepCopy ( ) ;

/ / Copi e pr of onde ( r cur si ve)
}
}
r0
p1 5 5
10
p2
10
r1
r0
p1 5 5
10
p2
10
r2
p1
p2
r0
p1 5 5
10
p2
10
r3
p1
p2
5 5
10 10
Java - Un abrg - 68 - Partage dobjets, copie superficielle et copie profonde
ELS - 16 avril 2002 23:14
Le principe prconis par le langage consiste obliger le programmeur redfinir la
mthode cl one dans la classe mme de lobjet et en lui donnant un mode daccs
public.
Voici un exemple typique proposant une copie superficielle simple:
cl ass MyPoi nt implements Cloneable {
:
publ i c Obj ect clone( ) {
t r y {r et ur n super. cl one( ) ; }
cat ch ( Cl oneNot Suppor t edExcept i on e)
{r et ur n nul l ; }
}
}
La classe MyPoi nt doit obligatoirement implmenter linterface Cloneable. En
effet, la premire chose que fait la mthode cl one de la classe Obj ect est de tester si
le type de lobjet courant pour laquelle elle est appele implmente Cl oneabl e.
Dans le cas contraire, lexception Cl oneNot Suppor t edExcept i on est leve.
Notons au passage que linterface Cloneable est vide : elle na pas de mthode !
Il sagit en effet dune interface de balisage dont le seul objectif est de permettre
lutilisation de loprateur i nst anceof dans une requte comme :
i f ( unObj et i nst anceof Cl oneabl e) . .
ELS - 16 avril 2002 23:14
Java - Un abrg - 69 - Annexe A - Les Applets
47 Annexe A - Les Applets
Une applet est une petite application que lon excute au travers du navigateur WEB :
Netscape, Explorer ou autre. Comme lapplication est rfrence par une page HTML,
son excution sera lance par le navigateur lui-mme, au moment du chargement de la
page .
47.1 UN BREF APERU
Pour le programmeur, raliser une applet nest pas plus compliqu que de raliser une
application autonome. Voici par exemple le code dune applet dont lexcution affichera
le texte Hello :
import j ava. appl et . Appl et ;
import j ava. awt . Gr aphi cs;
public class Appl et 1 extends Appl et {
public void pai nt ( Gr aphi cs g) {
//Dessine un rectangle autour de la zone de texte
g. dr awRect ( 0, 0, si ze( ) . wi dt h - 50,
si ze( ) . hei ght - 50) ;
//Affiche le texte l'intrieur du rectangle
g. dr awSt r i ng( "Hel l o" , 100, 100) ;
}
}
Pour excuter cette applet, la page HTML interprte par le navigateur aura lallure sui-
vante:
<HTML>
<HEAD>
<TI TLE> Hel l o </ TI TLE>
</ HEAD>
<BODY>
<APPLET CODE = Appl et 1. cl ass
WIDTH = 600
HEIGHT=400>
</ APPLET>
</ BODY>
</ HTML>
Nous trouvons la balise <APPLET> dans le corps mme du fichier HTML. Cette der-
nire sera utilise pour rfrencer notre applet. Les paramtres indiquent que lapplet
est insre dans une zone de la page HTML qui aura une largeur de 600 pixels, et une
hauteur de 400 pixels.
Pour excuter cette applet, nous avons deux possibilits :
1/ Charger la page HTML correspondante au moyen du navigateur WEB.
Lapplet sera alors automatiquement excute ;
2/ Utiliser lutilitaire appl et Vi ewer offert avec le JDK ( Java Develop-
ment Kit ), mis disposition pour tester trs simplement les applets en d-
Java - Un abrg - 70 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
veloppement.
Il suffira de taper la commande :

>appl et Vi ewer hel l o. ht ml
o hel l o. ht ml dsigne le fichier HTML crit ci-dessus.
Voici par exemple son excution au moyen de lutilitaire appl et Vi ewer :
Intrt des applets
Leur principal intrt est dtendre encore lattractivit du rseau : ne plus se limiter
des changes dinformation, mais offrir la possibilit dchanger des applications, t-
lcharges partir dun serveur distant pour tre excutes localement, sur le poste
client.
Comme le serveur ignore tout de la machine client, - il peut sagir dune machine
UNIX, dune machine Windows ou Windows NT -, il faut alors que le navigateur
puisse sappuyer sur une machine virtuelle Java, installe localement, et qui sera capa-
ble dexcuter lapplet en interprtant chacune de ses instructions.
La scurit
Un problme crucial est alors pos : le tlchargement de lapplication sur le poste
client doit se faire en toute scurit. Notamment, le poste client doit tre protg contre
ELS - 16 avril 2002 23:14
Java - Un abrg - 71 - Annexe A - Les Applets
lexcution de toute application qui violerait lintgrit de son environnement.
Pour cette raison, le navigateur imposera lapplet certaines conditions de fonctionne-
ment. Ainsi, du ct client, le contrle seffectuera tant au niveau de la mmoire vive,
que du disque local, que vers le rseau. Voir pour plus de dtails le point 47.5, page79.
Les applets ne sont plus la mode
Le temps de tlchargement des applets et la complexit du systme de scurit sont
malheureusement extrmement ennuyeux, et lon prfre aujourdhui utiliser des tech-
nologies bases sur la cration dynamique de pages html au moyen de servlets ou de JSP.
Toutefois, si lon se cantonne au monde intranet, - caractris par des dbits levs et
pour lequel les problmes de scurit se posent de manire diffrente -, les applets gar-
dent tout leur intrt et offrent des possibilits nettement suprieures aux autres techno-
logies.
47.2 LE CYCLE DE VIE DUNE APPLET
A la diffrence des applications autonomes, on peut constater que les applets ne poss-
dent pas de fonction main. Comme nous le verrons par la suite, ce point dentre sera
remplac dans les applets par deux procdures: init et start.
Une applet peut se trouver dans diffrents tats en fonction de ltat de la page HTML
qui la rfrence.
Remarquons en prliminaire quun navigateur Internet manipule les pages HTML au
moyen dune pile : quand une nouvelle page est charge, cette dernire est place au
sommet de la pile ; puis est interprte par le navigateur.
Par la suite, lutilisateur peut oprer un parcours de la pile en avant ou en arrire, au
grs de ses dsirs.
Et ainsi, nous pouvons donc dfinir deux tats pour une page HTML qui aura t char-
ge par le navigateur :
1/ page active : en cours dinterprtation ;
2/ page inactive : dans le cas contraire.
Nous retrouverons les deux tats Active et Inactive dans le cycle de vie dune applet.
Une applet connat par ailleurs 2 tats supplmentaires : Charge, et Initialise.
Java - Un abrg - 72 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
Voici le diagramme dtat correspondant au cycle de vie dune applet :
Figure 1: Cycle de vie dune applet
Aux changements dtat de lapplet sont associes 4 mthodes dfinies dans la classe
Appl et : i ni t , st ar t , st op et dest r oy.
Dbut
Dtruite
Charge
Initialise
Inactive Active
i ni t ( )
st ar t ( ) st op( )
st op( )
st ar t ( )
dest r oy( )
Dbut Dbut du chargement de lapplet ( loading )
Charge Lapplet a t charge en mmoire, lobjet reprsentant lapplet a t
instanci en utilisant le constructeur sans paramtre (constructeur par
dfaut, ou constructeur spcifi par le programmeur), tout lenviron-
nement de lapplet est en place : environnement graphique, possibi-
lit de travailler avec le rseau, ..
Initialise Ds que lapplet est charge et par consquent que tout son environ-
nement est en place, la machine virtuelle lui envoie aussitt le mes-
sage i ni t ( ) (voir ci-aprs). Aprs excution de la mthode
i ni t , lapplet passe ltat Initialise.
Active,
Inactive
Ces deux tats refltent celui de la page WEB qui rfrence lapplet.
Lapplet est active si la page WEB est active, elle est inactive si la
page WEB est inactive.
Dtruite Lexcution de lapplet est termine. Cette terminaison arrive quand
lapplet est dcharge ( unloaded ), et ceci typiquement lorsque le
navigateur est ferm.
Certains navigateurs toutefois, oprent un rechargement de lapplet
lorsque lutilisateur retourne la page de lapplet.
ELS - 16 avril 2002 23:14
Java - Un abrg - 73 - Annexe A - Les Applets
Ces 4 mthodes sont appeles automatiquement par la machine virtuelle loccasion
dun changement dtat. Par dfaut, ces 4 mthodes ne font rien ! Le concepteur de
lapplet est libre de les redfinir son grs, selon ses besoins. Limportant est quil
sache exactement quand ces mthodes sont appeles.
47.2.1 Un exemple : illustration du cycle de vie
Voici, pour illustrer les notions que nous venons de prsenter, le code dune petite applet
sans prtention qui se contente dafficher ses changements dtat.
import j ava. appl et . Appl et ;
import j ava. awt . Gr aphi cs;
public class Appl et 2 extends Appl et {
init( ) Ce message est envoy lapplet ds que cette dernire est charge
et dispose de tout son environnement. Il est recommand au pro-
grammeur de placer son code dinitialisation dans cette mthode
plutt que dans le constructeur. Notamment pour tout ce qui con-
cerne laccs au rseau (chargement dimages par exemple).
En effet, le programmeur a la garantie que le message i ni t ( )
sera reu une fois seulement que lapplet disposera de tout son
environnement.
start( ) Ce message est envoy aprs le message i ni t ( ) , ou ds que la
page HTML devient nouveau active.
Cest par exemple dans cette mthode que lon placera les instruc-
tions propres au dmarrage de threads .
stop( ) Ce message est envoy ds que la page HTML devient inactive.
En principe, le programmeur devrait exploiter cette mthode pour
suspendre ou pour stopper certaines activits lances loccasion
du message st ar t , activits dont lexcution est devenue inu-
tile puisque lutilisateur ne visionne plus la page HTML.
destroy( ) Le navigateur peut tre ferm, ou lapplet peut tre recharge
(reloading). Dans les deux cas, notre applet va mourir On
lui donne loccasion de dicter ses dernires volonts dans la
mthode dest r oy( ) .
Si lapplet se trouve initialement ltat Active, le message
st op( ) lui est dabord envoy. Cette dernire passe donc
dabord ltat Inactive avant dtre dtruite.
Le programmeur peut placer dans la mthode dest r oy( )
dventuelles instructions de nettoyage , utilises par exemple
pour librer certaines ressources.
Java - Un abrg - 74 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
private St r i ngBuf f er sb= new St r i ngBuf f er ( ) ;
public Appl et 2 ( ) { sb. append ( " Const r uct i on. . . " ) ; }
public void i ni t ( ) {
af f i cher ( " i ni t . . . " ) ;
}
public void st ar t ( ) {
af f i cher ( " st ar t . . . " ) ;
}
public void st op( ) {
af f i cher ( " st op. . . " ) ;
}
public void dest r oy( ) {
af f i cher ( " Dest r uct i on i mmi nent e. . . " ) ;
}
private void af f i cher ( St r i ng mot ) {
sb. append( mot ) ;
r epai nt ( ) ;
}
public void pai nt ( Gr aphi cs g) {
// Procdure appele:
// La premire fois que l'applet est affiche,
// A chaque fois que la surface de l'applet ncessite un rafrachissement,
// A chaque invocation du message "repaint()"
//Dessine un rectangle autour de la zone de texte
g. dr awRect ( 0, 0, si ze( ) . wi dt h - 1, si ze( ) . hei ght - 1) ;
//Affiche le texte l'intrieur du rectangle
g. dr awSt r i ng( sb. t oSt r i ng( ) , 5, 15) ;
}
}
Son excution au moyen de lappletViewer affichera ceci :
Const r uct i oni ni t st ar t
Si la mme applet est excute au moyen dun navigateur, on verra safficher ceci :
Const r uct i oni ni t st ar t stopstart stop start
La paire st opst ar t apparatra chaque fois que la page HTML qui rf-
rence lapplet aura t dsactive, puis active nouveau.
Le texte " Dest r uct i on i mmi nent e. . . " , affich au moment de la fermeture
du navigateur, naura pas le temps dtre visualis, moins davoir une machine parti-
culirement lente.., ce qui ne saurait tre le cas, vous connaissant.
47.3 DESSINER DANS UNE APPLET, AJOUT DE COMPOSANTS GUI
Les applets, contrairement aux applications autonomes, nont pas besoin de crer de
ELS - 16 avril 2002 23:14
Java - Un abrg - 75 - Annexe A - Les Applets
fentre: lapplet sexcute doffice dans la fentre du navigateur
1
3
. Toutefois, ceci
nempche pas une applet de crer une ou plusieurs fentres supplmentaires si le cur
lui en dit.
47.3.1 Les applets sont de riches hritires..
Une applet est ralise par drivation de la classe Applet. Nous lavons remarqu
au travers de nos deux premiers exemples : Appl et 1 et Appl et 2 :
public class Appl et 1 extends Appl et {. . }
public class Appl et 2 extends Appl et {. . }
Voici la situation de nos deux applets au sein de la hirarchie dhritage:
Figure 2: La class Applet au sein de la hirarchie d'hritage
1/ Une applet est un Component
En tant que tel, une applet est un composant graphique, qui peut interagir
1.
3
Attention la portabilit ! les composants dune applet (boutons, champs texte, ..) peuvent nces-
siter un espace graphique dont la taille diffre dun navigateur lautre. Il faut donc prvoir de la marge.
Par ailleurs, il est vivement conseill dutiliser des gestionnaires de prsentation flexibles, qui sadaptent
la taille de la fentre, comme par exemple Bor der Layout ou Gr i dBagLayout .
Object
Component
Container
Applet2
Panel
Applet
Applet1
getGraphics(): Graphics
paint(Graphics)
repaint()
:
setForeground (couleur)
:
Graphics
drawString(..)
drawRect (..)
:
setColor(..)
setFont(..)
:
contexte graphique
associ
setLayout (..)
paint(..)
validate()
:
"Container" disposant d'un
gestionnaire de prsentation
de type "FlowLayout"
Java - Un abrg - 76 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
avec lutilisateur.
Ainsi, lapplet est associe un contexte graphique dont on peut spcifier la
fonte, la couleur et dans lequel on peut dessiner au moyen de mthodes telles
que dr awSt r i ng, dr awRect , .. La classe Component met
disposition la mthode r epai nt ( ) , qui efface la surface du composant
et appelle la mthode pai nt ( . . ) dfinie ou redfinie pour ce compo-
sant.
Au niveau des vnements, on pourra rcuprer les actions de la souris, la
pression des touches du clavier, le changement de focus, ..
2/ Une applet est un Container
En tant que tel, une applet est un composant graphique qui peut contenir
dautres composants : des boutons, des champs de saisie, etc.. Ces compo-
sants sont rajouts au moyen des mthodes add( . . ) .
Un Cont ai ner propose par ailleurs une mthode pai nt ( . . ) , qui a
pour effet de distribuer cet appel tous les composants quil contient. Si
cette mthode est redfinie au niveau dun Container, ne pas oublier de la
terminer par super.paint(g) afin que tous les composants reoivent
leur tour le message pai nt .
Enfin, un Cont ai ner propose la mthode validate() , qui a pour
effet dafficher nouveau tous ses composants. A utiliser aprs avoir opr
des adjonctions ou des suppressions de composants de manire dynamique
alors que lapplet est dj affiche.
3/ Une applet est un Panel
Un Panel nest rien dautre quun Cont ai ner dont le gestionnaire
de prsentation a t pr-tabli pour tre de type Fl owLayout : les
composants sont aligns de gauche droite au fur et mesure de leur adjonc-
tion.
47.3.2 Dessiner dans une applet
En tant que Component , une applet dispose dun contexte graphique dont la taille
de la surface a t dfinie au moment du chargement de lapplet (paramtres WI DTH
et HEI GHT de la balise <APPLET>).
Pour dessiner, il suffira lapplet de sadresser son contexte graphique au sein de la
mthode paint, hrite de Applet, mais que lon peut redfinir:
publ i c void pai nt ( Gr aphi cs g) {
super . pai nt ( g) ;
g. dr awSt r i ng ( " Bonj our " , 10, 10) ;
g. dr awRect ( 10, 10, 100, 100) ;
. .
}
La mthode pai nt est appele automatiquement par la machine virtuelle la pre-
mire fois que l'applet est affiche. Par la suite, cette mthode est appele chaque fois
ELS - 16 avril 2002 23:14
Java - Un abrg - 77 - Annexe A - Les Applets
que la surface graphique de l'applet ncessite un rafrachissement (la page a t recou-
verte par une autre application), ou lorsque le programmeur lui-mme appelle la
mthode repaint
t hi s. repaint( ) ;
L'excution de la mthode r epai nt a pour effet:
1/ d'effacer la surface graphique du composant en utilisant la couleur de fond
du composant,
2/ d'assigner la couleur de premier plan du composant la couleur du contexte
graphique,
3/ d'appeler la mthode pai nt pour redessiner l'applet.
Pour une plus grande efficacit, le programmeur peut dfinir la zone de la surface gra-
phique effacer:
t hi s. repaint( x, y, l ar geur Zone, haut eur Zone) ;
47.4 LES THREADS ET LES APPLETS
Une activit interne excute ses instructions concurremment au reste de lapplication.
Remarquons en prliminaire que lexcution dune applet est un processus qui comporte
dj, au dpart, plusieurs activits concurrentes. A ces activits viennent se rajouter les
threads des activits internes dfinies par le programmeur lui-mme.
En effet, lexcution mme dune applet fait intervenir les activits suivantes :
un thread pour lAWT, responsable de linterface avec lutilisateur : affichage
dans la fentre et gestion des vnements ;
un ou plusieurs threads (a dpend ..), qui, placs sous le contrle du naviga-
teur, ont la responsabilit dappeler les mthodes i ni t , st ar t , st op
et dest r oy. Dans le cas o le navigateur utilise plusieurs threads, ces der-
niers appartiennent au mme groupe de threads , ainsi que tous les threads
crs en interne par les mthodes i ni t , st ar t , etc..
La dfinition dune activit concurrente au sein dune applet est chose courante. Nota-
mment, il nest pas rare dutiliser un thread pour oprer des initialisations en arrire-
plan. Par exemple, si lapplet doit charger un certain nombre dimages pour mettre en
uvre une animation, il y a tout intrt placer le code de chargement dans une activit
parallle. Le placer dans la mthode i ni t ( ) aurait pour consquence de bloquer
lexcution de lapplet en attendant que les images aient t compltement charges
1
4
.
1.
4
Notons toutefois que les images au format GIF et JPEG sont charges automatiquement par une
tche de fond que le programmeur na pas besoin de grer.
Java - Un abrg - 78 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
Un modle pour grer le thread dune applet
!! Les activits internes dune applet sexcutent mme quand lapplet nest plus
active !! Aprs avoir dmarr, une activit interne continue son excution tant que la
mthode r un( ) nest pas termine, et ceci indpendamment du fait que lapplet soit
active ou non.
Dans la plupart des cas, on libre les ressources occupes par une applet lorsque la page
qui la contient nest plus active.
Lide consiste exploiter la mthode stop() en crivant les instructions qui
entranent la destruction des threads crs par lapplet. Ces threads seront crs nou-
veau quand la page sera nouveau active en plaant le code correspondant dans la
mthode start().
Dans tous les cas, les activits internes ne survivront pas lapplet ! quand cette der-
nire sera dtruite loccasion par exemple de la fermeture du navigateur, le message
ki l l ( ) sera envoy au groupe de threads auquel elles appartiennent.
Considrons lexemple dune applet simulant un chronomtre et qui disposerait dune
tche interne pour maintenir jour le comptage des millisecondes.
Voici lentte de notre classe:
cl ass Chr onomet r e extends Appl et
implements Runnabl e {
// Variable dinstance
Thr ead act i vi t ; // Activit interne
:
Mthode start( ) :
public void st ar t ( ) {
act i vi t = new Thr ead( t hi s) ;
act i vi t . st ar t ( ) ;
}
Le thread est cr puis dmarr chaque fois que lapplet est active.
Mthode stop( ) :
public void st op( ) {
act i vi t = nul l ;
}
Lapplet est dsactive, on indique au thread courant quil doit terminer son
excution.
ELS - 16 avril 2002 23:14
Java - Un abrg - 79 - Annexe A - Les Applets
Mthode run( ) :
public void r un( ) {

while ( Thread.currentThread() == activit) {

.. Code de l'activit ..
try {Thr ead. sl eep( 100) ; }
catch ( I nt er r upt edExcept i on e) {}
}
}
Le message Thr ead. cur r ent Thr ead( ) retourne le thread courant, en
train dexcuter les instructions de r un( ) .
Le test de la boucle whi l e nest plus vrifi dans lun ou lautre des deux
cas suivants :
1/ lapplet a t dsactive, la mthode st op( ) a donn la valeur nul l
la variable act i vi t .
2/ lapplet a t dsactive, puis ractive aussitt. Lancienne activit, qui
tait endormie, na pas eu le temps de remarquer que la variable act i vi -
t tait passe nul l . Cette variable rfrence maintenant une nou-
velle activit (cre et dmarre par st ar t ( ) ) . Nous retrouvons ainsi
avec deux activits internes qui excutent concurremment la mthode
run () !!
A son rveil, lancienne activit constatera quelle nest plus rfrence par
la variable act i vi t . Elle va donc terminer son excution, et sera d-
truite sous peu. Ouf !
La nouvelle activit continue normalement son excution.
47.5 LA SCURIT ET LE DROIT DES APPLETS
Rappelons quune applet est une application tlcharge depuis nimporte quel point du
rseau Internet. Cette possibilit soulve un grave problme de scurit: le poste du
client doit tre protg contre lexcution dune application qui violerait lintgrit de
son environnement.
Par exemple, il serait possible dcrire une applet qui tablit une liste de tous les
fichiers .exe du disque dur local et envoie cette information un site Internet int-
ress.
Il serait encore possible dcrire une applet qui installe un virus sur le disque local
Le concept de scurit est donc primordial, sans quoi personne naccepterait de tl-
charger des applets.
Nous commenons par dcrire les deux premiers niveaux de scurit, offerts par le lan-
gage lui-mme, puis nous prsenterons le troisime niveau de scurit, assur cette
fois-ci par les navigateurs.
Java - Un abrg - 80 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
Niveau 1 : la scurit offerte par le langage Java
Le langage Java offre au dpart un certain nombre de caractristiques qui permettront
dexcuter les applets avec une certaine scurit.
Ces caractristiques empchent principalement les applets davoir un accs direct la
mmoire. Cet accs direct permettrait aux applets :
de dtruire ou de modifier des donnes du client,
de communiquer des donnes confidentielles du client,
de dtruire du matriel situ sur la machine du client,
daccaparer les ressources du client et de rendre ainsi sa machine inutilisable.
Voici certaines de ces caractristiques, que le compilateur vrifiera:
le langage Java nutilise pas de pointeurs de manire explicite. Les objets sont
accds en les identifiant spcifiquement au moyen dun nom. Cette absence
de pointeurs ne permet pas daccder directement certaines positions
mmoire de la machine.
Notamment, contrairement C++, Java manipule les textes et les tableaux au
moyen de structures de haut niveau sans avoir besoin de manipuler une quel-
conque arithmtique de pointeurs.
laccs aux lments des tableaux est contrl en temps rel, pendant lexcu-
tion du programme : un dpassement du tableau (ce qui reviendrait un accs
direct en mmoire) provoque aussitt la leve dune exception.
le compilateur Java vrifie que toutes les coercitions de type sont lgales. Rap-
pelons que Java est un langage fortement typ.
Ainsi, la modification indirecte des rfrences mmoire par le programmeur est impos-
sible. Par ailleurs, lenvironnement dexcution vrifie que la coercition dun objet
vers une sous-classe est bien conforme ce qui avait t prvu au niveau de la compila-
tion.
Niveau 2 : contrle de la conformit du byte-code
Le niveau 1 de scurit est assur par le compilateur.
Peux-ton toujours se fier aux compilateurs ? videmment non. Raison pour laquelle le
code gnr par le compilateur (le byte-code ) sera une nouvelle fois vrifi avant
dtre interprt.
Ainsi, loccasion du tlchargement dune applet, le chargeur de classes ( class
loader ) vrifie que les fichiers . cl ass , - qui contiennent le byte-code
interprter -, sont bien conformes la spcification du langage
1
5
.
ELS - 16 avril 2002 23:14
Java - Un abrg - 81 - Annexe A - Les Applets
Le navigateur nutilise quun seul chargeur de classe . Ce dernier est tabli par le
navigateur, au moment o le navigateur est lanc. Par la suite, ce chargeur ne peut pas
ni modifi, ni surcharg. Notamment, les applets ne peuvent pas crer ou rfrencer
leur propre chargeur.
Ce chargeur est indpendant de tout compilateur. Ainsi, il fonctionnera de manire
identique et effectuera le mme contrle de conformit avec des byte-code issus de
la compilation dautres langages tels que Ada ou C++.
Une fois la vrification effectue, il y a plusieurs possibilits. Les deux dernires per-
mettent damliorer sensiblement les performances.
interprter le code instruction par instruction,
associer linterprteur un compilateur la vole , qui compile les instruc-
tions dans le code natif de la machine cliente lors de leur premire excution.
Ce code natif tant excut lors des excutions ultrieures.
compiler le byte-code en crant du code natif (code de la machine cliente).
Niveau 3 : la scurit offerte par les navigateurs
Les navigateurs interviennent pour le tlchargement et pour lexcution des applets.
Notre discours est donc centr sur les applets et non pas sur les applications autonomes
( Standalone Java applications ). En effet, du point de vue de la scurit, ces deux
types dapplications sont pris en charge de manire trs diffrente.
applications autonomes
Une application autonome peut tout faire : lire et crire sur le disque local,
charger en mmoire des excutables ou des librairies pr-compiles en code
natif ( .dll ), ou encore communiquer avec des machines distantes via le
rseau.
applets
Les applets ont potentiellement les mmes droits..
Toutefois, le navigateur contrle ces accs et distingue deux types dapplets :
les applets dignes de confiance et les autres..
Le gestionnaire de scurit ( Applet Security Manager ), appel quel-
quefois le policier .. est un mcanisme toujours actif, qui assure le respect
1.
5
Notamment, il est vrifi:
quil ny aura pas de stack overflow ,
que les accs aux registres sont bien corrects,
que les paramtres des instructions sont corrects,
quil ny pas de conversions de donnes illgales.
Java - Un abrg - 82 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
des restrictions daccs pendant lexcution mme de lapplet.
Rgler le niveau de confiance
Dans ce dernier cas, lutilisateur peut spcifier le niveau de confiance en distinguant les
applets signes (voir ci-aprs), des applets non signes . Dans les deux cas, luti-
lisateur indiquera si les applets sont dignes de confiance ou si elles ne le sont pas. Si oui,
il prcisera un niveau de restrictions : lev, moyen ou faible, niveau qui dpend vi-
demment dun browser lautre.
un niveau lev de scurit signifie que lapplet na aucun droit
un niveau faible de scurit signifie au contraire que lapplet a tous les droits
le niveau intermdiaire, dit bac sable (sandbox) permet lutilisateur
de spcifier les objets placs dans le bac sable et avec lesquels lapplet peut
samuser..
Les applet signes
Une applet signeest une applet qui comporte lidentification de son auteur : celui-ci a
accept de confier son identit, laquelle est encrypte dans lapplet. Cette signature ga-
rantit que les donnes qui sont charges sont bien celles que le client a demandes. Luti-
lisateur doit spcifier au navigateur la liste des signatures autorises.
Attention toutefois.. est-ce que lauteur en question est vraiment digne de confiance ?
Le gestionnaire de scurit
Voici quelques informations relatives au gestionnaire de scurit que nous avons men-
tionn plus haut.
Par dfaut, les applications autonomes sexcutent sans gestionnaire de scurit. Elles
peuvent donc tout se permettre
1
6

Il nexiste quun seul gestionnaire de scurit au niveau du navigateur. Ce dernier est
spcifi et install au moment o le navigateur est lanc. Par la suite, ce gestionnaire
ne peut tre ni modifi ni surcharg, et les applets ne peuvent pas non plus ni crer, ni
rfrencer leur propre gestionnaire de scurit.
1.
6
Si cela savre gnant, il est possible de modifier ce comportement par dfaut en crivant et en installant
son propre gestionnaire de scurit.
ELS - 16 avril 2002 23:14
Java - Un abrg - 83 - Annexe A - Les Applets
Figure 3: Le gestionnaire de scurit
Ds que le gestionnaire de scurit dtecte une violation de la scurit, il lve aussitt
une exception de type Secur i t yExcept i on. Cette dernire peut tre rcupre
par l'applet qui doit se rsoudre alors faire autrement , si elle le peut ..
Toute mthode a la possibilit dinterroger le gestionnaire de scurit afin de savoir si
telle ou telle opration est permise ou non (voir les mthodes checkXXX de la
classe Secur i t yManager ).
47.6 CE QUI EST INTERDIT AUX APPLETS
Ce qui suit sadresse aux applets non dignes de confiance, qui ont donc des droits dac-
cs hautement limits.
Une applet ne peut pas :
1/ lire ou crire dans des fichiers situs sur le disque local du client ;
2/ ouvrir une connexion Internet autrement quavec lhte depuis lequel lap-
plet a t tlcharge; pour contourner cet empchement, il suffit que lap-
plet communique avec une application autonome situe sur le serveur. Cette
dernire, en tant quapplication autonome, aura la possibilit de se connecter
sur dautres sites.
3/ dmarrer un excutable situ sur la machine du client ;
4/ charger en mmoire des excutables ou des librairies pr-compiles
( .dll par exemple). Bien entendu, une applet peut utiliser son pro-
pre code, plac dans le rpertoire dhbergement du serveur, ainsi que les
classes de lAPI Java, situes dans lenvironnement du navigateur ou de
lappletViewer.
5/ dfinir des mthodes natives, cest--dire des mthodes pr-compiles dans
le langage de la machine client, et qui pourraient commander indirectement
des accs aux ressources.
Ouvrir une connexion rseau
Ouvrir une connexion avec lhte dhbergement et donc la seule possibilit.
Ressources du systme (fichiers, rseau)
Gestionnaire de scurit
Accs contrl
Applet tlcharge Application locale
Pas de contrainte
d'accs
Applet non
digne de confiance
Applet signe, et
digne de confiance
Java - Un abrg - 84 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
Il peut sagir en fait :
de lhte do provient la page HTML, si le code de lapplet et la page HTML
qui la rfrence sont situes au mme endroit ;
de lhte spcifi dans le paramtre optionnel codebase de la balise
<APPLET>, qui indique o trouver les fichiers . cl ass tlcharger.
47.7 CE QUI EST PERMIS AUX APPLETS
Soyons positifs et parlons un peu des permissions..
Accs aux proprits du systme
Les applets, quelles soient excutes par le navigateur ou par lappletViewer , peu-
vent accder certaines proprits du systme sur lequel elles sont en train de sexcu-
ter.
Par exemple, on pourrait crire :
St r i ng s = Syst em. get Pr oper t y ( " os. name" ) ;
Parmi ces proprits, on trouve :
Les applets peuvent consulter cette information, il nexiste pas de moyen pour les en
empcher.
Le programmeur na pas non plus les moyens de permettre aux applets daccder aux
autres proprits, comme par exemple :
java.version No de version de Java
java.vendor Spcification du fournisseur de la machine Java
java.vendor.url Son adresse URL
os.name Nom du systme dexploitation
os.arch Architecture du systme dexploitation
os.version Version du systme dexploitation
file.separator Sparateur de rpertoires (p.ex : / )
path.separator Par exemple : :
line.separator Sparateur de ligne
ELS - 16 avril 2002 23:14
Java - Un abrg - 85 - Annexe A - Les Applets
Comment sauvegarder des informations ?
Comme une applet na pas le droit daccder au disque local de la machine sur laquelle
elle sexcute, le seul moyen est doprer cette sauvegarde du ct serveur : une applet
peut en effet lire ou crire partir de fichiers situs du ct serveur
1
7
Quen est-il des applets charges depuis le systme de fichiers ?
Si les applets sont charges depuis le rseau, elles sont sujettes aux restrictions daccs
que nous avons mentionnes.
Si au contraire lapplet rside sur le disque local du client, dans un rpertoire apparte-
nant au CLASSPATH du client, les restrictions daccs sont beaucoup plus faibles.
Dune part, de telles applets ne sont pas passes par le vrificateur de code . Dautre
part, elles peuvent:
lire ou crire dans des fichiers du disque local,
charger des librairies ( . dl l ) en mmoire vive,
lancer des excutables.
47.8 COMMENT MANIPULER LES RESSOURCES WEB DANS UNE
APPLET ?
Tout en restant dans le cadre strict dfini par la politique des droits daccs, une applet
Java a lautorisation daccder des ressources de nature trs varies sur le rseau :
des fichiers son, des images, des vidos, ..
47.8.1 Identification dune ressource (ladresse URL)
Une ressource sera identifie de manire non ambigu par son adresse Internet que lon
appelle une URL ( Uniform Reference Location ).
Voici le format gnral dune URL :
java.class.path Le classpath de Java
java.home Le rpertoire dinstallation de Java
user.dir Le rpertoire courant de lutilisateur
user.home Le rpertoire de base de lutilisateur
user.name Le nom de lutilisateur
1.
7
Ceci peut tre opr soit par le biais de lapplication serveur (qui a le droit daccs, en tant
quapplication autonome), soit par le biais dun excutable dont le code est install du ct serveur
(script PERL, CGI, ou autre), et qui serait dmarr depuis lapplet, soit encore par biais
dune servlet , lance en mme temps que lapplet par la page html.
Java - Un abrg - 86 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
Cette information indique au navigateur le nom du protocole utiliser.
1/ Le protocole
Bien que le protocole standard sappelle HTTP ( HyperText Transert
Protocol ), dautres protocoles sont utiliss sur Internet, comme par exem-
ple:
FTP ( File Transfer Protocol ) pour le transfert de fichiers ;
SMTP (Simple Mail Transfer Protocol ) pour le courrier electroni-
que.
2/ Lidentification du serveur (adresse IP)
Cette information dsigne une machine situe sur le rseau Internet.
En principe, il sagit dune adresse numrique, code actuellement sur 32
bits, et crite sous la forme de 4 entiers de 0 255 spars par un point. Cette
adresse porte le nom dadresse Internet , ou encore dadresse IP .
En gnral, par commodit, on affecte un nom logique cette adresse, qui
sera compos dun nom de machine, dun nom de sous-domaine et dun nom
de domaine.
La correspondance entre le nom logique et ladresse IP est effectue par un
serveur de noms ( DNS , Domain Name Server ), que lon trouve
au niveau de chaque domaine.
3/ Le numro de port
Un serveur peut tre caractris par plusieurs programmes auxquels il est
possible de communiquer via le rseau. Ces diffrents programmes sont ap-
pels des services .
Chaque service est identifi par un numro de port.
Les serveurs offrent un service http affect de manire normalise au num-
ro 80. Ainsi, la valeur 80 est prise par dfaut si ladresse URL ne spcifie
aucun numro de port : il sagit donc dun champ facultatif.
4/ Lidentification de la ressource
Cette information prcise le chemin daccs de la ressource sur la machine.
47.8.2 Comment rcuprer lURL de lapplet ou de la page qui rf-
rence lapplet ?
Pour charger un fichier, une applet utilisera en gnral un URL relatif . Plutt que
de dcrire exactement o se trouve le fichier, cet URL se basera sur le rpertoire de base
http: //eig.unige.ch :80 /sons/bip.mav
Protocole Identification du serveur(adr. IP)
Machine.Sous-domaine.Domaine
Port
(Service)
Ressource
ELS - 16 avril 2002 23:14
Java - Un abrg - 87 - Annexe A - Les Applets
do provient lapplet.
A cette fin, le systme propose deux mthodes :
1/ la mthode get Codebase hrite de la classe Applet, qui rcupre
lURL spcifiant le rpertoire partir duquel lapplet a t charge, et que
lon appellera par la suite le rpertoire code-base ;
2/ la mthode get Document Base, qui rcupre lURL de la page HTML
qui rfrence lapplet, et que lon appellera par la suite le rpertoire
document-base .
A moins que la balise <APPLET> ne spcifie une valeur pour le paramtre
codebase , les URL retourns par ces deux mthodes sont identiques.
Pour les applets non dignes de confiance , seul lURL codebase sera utilis :
une telle applet ne pourra accder qu ce rpertoire et aux sous-rpertoires de ce der-
nier.
47.8.3 Exemple : chargement dun fichier image ou dun fichier son
par une applet
Supposons un fichier image et un fichier son, tous deux situs du ct serveur, dans le
rpertoire qui hberge la page HTML.
Supposons que le nom de ces fichiers soit spcifi dans la balise <APPLET> de la page
HTML, par le biais de deux paramtres i mage = et son = . La
mthode get Par amet er permet dobtenir la valeur de ces paramtres :
String fichierImage = getParameter ("image") ;
String fichierSon = getParameter ("son");
Supposons maintenant que ces deux fichiers se trouvent situs dans le sous-rpertoire
i nf o du rpertoire code-base :
Pour charger les deux fichiers, on crira:
I mage xx = get I mage ( get CodeBase( ) , " i nf o/ " +f i chi er I mage) ;
Audi oCl i p yy =get Audi oCl i p ( get CodeBase( ) , " i nf o/ " f i chi er Son) ;
sous-rpertoire "info"
rpertoire "code-base"
fichier ".class"
de l'applet
fichier son fichier image
Java - Un abrg - 88 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
En fait, le fichier image ne sera effectivement charg que lorsque la commande
dr awI mage ( xx, . . ) sera envoy au contexte graphique de l'applet:
g. dr awI mage( xx, 0, 0, t hi s) ;
Le fichier son sera manipul au moyen des mthodes pl ay, l oop ou st op:
yy. pl ay( ) ;
yy. st op( ) ;
yy. l oop( ) ; // Jouer en boucle
47.9 LA BALISE <APPLET> ET LES PARAMTRES
Nous avons dj introduit la balise <APPLET> du langage HTML. Nous allons main-
tenant tudier en dtail lenvironnement HTML des applets et voir notamment comment
passer des paramtres une applet.
Les paramtres permettent l'utilisateur d'une applet d'influencer sur la faon dont
cette dernire sera excute.
47.9.1 Spcifier les paramtres et leur valeur
Considrons lexemple suivant :
<APPLET
CODE = " xxxx. cl ass"
WI DTH = 450
HEI GHT = 150
CODEBASE = ht t p: / / www. t com. ch/ appl et s/
ALI GN = " LEFT"
HSPACE = 10
VSPACE = 10
ALT = " i mpossi bl e de char ger l ' appl et "
>
<PARAM NAME = " nomDeLappl et " VALUE = " monNom" >
<PARAM NAME = " aut r ePar amet r eDeTypeEnt i er " VALUE = 10>
</APPLET>
Dans cette balise, seuls les paramtres CODE, WI DTH et HEI GHT sont obliga-
toires, les autres sont facultatifs.
ELS - 16 avril 2002 23:14
Java - Un abrg - 89 - Annexe A - Les Applets
CODE
Pour rfrencer le fichier . cl ass de l'applet excuter
WIDTH, HEIGHT
Largeur et hauteur de la surface rserve l'excution de l'applet dans la fentre
d'interprtation de la page HTML
CODEBASE
URL complet du rpertoire contenant le fichier . cl ass de l'applet ex-
cuter.
Ce paramtre est obligatoire si cet URL est diffrent de l'URL qui hberge la
page HTML.
L'URL peut tre spcifi en absolu (voir l'exemple plus haut) , ou en relatif.
Dans ce dernier cas, l'URL est spcifi relativement l'URL de la page HTML
qui encapsule l'applet; trs souvent, cet URL aura la forme suivante: "unR-
per t oi r e/ ", correspondant au schma prsent ci-aprs.
ALIGN
Pour positionner l'applet par rapport la ligne courante de la page HTML.
Il est prvu de positionner lapplet par rapport au texte de la ligne courante. Le
paramtre prendra alors lune ou lautre des valeurs suivantes :
RIGHT : droite du texte, LEFT : sa gauche, TEXTTOP : le texte en haut,
MIDDLE : le texte au milieu, BOTTOM: le texte en bas.
Ou alors, lapplet sera positionne par rapport au plus grand composant de la
ligne courante. Il suffit de donner au paramtre lune ou lautre des valeurs
suivantes :
TOP : positionne en haut, ABSMIDDLE : au milieu, ABSBOTTOM: posi-
tionne en bas.
ALT
Pour dsigner le texte qui sera affich si l'applet ne peut pas tre charge
HSPACE et VSPACE
Pour dsigner des espacements horizontal et vertical qui entourent la surface
rserve l'applet. Ces paramtres sont exprims en pixels.
sous-rpertoire "unRpertoire"
rpertoire "document-base"
fichier ".html"
fichier ".class"
de l'applet
Java - Un abrg - 90 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
la balise <PARAM NAME = "nomDeLapplet" VALUE = "monNom">
Utilise pour spcifier un paramtre personnalis , spcifi par son nom et sa
valeur.
De telles balises peuvent apparatre un nombre quelconque de fois. On peut
ainsi spcifier autant de paramtres qu'on le dsire.
La valeur d'un paramtre peut appartenir l'un ou l'autre des types suivants:
URL
entier, rel
boulen ("true" ou "false")
String
47.9.2 Lire la valeur des paramtres dans les instructions de l'applet
Pour lire la valeur des paramtres spcifis dans la balise <APPLET>, on peut disposer
de la mthode get Par amet er :
publ i c St r i ng getParameter ( St r i ng name)
Cette mthode retourne un St r i ng convertir suivant le type du paramtre.
Voici quelques exemples:
St r i ng nomAppl et = get Par amet er ( " nomDeLappl et " ) ;
int l ar geur Sur f ace =
( I nt eger . val ueOf ( get Par amet er ( " WI DTH" ) ) ) . i nt Val ue( ) ;
Comment aider l'utilisateur utiliser correctement les paramtres ?
Les navigateurs peuvent utiliser les informations retournes par la mthode get Pa-
r amet er I nf o pour aider les utilisateurs spcifier la valeur des paramtres.
Pour exploiter cette possibilit, il suffit au programmeur d'crire la mthode get Pa-
r amet er I nf o:
Voici un exemple:
public St r i ng[][] get Par amet er I nf o ( ) {
St r i ng [][] i nf o = {
// Nom du paramtre Type Description
{" nomDeLappl et " , " St r i ng" , " nomde l ' appl et " },
{" aut r ePar amet r e" , " i nt " , " bl a bl a bl a" },
:
}
return i nf o;
}
ELS - 16 avril 2002 23:14
Java - Un abrg - 91 - Annexe A - Les Applets
Cette mthode doit retourner un tableau deux dimensions, un tableau de tableaux de 3
chanes de caractres.
47.9.3 Le paramtre ARCHIVE : les fichiers JAR
Si le code de lapplet est compos de plusieurs fichiers . cl ass , le chargement
peut tre long, trs long
Pour acclrer le processus, une premire solution consiste rassembler plusieurs clas-
ses dans un seul fichier. Ainsi, le nombre de connexions http sera rduit dautant.
Comme, le dmarrage dune connexion http peut ncessiter plusieurs secondes, lco-
nomie de temps est consquente.
Une deuxime solution est en fait une amlioration de la prcdente : les fichiers
. cl ass sont rassembls dans un ou dans plusieurs fichiers, qui sont eux-mmes
comprims en sappuyant sur le format ZIP . Il sagit du format standard darchi-
vage utilis par Java, que lon appelle le format JAR , introduit dans lenvironne-
ment JDK 1.1.
Les fichiers JAR devant tre chargs pour excuter lapplet sont spcifis au moyen
du paramtre ARCHI VE de la balise <APPLET> :
<APPLET
CODE = " nomFi chi er . cl ass"
ARCHIVE = " f i chi er J AR1, f i chi er J AR2"
:
</ APPLET>
Evidemment, le ou les fichiers JAR doivent tre prpars par le programmeur. A
cette fin, lenvironnement de dveloppement Java fournit lutilitaire jar , prvu pour
construire de tels fichiers.
Voici par exemple la commande qui permettra de rassembler toutes les classes
( . cl ass ) et toutes les images ( . gi f ) du rpertoire courant dans un seul
fichier compress t r uc. j ar :
jar cvf t r uc. zi p *. cl ass *. gi f
47.10POINTS DIVERS
Voici, pour terminer, une liste de remarques ou dinformations diverses, toutes relatives
lutilisation des applets.
Java - Un abrg - 92 - Annexe A - Les Applets
ELS - 16 avril 2002 23:14
47.10.1 Affichage dune ligne de statut
Les navigateurs offrent la possibilit aux applets dafficher une ligne de statut.
Attention ! au cas o la page HTML rfrence plusieurs applets, cette ligne de statut
sera partage entre toutes.
La mthode showSt at us, disposition, sutilise ainsi :
showStatus ("Hello, patience, je charge un fichier) ;
47.10.2 Affichage dune page HTML dans le navigateur
La mthode showDocument , mise disposition par la classe Appl et Cont ext ,
demande au navigateur dafficher une page HTML. Cette page sera spcifie par son
URL, et laffichage aura lieu dans une fentre spcifier galement.
showDocument ( unURL, fentreCible)
Concernant la fentre daffichage, le deuxime paramtre peut prendre les valeurs
suivantes :
" _bl ank" affichage dans une nouvelle fentre
" _sel f " affichage dans la fentre mme qui contient lapplet
" nomDuneFentre" affichage dans une fentre crer le cas chant

47.10.3 Envoyer des messages dautres applets


Une page HTML peut rfrencer plusieurs applets qui sexcuteront de manire concur-
rente.
Nous nous contenterons ici de mentionner le fait que toutes ces applets ont la possibi-
lit de discuter entre elles en senvoyant des messages.
A cette fin, la mthode get Appl et , de la classe Appl et Cont ext , retourne
une applet que lon aura rfrence pas son nom . Le nom dune applet peut tre
spcifi au moyen du paramtre NAME de la balise <APPLET>.
Une fois que lon dispose de la rfrence sur lapplet cible , il suffit de lui envoyer
nimporte quel message que cette dernire dfinit par le biais de ses mthodes.
Appl et aut r eAppl et =
get Appl et Cont ext ( ) . get Appl et ( " nomAppl et " ) ;
aut r eAppl et . m( . . ) ;
ELS - 16 avril 2002 23:14
Java - Un abrg - 93 - Annexe A - Les Applets
// Envoi dun message lautre applet
47.10.4 Jouer des sons
A partir de la version 1.2 du Java Development Kit , les applets et les applications
autonomes ont la possibilit de manipuler des sons dans diffrents formats : mav, midi,
..
la mthode get Audi oCl i p, hrite de Applet, permet de charger un
fichier son ;
les mthodes pl ay, l oop et st op, de la classe Audi oCl i p, per-
mettent de manipuler le son.
47.10.5 Charger une applet, a peut tre long ..
Les classes de lapplet sont charges au travers du rseau, a peut tre parfois trs long..
Pour acclrer le temps de chargement de manire trs efficace, on peut utiliser les
fichiers darchivage au format JAR . Voir les points 47.9.3, page 91 et 40.3,
page51 pour obtenir plus dinformations ce sujet.
Mais on peut aussi, pour y remdier, faire illusion en utilisant une applet dont la clase
principale (la sousclasse de Appl et ) est trs petite. Ds lors, le message de statut
de lapplet saffichera trs vite, pendant quune tche de fond (un thread crit par
nos soins), soccupera de pr-charger
1
8
les classes dont lapplication aura besoin.
1.
8
mthode l oadCl ass de la classe Cl assLoader
Java - Un abrg - 94 - AnnexeB - Liste des oprateurs avec priorit
ELS - 16 avril 2002 23:14
48 Annexe B - Liste des oprateurs avec priorit
Java Au sein d'une mme expression, des oprateurs de type L (Gauche) et de mme
priorit seront valus de gauche droite. C'est le cas de la plupart des oprateurs.
Les oprateurs de type R (Droite) et de mme priorit, seront au contraire valus de
droite gauche. C'est par exemple le cas de l'oprateur d'affection.
Si le programmeur dsire intervenir sur lordre dvaluation, il utilisera des parenthses
en crant ainsi des sous-expressions qui seront values de manire prioritaire.
Niveau
de
priorit
Type Oprateur Type de loprande Fonction
0 L . Oprateur d'accs : envoi de message,
accs aux variables d'instance
L ( . . ) Expression Appel de fonction,
Cration d'une sous-expression
L [ . . ] Expression Accs aux lments dun tableau
1 R ++, - - Arithmtique pr- ou -post- Incrmentation, Dcrmentation
R +, - Arithmtique Signe plus, moins (oprateurs unaires)
R ~ Entier NOT binaire, bit bit
! Boolen NOT logique
2 R ( . . ) type Conversion de type (coercition, casting)
R new Classe Cration d'un objet
3 L *, / , % Arithmtique Oprateurs de multiplication, de division et
modulo
4 L +, - Arithmtique Oprateurs arithmtiques de soustraction et
d'addition
L + String Concatnation de chanes
5 L <<, >> Entier Dcalage bit bit
L >>> Entier Dcalage droite sans extension de signe
6 L <, <=, >,
>=
Arithmtique Oprateurs relationnels
L instanceof Objet, Classe Retourne un boolen indiquant si lobjet est
linstance dune certaine classe
7 L ==, ! = types primitifs Comparaison de valeur (gale, diffrent)
ELS - 16 avril 2002 23:14
Java - Un abrg - 95 - AnnexeB - Liste des oprateurs avec priorit
L ==, ! = objets Comparaison de rfrences (gale, diffrent)
8 L & Entiers AND bit bit
L & Boolens AND boulen (les 2 termes sont valus)
9 L ^ Entiers XOR bit bit
L ^ Boolens XOR boolen
10 L
|
Entiers OR bit bit
L
|
Boolens OR boolen
11 L && Boolens AND logique conditionnel (un seul terme
valu)
12 L | | Boolens OU logique conditionnel (un seul terme
valu)
13 R ?: Exp. bool., xx, xx if arithmtique (oprateur ternaire)
14 R =, *=, / =,
%=, +=, -
=, <<=,
>>=, >>>=,
&=, | =, ^=
variable, xx Oprateurs d'affectation et d'affectations
composes
Java - Un abrg - 96 - Annexe C Cration darchives JAR
ELS - 16 avril 2002 23:14
49 Annexe C Cration darchives JAR
Le tlchargement de lapplet vers le client peut prendre du temps, beaucoup de temps,
et peu provoquer par ailleurs un encombrement non ngligeable du rseau.
Dans la mesure du possible, il faut donc tcher de rduire la quantit dinformations
transfrer, et trouver un moyen pour limiter la gne du client.
Notons au pralable que le concept mme des applets entrane dj une rduction
importante des informations transmettre puisque lexcution du code sappuie sur les
bibliothques de le machine virtuelle installe dans le navigateur du client : seules les
classes et les fichiers propres lapplication devront tre tlchargs.
Pour rduire la quantit des informations transmettre, la solution propose par Sun
consiste compresser tous les fichiers tlcharger en un seul fichier que lon appelle
un fichier darchivage. Ce dernier portera lextension .j ar , avec un mode de com-
pression sappuyant sur le format zip.
49.1 QUELQUES CONSIDRATIONS SUR LE TEMPS DE CHARGEMENT
DES APPLETS
Lengouement pour les applets a tourn court quand le public sest rendu compte quil
fallait parfois attendre une trentaine de secondes pour tlcharger la page et le code de
lapplet. La rgle de base est donc de limiter la taille des applets de petits programmes.
Comme le temps de chargement dpend directement du type de connexion, voici un
tableau indiquant le temps de chargement minimum pour un fichier de 100 Kbytes,
ainsi quune ide du volume des informations transfrer si on ne veut pas dpasser un
temps de chargement de 5 sec (ce qui peut paratre raisonnable).
Dbit Ligne
modem
56 Kbits
Ligne
RNIS
64 Kbits
Rseau
Ethernet
10 Mbits
Rseau
Ethernet
100 Mbits
Temps pour 100
kbytes
15 sec 13 sec 0,08 sec 0,008 sec
Volume pour 5
sec
20 Kbytes 38 Kbytes 9,5 Mby-
tes
59,5 Mbytes
ELS - 16 avril 2002 23:14
Java - Un abrg - 97 - Annexe C Cration darchives JAR
Ainsi, ce tableau montre que le volume occup par la page html, le code de lapplet et
les images ventuelles, ne devrait pas dpasser quelques dizaines de Kbytes dans un
contexte internet avec des clients de caractristiques diverses.
Dans un contexte intranet dentreprise avec un rseau sappuyant trs souvent sur une
couche Ethernet, le problme est bien diffrent. Le tlchargement dune petite applet
de 100 Kbytes sera quasiment instantan.
Notons par ailleurs que rares sont les applets dont la aille quelques dizaines de Kbytes.
Le bytecode est en effet peu gourmand en mmoire : Sun avait prvu au dpart dutili-
ser Java pour des systmes embarqus, et la rduction de la taille mmoire tait lpo-
que une priorit.
49.2COMPRESSER ET AGGLOMRER LES FICHIERS TLCHARGER
Pour diminuer de faon notable le temps de chargement, la solution consiste regrouper
tous les composants (le bytecode, les images, les sons, ..) dans un seul fichier, et com-
presser ce dernier.
Lutilisation dun fichier compress est doublement efficace :
Moins dinformations transmettre ;
Et comme http coupe la connexion TCP/IP aprs chaque transfert de fichier, la
runion de toutes les classes en un seul fichier permet doprer une seule tran-
saction http.
En contre partie, le navigateur devra dcompresser le fichier. Mais a nest pas trs
grave si le client possde une machine puissante, compare au dbit du rseau.
Pour oprer cette compression, une premire mthode consiste utiliser lutilitaire
WinZip, mais il est prfrable de comprimer avec loutil de compression au format
jar , propos par Sun, et qui fait partie du JDK (depuis 1.1). En effet, ce dernier per-
met dajouter des informations dauthentification (la fameuse signature
lectronique ).
49.3LE FORMAT JAR
JAR est une archive zip selon la spcification PKWARE : il contient larchive zip, plus
ventuellement des fichiers de signatures lectroniques et un fichier MANIFEST qui d-
crit la liste des fichiers de signatures ventuels prsents dans larchive.
Sa compatibilit avec ZIP lui permet dtre dcompress avec UnZi p.
49.4COMMENT UTILISER UN JAR DANS UNE APPLET ?
Pour utiliser dans une applet un jar plutt quune classe, il suffit dinclure le paramtre
ARCHIVE :
<APPLET CODE = Xxx. cl ass
Java - Un abrg - 98 - Annexe C Cration darchives JAR
ELS - 16 avril 2002 23:14
ARCHIVE = " Yyy. j ar "
WI DTH = 460,

Il est possible d'inclure plusieurs archives, il suffit de les sparer par des virgules:
ARCHI VE = " xxx. j ar , yyy. j ar , zzz. j ar "
L'archive n'a pas besoin d'tre complte ! Si le navigateur n'y trouve pas ce qu'il cher-
che, il s'adresse au serveur en utilisant le paramtre CODEBASE, comme il le fait
dhabitude.
49.5 SYNTAXE DE LA COMMANDE JAR
Syntaxe
jar [ opt i ons] [ mani f est ] dest i nat i on i nput - f i l e
[ i nput - f i l es]
Les options de la commande jar
Un argument commenant par le caractre @ peut tre utilis pour spcifier des param-
tres supplmentaires, raison dun paramtre par ligne. Ces paramtres sont insrs dans la ligne
de commande la position correspondant largument @<nomDeFi chi er >.
Operation Command
Pour crer un fichier JAR jar cf jar-file input-file(s)
Pour visionner le contenu dun fichier JAR jar tf jar-file
Pour extraire le contenu dun fichier JAR jar xf jar-file
Pour extraire des fichiers spcifiques dun
fichier JAR
jar xf jar-file archived-file(s)
Pour excuter une application empaquete
dans un fichier JAR (Jar executable)
( partir de la version JDK 1.2 --, ncessite
un fichier manifest comportant lentte
Main-Class)
java -jar app.jar
Pour invoquer une applet empaquete dans
un fichier JAR
<applet code=AppletClassName.class
archive="JarFileName.jar"
width=width height=height>
</applet>
ELS - 16 avril 2002 23:14
Java - Un abrg - 99 - Annexe C Cration darchives JAR
c Creates a new or empty archive on the standard output.
t Lists the table of contents from standard output.
x file Extracts all files, or just the named files, from standard input. If file is
omitted, then all files are extracted; otherwise, only the specified file or files are
extracted.
f The second argument specifies a jar file to process. In the case of creation, this
refers to the name of the jar file to be created (instead of on stdout). For table or
xtract, the second argument identifies the jar file to be listed or extracted.
v Generates verbose output on stderr.
m Includes manifest information from specified pre-existing manifest file.
Example use:
jar cmf myManifestFile myJarFile *.class
You can add special-purpose name-value attribute headers to the manifest file
that aren't contained in the default manifest. Examples of such headers would
be those for vendor information, version information, package sealing, and hea-
ders to make JAR-bundled applications executable.
0Store only, without using ZIP compression.
M Do not create a manifest file for the entries.
u Update an existing JAR file by adding files or changing the manifest.
For example,
jar uf foo.jar foo.class
would add the file foo.class to the existing JAR file foo.jar, and
jar umf manifest foo.jar
would update foo.jar's manifest with the information in manifest.
-C Temporaily changes directories during execution of jar command while pro-
cessing the next argument. For example,
j ar uf f oo. j ar - C cl asses bar . cl ass
would change to the classes directory and add the bar.class from that directory to
foo.jar. The following command,
jar uf foo.jar -C classes . -C bin xyz.class
would change to the classes directory and add to foo.jar all f iles within the classes
directory, but not the classes directory itself, and then change to the bin directory and
add xyz.class to foo.jar.
Java - Un abrg - 100 - Annexe C Cration darchives JAR
ELS - 16 avril 2002 23:14
If any of "files" is a directory, then that directory is processed recursively.
49.6LES JAR EXCUTABLES
Les archives JAR offrent en outre la possibilit de crer des excutables Java que
lon peut excuter par un simple double-clic !
Pour construire lexcutable Xxx.jar
>j avac Xxx. j ava
>j ar cvf Xxx. j ar listeDesClassesAInclure
>j ar umf NomDuFi chi er Mani f est Xxx. j ar
Contenu du fichier manifest (un fichier texte qui portera par exemple le nom mani-
fest.mf)
Mai n- Cl ass : Xxx
Pour lancer le jar excutable
Un double-clic,
ou : >j ava j ar Xxx. j ar
49.7 SIGNATURE DUN FICHIER DARCHIVE
Lutilitaire j ar si gner , livr avec le JDK, permet de signer une applet : la signa-
ture est opre directement sur le fichier j ar . Cette signature lectronique permet-
tra deux choses :
Dune part dauthentifier lauteur de lapplet (lapplet vient bien de telle ou
telle personne, qui on fait confiance) ;
Dautre part de vrifier lintgrit des donnes transmises sur le rseau (le code
de lapplet na pas t remplac en chemin par le code dune autre applet doue
ELS - 16 avril 2002 23:14
Java - Un abrg - 101 - Annexe C Cration darchives JAR
de mauvaises intentions).
Java - Un abrg - 102 - Annexe D - Les principaux paquetages
ELS - 16 avril 2002 23:14
50 Annexe D - Les principaux paquetages
Java java.lang
Import doffice dans les programmes ;
Contient les classes fondamentales qui accompagnent le langage de programmation :
Strings, threads, exceptions, erreurs, ..
java.lang.reflect
Classes ddies lintrospection, pour connatre par exemple la liste des mthodes et des
variables attaches tel ou tel objet.
java.io
Entres-sorties, traites la base sous la forme de flots squentiels de bytes ou de carac-
tres.
lecture et criture dans des fichiers du disque dur local, ou situs distance
sur le rseau
communication dinformations avec des sockets
communication dobjets srialiss (pour RMI)
java.net
Entres/sorties avec des ressources URL, Connexions par Sockets et datagrammes
java.util
Collections dobjets (listes dynamiques, piles), Dates, String parsing, Gnrateur de
nombres alatoires
java.Math
Fonctions mathmatiques
java.awt
Librairie graphique et cration des interfaces utilisateurs : fentres, dialogues, compo-
sants interactifs,..
Swing (java 1.2)
Amlioration de linterface utilisateur, plus grand choix de composants, de fontes, ..
Java 2D (java 1.2)
Grand choix de courbes, rotation, translation, ..
ELS - 16 avril 2002 23:14
Java - Un abrg - 103 - Annexe D - Les principaux paquetages
Java 3D (java 1.2)
JMF
Java Multimdia Framework : audio, video, synchronisation
Pour le rseau
java.sql jdbc
java.rmi RMI
javax.mail envoyer des mails
Enterprise Java Beans
Java - Un abrg - 104 - Annexe D - Les principaux paquetages
ELS - 16 avril 2002 23:14
ELS - 16 avril 2002 23:15
Java - Abrg - 105 -
Annexe A I ndex
A
abstract 53
adresse IP 86
affectation 2
amorce dune application 48
applets 69
affichage dune ligne de statut
92
affichage dune page html 92
balise et paramtres 88
chargement 93
charger un fichier son 87
charger une image 87
dessiner dans 74
envoyer des messages entre
applets 92
interdictions 83
jouer des sons 93
le gestionnaire de scurit 82
manipulation des ressources
WEB 85
permissions 84
rcuprer lURL 86
scurit 79
signature 82
temps de chargement 96
threads dans une applet 77
utiliser une archive jar 97
archives
compression 97
jar 51, 96
awt 102
B
boolean 13
byte 13
C
catch 40, 41
chanes de caractres 1, 21
char 13
classe
modificateurs 53
principale 48
structure 51
visibilit des objets 55
classpath 49
clone 67
commentaires 2
compilation 49
localisation des classes 49
concatnation 1
constantes symboliques 64
constructeurs 52, 56
de classe 59, 63
enchanement 57
invocation 17
par dfaut 59
super 58
conventions dcriture 1
conversions 25
entre objets 27
ELS - 16 avril 2002 23:15
e-Quest Analyse - 106 -
entre primitifs 25
primitifs - objets 26
String - boolean 26
String - char 26
String - numriques 26
copie
profonde 64
superficielle 64
copie dobjets 65
cos 31
D
destroy 73
destructeurs 60
double 13
E
exceptions 38
catch en cascade 41
classification 39
clause finally 42
crer un nouveau type 44
lever une exception 43
propagatioin 40
rcupration 41
RunTimeException 43
excution 50
extends 54
F
fichiers 46
composition 47
final 53, 64
finalize 17, 60
float 13
fonctions 28
dclaration 31
invocation 32
G
garbage collector 17, 60
I
implements 54
importation 45
init 73
instruction
affectation 2
boucles REPETER & TAN-
TQUE 11
break & continue 12
composite 6
do & while 11
else if 9
for 11
if 8
le bloc 6
switch 10
int 13
io 102
J
jar 51, 96
applets 97
excutables 100
le paramtre ARCHIVE 91
signature dune archive 100
syntaxe des commandes 98
java 50
javac 50
JMF 103
L
lang 102
length 19
librairies 49
long 13
M
machine virtuelle 50
main 48
paramtres 48
Math 102
messages
envoi 28
mthodes 28
de classe et dinstance 29
dclaration 31
imbrication 35
paramtres 34
rcursivit 36
surcharge 36
ELS - 16 avril 2002 23:15
e-Quest Analyse - 107 -
N
net 102
new 94
O
objets 14
copie 65
copie et partage 64
cration 16
cycle de vie 16
destruction 17
initialisation 16
manipulation par rfrence 14
partage dobjets 15
oprateur
++ -- 3
affectation compose 4
arithmtique 5
associativit 94
if arithmtique 6
instance of 6
logique 4
manipulation de bits 5
surcharge 37
P
paquetages 44
composition 47
dfinition et utilisation 45
gestion des fichiers 46
hirarchies 46
importation 45
passage des paramtres 34
port 86
primitifs 13
initialisation 16
manipulation par valeur 14
procdures 28
dclaration 32
invocation 33
public 53
R
records 23
rcursivit 36
reflect 102
S
short 13
sin 31
start 73
static 60
stop 73
String 21
structure dune application 47
super 58
surcharge
des mthodes 36
des oprateurs 37
Swing 102
T
tableaux 17
n dimensions 20
accs aux lments 18
comme argument de mthode
19
comme type de retour 19
cration 18
dclaration 17
taille 19
this 29
threads 77
throw 43
throws 40
try 41
type
articles 23
boolean 13
boolens 13
caractres 13
chanes de caractres 21
char 13
conversions 25
entiers 13
numrs 24
float & double 13
int, long, short & byte 13
intervalles 23
objets 14
primitif 13
records 23
rels 13
ELS - 16 avril 2002 23:15
e-Quest Analyse - 108 -
tableaux 17
types de donnes 13
U
unicode 1
URL 85
util 102
V
variables
dinstance 52
dinstance & accs 63
de classe 52
de classe & accs 63
de classe & dinstance 60
de classe & initialisation 62
visibilit dans une classe 55