You are on page 1of 100

Introduction Java

Borland VERSION 3

JBuilder

Consultez le fichier DEPLOY.TXT situ dans le rpertoire de base de JBuilder 3 pour avoir la liste complte des fichiers que vous pouvez distribuer en accord avec votre contrat de licence JBuilder 3. Les applications mentionnes dans ce manuel sont brevetes par Inprise ou en attente de brevet. Ce document ne donne aucun droit sur ces brevets. COPYRIGHT 1999 Inprise Corporation. Tous droits rservs. borland.com est une division de Inprise Corporation. Tous les produits Inprise et borland.com sont des marques dposes de Inprise Corporation. Tous les autres noms de produits sont des marques dposes de leurs fabricants respectifs.

Table des matires


Chapitre 1 Chapitre 2

Les bases du langage Java


Syntaxe Java . . . . . . . . . . . . . . . . . Identificateurs . . . . . . . . . . . . . . Littraux . . . . . . . . . . . . . . . . . . Littraux entiers. . . . . . . . . . . . Littraux virgule flottante . . . . . . Littraux boolens . . . . . . . . . . Littraux caractre . . . . . . . . . . Littraux chane . . . . . . . . . . . . Mots cls. . . . . . . . . . . . . . . . . . Instructions . . . . . . . . . . . . . . . . Blocs de code . . . . . . . . . . . . . . . Commentaires . . . . . . . . . . . . . . Expressions . . . . . . . . . . . . . . . . Oprateurs . . . . . . . . . . . . . . . . Oprateurs arithmtiques . . . . . . Oprateurs logiques . . . . . . . . . Oprateurs de comparaison . . . . . Oprateurs daffectation . . . . . . . Oprateurs au niveau bits . . . . . . Un oprateur spcial : loprateur ?: Types de donnes Java . . . . . . . . . . . Variables. . . . . . . . . . . . . . . . . . Types de donnes intgrs. . . . . . . . Types de donnes numriques . . . Types de donnes boolens . . . . . Types de donnes caractre . . . . . Types de donnes composites. . . . . . Tableaux . . . . . . . . . . . . . . . . Chanes. . . . . . . . . . . . . . . . . Transtypage . . . . . . . . . . . . . . . . Transtypage implicite . . . . . . . . Rgles de porte . . . . . . . . . . . . . Structure de contrle du droulement . . . Boucles. . . . . . . . . . . . . . . . . . . La boucle while . . . . . . . . . . . . La boucle do . . . . . . . . . . . . . . La boucle for. . . . . . . . . . . . . . Instructions de contrle des boucles . . Linstruction break . . . . . . . . . . Linstruction continue . . . . . . . . Instructions conditionnelles . . . . . . . Linstruction if-else . . . . . . . . . . Linstruction switch. . . . . . . . . . Rcapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1-1
. 1-1 . 1-2 . 1-3 . 1-3 . 1-3 . 1-4 . 1-4 . 1-5 . 1-5 . 1-6 . 1-6 . 1-7 . 1-8 . 1-8 . 1-9 . 1-10 . 1-10 . 1-11 . 1-12 . 1-13 . 1-13 . 1-13 . 1-14 . 1-14 . 1-15 . 1-15 . 1-15 . 1-15 . 1-17 . 1-18 . 1-18 . 1-18 . 1-19 . 1-19 . 1-20 . 1-20 . 1-20 . 1-22 . 1-22 . 1-22 . 1-22 . 1-22 . 1-23 . 1-24

Programmation oriente objet dans Java


Prsentation de la programmation oriente objet. . . . . . . . . . . . . . . . . . . . . . Classes . . . . . . . . . . . . . . . . . . . . . Dclaration et instanciation des classes . Donnes membre . . . . . . . . . . . . . Mthodes de classe . . . . . . . . . . . . Constructeurs et finaliseurs . . . . . . . Etude de cas : Exemple simple dOOP . Hritage de classe . . . . . . . . . . . . . Utilisation de this et de super . . . . Modificateurs daccs . . . . . . . . . . . Accs depuis lintrieur du paquet dune classe . . . . . . . . . . . . . . Accs depuis lextrieur du paquet dune classe . . . . . . . . . . . . . . Mthodes daccs . . . . . . . . . . . . . Classes abstraites . . . . . . . . . . . . . Polymorphisme . . . . . . . . . . . . . . . . Surcharge des mthodes . . . . . . . . . Utilisation des interfaces . . . . . . . . . Paquets Java . . . . . . . . . . . . . . . . . . Linstruction import . . . . . . . . . . . . Dclaration des paquets . . . . . . . . . Options de projet relatives aux paquets Rcapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-1
. 2-1 . 2-2 . 2-2 . 2-3 . 2-3 . 2-4 . 2-4 . 2-6 . 2-8 . 2-9

. . . 2-9 . . . . . . . . . . . . . . . . . . . . . . . 2-9 2-10 2-11 2-13 2-13 2-13 2-17 2-17 2-18 2-18 2-19

Chapitre 3

Les bibliothques des classes Java 3-1


Introduction . . . . . . . . . . . . Le paquet du langage (lang) . . . La classe Object . . . . . . . . Classes denveloppe de type . La classe Math . . . . . . . . . La classe String . . . . . . . . La classe StringBuffer . . . . . La classe System . . . . . . . . Le paquet des utilitaires (util) . . Linterface Enumeration . . . La classe Vector . . . . . . . . Le paquet des E/S (io) . . . . . . Classes de flux dentre. . . . Classes de flux de sortie . . . Classes de fichiers . . . . . . . La classe StreamTokenizer . . i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-1 . 3-2 . 3-2 . 3-2 . 3-3 . 3-4 . 3-5 . 3-6 . 3-6 . 3-7 . 3-7 . 3-9 . 3-9 3-11 3-12 3-13

Bibliothque gnrique Java (JGL) . . . . . . . . 3-13 Rcapitulatif . . . . . . . . . . . . . . . . . . . . 3-15

Chapitre 4

Techniques de thread
Gnralits . . . . . . . . . . . . . . . . . . . . A quoi servent les threads ? . . . . . . . . . Pourquoi nai-je pas encore entendu parler des threads ? . . . . . . . . . . . . . . . . Cration dun thread . . . . . . . . . . . . . . Sous-classe de la classe Thread . . . . . . . Exemple : Implmentation dun thread de comptage . . . . . . . . . . . . . . . Implmentation de linterface Runnable. . LAPI des threads . . . . . . . . . . . . . . . . Constructeurs . . . . . . . . . . . . . . . . . La mthode start() . . . . . . . . . . . . . . La mthode sleep() . . . . . . . . . . . . . . La mthode yield() . . . . . . . . . . . . . . La mthode join(). . . . . . . . . . . . . . . Le cycle de vie dun thread . . . . . . . . . . . Protection de votre code par rapport aux threads . . . . . . . . . . . . . . . . . . . Le mot cl synchronized . . . . . . . . . . . Moniteurs . . . . . . . . . . . . . . . . . . . Rcapitulatif . . . . . . . . . . . . . . . . . . .

4-1
. 4-1 . 4-1 . 4-2 . 4-2 . 4-2 . . . . . . . . . . . . . 4-3 4-4 4-5 4-5 4-6 4-6 4-6 4-6 4-6 4-7 4-7 4-8 4-8

Mthodes ObjectOutputStream Utilisation des flux dentre . . . . Mthodes ObjectInputStream . Ecriture et lecture des flux dobjets Rcapitulatif . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. 5-4 . 5-4 . 5-6 . 5-6 . 5-6

Chapitre 6

Scurit de la machine virtuelle Java


Gnralits . . . . . . . . . . . . . . . . . . . . . Pourquoi la machine virtuelle Java est-elle ncessaire ? . . . . . . . . . . . . . Quels sont les principaux rles de la JVM ? Scurit de la machine virtuelle Java . . . . . . Le modle de scurit . . . . . . . . . . . . . Le vrificateur Java . . . . . . . . . . . . Le gestionnaire de scurit . . . . . . . . Le chargeur de classe . . . . . . . . . . . Scurit de Java en tant que langage. . . Les compilateurs Just-In-Time . . . . . . . . Rcapitulatif . . . . . . . . . . . . . . . . . . . .

6-1
. 6-1 . 6-2 . 6-2 . 6-3 . 6-3 . 6-3 . 6-4 . 6-5 . 6-6 . 6-6 . 6-6

Chapitre 7

Utilisation de linterface de code natif


Gnralits . . . . . . . . . . . . . Utilisation de la JNI . . . . . . Utilisation du mot cl native . Utilisation de loutil javah . . Rcapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7-1
. 7-1 . 7-1 . 7-2 . 7-3 . 7-3

Chapitre 5

Srialisation
Gnralits . . . . . . . . . . Pourquoi srialiser ? . . . . . Srialisation dans le JDK 1.1 Linterface Serializable . . Utilisation des flux de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5-1
5-1 5-1 5-2 5-2 5-3

Index

I-1

ii

Chapitre

Chapitre 1

Les bases du langage Java

Ce chapitre traite des sujets suivants : Les identificateurs et les restrictions qui sappliquent leur dclaration. Les littraux. Les squences dchappement. Les mots cls dans Java. Les blocs de code. Les expressions. Les oprateurs Java. Les types de donnes pris en charge par Java. Les diffrences de types de donnes entre Java et C/C++. Les constructions de boucles dans Java. Les instructions conditionnelles dans Java.

Syntaxe Java
Avant de pouvoir effectivement lire ou crire des programmes dans un langage quel quil soit, il est ncessaire den connatre la syntaxe et les restrictions. La syntaxe dun langage dfinit la faon dont le programme est crit ; plus spcifiquement, elle dfinit les lments du langage et la faon de les utiliser individuellement et ensemble. Vous trouverez ci-dessous la liste des lments de base du langage, qui montre en quoi ils sont importants pour la syntaxe : Identificateurs : Composition des noms des variables. Restrictions et conventions daffectation des noms. Littraux : Composition des noms des constantes. Affectation de leurs valeurs.

Les bases du langage Java

1-1

Syntaxe Java

Mots cls : Mots prdfinis du langage. Comment sont-ils utiliss et comment ne le sont-ils pas ? Instructions : Quest-ce quune instruction et comment en crire une ? Blocs de code : Comment les instructions sont-elles regroupes ensemble ? Commentaires : Ajout de commentaires et de remarques au programme Expressions : Quest-ce quune expression et comment en crire une ? Oprateurs : Oprateurs utiliss dans le langage. Leur utilisation dans les expressions. Un programmeur peut-il dfinir ses propres oprateurs ?

Identificateurs
Un identificateur est un nom qui identifie de faon unique une variable, une mthode ou une classe (nous parlerons des variables plus loin dans ce chapitre ; les mthodes et les classes sont prsentes dans le chapitre 2, Programmation oriente objet dans Java). Dans la plupart des langages, des restrictions sappliquent la composition des identificateurs. Voici les restrictions de Java relatives aux identificateurs : Tous les identificateurs doivent commencer par une lettre, un trait de soulignement ( _ ) ou un signe dollar ($) Un identificateur peut inclure des chiffres, mais ne doit pas commencer par un chiffre Un identificateur ne peut pas contenir despace vide (tabulation, espace, nouvelle ligne ou retour chariot) Les identificateurs diffrencient les minuscules et les majuscules Les mots cls de Java ne peuvent pas servir didentificateurs
Remarque

Comme les noms de certaines bibliothques C commencent par un trait de soulignement ou un signe dollar, vitez de commencer le nom dun identificateur par ces caractres. Importer une bibliothque C dans un programme qui utilise un trait de soulignement ou un signe dollar au dbut dun nom didentificateur risque de provoquer des conflits et des confusions entre les noms. Outre ces restrictions, certaines conventions sappliquent aux identificateurs pour faciliter leur lecture. Bien que ces conventions naffectent en rien le compilateur, il est conseill de les respecter dans les programmes. Le tableau suivant donne la liste de ces conventions selon le type didentificateur :
Type didentificateur
Nom de classe Nom de fonction

Convention
Chaque mot commence par une majuscule Chaque mot, sauf le premier, commence par une majuscule

Exemples
Mammifre, MammifreMarin obtenirAge, dfinirHauteur

1-2

Introduction Java

Syntaxe Java

Type didentificateur
Nom de variable Noms des constantes

Convention
Chaque mot, sauf le premier, commence par une majuscule Toutes les lettres sont en majuscules et les mots sont spars par un trait de soulignement

Exemples
age, tailleCerveau MAX_HEIGHT, MAX_AGE

Littraux
Un littral, ou constante, reprsente une valeur qui ne change jamais. Faites une nette distinction entre un identificateur qui reprsente une valeur et un littral qui est une valeur. Par exemple, le nombre 35 est un littral ; lidentificateur age reprsente un nombre qui peut tre gal 35. Dans Java, un littral peut tre un nombre (entier ou virgule flottante), un boolen, un caractre ou une chane.

Littraux entiers
Les littraux entiers peuvent prendre trois formats : dcimal (base 10), hexadcimal (base 16) et octal (base 8). Les littraux dcimaux sont crits comme des nombres ordinaires, les littraux hexadcimaux commencent toujours par 0X et les littraux octaux commencent par 0. Par exemple, le nombre dcimal 10 scrit 0xA ou 0XA en format hexadcimal et 012 en format octal. Un littral entier peut tre stock dans les types de donnes byte, short, int ou long. Par dfaut, Java stocke les littraux entiers dans le type de donnes int, limit 32 bits. Pour stocker un littral entier dans le type de donnes long, qui peut recevoir des valeurs de 64 bits, ajoutez le caractre l ou L la fin du littral. Par exemple, le littral 9999L est stock dans le type long. Les lignes de code suivantes utilisent des littraux entiers :
int x = 12345; int y = x * 4; //12345 est un littral //4 est un littral

Dans la premire ligne, le littral 12345 est stock directement dans la variable x de type int. Dans la deuxime ligne, le littral 4 sert calculer une valeur qui est ensuite stocke dans la variable y de type int. Remarquez que, mme si un littral entier reprsente une valeur constante, il peut toujours tre attribu une variable entire. La variable est lunit de stockage qui peut, tout moment, reprsenter une valeur littrale unique. Cette remarque sapplique aussi tous les autres types de littraux.

Littraux virgule flottante


Un littral virgule flottante est un nombre contenant un point dcimal et/ou un exposant. Un littral virgule flottante suit une notation standard ou scientifique. Par exemple, 123.456 est la notation standard, alors que 1.23456e+2 est la notation scientifique.

Les bases du langage Java

1-3

Syntaxe Java

Les littraux virgule flottante sont du type double sur 64 bits (type par dfaut) ou du type float sur 32 bits. Pour stocker un littral virgule flottante dans le type float, ajoutez la lettre f ou F la fin du nombre.

Littraux boolens
Un littral boolen reprsente deux tats possibles : vrai ou faux. Les littraux boolens sont stocks dans le type de donnes boolen. A la diffrence de C/ C++ o les tats dune valeur boolenne sont reprsents par 0 (faux) et 1 (vrai), Java reprsente ces tats par les mots cls true (vrai) et false (faux).

Littraux caractre
Un littral caractre reprsente un caractre Unicode unique. Les littraux caractre sont toujours mis entre guillemets simples ; par exemple, A et 9 sont des littraux caractre. Java utilise le type char pour stocker des caractres uniques.
Remarque

Le jeu de caractres Unicode, sur 16 bits, remplace le jeu ASCII de 8 bits. Il peut dfinir jusqu 65536 valeurs, ce qui est suffisant pour inclure les symboles et les caractres dautres langues. Pour avoir de plus amples informations, consultez la page daccueil Unicode ladresse www.unicode.org.

Squences dchappement
Une squence dchappement est un type spcial de littral caractre. Comme C/ C++, Java utilise les squences dchappement pour reprsenter des caractres de contrle spciaux et des caractres non imprimables. Une squence dchappement est reprsente par une barre oblique inverse (\) suivie dun code caractre. Le tableau suivant rsume ces squences dchappement :
Caractre
Barre oblique inverse Retour arrire Retour chariot Continuation Guillemet double Saut de page Tabulation horizontale Nouvelle ligne Caractre octal Guillemet simple Caractre Unicode

Squence dchappement
\\ \b \r \ \ \f \t \n \DDD \ \uHHHH

Un caractre octal est reprsent par une suite de trois chiffres octaux ; un caractre Unicode est reprsent par une suite de quatre chiffres hexadcimaux.

1-4

Introduction Java

Syntaxe Java

Par exemple, le nombre dcimal 57 est reprsent par le code octal \071 et par la squence Unicode \u0039. Pour illustrer lutilisation des squences dchappement, la chane de linstruction suivante imprime sur la premire ligne les mots Nom et ID spars par deux tabulations et, sur la deuxime ligne, "Jean Martin" et "999" galement spars par deux tabulations :
String demoEchap = new String ("Nom\t\tID\n\"Jean\ Martin\"\t\t\"999\"");

Remarquez que cette instruction est intentionnellement crite sur deux lignes ; en consquence, le caractre de continuation (\) vite toute erreur du compilateur.

Littraux chane
Un littral chane reprsente une suite de caractres. Dans Java, les chanes sont toujours entre guillemets doubles. Java gre les chanes diffremment de C/C++ ; ce dernier reprsente une chane par un tableau de caractres, alors que Java utilise les classes String et StringBuffer. Ainsi, de tous les types de littraux dont nous avons parl, seuls les littraux chane sont stocks par dfaut sous forme dobjets. Les chanes sont prsentes plus en dtail dans la section Tableaux et chanes.

Mots cls
Un mot cl est un identificateur prdfini qui a une signification spciale pour le compilateur Java et qui ne peut pas tre redfini. Voici la liste des mots cls Java : abstract byvalue* char default extends float goto* inner* long operator* protected short synchronized transient void boolean case class do false for if instanceof native outer* public static this true volatile break cast* const* double final future* implements int new package rest* super throw try while byte catch continue else finally generic* import interface null private return switch throws var*

Les bases du langage Java

1-5

Syntaxe Java
* Rserv mais non utilis.

Comme lavez peut-tre remarqu, de nombreux mots cls Java sont emprunts C/C++. Les mots cls sont toujours crits en minuscules, comme dans C/C++. De faon gnrale, les mots cls Java peuvent tre classs par catgories selon leurs fonctions de la faon suivante (exemples entre parenthses) : Mots Mots Mots Mots Mots Mots Mots cls cls cls cls cls cls cls de dclaration des donnes (boolean, float, int) de boucle (continue, while, for) conditionnels (if, else, switch) dexception (try, throw, catch) de structure (class, extends, implements) de modification et daccs (private, public, transient) divers (true, null, super)

Instructions
Pour le compilateur, une instruction reprsente une commande unique, ou une ligne de code. Cependant, cela ne signifie pas que chaque ligne de code est une instruction ; en dautres termes, il ny a pas de correspondance un pour un entre les lignes physiques de codes et les instructions. Comme nous allons le voir plus loin dans ce chapitre, certaines instructions, comme linstruction if, peuvent se composer de plusieurs lignes de code. Ainsi, si une instruction peut occuper plusieurs lignes physiques, comment le compilateur sait-il o se termine chaque instruction et o commence la suivante ? En sparant les instructions par des points-virgule. Puisque les instructions sont toujours spares par des points-virgule, le compilateur Java ne sintresse pas la longueur de chacune. Par exemple, les deux instructions suivantes sont quivalentes :
x = (y + z) / q; //instruction 1 x = (y + z ) / q; //instruction 2

La deuxime instruction englobe des caractres espace vide (les caractres espace vide sont lespace, les tabulations horizontale et verticale, le saut de page et la nouvelle ligne). Bien que le compilateur Java ignore tous les caractres espace vide intgrs aux instructions, il est dconseill dy avoir recours pour ne pas rendre le code plus difficile lire.
Remarque

Rappelez-vous que, dans le cas de valeurs chane, il faut mettre le caractre de continuation (\) la fin de chaque ligne pour que les chanes puissent occuper plusieurs lignes.

Blocs de code
Un bloc de code est un groupe dinstructions qui se comportent comme une unit. Java dlimite les blocs de code par des accolades ({ et }). Les dfinitions des classes, les instructions de boucle, les instructions conditionnelles, les

1-6

Introduction Java

Syntaxe Java

instructions dexception et les corps des fonctions sont des exemples de blocs de code. Dans lexemple de code suivant, il y a trois blocs de code : la fonction frmResolver(), le bloc try et le bloc catch.
public frmResolver() { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } }

Le code ci-dessus illustre le concept de blocs imbriqus : les blocs try et catch sont imbriqus dans le bloc principal frmResolver().

Commentaires
Les commentaires sont des instructions crites en langage naturel par le programmeur pour ajouter des remarques concernant le code. Dans Java, il y a trois styles de commentaires. Le premier commence par /* et se termine par */ ; il permet dcrire des commentaires sur plusieurs lignes. Ce style est identique celui du langage C. Le code suivant montre lutilisation de ce style :
x = y + z; /* Ceci est un commentaire.*/ z = q / p; /*Ce commentaire stend sur deux lignes*/

Quand le compilateur Java rencontre /*, il ignore tout ce qui suit jusqu ce quil rencontre */. Le deuxime style de commentaire ressemble au premier mais commence par /** et se termine par */. La diffrence est que ce style est utilis par loutil javadoc du JDK pour gnrer automatiquement une documentation partir du code source (la documentation Java nest pas incluse dans ce cours). Le troisime style de commentaire est tir du langage C++. Il commence par // et ne peut tre crit que sur une ligne. Voici un exemple :
x = y + z; //Ce commentaire ne peut pas tre crit sur plusieurs lignes

Limbrication de commentaires nest possible que lorsque des commentaires du troisime style sont imbriqus dans un des deux autres styles. Limbrication des commentaires des deux premiers styles nest pas autorise. Voici un commentaire imbriqu invalide :
/*Dbut du commentaire /* Le commentaire se termine ici */

Les bases du langage Java

1-7

Syntaxe Java

Ceci ne se trouve pas dans le commentaire et gnrera une erreur du compilateur */

Comme cela a dj t dit, le compilateur ignore tout ce qui se trouve entre /* et */ ; aussi, quand il rencontre le premier */, il pense que le commentaire se termine. En consquence, la dernire ligne du code ne se trouve pas dans le commentaire. Voici un exemple de commentaire imbriqu valide :
/*Dbut du commentaire //Ceci est correct //Ceci aussi Fin du commentaire. */

Expressions
Une expression est une combinaison significative didentificateurs, de mots cls, de symboles et doprateurs qui a une valeur. De faon gnrale, tout ce qui peut tre mis du ct droit dun signe daffectation est une expression. Voici quelques exemples dexpressions :
s = "Bonjour tous"; x = 123.4; y = (x * 5) / 2; valeur = obtenirValeur(); Mammifre m = new Mammifre();

A partir des exemples prcdents, nous pouvons classer les expressions dans les catgories suivantes : Affectations de variables : Les deux premires expressions attribuent des valeurs aux variables s et x. Expressions doprateurs : La troisime expression en est un exemple. Les expressions doprateurs utilisent des combinaisons de variables, littraux, appels de mthodes, oprateurs et symboles. Ce type est examin dans la section suivante. Appels de mthodes : La quatrime expression est un appel la mthode getValue(), qui renvoie une valeur attribue valeur. Affectation dobjet : La dernire expression affecte de la mmoire lobjet Mammifre m. Les expressions daffectation dobjet sont des expressions dappel de mthode spciales. Le chapitre 2, Programmation oriente objet dans Java prsente ces deux types dexpressions en dtail.

Oprateurs
Les oprateurs sont des symboles spciaux qui excutent une fonction particulire sur des oprandes. Il y a cinq types gnraux doprateurs : oprateurs

1-8

Introduction Java

Syntaxe Java

arithmtiques, oprateurs logiques, oprateurs de comparaison, oprateurs daffectation et oprateurs au niveau bits. Chaque catgorie peut tre subdivise en unaire et binaire. Les oprateurs unaires utilisent un seul oprande, alors que les oprateurs binaires utilisent deux oprandes. Dans les sections suivantes, nous allons passer en revue les diffrents types doprateurs. Nous parlerons aussi de lassociativit et de la prsance des oprateurs. La prsance dtermine la priorit des oprateurs alors que lassociativit dtermine lordre des oprateurs de mme prsance utiliss dans une instruction unique.

Oprateurs arithmtiques
Java fournit un jeu complet doprateurs destins aux calculs arithmtiques. A la diffrence de certains langages, Java peut excuter des fonctions mathmatiques la fois sur des valeurs entires et en virgule flottante. Ces oprateurs vous sont sans doute familiers. Le tableau suivant fait la liste des oprateurs mathmatiques :
Oprateur
++/-+/* / % +/-

Dfinition
Incrmentation/dcrmentation automatique Plus/moins unaire Multiplication Division Modulo Addition/soustraction

Prsance
1 2 4 4 4 5

Associativit
Droite Droite Gauche Gauche Gauche Gauche

Loprateur modulo renvoie le reste de la division du premier oprande par le second. Les oprateurs incrmentation/dcrmentation automatique sont des oprateurs unaires. Ils modifient la valeur de leur oprande en ajoutant ou en soustrayant 1 leur valeur. Quand ils sont utiliss dans une expression, le rsultat de lopration incrmentation/dcrmentation automatique dpend de la position de loprateur par rapport loprande (avant ou aprs). En voici un exemple :
int y = 3, x, z; x = ++y; z = y--;

Dans la deuxime instruction, la variable y est incrmente de 1, puis sa nouvelle valeur (4) est attribue x. Dans la troisime instruction, la dcrmentation automatique se fait aprs laffectation de la valeur actuelle de y z. En dautres termes, la valeur actuelle de y (4) est attribue z, puis y prend la valeur 3. Le code suivant illustre leffet de la prsance et de lassociativit sur les oprateurs :
int x = 1, y = 2, z = 3, i, j; i = x + y * z; //identique i = x + (y * z)

Les bases du langage Java

1-9

Syntaxe Java

j = ++x + -y; i = x++ + -y;

//identique j = (++x) + (-y) //identique i = x++ + (-y)

Oprateurs logiques
Les oprateurs logiques (ou boolens) permettent au programmeur de regrouper des expressions boolennes pour dterminer certaines conditions. Ces oprateurs excutent les oprations boolennes standard (AND, OR, NOT et XOR). Le tableau suivant donne la liste des oprateurs logiques :
Oprateur
! & ^ | && ||

Dfinition
Complment logique unaire (NOT) Evaluation AND XOR Evaluation OR Court-circuit AND Court-circuit OR

Prsance
2 9 10 11 12 13

Associativit
Droite Gauche Gauche Gauche Gauche Gauche

Les oprateurs dvaluation valuent toujours deux oprandes. Les oprateurs court-circuit valuent toujours le premier oprande et, si cela suffit dterminer la valeur de la totalit de lexpression, ils nvaluent pas le deuxime oprande. Le code suivant vous aide mieux comprendre :
if ( !estHautePression && (temprature1 > temprature2)) { } boolean1 = (x < y) || ( a > b); boolean2 = (10 > 5) & (5 > 1);

La premire instruction value dabord !estHautePression ; si le rsultat a la valeur false, elle nvalue pas le deuxime oprande (temperature1 > temperature2), puisque, le premier oprande ayant la valeur false, la totalit de lexpression a forcment la valeur false. La deuxime instruction agit de mme : boolean1 na la valeur true que si x est infrieur y (la valeur du deuxime oprande nest jamais dtermine). Dans la troisime instruction, le compilateur calcule les valeurs des deux oprandes avant dattribuer le rsultat boolean2.
Remarque

Loprateur XOR ne donne une valeur true que si les oprandes ont des valeurs diffrentes (true et false, ou false et true).

Oprateurs de comparaison
Les programmeurs ont besoin de comparer des valeurs. A la diffrence des oprateurs logiques, les oprateurs de comparaison nvaluent quune seule expression. Le tableau suivant donne la liste des oprateurs de comparaison :
Oprateur
< >

Dfinition
Infrieur Suprieur

Prsance
7 7

Associativit
Gauche Gauche

1-10

Introduction Java

Syntaxe Java

Oprateur
<= >= == !=

Dfinition
Infrieur ou gal Suprieur ou gal Egal Diffrent de

Prsance
7 7 8 8

Associativit
Gauche Gauche Gauche Gauche

Loprateur dgalit permet de comparer deux variables objet du mme type (les objets sont prsents au chapitre 2, Programmation oriente objet dans Java). Dans ce cas, le rsultat de la comparaison na la valeur true que si les deux variables font rfrence au mme objet. En voici une illustration :
m1 = new Mammifre(); m2 = new Mammifre(); boolean b1 = m1 == m2; //b1 a la valeur false m1 = m2; boolean b2 = m1 == m2; //b2 a la valeur true

Comme m1 et m2 font rfrence des objets diffrents, le premier test dgalit donne le rsultat false (bien quils soient du mme type). La deuxime comparaison donne le rsultat true, puisque les deux variables reprsentent maintenant le mme objet.
Remarque

Cependant, la mthode equals() est utilise la plupart du temps pour comparer des objets. Cette mthode, dfinie dans la classe Object, doit tre implmente dans une sous-classe de la classe Object, avant que lgalit des objets de la classe puisse tre contrle.

Oprateurs daffectation
Comme tous les langages, Java permet dattribuer des valeurs aux variables. Le tableau suivant donne la liste des oprateurs daffectation :
Oprateur
= += -= *= /= &= |= ^=

Dfinition
Affectation Ajout et affectation Soustraction et affectation Multiplication et affectation Division et affectation AND avec affectation OR avec affectation XOR avec affectation

Prsance
15 15 15 15 15 15 15 15

Associativit
Droite Droite Droite Droite Droite Droite Droite Droite

Le premier oprateur vous est maintenant familier. Les autres oprateurs daffectation commencent par une opration, puis stockent le rsultat de lopration dans loprande situ sur le ct gauche de lexpression. Voici quelques exemples :
int y = 2; y *= 2; //identique (y = y * 2)

Les bases du langage Java

1-11

Syntaxe Java

boolean b1 = true, b2 = false; b1 &= b2; //identique (b1 = b1 & b2)

Oprateurs au niveau bits


Il y a deux types doprateurs au niveau bits : oprateurs de dcalage et oprateurs boolens. Les oprateurs de dcalage permettent de dcaler les chiffres binaires dun nombre entier vers la droite ou la gauche. Etudiez lexemple suivant (le type entier short est utilis la place du type int pour plus de concision) :
short i = 13; i = i << 2; i >>= 3; //i a la valeur 0000000000001101 //i a la valeur 0000000000110100 //i a la valeur 0000000000000110

Dans la deuxime ligne, loprateur de dcalage des bits dcale tous les bits de i de deux positions vers la gauche. Loprateur de dcalage sur la droite dcale ensuite les bits de trois positions vers la droite.
Remarque

Lopration de dcalage fonctionne diffremment dans Java et dans C/C++, principalement en ce qui concerne les nombres entiers signs. Dans un nombre entier sign, le bit le plus gauche prcise le signe du nombre entier (il a la valeur 1 pour les nombres ngatifs). Dans Java, les nombres entiers sont toujours signs, alors que dans C/C++, ils sont signs par dfaut. Dans la plupart des implmentations de C/C++, une opration de dcalage des bits ne conserve pas le signe du nombre entier (puisque le bit du signe serait dcal). Cependant, dans Java, les oprateurs de dcalage conservent le bit du signe (sauf si vous utilisez loprateur >>> pour effectuer un dcalage non sign). Cela signifie que le bit du signe est dupliqu, puis dcal (un dcalage droite de 10010011 de 1 bit donne 11001001). Le tableau suivant donne la liste complte des oprateurs Java au niveau bits :
Oprateur
~ << >> >>> & | ^ <<= >>= >>>=

Dfinition
Complment au niveau bits Dcalage gauche sign Dcalage droit sign Dcalage droit par ajout de zros (non sign) AND au niveau bits OR au niveau bits XOR au niveau bits Dcalage gauche avec affectation Dcalage droit avec affectation Dcalage droit par ajout de zros avec affectation

Prsance
2 6 6 6 9 10 11 15 15 15

Associativit
Droite Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche

1-12

Introduction Java

Types de donnes Java

Un oprateur spcial : loprateur ?:


Nous avons cit deux types doprateurs : unaire et binaire. Ce nest pas totalement exact. Il y a aussi un oprateur ternaire que Java tire de C, loprateur ?:. Voici la syntaxe gnrale de cet oprateur :
expression1? expression2: expression3;

expression1 est value en premier. Si sa valeur est true, expression2 est calcule, sinon expression3 est calcule. Voici une illustration :
int x = 3, y = 4, max; max = (x > y)? x: y; //ceci revient dire max=y;

Dans ce code, max reoit la valeur de x ou de y, selon que x est suprieur y ou non.
Remarque

Certaines personnes confondent cet oprateur avec une instruction conditionnelle. Ce nest pas une instruction, comme lillustre lerreur dans le code suivant :
(x > y)? max = x: max = y; //ne peut pas tre utilis comme une instruction

Types de donnes Java


Les types de donnes sont des entits qui reprsentent des types spcifiques de valeurs pouvant tre stockes en mmoire et interprtes dune faon spcifique par le compilateur. Dans une section prcdente, nous avons dj parl des types de donnes lors de la prsentation des littraux. Le type de donnes dans lequel le littral est stock dpend de la valeur de ce dernier ; par exemple, le littral 9 peut tre stock dans le type de donnes int et le littral c peut tre stock dans le type de donnes char. Dans Java, il y a deux catgories de types de donnes : intgrs et composites. Les types de donnes intgrs (ou primitifs) peuvent ensuite tre diviss en trois autres catgories : numrique, boolen et caractre. Ils sont compris par le compilateur et ne ncessitent pas de bibliothques spciales. (A la base, une bibliothque spciale fait rfrence nimporte quelle collection de code qui ne fait pas partie de la dfinition actuelle du langage). Les types composites sont de deux sortes : tableaux et chanes. Gnralement, les types composites ncessitent lutilisation de bibliothques spciales. Avant dtudier les diffrents types de donnes de Java, nous devons en savoir plus sur les variables.

Variables
Nous avons dfini un type de donnes comme une entit qui reprsente une valeur spcifique pouvant tre stocke en mmoire. Comment affecter de la mmoire pour cette valeur, comment y accder et comment lui attribuer des valeurs ? Pour affecter de la mmoire au stockage de types de donnes, il faut dabord dclarer une variable du type de donnes voulu, puis lui donner un

Les bases du langage Java

1-13

Types de donnes Java

nom (identificateur) qui la rfrence. Voici la syntaxe gnrale dune dclaration de variable :
typeDonnes identificateur [ = valeurParDfaut ];

La dclaration commence par le type de la variable, puis dsigne lidentificateur et se termine par laffectation facultative dune valeur par dfaut. Voici quelques exemples de dclarations de variables de diffrents types :
int p; //dclare la variable p stocker dans le type de donnes int float x, y = 4.1, z = 2.2; boolean finDeFichier = false; char car1 = T;

Remarquez que la deuxime ligne dclare trois variables la fois. Il est possible de dclarer en une seule fois plusieurs variables du mme type, pourvu que vous spariez leurs identificateurs par des virgules. Une variable peut tre dclare nimporte o dans un programme, tant que sa dclaration prcde les instructions qui y font rfrence. Java est un langage forc, ce qui signifie que toutes les variables doivent tre dclares avant dtre utilises. Si nous essayons de rfrencer la variable x sans la dclarer auparavant, il y a une erreur de compilation :
int y = 4, z = 2; x = y / z; //Quest-ce que x ? Du type float, char, int ou quoi ?

Dans lexemple ci-dessus, la deuxime ligne gnre une erreur, puisque le compilateur ne connat pas le type de x ; il ne sait mme pas o la variable est stocke en mmoire.
Remarque

Pour viter tout problme, comme rfrencer une variable qui nexiste pas encore, il est conseill de dclarer toutes les variables au dbut des blocs de code o elles sont utilises. Vous pouvez ainsi suivre plus facilement la trace de vos variables. Maintenant que nous savons ce que sont les variables, nous pouvons poursuivre la prsentation des types de donnes.

Types de donnes intgrs


Types de donnes numriques
Le tableau suivant rsume les types de donnes numriques :
Type
byte short int long

Taille
8 bits 16 bits 32 bits 64 bits

Description (valeurs extrmes)


trs petit nombre entier sign (128 127) nombre entier sign court (32768 32767) nombre entier sign (2.14e+9 2.14e+9) nombre entier sign long (9.22e+18 9.22e+18)

1-14

Introduction Java

Types de donnes Java

Type
float double

Taille
32 bits 64 bits

Description (valeurs extrmes)


nombre en virgule flottante (1.402e-45 3.402e+38) nombre en virgule flottante double prcision (4.94e-324 1.79e+308)

Si le programmeur ninitialise pas une variable numrique, la machine virtuelle Java lui donne automatiquement la valeur 0. La plupart des compilateurs Java dtectent les variables non initialises. Ce comportement diffre de C/C++ o les variables non initialises contiennent des valeurs alatoires et ne sont pas dtectes par le compilateur.

Types de donnes boolens


Un type de donnes boolen a deux valeurs : true et false. A la diffrence de C/ C++, qui stocke les types de donnes boolens sous forme numrique (0 pour false et 1 pour true), Java utilise le type de donnes intgr boolean. Les variables de type boolean non initialises ont automatiquement la valeur false. Le code suivant illustre lutilisation dune variable de type boolean :
int a = 1, b = 0; boolean bool = a < b; //bool a la valeur false

Types de donnes caractre


Java utilise le type de donnes char pour stocker un caractre Unicode unique. Toutefois, le type char de Java a une largeur de 16 bits, alors quil na que 8 bits de large (par dfaut) dans C/C++.

Types de donnes composites


Tableaux
Un tableau est une structure de donnes qui peut contenir plusieurs lments du mme type. Les lments dun tableau peuvent tre de nimporte quel type : type primitif, type composite ou classe dfinie par lutilisateur. Si vous avez utilis des tableaux dans dautres langages, la faon dont Java gre les tableaux vous semblera sans doute sduisante. Examinons dabord quelques exemples de dclarations de tableaux :
int idEtudiant[]; char[] grades; float coordonnes[][];

Ces dclarations amnent deux remarques : La taille du tableau nest pas prcise ; dans la plupart des langages, la taille dun tableau doit faire partie de sa dclaration. Les crochets peuvent suivre lidentificateur, comme dans le premier exemple, ou suivre le type de donnes, comme dans le deuxime exemple.

Les bases du langage Java

1-15

Types de donnes Java

Cration et initialisation des tableaux


Les dclarations de tableaux ci-dessus naffectent pas rellement de mmoire aux tableaux (elles dclarent simplement des identificateurs qui permettront ventuellement de stocker des tableaux rels). Cest la raison pour laquelle les tailles des tableaux ne sont pas prcises. Pour affecter rellement de la mmoire aux variables tableaux, il faut utiliser loprateur new de la faon suivante :
int idEtudiant[] = new int[20]; char[] grades = new char[20]; float[][] coordonnes = new float[10][5];

La premire instruction cre un tableau de 20 lments de type int, la deuxime cre un tableau de 20 lments de type char et la troisime cre un tableau deux dimensions 10 sur 5 de type float (10 lignes, 5 colonnes). Quand un tableau est cr, tous ses lments sont vides.
Remarque

Dans Java, lutilisation de loprateur new est semblable lutilisation de la commande malloc en langage C et de loprateur new en C++. Pour initialiser un tableau, les valeurs des lments du tableau sont numres lintrieur dun ensemble entre accolades. Pour les tableaux plusieurs dimensions, il faut utiliser des accolades imbriques. Les instructions suivantes illustrent cette initialisation :
char[] grades = {A, B, C, D, F}; float[][] coordonnes = {{0.0, 0.1}, {0.2, 0.3}};

La premire instruction cre un tableau de type char appel grades. Elle initialise les lments du tableau avec des valeurs comprises entre A et F. Nous navons pas eu besoin dutiliser loprateur new pour crer ce tableau ; en initialisant le tableau, la mmoire ncessaire est automatiquement affecte au tableau pour y mettre les valeurs inutilises. Par consquent, la premire instruction cre un tableau de type char de 5 lments. La deuxime instruction cre un tableau de type float a deux dimensions appel coordonnes, avec une taille de 2 sur 2. La premire ligne du tableau est initialise avec les valeurs 0.0 et 0.1 et la deuxime ligne avec les valeurs 0.2 et 0.3. De par sa conception, coordonnes est un tableau contenant deux lments tableau.

Accs aux lments des tableaux


Pour accder aux lments dun tableau, il faut indexer la variable tableau. Cette indexation implique que le nom de la variable tableau soit suivi du numro de llment (index) entre crochets. Lindex des tableaux commence toujours 0. Dans le cas dun tableau plusieurs dimensions, il faut utiliser un index par dimension. Voici quelques exemples :
premierElment = grades[0]; cinquimeElment = grades[4]; ligne2Col1 = coordonnes[1][0]; //premierElment = A //cinquimeElment = F //ligne2Col1 = 0.2

1-16

Introduction Java

Types de donnes Java

La petite partie de code suivante illustre lutilisation des tableaux. Elle cre un tableau de 5 lments de type int appel tableauInt, puis utilise une boucle for pour mettre les nombres entiers 0 4 dans les lments du tableau :
int[] tableauInt = new int [5]; int index; for (index = 0; index < 5; index++) tableauInt [index] = index;

Les boucles for sont prsentes dans une section ultrieure. Ce code utilise la boucle pour incrmenter la variable index de 0 4 et, chaque passage, la valeur de index est mise dans llment de tableauInt index par index.

Chanes
Une chane est une suite de caractres. Pour stocker des chanes, Java utilise le type String. Ce type de donnes fait partie du paquet java.lang tudi au chapitre 3, Les bibliothques des classes Java. Cela signifie quil ne sagit pas dun type intgr ; pour dclarer une variable du type String, il faut utiliser le paquet java.lang. Nous tudierons les paquets dans le chapitre 2, Programmation oriente objet dans Java. Une fois initialise, une variable de type String ne peut pas tre modifie. Comment peut-elle tre une variable et ne pas pouvoir tre modifie ? Rappelez-vous quune variable nest quune rfrence un emplacement en mmoire ; vous lutilisez pour accder la mmoire sur laquelle elle pointe et modifier cette mmoire. Dans le cas dune variable du type String, la mmoire sur laquelle pointe la variable String ne peut pas tre modifie ; toutefois, la variable elle-mme peut pointer ailleurs, comme lillustre le code suivant :
String s = new String ("Bonjour"); s = "Bonjour tous; //s pointe maintenant sur un nouvel emplacement mmoire

Nous avons dabord cr une variable de type String appele s qui pointait sur un emplacement particulier en mmoire contenant la chane "Bonjour". Avec la deuxime ligne, s pointe sur un nouvel emplacement en mmoire qui contient maintenant "Bonjour tous". Cela est exact puisque nous avons modifi la variable elle-mme, et non la mmoire sur laquelle elle pointe. Cela illustre la diffrence entre une variable et la mmoire sur laquelle elle pointe. Pour disposer dun meilleur contrle sur vos chanes, utilisez la classe StringBuffer. Cette classe, qui fait aussi partie du paquet java.lang, fournit des mthodes permettant de modifier le contenu des chanes. Voici un exemple impossible raliser avec la classe String :
StringBuffer s = new StringBuffer ("Bonjour"); s.setCharAt (1, 'e'); //s a maintenant la valeur "Benjour"

La mthode setCharAt() de StringBuffer remplace le caractre situ la position prcise par le premier paramtre par le caractre donn en second paramtre. Nous tudions les deux classes de chanes dans le chapitre 3, Les bibliothques des classes Java.

Les bases du langage Java

1-17

Types de donnes Java

Transtypage
Dans certains cas, il est ncessaire de convertir un type de variable en un autre type. Par exemple, vous pouvez avoir besoin de transmettre une variable de type int une mthode qui naccepte que des variables de type float. Convertir le type dune variable sappelle transtypage. Pour transtyper une variable, faites prcder lidentificateur de la variable du type voulu entre parenthses. Lexemple suivant montre comment la variable renvoye par une mthode, de type int, peut tre transtype en type float :
float f = (float) retourInt();

Soyez prudent lors des transtypages, car il y a des risques de perte dinformations. Par exemple, lors dun transtypage dune variable de type long de 64 bits en une variable de type int de 32 bits, le compilateur ignore les 32 bits de niveau suprieur de la variable de type long. Si la valeur de la variable de type long dpasse 32 bits au moment du transtypage, le transtypage attribue une valeur inexacte la variable de type int. En rgle gnrale, le type cible du transtypage doit avoir une taille au moins gale au type initial. Le tableau suivant montre les transtypages qui ne risquent pas de provoquer des pertes dinformations :
Type initial
byte short char int long float

Transtypage
short, char, int, long, float, double int, long, float, double int, long, float, double long, float, double float, double double

Transtypage implicite
Dans certains cas, un transtypage peut tre ralis implicitement par le compilateur. Voici un exemple :
if (3 > 'a') { }

Dans ce cas, la valeur a est convertie en nombre entier (valeur ASCII de la lettre a) avant dtre compare au nombre 3.

Rgles de porte
Les rgles de porte dterminent o est reconnue une variable dans un programme. Les variables appartiennent deux catgories de porte principales : Variables globales : Variables reconnues tout au long du programme. Variables locales : Variables reconnues uniquement dans le bloc de code o elles sont dclares.

1-18

Introduction Java

Structure de contrle du droulement

Les rgles de porte sont troitement lies aux blocs de code. Voici la rgle de porte gnrale : une variable dclare dans un bloc de code nest visible que dans ce bloc et dans les blocs qui y sont imbriqus. Le code suivant illustre cette rgle :
class dmoPorte { int x = 0; void mthode1() { int y; y = x; //correct } void mthode2() { int z = 1; z = y; //incorrect! } }

Ce code dclare une classe appele dmoPorte qui contient deux mthodes : mthode1() et mthode2(). La classe elle-mme est considre comme tant le bloc de code principal et les deux mthodes sont ses blocs imbriqus. Si vous ntes pas familiaris avec les classes, considrez que dmoPorte est le programme rel et que les deux mthodes sont ses fonctions. Les classes et les mthodes sont traites dans le chapitre 2, Programmation oriente objet dans Java. La variable x est dclare dans le bloc principal et elle est donc visible (reconnue par le compilateur) dans la mthode mthode1() et la mthode2(). Dautre part, les variables y et z sont dclares dans deux blocs imbriqus mais indpendants ; ainsi, essayer dutiliser y dans mthode2() provoque une erreur, puisque y nest visible que dans son bloc.
Remarque

Un programme qui repose sur des variables globales peut tre sujet des erreurs pour deux raisons : (1) les variables globales sont difficiles suivre ; (2) une modification apporte une variable globale dans une partie du programme peut avoir un effet indsirable dans une autre partie du programme. Les variables locales sont plus sres, puisquelles ont une dure de vie limite. Par exemple, une variable dclare dans une mthode nest accessible qu partir de cette mthode et ne risque pas dtre utilise de faon errone ailleurs dans le programme.

Structure de contrle du droulement


Boucles
Dans un programme, chaque instruction est excute une fois. Cependant, il est quelquefois ncessaire dexcuter une ou plusieurs instructions plusieurs fois jusqu ce quune condition soit satisfaite. Avec Java, il y a trois faons de crer des boucles : boucles while, do et for.

Les bases du langage Java

1-19

Structure de contrle du droulement

La boucle while
La boucle while est utilise pour crer un bloc de code qui sera excut tant quune condition particulire est satisfaite. Voici la syntaxe gnrale de la boucle while :
while (condition) { code excuter dans une boucle }

La boucle commence par tester la condition. Si la condition a la valeur true, la boucle excute la totalit du bloc. Ensuite, elle teste la condition une nouvelle fois et rpte ce processus jusqu ce que la condition prenne la valeur false. A ce moment, la boucle achve son excution. En voici un exemple simple :
int x = 0; //imprime "Bouclage" 10 fois while (x < 10){ System.out.println("Bouclage"); x++; }

Quand la boucle commence, elle regarde si la valeur de x(0) est infrieure 10. Comme cest le cas, le corps de la boucle est excut. Le mot "Bouclage" est affich lcran, puis la valeur de x est incrmente. La boucle continue jusqu ce que la valeur de x soit suprieure ou gale 10. Vrifiez que la condition prend la valeur false au moins une fois pour que la boucle se termine ; sinon, la boucle sexcute indfiniment.
Remarque

Vous pouvez galement arrter lexcution dune boucle avec les instructions return, continue ou break. Linstruction return est illustre dans le chapitre 2, Programmation oriente objet dans Java ; les instructions break et continue sont prsentes dans la section suivante.

La boucle do
La boucle do ressemble la boucle while, sauf quelle value la condition aprs les instructions et non avant. Le code suivant montre la boucle while prcdente convertie en boucle do :
int x = 0; do{ System.out.println("Bouclage"); x++; }while (x < 10);

La diffrence principale entre les deux boucles est que, la diffrence de la boucle while, la boucle do sexcute toujours au moins une fois.

La boucle for
La boucle for est la plus puissante des constructions de boucles. Voici la syntaxe gnrale dune boucle for :
for (expr init; expr condition; expr opration) {

1-20

Introduction Java

Structure de contrle du droulement

Linitialisation dune boucle for se compose de trois parties : une expression dinitialisation, une expression conditionnelle et une expression dopration. La troisime expression met gnralement jour la variable de la boucle initialise par la premire expression. Voici la boucle for quivalent notre boucle while initiale :
for (int x = 0; x < 10; x++){ System.out.println("Bouclage"); }

Cette boucle et la boucle while quivalente sont pratiquement identiques. En fait, (presque) chaque boucle for a une boucle while quivalente. Par contre, la boucle for sexcute diffremment. La premire expression est excute en premier (dans ce cas, x est initialise). La condition est ensuite teste et, si elle a la valeur true, le corps de la boucle est excut. A la fin de lexcution de la boucle, la troisime expression est calcule (x est incrmente). Le cycle revient ensuite la premire expression. Il est important de bien comprendre le fonctionnement, sinon les rsultats peuvent tre imprvisibles. La boucle for est beaucoup plus souple que les autres boucles ; elle peut tre construite de faon diminuer le nombre de lignes de code et en amliorer lefficacit. Pour dmontrer la souplesse de la boucle for, examinons le code suivant :
int x = 1, z = 0; while (x <= 20) { z += x; x++; }

Cette boucle additionne simplement les nombres de 1 20 (inclus). Voici la boucle for quivalente :
int z = 0; for (int x=1; x <= 20; x++) { z+= x; }

Pour rduire de moiti le nombre de fois o la boucle sexcute, nous pouvons utiliser la boucle suivante :
for (int x=1,y=20, z=0; x<=10 && y>10; x++, y--) { z+= x+y; }

Pour mieux comprendre le fonctionnement de cette boucle, dcoupons-la en quatre sections principales :

1 2 3 4

Lexpression dinitialisation : int x =1, y=20, z=0 Le condition de la boucle : x<=10 && y>10 Lexpression dopration : x++, y-Le corps principal : z+= x + y

Les bases du langage Java

1-21

Structure de contrle du droulement

Mathmatiquement parlant, la deuxime boucle for nest pas plus efficace que la premire (elles ont toutes les deux le mme ordre dimportance). Le but de cet exemple est simplement dillustrer la souplesse de la boucle for. Comment le fonctionnement de la boucle suivante diffre-t-il de la prcdente ?
for (int x=1,y=20, z=0; x<=10 && y>10; x++, y--, z+=x+y) { }

Instructions de contrle des boucles


Linstruction break
Linstruction break permet de sortir dune structure de boucle avant que la condition du test soit respecte. Quand la boucle rencontre une instruction break, elle se termine immdiatement en ignorant le code restant. En voici un exemple :
int x = 0; while (x < 10){ System.out.println("Bouclage"); x++; if (x == 5) break; else //faire quelque chose dautre }

Dans cet exemple, la boucle sarrte quand x est gal 5.

Linstruction continue
Linstruction continue permet dignorer le reste de la boucle et de reprendre lexcution litration suivante de la boucle.
for ( int x = 0 ; x < 10 ; x++){ if(x == 5) continue; //revient au dbut de la boucle avec x=6 System.out.println("Bouclage"); }

Cet exemple nimprime pas Bouclage si x a la valeur 5.

Instructions conditionnelles
Avec les instructions conditionnelles, votre code a la possibilit de prendre des dcisions. Dans Java, il y a deux structures conditionnelles : linstruction if-else et linstruction switch.

Linstruction if-else
Voici la syntaxe de linstruction if-else :
if (condition1) {

1-22

Introduction Java

Structure de contrle du droulement

//blocCode 1 } else if (condition2) { //blocCode 2 } else { //blocCode 3 }

Linstruction if-else est gnralement constitue de plusieurs blocs. Quand linstruction if-else sexcute, un seul des blocs est excut (celui dont la condition a la valeur true, videmment). Les blocs if-else et le bloc else sont facultatifs. Linstruction if-else nest pas limite trois blocs, elle peut contenir autant de bloc if-else que ncessaire. Les exemples suivants montrent lutilisation de linstruction if-else :
if ( x % 2 == 0) System.out.println("x est pair"); else System.out.println("x est impair"); if (x = y) System.out.println("x est gal y"); else if (x < y) System.out.println("x est infrieur y"); else System.out.println("x est suprieur y");

Linstruction switch
Dune certaine faon, linstruction switch est une version spcialise de linstruction if-else. Voici la syntaxe gnrale de linstruction switch :
switch (expression){ case valeur1: blocCode1; break; case valeur2: blocCode2; break; default : blocCode3; }

Il faut claircir un certain nombre de points concernant linstruction switch : Les blocs de code nont pas besoin dtre mis entre accolades. Le bloc de code default correspond au bloc else dune instruction if-else. Les blocs de code sont excuts selon la valeur dune variable ou dune expression, pas dune condition. La valeur de lexpression doit tre de type nombre entier (ou dun type qui peut tre transtyp en int sans risque, comme char). Les valeurs case doivent tre des expressions constantes du mme type que lexpression.

Les bases du langage Java

1-23

Rcapitulatif

Le mot cl break est facultatif. Il est ncessaire pour terminer lexcution de linstruction switch une fois quun code de bloc sexcute. Si, par exemple, break nest pas mis aprs blocCode1 et si blocCode1 est excut, alors blocCode2 sexcute immdiatement aprs blocCode1 (un effet secondaire parfois utile mais, dans la plupart des cas, indsirable). Si un bloc de code doit tre excut quand lexpression a une valeur parmi plusieurs, il faut numrer les valeurschacune tant prcde dun mot cl case et suivie par un point-virgule (nous allons en voir un exemple). Voici un exemple (c est de type char):
switch (c){ case '1': case '3': case System.out.println("c break; case '0': case '2': case System.out.println("c break; case ' ': System.out.println("c break; default : System.out.println("c } '5': case '7': case '9': est un chiffre impair"); '4': case '6': case '8': est un chiffre pair");

est un espace");

nest ni un chiffre ni un espace");

Linstruction switch value c et passe directement linstruction case dont la valeur est gale c. Si aucune des valeurs case nest gale c, la section default est excute. Remarquez la faon dutiliser plusieurs valeurs pour chaque bloc.

Rcapitulatif
Sujets abords dans ce chapitre : Les identificateurs servent identifier des variables, des mthodes et des classes de faon unique. Ils doivent commencer par un trait de soulignement, un signe dollar ou une lettre. Ils peuvent inclure des chiffres et diffrencient les minuscules et les majuscules. Les littraux reprsentent des valeurs constantes. Ils peuvent tre utiliss dans des expressions et des affectations de variables. Les squences dchappement reprsentent des caractres de contrle spciaux et des caractres non imprimables. Les blocs de code permettent de regrouper des instructions relies les unes aux autres. Une expression est une entit qui a une certaine valeur. Les expressions peuvent combiner des identificateurs, des mots cls, des oprateurs et des symboles.

1-24

Introduction Java

Rcapitulatif

Les oprateurs de Java ont les types suivants : arithmtique, logique, de comparaison, daffectation et au niveau bits. Certains oprateurs sont unaires et dautres sont binaires. Java a aussi emprunt C/C++ un oprateur ternaire (?:). Java prend en charge des types de donnes primitifs (types numrique, boolen et caractre), ainsi que des types de donnes composites (tableaux et chanes). Les types de donnes de Java sont diffrents de ceux de C/C++, car Java nutilise pas de tableaux de caractres pour reprsenter les chanes et ne reprsente pas les valeurs boolennes par des 0 et des 1. En outre, les types nombre entier de Java sont toujours signs ; dans C/C++, ils sont signs par dfaut. Dans Java, il y a trois structures de boucle : la structure while, la structure do et la boucle for. La boucle for est la plus souple des structures de boucle de Java. Dans Java, il y a deux instructions conditionnelles : if et switch.

Les bases du langage Java

1-25

1-26

Introduction Java

Chapitre

Chapitre 2

Programmation oriente objet dans Java

Ce chapitre traite des sujets suivants : Depuis combien de temps la programmation oriente objet existe-t-elle ? Dclaration dun objet et instanciation dune classe. Quels types peuvent apparatre dans une classe ? Dfinition des constructeurs et des finaliseurs. Comment implmenter lhritage dune classe parent sur une classe enfant ? Utilit des mots cls this et super. Dfinition des mthodes daccs. Quest-ce quune classe abstraite ? Prsentation du polymorphisme. Quest-ce quune interface ? Utilit de linstruction import

Prsentation de la programmation oriente objet


La programmation oriente objet existe depuis larrive du langage Simula 67 en 1967. Cependant, elle nest vraiment devenue un des paradigmes de la programmation quau milieu des annes 1980. La principale diffrence entre la programmation structure traditionnelle et la programmation oriente objet est que cette dernire met dans une mme structure les donnes et les oprations qui leurs sont associes. En programmation traditionnelle, les donnes et les oprations associes sont
Programmation oriente objet dans Java

2-1

Classes

spares, et cette mthodologie ncessite lenvoi des structures de donnes aux procdures et fonctions qui les utilisent. La programmation oriente objet rsout de nombreux problmes inhrents cette conception en mettant dans une mme entit les attributs et les oprations. Cela est plus proche du monde rel, dans lequel tous les objets disposent dattributs auxquels sont associs des activits. Java est un pur langage orient objets, ce qui signifie que le niveau le plus externe de la structure des donnes est lobjet. Dans Java, il ny a pas de constantes, variables ou fonctions autonomes laccs se fait toujours par des classes et des objets. Il sagit l dune des fonctions les plus sympathiques de Java par rapport dautres langages orients objet hybrides qui gardent des aspects de langages structurs et ajoutent des extensions dobjets. Par exemple, C++ et Object Pascal sont des langages orients objet, mais permetent toujours dcrire des programmes structurs, ce qui diminue lefficacit des extensions orientes objets. Une telle option nest pas disponible dans Java !

Classes
Tout dabord, il faut faire la distinction entre les classes et les objets. Une classe est la dfinition dun type, alors que lobjet est une dclaration de variable. Aprs avoir cr une classe, vous pouvez crer autant dobjets que voulu bass sur cette classe. Entre les classes et les objets, il y a la mme relation quentre une recette de clafoutis et le clafoutis lui-mme partir dune mme recette de clafoutis, vous pouvez faire autant de clafoutis que vous voulez. Le processus de cration dun objet partir dune classe est appel instanciation dun objet ou cration dune occurrence dune classe.

Dclaration et instanciation des classes


Une classe Java peut tre trs simple. Voici la dfinition dune classe vide :
class MaClasse { }

Evidemment, cette classe nest pas encore utile, mais elle est correcte dans Java. Une classe un peu plus utile contiendra quelques donnes membre et mthodes, que nous allons ajouter sous peu. Mais commenons par tudier la syntaxe de linstanciation dune classe. Pour crer une occurrence de cette classe, il faut utiliser loprateur new avec la nom de la classe. Il faut dclarer une variable doccurrence pour lobjet.
MaClasse monObjet;

Mais cette instruction naffecte ni mmoire ni autres ressources lobjet. Elle cre une rfrence appele monObjet, mais ninstancie pas lobjet. Cest le rle de loprateur new.
monObjet = new MaClasse();

2-2

Introduction Java

Classes

Remarquez que le nom de la classe est utilis comme sil sagissait dune mthode. Il ne sagit pas dune concidence (comme vous le verrez dans une section ultrieure). Aprs lexcution de cette ligne de code, il est possible daccder aux variables et aux mthodes membre de la classe (qui nexistent pas encore) avec loprateur .. Une fois lobjet cr, vous navez pas vous proccuper de sa destruction. Dans Java, les objets sont automatiquement limins par le Garbage collector. Ds que la rfrence un objet (cest--dire la variable) sort de la porte, la machine virtuelle libre automatiquement toutes les ressources affectes par loprateur new.

Donnes membre
Comme nous lavons dit, une classe Java peut contenir des donnes membre et des mthodes. Voici une classe qui ne contient que des donnes membre :
public class ClasseChien { String nom,couleurYeux; int age; boolean avecQueue; }

Dans cet exemple, nous avons cr la classe ClasseChien qui contient des variables membre appeles nom, couleurYeux, age et un indicateur appel avecQueue. Une variable membre dune classe peut avoir nimporte quel type (primitif, composite et types dobjets). Pour accder une donne membre, il faut dabord crer une occurrence de la classe puis accder aux donnes avec loprateur ..

Mthodes de classe
Les classes peuvent contenir aussi des mthodes. En fait, il ny a dans Java ni fonction ni procdure autonome toutes les sous-routines sont dfinies en tant que mthodes de classes. Voici un exemple de la classe ClasseChien ci-dessus laquelle est ajoute la mthode aboie() :
public class ClasseChien { String nom,couleurYeux; int age; boolean avecQueue; public void aboie() { Message msgAboie = new Message(); msgAboie.setMessage( "Wouah, wouah" ); msgAboie.setFrame( new Frame() ); msgAboie.show(); } }

Remarquez que, lors de la dfinition des mthodes, limplmentation de la mthode figure juste sous la dclaration. Cela est diffrent de certains autres

Programmation oriente objet dans Java

2-3

Classes

langages orients objet dans lesquels la classe est dfinie un emplacement et le code dimplmentation est situ ailleurs. Remarquez aussi quil faut spcifier un type de retour et les paramtres reus par la mthode. Laccs une mthode est similaire laccs aux variables membre. Par exemple,
ClasseChien chien = new ClasseChien(); chien.age = 4; chien.aboie();

Constructeurs et finaliseurs
Chaque classe a une mthode spciale appele constructeur, qui porte toujours le mme nom que la classe et ne peut pas prciser de valeur de retour. Le constructeur prend soin daffecter toutes les ressources dont lobjet a besoin et de renvoyer une occurrence de lobjet. Quand vous utilisez loprateur new, vous appelez en ralit le constructeur. Comme loccurrence de lobjet est toujours le type de retour, il nest pas ncessaire de prciser de type de retour du constructeur ! Dans la plupart des langages orients objet correspond une mthode nomme destructeur, appele pour librer les ressources affectes par le constructeur. Cependant, comme nous lavons dj signal, Java na pas de mcanisme destructeur, puisque ce langage prend soin de librer toutes les ressources pour vous. Cependant, certaines situations ncessitent un nettoyage spcial que le Garbage collector ne peut pas effectuer quand la classe disparat. Par exemple, certains fichiers ont t ouverts pendant la dure de vie de lobjet et vous voulez vrifier quils sont correctement ferms quand lobjet est dtruit. Pour cela, une autre mthode spciale, appele finaliseur, peut tre dfinie. Cette mthode (si elle est prsente) est appele par le Garbage collector immdiatement avant la destruction de lobjet. Ainsi, si un nettoyage spcial quelconque doit avoir lieu, le finaliseur peut le faire pour vous. Cependant, le Garbage collector sexcute dans la machine virtuelle sous forme de thread de faible priorit, ce qui ne permet pas de savoir quel moment il dtruira rellement votre objet. Cest pourquoi il vaut mieux viter de mettre dans le finaliseur du code dpendant du temps, puisque vous ne pouvez pas savoir quand il sera appel.

Etude de cas : Exemple simple dOOP


Dans cette section, nous allons voir un exemple simple de dfinition de classes et dinstanciation dobjets. Nous allons dvelopper une application qui cre deux objets (un chien et un homme) et montrer leurs attributs sur une fiche. Voici une capture dcran de lapplication en cours dexcution.

2-4

Introduction Java

Classes

Figure 2.1

Fiche OOP1 montrant deux objets instancis

Voici le contenu du fichier ClasseChien.java :


package Oop1; public class ClasseChien { String nom,couleurYeux; int age; boolean avecQueue; public ClasseChien() { nom = "Snoopy"; couleurYeux = "Noir"; age = 2; avecQueue = true; } }

Comme vous pouvez le voir, nous dfinissons ClasseChien et fournissons quelques variables membre. Il y a aussi un constructeur pour grer linstanciation des objets ClasseChien. Voici la source de ClasseHomme (trouve dans ClasseHomme.java) :
package Oop1; public class ClasseHomme { String nom,couleurYeux; int age; boolean estMari; public ClasseHomme() { nom = "Bob"; couleurYeux = "Bleu"; age = 1; estMari = true; } }

Il y a videmment certaines similitudes (dont nous tirerons parti dans une section ultrieure).

Programmation oriente objet dans Java

2-5

Classes

Dans la classe Frame, nous dclarons deux variables doccurrence permettant de rfrencer nos objets. Voici la source des dclarations de variables Frame1 :
public class Frame1 extends DecoratedFrame { // Cre une rfrence pour les objets ClasseChien chien; ClasseHomme homme; XYLayout xYLayout2 = new XYLayout(); BevelPanel bevelPanel1 = new BevelPanel(); . . .

Voici le code du gestionnaire dvnement correspondant au bouton Crer Chien o nous instancions lobjet et remplissons quelques zones de texte de la fiche :
void button1_actionPerformed(ActionEvent e) { chien = new ClasseChien(); txtfldNomChien.setText( chien.nom ); txtfldCouleurYeuxChien.setText( chien.couleurYeux ); txtfldAgeChien.setText( Integer.toString( chien.age ) ); chkbxChien.setState( chien.avecQueue); }

Nous appelons le constructeur de lobjet chien puis accdons ses variables membre. Voici le code source correspondant pour le gestionnaire dvnement du bouton Crer Homme :
void button2_actionPerformed(ActionEvent e) { homme = new ClasseHomme(); txtfldNomHomme.setText( homme.nom ); txtfldCouleurYeuxHomme.setText( homme.couleurYeux ); txtfldAgeHomme.setText( Integer.toString( homme.age ) ); chkbxHomme.setState( homme.estMari ); }

Hritage de classe
Les classes chien et homme cres ont plusieurs similitudes. Un des avantages de la programmation oriente objet est la possibilit de grer de telles similitudes, comme dans une hirarchie. Cette possibilit sappelle hritage. Quand une classe hrite dune autre classe, la classe enfant hrite automatiquement de toutes les caractristiques (variables membre) et du comportement (mthodes) de la classe parent. Lhritage est toujours additif ; il nest pas possible dhriter dune classe et de recevoir moins que ce que possde la classe parent. Dans Java, lhritage est gr avec le mot cl extends. Quand une classe hrite dune autre classe, la classe enfant tend la classe parent.
public class ClasseChien extends ClasseMammifre { . . . }

Les lments communs aux hommes et aux chiens sont communs tous les mammifres, ce qui permet de crer une classe appele ClasseMammifre pour

2-6

Introduction Java

Classes

grer ces similitudes. Nous pouvons ensuite supprimer les dclarations des lments communs de ClasseChien et ClasseHomme, les dclarer la place dans ClasseMammifre, puis crer les sous-classes ClasseChien et ClasseHomme partir de ClasseMammifre. Voici la dclaration de ClasseMammifre :
package Oop2; public class ClasseMammifre { String nom,couleurYeux; int age; public ClasseMammifre() { nom = "Le nom"; couleurYeux = "Noir"; age = 0; } }

Remarquez que ClasseMammifre a les caractristiques communes aux deux classes ClasseChien et ClasseHomme. Maintenant, nous pouvons crire ClasseChien et ClasseHomme dune autre faon pour tirer parti de lhritage.
package Oop2; public class ClasseChien extends ClasseMammifre { boolean avecQueue; public ClasseChien() { // Super() implicite nom = "Snoopy"; age = 2; avecQueue = true; } } package Oop2; public class ClasseHomme extends ClasseMammifre{ boolean estMari; public ClasseHomme() { nom = "Bob"; couleurYeux = "Bleu"; age = 1; estMari = true; } }

Remarquez que, puisque ClasseChien tend ClasseMammifre, elle dispose de toutes les variables membre et de toutes les mthodes de ClasseMammifre. En fait, mme ClasseMammifre a hrit dune autre classe. Dans Java, toutes les classes tendent la classe Object ; donc, si une classe est dclare sans tendre une autre classe, elle tend implicitement la classe Object. Dans Java, les classes ne peuvent hriter que dune seule classe la fois (hritage unique). Dans certains langages (comme C++), il est possible dhriter de plusieurs classes la fois (hritage multiple), mais ce nest pas le cas de Java. Une

Programmation oriente objet dans Java

2-7

Classes

classe ne peut tendre quune classe la fois. Bien quil ny ait aucune restriction sur le nombre de fois o lhritage peut tre utilis pour tendre la hirarchie, il ne peut y avoir quune extension la fois. Lhritage multiple est une fonctionnalit sympathique, mais elle donne des hirarchies dobjets trs complexes. Java dispose dun mcanisme qui offre pratiquement les mmes avantages sans tre aussi complexe, appel interfaces (prsent dans une section ultrieure). ClasseMammifre a un constructeur qui dfinit des valeurs par dfaut trs pratiques et commodes, et il serait avantageux que les sous-classes puissent accder ce constructeur. En fait, elles le peuvent. Il y a deux faons dy arriver dans Java. Si vous nappelez pas explicitement le constructeur de la classe parent, Java lappelle automatiquement pour vous comme premire ligne du constructeur de la classe enfant. La seule faon dviter ce comportement consiste appeler vous-mme un des constructeurs de la classe parent comme premire ligne du constructeur de la classe enfant. Les appels au constructeur sont toujours chans de cette faon et ce mcanisme ne peut pas tre contourn. Cest une fonctionnalit trs sympathique du langage Java, puisque, dans les autres langages orients objet, une erreur habituelle consiste ne pas appeler le constructeur de la classe parent. Java le fait toujours pour vous si vous ne le fates pas. Cest la signification du commentaire de la premire ligne du constructeur de ClasseChien (Super() implicite). Le constructeur de ClasseMammifre est appel cet emplacement automatiquement. Ce mcanisme repose sur lexistence dun constructeur sans paramtre dans la classe suprieure. Si le constructeur nexiste pas et si vous nen appelez pas un autre sur la premire ligne du constructeur enfant, la classe ne pourra pas se compiler.

Utilisation de this et de super


Si vous avez frquemment besoin dappeler explicitement le constructeur de la classe suprieure, utilisez le mot cl Java Super(). Il appelle le constructeur de la classe parent, dot des paramtres ncessaires. Il est aussi possible davoir plusieurs constructeurs pour une classe (notion prsente dans la section Surcharge des mthodes). Si vous crez plusieurs constructeurs, vous ne voulez pas dupliquer le code commun. Pour cela, appelez le constructeur dune mme classe avec le mot cl this() et transmettez-lui les paramtres ncessaires. Pour lapplication de lexemple, le changement de hirarchie est la seule diffrence entre les deux versions de lexemple. Linstanciation des objets et la fiche principale ne sont absolument pas modifies. Cependant, la conception de lapplication est plus efficace, puisque, pour modifier une quelconque des caractristiques des mammifres, il suffit de le faire dans la classe ClasseMammifre et de recompiler les classes enfant. Ces changements se reportent automatiquement sur les classes enfant.

2-8

Introduction Java

Classes

Modificateurs daccs
Un autre aspect des classes Java est laccessibilit des membres (variables et mthodes) de la classe. Dans Java, plusieurs options permettent de personnaliser laccessibilit aux membres. En rgle gnrale, il vaut mieux limiter la porte des lments des programmes (dont les membres des classes) autant que possible ; moins un lment est accessible, moins il risque dtre mal utilis. Dans Java, il y a quatre modificateurs daccs diffrents pour les membres des classes : private, protected, public et default (ou labsence de tout modificateur). Le fait que les classes dun mme paquet disposent daccs diffrents par rapport aux classes situes en dehors du paquet ajoute un peu de complexit. Les deux tableaux suivants montrent laccessibilit et lhritage des classes et des variables membre depuis lintrieur du mme paquet et depuis lextrieur du paquet (les paquets sont prsents plus loin).

Accs depuis lintrieur du paquet dune classe


Modificateur daccs
Par dfaut (pas de modificateur) Public Protected Private

Hritage
Oui Oui Oui Non

Accessible
Oui Oui Oui Non

Ce tableau montre comment les autres membres du mme paquet accdent aux membres dune classe et en hritent. Par exemple, un membre dclar private est inaccessible depuis les autres membres du mme paquet et il est impossible den hriter. Les membres dclars avec les autres modificateurs sont accessibles depuis les autres membres de ce paquet qui peuvent aussi en hriter.

Accs depuis lextrieur du paquet dune classe


Modificateur daccs
Par dfaut (pas de modificateur) Public Protected Private

Hritage
Non Oui Oui Non

Accessible
Non Oui Non Non

Par exemple, ce tableau montre quil est possible dhriter dun membre de type protected mais quil est impossible dy accder partir de classes situes en dehors de son paquet. Dans les deux tableaux prcdents, il faut noter principalement que les membres dclars de type public sont disponibles qui souhaite y accder (les constructeurs sont toujours de type public) alors que les membres de type

Programmation oriente objet dans Java

2-9

Classes

private sont inaccessibles et quil est impossible den hriter en dehors de leur classe. Ainsi, toute variable ou mthode membre qui doit rester strictement interne la classe doit tre dclare private. Habituellement, les langages orients objet acceptent lide de conserver les informations lintrieur de la classe en rendant private toutes les variables membre de la classe et en y accdant au moyen de mthodes appeles dans un format spcifique, les mthodes daccs.

Mthodes daccs
Les mthodes daccs permettent daccder publiquement la classe depuis lextrieur tout en conservant au stockage des donnes de la classe son aspect priv. Cest une bonne ide puisque vous pourrez ensuite tout moment modifier la reprsentation interne des donnes dans la classe sans toucher aux mthodes qui dfinissent rellement ces valeurs internes. Si vous ne modifiez pas linterface publique daccs la classe, vous ne dtruisez aucun code qui repose sur cette classe et ses mthodes publiques. Vous tes libre de modifier les travaux internes sans dtruire le code qui repose sur cette classe. Dans Java, les mthodes daccs sont fournies par paires : une pour obtenir la valeur interne (Get) et une autre pour dfinir la valeur interne (Set). Par convention, la mthode Get utilise le nom interne priv avec get comme prfixe et la mthode Set fait de mme avec set. En gnral, les mthodes Get boolennes utilisent is ou has comme prfixe la place de get. Les mthodes daccs permettent aussi de valider facilement les donnes attribues une variable membre particulire. En voici un exemple. Pour notre classe ClasseChien, nous avons dclar private toutes les variables membre internes et ajout des mthodes daccs permettant daccder aux valeurs internes. Remarquez que ClasseChien ne cre quune nouvelle variable membre, avecQueue.
package Oop3; import borland.jbcl.control.*; import java.awt.*; public class ClasseChien extends ClasseMammifre{ // mthodes daccs aux proprits // Queue public boolean hasQueue() { return queue; } public void setQueue( boolean value ) { queue = value; } public ClasseChien() { setNom( "Snoopy" ); setSon( "Wouah, wouah!" ); setAge( 2 );

2-10

Introduction Java

Classes

setQueue( true ); } public void Vitesse() { Message messageVitesse = new Message(); messageVitesse.setMessage("30 km/h"); messageVitesse.setFrame(new Frame()); messageVitesse.show(); } private boolean queue; }

Remarquez que queue a t dplace vers le bas de la classe et quelle est maintenant dclare comme private. Lemplacement de la dfinition est sans importance, mais il est habituel dans Java de mettre les membres privs de la classe en bas de la dfinition (aprs tout, vous ne pouvez pas y accder depuis lextrieur de la classe ; par consquent, si vous lisez le code, vous tes intress en premier pas les aspects publics). Nous avons cr aussi deux mthodes publiques pour obtenir (Get) la valeur (hasQueue()) et dfinir (Set) la valeur (setQueue()). Remarquez que ClasseMammifre a aussi des mthodes daccs pour ses variables membre, ce qui permet au constructeur de la classe ClasseChien dutiliser les mthodes set pour attribuer ces valeurs.

Classes abstraites
Dans une classe, il est possible de dclarer une mthode comme tant abstraite, ce qui signifie quil ny a pas dimplmentation de la mthode dans cette classe, mais que toutes les classes qui tendent celle-ci doivent fournir une implmentation. Quand une classe contient une mthode abstraite, la totalit de la classe doit tre dclare comme abstraite. Cela signifie quune classe qui inclut au moins une mthode abstraite (et qui est donc une classe abstraite) ne peut pas tre instancie. En voici un exemple : Nous voulons que tous les mammifres puissent prciser leur vitesse de course maximale. Cependant, les diffrents types de mammifres renseigneront leur vitesse diffremment. Dans ce but, nous avons cr dans la classe des mammifres une mthode abstraite appele Vitesse(). Toutes les sous-classes devront donc implmenter une mthode qui donnera la vitesse. Cette classe montre aussi lutilisation complte des mthodes daccs. (Lexemple illustre aussi les interfaces qui seront prsentes dans la prochaine section).
package Oop3; import Oop3.InterfaceSon; import java.awt.*; import borland.jbcl.control.*; abstract public class ClasseMammifre implements InterfaceSon { // mthodes daccs aux proprits // nom public String getNom() { return nom;

Programmation oriente objet dans Java

2-11

Classes

} public void setNom( String value ) { nom= value; } // couleurYeux public String getCouleurYeux() { return couleurYeux; } public void setCouleurYeux( String value ) { couleurYeux = value; } // son public String getSon() { return son; } public void setSon( String value ) { son = value; } // age public int getAge() { return age; } public void setAge( int value ) { if ( value > 0 ) { age = value; } else age = 0; } public ClasseMammifre() { nom = "Le nom"; couleurYeux = "Noir"; age = 0; } public void Parle() { Message messageSon = new Message(); messageSon.setMessage( this.son ); messageSon.setFrame( new Frame() ); messageSon.show(); } abstract public void Vitesse(); private String nom, couleurYeux, son; private int age; }

Remarquez que la mthode Vitesse() et la classe ont t toutes les deux dclares abstraites.

2-12

Introduction Java

Polymorphisme

Polymorphisme
Le polymorphisme est la possibilit pour deux classes spares, mais relies, de recevoir le mme message mais dagir dessus de diffrentes faons. En dautres termes, deux classes diffrentes (mais relies) peuvent avoir la mme mthode mais limplmenter de faon diffrente. Vous pouvez ainsi avoir une mthode dans une classe, galement implmente dans une classe enfant, et accder au code depuis la classe parent (ce qui est similaire au chanage automatique du constructeur dj voqu). Tout comme dans lexemple du constructeur, le mot cl super permettra daccder toutes les mthodes ou variables membre de la classe de niveau suprieur. Voici un exemple simple avec deux classes (Parent et Enfant).
class Parent { int x = 1; int uneMthode(){ return x; } } class Enfant extends Parent { int x; // ce x fait partie de cette classe int uneMthode() { // ceci redfinit la mthode de la classe parent x = super.x + 1; // accs au x de la classe parent avec super return super.uneMthode() + x; } }

Surcharge des mthodes


Dans Java, il est possible de crer dans une classe plusieurs mthodes qui portent le mme nom mais avec diffrents paramtres et/ou valeurs de retour. Cela est connu sous le nom de surcharge des mthodes. Java dcide de la mthode appeler en regardant la valeur de retour et les paramtres.

Utilisation des interfaces


Fonctionnellement, une interface ressemble une classe abstraite mais avec une diffrence importante : une interface ne peut pas inclure de code. Dans Java, le mcanisme dinterface est un moyen destin remplacer lhritage multiple. Une interface est une dclaration de classe spcialise qui peut dclarer des constantes et des dclarations de mthodes, mais pas dimplmentation ; il est impossible de mettre du code dans une interface. Voici un exemple de dclaration dinterface.
package Oop3; interface InterfaceSon {

Programmation oriente objet dans Java

2-13

Polymorphisme

public void Parle(); }

Remarquez lutilisation du mot cl interface la place de class. Par dfaut, toutes les mthodes dclares dans une interface sont publiques ; il est ainsi inutile de prciser leur accessibilit. Une classe peut implmenter une interface en utilisant le mot cl implements. Une classe ne peut tendre quune seule autre classe, mais elle peut implmenter autant dinterfaces quelle le veut. Cest de cette faon que les interfaces Java grent des situations qui sont normalement gres par lhritage multiple. Dans de nombreuses situations, vous pouvez traiter linterface comme sil sagissait dune classe. En dautres termes, pour plus de facilit, vous pouvez traiter des objets qui implmentent une interface comme des sous-classes de linterface. Cependant, remarquez que vous ne pouvez accder aux mthodes dfinies par cette interface que si vous transtypez un objet qui implmente linterface. Lexemple ci-dessous illustre le polymorphisme et les interfaces : La dfinition de ClasseMammifre ci-dessus implmente linterface InterfaceSon illustre ci-dessus. Rappelez-vous que ClasseMammifre contient aussi la mthode abstraite Vitesse(). Voici les nouveaux fichiers source de ClasseChien et ClasseHomme.
package Oop3; import borland.jbcl.control.*; import java.awt.*; public class ClasseChien extends ClasseMammifre{ // mthodes daccs aux proprits // Queue public boolean hasQueue() { return queue; } public void setQueue( boolean value ) { queue = value; } public ClasseChien() { setNom( "Snoopy" ); setSon( "Wouah, wouah !" ); setAge( 2 ); setQueue( true ); } public void Vitesse() { Message messageVitesse = new Message(); messageVitesse.setMessage("30 km/h"); messageVitesse.setFrame(new Frame()); messageVitesse.show(); } private boolean queue; } package Oop3; import borland.jbcl.control.*;

2-14

Introduction Java

Polymorphisme

import java.awt.*; public class ClasseHomme extends ClasseMammifre { // mthodes daccs aux proprits // mari public boolean isMari() { return mari; } public void setMari( boolean value ) { mari = value; } public ClasseHomme() { setNom( "Bob" ); setcouleurYeux( "Bleu" ); setSon( "Bonjour tous !" ); setAge( 1 ); setMari( true ); } public void Vitesse() { Message messageVitesse = new Message(); messageVitesse.setMessage( "22 km/h" ); messageVitesse.setFrame( new Frame() ); messageVitesse.show(); } private boolean mari; }

Comme les deux classes tendent ClasseMammifre, elles doivent toutes les deux fournir une implmentation de la mthode Vitesse(). Remarquez aussi quelles implmentent aussi linterface InterfaceSon parce quelle est dj implmente dans ClasseMammifre, mais le son mis par chaque mammifre est prcis dans le constructeur. Il y a aussi quelques modifications apportes la fiche principale de lapplication. Nous avons ajout deux boutons, Vitesse et Parle.
Figure 2.2 Nouvelle version de lapplication exemple avec les boutons Vitesse et Parle

Programmation oriente objet dans Java

2-15

Polymorphisme

Nous avons ajout aussi quelques dclarations dans la classe de la fiche.


// Cre une rfrence pour les objets ClasseChien chien; ClasseHomme homme; //Cre un tableau dinterfaces son InterfaceSon listeSons[] = new InterfaceSon[2]; //Cre un tableau de mammifres ClasseMammifre listeMammifres[] = new ClasseMammifre[2];

Outre la cration de rfrences pour chien et homme, nous avons cr aussi deux tableaux pour les mammifres et les interfaces son. Ensuite, quand nous crons le chien et lhomme, nous ajoutons les rfrences voulues dans les deux listes.
void button1_actionPerformed(ActionEvent e) { chien = new ClasseChien(); txtfldNomChien.setText( chien.getNom() ); txtfldCouleurYeuxChien.setText( chien.getcouleurYeux() ); txtfldAgeChien.setText( Integer.toString( chien.getAge()) ); chkbxChien.setState( chien.hasQueue() ); listeMammifres[0] = chien; listeSons[0] = chien; } void button2_actionPerformed(ActionEvent e) { homme = new ClasseHomme(); txtfldNomHomme.setText( homme.getNom() ); txtfldCouleurYeuxHomme.setText( homme.getcouleurYeux() ); txtfldAgeHomme.setText( Integer.toString( homme.getAge()) ); chkbxHomme.setState( homme.isMari() ); listeMammifres[1] = homme; listeSons[1] = homme; }

Remarquez que nous pouvons ajouter les deux objets aux deux listes sans transtypage, puisque ce sont tous les deux des mammifres et des objets pouvant mettre des sons du fait de leur ligne. Le code sous le bouton Vitesse boucle dans la liste et demande chaque objet dafficher sa vitesse.
void button4_actionPerformed(ActionEvent e) { for (int i = 0; i <= 1; i++) { listeMammifres[i].Vitesse(); } }

Remarquez encore quil nest pas ncessaire de transtyper les objets pour accder la mthode Vitesse(). Au premier accs dans la liste, le chien affiche sa vitesse ; au deuxime accs, lhomme affiche sa vitesse. Cest le polymorphisme en action : deux objets spars mais relis recevant le mme message et ragissant de faon diffrente. Le code situ sous le bouton Parle est semblable.
void button3_actionPerformed(ActionEvent e) {

2-16

Introduction Java

Paquets Java

for (int i = 0; i <= 1; i++) { listeSons[i].Parle(); } }

Vous verrez que nous pouvons traiter InterfaceSon comme une classe si besoin est. Encore une fois, aucun transtypage nest ncessaire pour excuter cette mthode sur ces objets. Cependant, comme il sagit dune interface, nous ne pouvons pas accder la mthode Vitesse() partir de cette rfrence sans transtypage. Mais remarquez que linterface apporte certains avantages de lhritage multiple tout en vitant sa complexit.

Paquets Java
Pour faciliter la rutilisation du code, Java permet de regrouper plusieurs dfinitions de classes dans un groupe logique appel paquet. Si, par exemple, vous crez un groupe des rgles de gestion qui modlisent les traitements de gestion de votre entreprise, vous pouvez les runir dans un paquet. Cela facilite la rutilisation du code prcdemment cr.

Linstruction import
Le langage Java est fourni avec de nombreux paquets prdfinis. Par exemple, le paquet java.applet contient des classes permettant de travailler avec les applets Java. Dans lexemple prcdent, nous avons dclar une sous-classe dapplet avec la ligne de code suivante :
public class Bonjour extends java.applet.Applet {

Dans ce code, nous avons rellement fait rfrence la classe appele Applet dans le paquet java.applet. Il nest pas pratique davoir rpter le nom complet de la classe java.applet.Applet chaque fois quil faut faire rfrence cette classe. Java propose une autre solution. Vous pouvez importer un paquet frquemment utilis :
import java.applet.*;

Cela prcise au compilateur si tu rencontres un nom de classe inconnu, cherches dans le paquet java.applet. Maintenant, pour dclarer notre nouvelle classe, nous pouvons dire,
public class Bonjour extends Applet {

ce qui est plus court. Cependant, cela pose un problme si deux paquets imports contiennent deux classes qui portent le mme nom. Dans ce cas, il faut utiliser le nom complet.

Programmation oriente objet dans Java

2-17

Paquets Java

Dclaration des paquets


La cration de vos propres paquets est presque aussi simple que leur utilisation. Par exemple, pour crer un paquet appel monpaquet, il suffit dutiliser une instruction package au dbut du fichier :
package monpaquet; public class Bonjour extends java.applet.Applet { public void init() { add(new java.awt.Label("Bonjour tous sur le Web !")); } } // end class

Maintenant, nimporte quel autre programme peut, pour accder aux classes dclares dans monpaquet, utiliser linstruction :
import monpaquet.*;

Rappelez-vous que ce fichier doit se trouver dans un sous-rpertoire appel monpaquet. Cela permet au compilateur Java de localiser facilement votre paquet. Lexpert projet de JBuilder dfinit automatiquement le rpertoire pour quil corresponde au nom du projet. Noubliez donc pas que le rpertoire de base de tout paquet import doit figurer dans le Chemin du source de lEDI de JBuilder ou dans le Chemin du source de votre projet. Pensez-y si vous dcidez de mettre un paquet dans un rpertoire de base diffrent. La section Java Language Specification (fournie dans la documentation en ligne) donne plus dinformations sur les paquets, dont les conventions de nom recommandes.

Options de projet relatives aux paquets


Dans la section Chemins de la bote de dialogue Proprits du projet, vous pouvez dfinir les proprits relatives aux paquets : Chemin des sources du navigateur : prcise le chemin utilis par lEDI de JBuilder pour chercher les fichiers source. Sil ne trouve pas les fichiers, il utilise le chemin des sources du compilateur. Chemin des sources du compilateur : JBuilder utilise ce chemin pour comparer des fichiers .class du Chemin de la classe aux fichiers .java correspondants, pour savoir sil faut recompiler les fichiers .java. Chemin de la classe : JBuilder cherche les fichiers .class dans ce chemin. Quand vous rfrencez une classe dun autre paquet, JBuilder cherche ce paquet dans le chemin de la classe. Chemin de sortie : lieu de stockage des fichiers compils. Quand un compilateur Java compile une classe Java, il met les bytecodes rsultants dans un fichier qui porte le mme nom que la classe et lextension .class. Le Chemin de sortie reflte le chemin dans lequel vous avez cr votre projet. Ainsi, pour crer ClasseChien, nous avons cr un fichier appel

2-18

Introduction Java

Rcapitulatif

ClasseChien.java. Ce fichier se trouve dans le sous-rpertoire Oop1 ; par consquent, le rsultat de la compilation de ce fichier donne un fichier appel ClasseChien.class stock dans le sous-rpertoire Oop1 du Chemin de sortie. Quand une partie du code Java rfrence un paquet externe (par exemple si vous utilisez un des composants du paquet java.awt), lenvironnement et le compilateur Java parcoureront les chemins des sources et de la classe pour trouver un sous-rpertoire portant le mme nom que le paquet.

Rcapitulatif
Dans ce chapitre, nous avons abord les sujets suivants : La programmation oriente objet est apparue en 1967 avec le langage Simula 67 mais sest rpandue partir des annes 80. Un objet est dclar comme nimporte quelle autre variable et il est instanci par le mot cl new. Dans une classe, nimporte quel type (primitif et objet) peut figurer. Un constructeur est une mthode spciale qui affecte toutes les ressources de la classe. Un finaliseur est une mthode automatiquement appele par le Garbage collector juste avant la destruction dun objet. Lhritage est implment en utilisant le mot cl extends. Le mot cl this fait rfrence la classe actuelle et il peut tre utilis comme appel de mthode pour appeler un autre constructeur de la classe. Le mot cl super peut servir rfrencer une variable membre dune classe parent ou appeler le constructeur dune classe parent. Les mthodes daccs get et set servent encapsuler la reprsentation des donnes internes dans la fiche des variables membre prives. Une classe abstraite contient au moins une mthode abstraite, qui ne peut pas tre instancie. Le polymorphisme est la possibilit offerte deux objets spars, mais relis, de recevoir le mme message et dy ragir diffremment. Une interface ressemble une classe abstraite mais ne peut pas contenir de code ni de variable membre non constante. Avec linstruction import, il devient inutile de qualifier compltement les noms des classes.

Programmation oriente objet dans Java

2-19

2-20

Introduction Java

Chapitre

Chapitre 3

Les bibliothques des classes Java

Ce chapitre traite des sujets suivants : Utilit des bibliothques des classes standard dans le dveloppement Java. But des classes denveloppe de type. Pourquoi Java supporte-t-il des types de donnes primitifs ?

Introduction
Pour prendre en charge certaines fonctionnalits, la plupart des langages de programmation reposent sur des bibliothques dj construites. Par exemple, le langage C nintgre pas la prise en charge des fonctions dE/S. Le JDK 1.1 dispose dune bibliothque trs impressionnante qui inclut la connectivit des bases de donnes, la conception GUI, les E/S et la programmation en rseau. Bien que le JDK 1.1 contienne de nombreux paquets de prise en charge, dix dentre eux mritent une prsentation spcifique. Le tableau suivant les dcrit brivement.
Paquet
Langage Utilitaires E/S Rseau AWT Texte Scurit RMI Reflection SQL

Description
Noyau principal du langage Java Prise en charge des structures de donnes utilitaires Prise en charge de divers types dentre/sortie Prise en charge de TCP/IP et programmation des sockets Conception GUI et gestion des vnements Prise en charge de la localisation Prise en charge de la scurit par cryptographie Prise en charge de la programmation distribue Donne des informations sur les classes lexcution Prise en charge de linterrogation des bases de donnes avec SQL

Les bibliothques des classes Java

3-1

Le paquet du langage (lang)

Ce chapitre sintresse surtout aux paquets relatifs au langage, aux utilitaires et aux E/S. Le paquet sur la scurit est prsent dans le chapitre 6, Scurit de la machine virtuelle Java.

Le paquet du langage (lang)


Le paquet java.lang est un des plus importants de la bibliothque des classes Java. Il contient les classes principales de prise en charge du langage. Il est pratiquement impossible dcrire un programme Java sans utiliser le paquet du langage. Les sections suivantes prsentent quelques-unes des classes les plus importantes de ce paquet.

La classe Object
La classe Object est parent de toutes les classes Java. Cela signifie simplement que toutes les classes Java sont drives de la classe Object. Cette classe contient elle-mme plusieurs mthodes importantes : clone, equals et toString. Un objet qui utilise la mthode clone fait simplement une copie de lui-mme. Pour cela, une certaine quantit de mmoire est affecte au clone, puis le contenu de lobjet initial est copi dans lobjet clone. Par exemple, nous voulons obtenir une copie de la classe Document avec une proprit texte et auteur. Pour crer une occurrence de la classe Document contenant les deux proprits et les valeurs associes lobjet, utilisez la mthode clone. Le code suivant montre comment y parvenir.
Document document1 = new Document ("docText.txt", "Jean Martin"); Document document2 = document1.clone();

La mthode equals compare deux objets du mme type sur la base de leurs proprits. Elle renvoie une valeur boolenne qui dpend de lobjet qui a appel la mthode et de lobjet qui lui a t transmis. Par exemple, si equals est appele par un objet qui lui transmet un objet compltement identique, la mthode equals renvoie la valeur True. La mthode toString donne un rsultat de type String qui reprsente la valeur de lobjet. Pour que cette mthode renvoie des informations correctes quel que soit le type dobjet, la classe de lobjet doit la redfinir.

Classes denveloppe de type


Dans Java, les types de donnes primitifs ne sont pas utiliss en tant quobjets, pour des raisons de performances. Ces types de donnes incluent les nombres, les valeurs boolennes et les caractres. Traiter ces types de donnes primitifs comme des objets dgraderait considrablement les performances du langage ( cause du temps systme consacr au traitement des objets). Cependant, certaines classes et mthodes Java ncessitent que les types de donnes primitifs soient des objets. Il est galement

3-2

Introduction Java

Le paquet du langage (lang)

utile, dans certains cas, dajouter des mthodes personnalises ces types. Pour ces raisons, les classes Java denveloppe de type peuvent tre instancies. Le tableau suivant donne la liste des types de donnes primitifs que les paquets du Langage prennent en charge en tant quobjets.
Classes denveloppe de type
Boolean Byte Character Double Float Integer long short

Description
True ou False (1 bit) 128 127 (nombre entier sign sur 8 bits) Caractre Unicode (16 bits) +1.79769313486231579E+308 +4.9406545841246544E324 (64 bits) +3.40282347E+28 +1.40239846E45 (32 bits) 2147483648 2147483647 (nombre entier sign sur 32 bits) 9223372036854775808 9223372036854775807 (nombre entier sign sur 64 bits) 32768 32767 (nombre entier sign sur 16 bits)

Bien que chacune de ces classes contienne ses propres mthodes, plusieurs dentre elles sont standard pour plusieurs objets. Elles incluent ClassType, typeValue, toString et equals. La mthode ClassType est le constructeur des classes denveloppe. Elle prend simplement un argument du type de la classe quelle enveloppe. Par exemple, le code suivant montre la construction dune classe denveloppe du type Character.
Character charWrapper = new Character ('T');

La mthode typeValue renvoie le type primitif de la classe denveloppe. Le code suivant illustre lutilisation de lobjet charWrapper. Remarquez que charPrimitive est un type de donnes primitif (char). Cependant, avec cette mthode, des types de donnes primitifs peuvent tre attribus aux enveloppes de types.
char charPrimitive = charWrapper.charValue();

Les mthodes toString et equals sont utilises de la mme faon que dans la classe Object. Elles sont gnralement utilises pour le dbogage.

La classe Math
La classe Math fournit des mthodes utiles qui implmentent des fonctions mathmatiques courantes. Cette classe nest pas instancie ; elle est dclare comme final, ce qui signifie quelle ne comporte pas de sous-classe. Parmi les mthodes de cette classe, se trouvent : sin, cos, exp, log, max, min, random, sqrt et tan. Quelques mthodes sont surcharges pour accepter et renvoyer diffrents types de donnes. Voici quelques exemples dutilisation de ces mthodes.
double d1 = Math.sin (45); double d2 = 23.4; double d3 = Math.exp (d2);

Les bibliothques des classes Java

3-3

Le paquet du langage (lang)

double d4 = Math.log (d3); double d5 = Math.max (d2, Math.pow (d1, 10);

La classe Math dclare aussi les constantes PI et E qui peuvent tre facilement utilises dans les calculs.
Remarque

Ne confondez pas la classe Math avec le paquet java.math. Ce dernier assure la prise en charge des classes permettant de travailler avec des nombres importants.

La classe String
La classe String sert dclarer et manipuler des chanes de caractres. A la diffrence de C/C++, Java nutilise pas de tableaux de caractres pour reprsenter des chanes. La classe String, destine aux chanes de caractres constantes, est habituellement construite quand le compilateur Java rencontre une chane de caractres entre guillemets. Il y a cependant plusieurs faons de construire des chanes. Le tableau suivant donne la liste des constructeurs de chanes ainsi que les paramtres quils acceptent.
Constructeur
String String String String String

Paramtres
() (String) (char valeur[]) (char valeur[], int dcalage, int nombre) (StringBuffer)

La classe String contient plusieurs mthodes importantes, essentielles dans le traitement des chanes de caractres. Le tableau suivant dresse la liste de quelques mthodes parmi les plus utiles, avec ce quelles acceptent et renvoient.
Mthode
length charAt compareTo startsWith endsWith indexOf substring concat toLowerCase toUpperCase valueOf

Accepte
() (int index) (String) (String prefixe) (String suffixe) (int ch) (int indexDbut, int indexFin) (String) () () (Object)

Renvoie
int char int boolean boolean int String String String String String

Comme elles sont surcharges pour accepter et renvoyer diffrents types de donnes, ces mthodes sont encore plus puissantes. Les exemples suivants illustrent lutilisation de la classe String et de quelques-unes de ses mthodes.

3-4

Introduction Java

Le paquet du langage (lang)

String s1 = new String ("Bonjour tous."); char cArray[] = {'J', 'B', 'u', 'i', 'l', 'd', 'e', 'r'}; String s2 = new String (cArray); //s2 = "JBuilder" int i = s1.length(); char c = s1.charAt(4); i = s1.indexOf('o'); //i = 15 //c = 'o' //i = 1(le premier 'o')

String s3 = "abcdef".substring (2, 5) //s3 = "cde" String s4 = s3.concat ("f");//s4 = "cdef" String s5 = valueOf (i); //s5 = "2" (valueOf()is static)

La classe StringBuffer
La classe StringBuffer est diffrente de la classe String, puisque les objets StringBuffer peuvent tre modifis. Tout comme la classe String, la classe StringBuffer dispose de plusieurs constructeurs. Le tableau suivant dresse la liste des constructeurs de la classe StringBuffer.
Constructeur
StringBuffer StringBuffer StringBuffer

Accepte
() (int longueur) (String)

Plusieurs mthodes importantes diffrencient la classe StringBuffer et la classe String, dont : Length, Capacity, setLength, charAt, setCharAt, Append, Insert et toString. La mthode Append est utilise relativement souvent dans le traitement des objets StringBuffer. Elle sert ajouter du texte lobjet StringBuffer. Par chance, la mthode Append a t fortement surcharge. La mthode Capacity est galement souvent utilise avec les objets StringBuffer. Elle renvoie la quantit de mmoire affecte au StringBuffer. Comme la mmoire affecte un objet StringBuffer peut tre contrle avec le constructeur StringBuffer (int length), cette valeur peut tre suprieure la valeur renvoye par la mthode Length. Le code suivant illustre quelques-unes des mthodes associes la classe StringBuffer.
StringBuffer s1 = new StringBuffer(10); int c = s1.capacity(); int l = s1.length(); s1.append("Bor"); s1.append("land"); c = s1.capacity(); l = s1.length(); s1.setLength(2); //c = 10 //l = 0 //s1 = "Bor" //s1 = "land" //c = 10 //l = 7 //s1 = "Bo"

StringBuffer s2 = new StringBuffer("Bonour tous"); s2.insert (3, "j"); //s2 = "Bonjour tous"

Les bibliothques des classes Java

3-5

Le paquet des utilitaires (util)

La classe System
La classe System permet daccder aux ressources indpendantes de la plate-forme du systme. Cest une classe dclare comme final, qui ne peut donc pas donner naissance des sous-classes. Ses mthodes et variables sont galement dclares comme statiques, ce qui lui permet dtre disponible sans tre instancie. Les mthodes de la classe System sont utiles dans de nombreus cas. Une fonction importante consiste obtenir lheure du systme avec la mthode currentTimeMillis. Il est galement possible dextraire et de modifier les ressources du systme avec les mthodes Get et Set. La classe System permet de forcer la rcupration de place (Garbage collection) avec la mthode gc ; enfin, la classe System permet aux dveloppeurs de charger des bibliothques de liens dynamiques avec la mthode loadLibrary. Laspect le plus utile de la classe System est les variables quelle dclare, qui permettent davoir une interaction avec le systme. On y trouve les variables in, out et err. La variable in reprsente le flux dentre standard du systme, alors que la variable out reprsente le flux de sortie standard. La variable err est le flux derreur standard. Les flux sont dcrits en dtail dans la section consacre au paquet des E/S.

Le paquet des utilitaires (util)


Le paquet java.util contient plusieurs classes et interfaces utilitaires cruciales pour le dveloppement Java. La plupart dentre elles aident le dveloppeur lors de la conception de diffrents types de structures de donnes. Le tableau suivant dcrit quelques-unes des classes associes au paquet des utilitaires.
Classe
Calendar Date Dictionary Hashtable SimpleTimeZone Stack StringTokenizer Vector

Description
Permet lutilisation des fonctions de calendrier Reprsente les dates et les heures Classe abstraite parent de Hashtable Permet dassocier des cls des valeurs Reprsente un fuseau horaire Permet dempiler les objets Dcompose un objet String en jetons Implmente un tableau dynamique dobjets

Le paquet des utilitaires dclare aussi trois interfaces : Enumeration, EventListener et Observable. Dans cette section, nous naborderons que la classe Vector et linterface Enumeration.

3-6

Introduction Java

Le paquet des utilitaires (util)

Linterface Enumeration
Linterface Enumeration sert implmenter une classe pouvant numrer des valeurs. Une classe qui implmente linterface Enumeration facilite linvestigation de structures de donnes. Avec les mthodes dfinies dans linterface Enumeration, lobjet Enumeration peut extraire en continu tous les lments dune structure de donnes, un par un. Seules deux mthodes sont dclares dans linterface Enumeration : hasMoreElements et nextElement. La mthode hasMoreElements renvoie True sil reste des lments dans la structure de donnes. La mthode nextElement renvoie lobjet suivant dans la structure de donnes en cours dnumration. Un exemple simple illustre limplmentation de linterface Enumeration. Il contient une classe appele canEnumerate, qui implmente linterface Enumeration. Une occurrence de cette classe peut tre utilise pour imprimer tous les lments dun objet Vector (v dans ce cas).
canEnumerate enum = v.elements(); while (enum.hasMoreElements()) { System.out.print (enum.nextElement()); }

Un objet Enumeration est limit car il ne peut tre utilis quune seule fois. Linterface ne dispose pas de mthode permettant de revenir sur llment prcdent. Ainsi, une fois la totalit de la liste numre, lobjet est consomm.

La classe Vector
Le JDK 1.1 ne prend pas en charge de nombreuses structures de donnes dynamiques, comme les listes lies et les files dattente ; elle dfinit seulement une classe Stack. Cependant, la classe Vector permet dimplmenter facilement des structures de donnes dynamiques. Le tableau suivant dresse la liste de quelques mthodes de la classe Vector parmi les plus importantes, avec ce quelles acceptent.
Mthode
Vector Vector setSize capacity size elements elementAt firstElement lastElement

Accepte
(int capacitInitiale) (int capaciteInitiale, int incrmentCapacit) (int nouvelleTaille) () () () (int) () ()

Les bibliothques des classes Java

3-7

Le paquet des utilitaires (util)

Mthode
removeElementAt addElement toString

Accepte
(int index) (Object) ()

Comme elle affecte plus de mmoire que ncessaire pendant lajout de nouveaux lments, la classe Vector est efficace. Par consquent, la capacit dun objet Vector est gnralement suprieure sa taille relle. Le paramtre incrmentCapacit du deuxime constructeur prcise laugmentation de la capacit de lobjet Vector quand on lui ajoute un lment. Le code suivant illustre lutilisation de la classe Vector. Dans ce code, lobjet Vector vector1 est cr et numre ses lments de trois faons : avec la mthode nextElement dEnumeration, avec la mthode elementAt de Vector et avec la mthode toString de Vector. Pour afficher le rsultat, un composant AWT appel textArea est cr et la proprit text est dfinie avec la mthode setText. Voici le code ajout la fin du constructeur VectorTest1.
Vector vector1 = new Vector (10, 2); //taille initiale : 10, //incrmentCapacit : 2

for (int i=0; i<10;i++) vector1.addElement(new Integer(i)); //addElement naccepte pas les types int //enumrer vector1 Enumeration e = vector1.elements(); frame.textArea1.setText ("Elments utilisant nextElement() dEnumeration :\n"); while (e.hasMoreElements()) frame.textArea1.setText (frame.textArea1.getText()+ e.nextElement()+ " | "); frame.textArea1.setText (frame.textArea1.getText()+ "\n\n"); //enumrer en utilisant la mthode elementAt() frame.textArea1.setText (frame.textArea1.getText()+ "Elments utilisant elementAt() de Vector :\n"); for (int i=0; i< vector1.size();i++) frame.textArea1.setText (frame.textArea1.getText()+ vector1.elementAt(i) + " | "); frame.textArea1.setText (frame.textArea1.getText()+ "\n\n"); //enumrer en utilisant la mthode toString() frame.textArea1.setText (frame.textArea1.getText()+ "Voici le vecteur sous forme de String :\n"); frame.textArea1.setText (frame.textArea1.getText()+ vector1.toString());

La figure suivante montre laction de ce code dans une application.

3-8

Introduction Java

Le paquet des E/S (io)

Figure 3.1

Exemple Vector et Enumeration

Le paquet des E/S (io)


The java.io package provides support for reading and writing data to and from different devices. The classes in this package can be divided into the following packages: Input stream classes, Output stream classes, File classes, and the StreamTokenizer class. Le paquet java.io prend en charge la lecture et lcriture de donnes sur diffrentes units. Les classes de ce paquet peuvent tre rparties en paquets diffrents. Il sagit des classes de flux dentre, des classes de flux de sortie, des classes File et de la classe StreamTokenizer.

Classes de flux dentre


Un flux dentre (Input) sert lire des donnes depuis une source dentre (cest--dire un fichier, une chane de caractres, la mmoire, etc.). Dans cette dfinition, il y a plusieurs classes encapsules. Les classes de flux dentre incluent : InputStream, BufferedInputStream, DataInputStream, FileInputStream et StringBufferInputStream. La mthode de base de lecture de donnes avec une classe de flux Input est toujours la mme : (1) crer une occurrence dune classe de flux dentre, puis (2) prciser lemplacement des donnes lire. Les classes de flux dentre utilisent les donnes sous forme dun flux de donnes continu. Sil ne reste plus de donnes disponibles, la classe de flux dentre se bloque (attend que de nouvelle donnes soient disponibles). Outre les classes de flux dentre, le paquet des E/S fournit des classes de lecture qui correspondent toutes les classes de flux dentre (sauf DataInputStream). Il sagit des classes Reader, BufferedReader, FileReader et StringReader. Les classes de lecture sont identiques aux classes de flux dentre, sauf quelles lisent des caractres Unicode et non des octets.

Les bibliothques des classes Java

3-9

Le paquet des E/S (io)

La classe InputStream est une classe abstraite de laquelle toutes les autres classes de flux dentre sont drives. Elle fournit linterface de base pour la lecture dun flux doctets. Le tableau suivant dresse la liste de quelques mthodes InputStream avec ce quelles attendent. Chacune des mthodes, sauf la mthode close, renvoie une valeur de type int.
Mthode
read read read available skip close

Accepte
() (byte b[]) (byte b[], int dcalage, int longueur) () (long) ()

La premire mthode, abstract int read, lit un octet partir du flux en entre et renvoie un nombre entier (la valeur renvoye peut tre de type char). A la fin du flux, elle renvoie -1. La deuxime mthode, int read(byte b[]), lit plusieurs octets et les place dans son paramtre tableau. Elle renvoie le nombre doctets lus ou 1 quand la fin du flux est atteinte. La dernire mthode read, int read(byte b[], int dcalage, int longueur), permet au dveloppeur de prciser le nombre doctets lire et o les mettre dans le tableau. La mthode int available renvoie le nombre doctets en entre qui peuvent tre lus sans blocage. La mthode skip ignore dans le flux un nombre doctets prcis. Pour terminer, la mthode close permet de fermer le flux en entre. Normalement, cette mthode est appele automatiquement, mais il est plus sr de lappeler manuellement. La classe FileInputStream ressemble beaucoup la classe InputStream, sauf quelle est conue pour lire partir de fichiers. Elle contient deux constructeurs : FileInputStream(String nom) et FileInputStream(File fichier). Le premier constructeur prend comme paramtre un nom de fichier. Le deuxime prend simplement un objet File. La classe File est prsente plus loin. Lexemple suivant illustre une utilisation de la classe FileInputStream.
import java.io.*; class fileReader { public static void main (string args[]) { byte buff[] = new byte [80]; try { InputStream fileIn = new FileInputStream("Readme.txt"); int i = fileIn.read(buff); } catch(FileNotFoundException e) { } catch(IOException e) { }

3-10

Introduction Java

Le paquet des E/S (io)

String s = new String(buff); System.out.println(s); } }

Dans cet exemple, un tableau de caractres est cr pour recevoir les donnes en entre. Ensuite, un objet FileInputStream est instanci et transmet le nom du fichier en entre son constructeur. Ensuite, la mthode read() de FileInputStream lit un flux de caractres quelle met dans le tableau buff. Les 80 premiers octets du fichier Readme.txt sont lus et mis dans le tableau buff. La classe FilerReader aurait pu tre utilise la place de la mthode FileInputStream. Les seules modifications ncessaires seraient le remplacement dun tableau de type byte par un tableau de type un tableau de type char, et lobjet reader serait instanci de la manire suivante.
Reader fileIn = new FileReader("Readme.txt");

Enfin, pour voir le rsultat de la lecture, un objet string est cr en utilisant le tableau buff array, puis il est transmis la mthode System.out.println. Comme cela a dj t dit, la classe System est dfinie dans java.lang et donne accs aux ressources du systme. System.out est un membre statique de la classe System et reprsente le priphrique de sortie standard. La mthode println est appele pour envoyer la sortie sur le priphrique de sortie standard. Lobjet System.out est du type PrintStream, prsent dans la section rserve aux classes de flux de sortie. Lobjet System.in, du type InputStream, est un autre membre statique de la classe System. Naturellement, il reprsente le priphrique dentre standard.

Classes de flux de sortie


Les classes de flux de sortie (Output) sont la contrepartie des classes de flux dentre. Elles permettent denvoyer des flux de donnes en sortie sur diverses units. Dans Java, les classes de flux de sortie principales sont : OutputStream, PrintStream, BufferedOutputStream, DataOutputStream et FileOutputStream. Pour envoyer un flux de donnes en sortie, il faut crer un objet de flux Output et diriger les donnes en sortie vers une unit particulire. Comme on peut sy attendre, il y a aussi des classes dcriture. A toutes les classes, sauf DataOutputStream, correspond une classe dcriture. Comme la classe OutputStream est la contrepartie de la classe InputStream, elle dfinit les mthodes suivantes.
Mthode
write write write flush close

Accepte
(int) (byte b[]) (byte b[], int dcalage, int longueur) () ()

Les bibliothques des classes Java

3-11

Le paquet des E/S (io)

La mthode flush sert vider le flux en sortie (cest--dire quelle force la sortie des donnes qui taient stockes en mmoire tampon). La classe PrintStream est principalement destine lenvoi en sortie des donnes sous forme de texte. Elle a deux constructeurs : PrintStream(OutputStream) et PrintStream(OutputStream, boolean autoflush). Les deux constructeurs sont diffrents. Avec le premier, lobjet PrintStream vide les donnes de la mmoire tampon sur la base de conditions prcises, alors que le deuxime vide les donnes quand il trouve un caractre de nouvelle ligne (si autoflush a la valeur True). Voici quelques mthodes dfinies par PrintStream.
Mthode
checkError print print println println

Accepte
() (Object obj) (String s) () (Object obj)

Les mthodes print et println sont surcharges pour accepter et renvoyer diffrents types de donnes. La mthode checkerror vide le flux et renvoie une valeur False en cas derreur.

Classes de fichiers
Les classes FileInputStream et FileOutputStream fournissent uniquement les fonctions de base de gestion des entres et sorties de fichiers. Le paquet java.io fournit la classe File et la classe RandomAccessFile pour une prise en charge volue des fichiers. La classe File fournit un accs facile aux attributs et fonctions des fichiers. La classe RandomAccessFile fournit diverses mthodes de lecture et dcriture sur un fichier. La classe File a trois constructeurs : File(String chemin), File(String chemin, String nom) et File(File dir, String nom). La classe File implmente galement de nombreuses mthodes importantes. La tableau suivant dresse la liste de ces mthodes, avec ce quelles renvoient.
Mthode
delete canRead canWrite exists isDirectory renameTo long lastModified long length getName

Renvoie
boolean boolean boolean boolean boolean boolean long long String

3-12

Introduction Java

Bibliothque gnrique Java (JGL)

Mthode
getParent getPath

Renvoie
String String

La classe RandomAccessFile est plus puissante que les classes FileInputStream et FileOutputStream. Elle implmente des mthodes de lecture et dcriture pour tous les types primitifs. Elle a les deux constructeurs suivants : RandomAccessFile(String nom, String mode) et RandomAccessFile(File fichier, String mode). Le paramtre mode prcise si lobjet RandomAccessFile est utilis en lecture ("r") ou en lecture/criture ("rw"). RandomAccessFile implmente de nombreuses mthodes puissantes. Le tableau suivant donne la liste de quelques mthodes, avec ce quelles acceptent.
Mthode
skipBytes getFilePointer seek read read readType write write length close

Accepte
(int) () (long pos) () (byte b[], int dcalage, int longueur) () () (byte b[], int dcalage, int longueur) () ()

La classe StreamTokenizer
Cette classe sert dcomposer un flux en jetons individuels. La classe StreamTokenizer implmente des mthodes utilises pour dfinir la syntaxe lexicale des jetons. Cette technique de traitement des flux en jetons est peut-tre la plus utilise dans lcriture de compilateurs.

Bibliothque gnrique Java (JGL)


Le JDK 1.1 ne prend en charge que trois types de structures de donnes : Vector, Stack et Hashtable. Il ne prend pas trs bien en charge divers algorithmes, comme le tri et le filtrage. La bibliothque gnrique Java (JGL), distribue gratuitement, peut pallier ces insuffisances. Parmi les fonctionnalits les plus utiles de la JGL se trouvent la srialisation, la scurit multi-thread, des performances optimales, 11 structures de donnes et 40 algorithmes ; elle est totalement compatible avec le JDK 1.1.

Les bibliothques des classes Java

3-13

Bibliothque gnrique Java (JGL)

La JGL inclut aussi plusieurs structures de donnes. Le tableau suivant dfinit chaque structure de donnes.
Structure de donnes
Array Deque Dlist Slist HashMap OrderedMap HashSet OrderedSet PriorityQueue Queue Stack

Description
Linaire, stockage contigu Linaire, stockage non contigu ; insre des lments aux deux extrmits Liste doublement lie Liste simplement lie Stocke des mappes en utilisant une table hash Stocke des mappes dans lordre Stocke un ensemble en utilisant une table hash Stocke un ensemble dans lordre Droule des lments dans un ordre tri Structure de donnes FIFO (premier entr, premier sorti) Structure de donnes FILO (premier entr, dernier sorti)

La JGL contient aussi plusieurs types dalgorithmes. Le tableau suivant dcrit chaque algorithme en dtail.
Algorithme
Applying Copying Filling Filtering Finding Heap Replacing Reversing Set operations Shuffling Sorting Swapping

Description
Applique une fonction tous les lments dune squence Copie une squence Remplit une squence avec un lment unique Filtre une squence Trouve un lment sur la base dune condition Manipule un tas Remplace un lment Inverse une squence Excute une union, une intersection, une inclusion et une diffrence Mlange une squence alatoirement Trie une squence Intervertit des lments ou des squences

Outre les conteneurs et les algorithmes, la JGL dfinit plusieurs interfaces et exceptions. Elle contient aussi des itrateurs qui prennent en charge diffrentes itrations dans les conteneurs et les objets des fonctions.

3-14

Introduction Java

Rcapitulatif

Rcapitulatif
Sujets abords dans ce chapitre : Les bibliothques des classes standard fournissent de nombreux paquets essentiels au dveloppement Java. Ces paquets incluent le langage, les E/S, les utilitaires, le rseau, AWT et le texte. La scurit, RMI, Reflection et SQL. Les types de donnes primitifs sont essentiels pour des raisons de performances. Sans ces types de donnes, des calculs complexes ralentiraient beaucoup les performances de lapplication. Avec les classes denveloppe de type, les dveloppeurs peuvent traiter des types de donnes primitifs comme sil sagissait dobjets. Le paquet de la JBCL (Bibliothque des Composants Java Beans) apporte aux dveloppeurs plusieurs composants UI dont : ButtonBar, ButtonControl, CheckBoxControl, CheckBoxPanel, ListControl, ChoiceControl, GridControl et StatusBar. Avec les classes MultiCaster, les Java Beans disposent dun moyen efficace de gestion des vnements. Elles utilisent un tableau la place dun vecteur pour conserver une liste des objets Auditeurs dvnements.

Les bibliothques des classes Java

3-15

Rcapitulatif

3-16

Introduction Java

Chapitre

Chapitre 4

Techniques de thread

Ce chapitre traite des sujets suivants : Description dun thread Utilit des threads Cration et utilisation des threads Diffrents tats dun thread Utilit du mot cl synchronized

Gnralits
Mme si vous nen tes pas toujours conscient, les threads font partie de tout programme Java ; quand vous excutez une application Java, la machine virtuelle Java (Java Virtual Machine ou JVM) excute sa mthode main() dans son propre thread. Les applets sexcutent aussi dans leurs propres threads. Cela montre combien le concept des threads est intgr Java. Pour quun programmeur Java puisse donner la pleine mesure de ses capacits, il lui faut connatre le fonctionnement des threads et la faon de les utiliser dans le dveloppement des programmes Java.

A quoi servent les threads ?


Avant tout, un thread est une seule et mme entit de travail qui peut sexcuter de faon indpendante lintrieur dune application. Une application multithread prend en charge lexcution simultane de plusieurs threads. Pour comprendre lutilit des threads, prenons un exemple montrant comment leur prsence peut augmenter considrablement la productivit dune application, alors que leur absence est pnalisante. Considrons le cas o vous voulez utiliser un navigateur Web pour, simultanment, tlcharger un fichier dun site et accder un autre site. Si le navigateur ne peut pas excuter ces deux tches simultanment, il vous faut attendre la fin du tlchargement avant de commencer lautre action ; si le
Techniques de thread

4-1

Cration dun thread

fichier est volumineux, imaginez la perte de temps qui en dcoule. Il est certainement plus productif de consacrer le temps de tlchargement dautres tches. Cest pourquoi la plupart des navigateurs Web sont multithreads.

Pourquoi nai-je pas encore entendu parler des threads ?


Le concept de threads nest pas vraiment rcent. Avant Java, les threads ntaient pas aussi connus que maintenant parce quaucune API nexistait pour standardiser leur utilisation sur des plates-formes diffrentes. Java est fourni avec une API de threads prise en charge par chaque JVM excute sur chaque plate-forme.

Cration dun thread


Il convient maintenant de montrer comment un thread est cr dans Java. Le paquet java.lang dfinit une classe Thread rserve la cration des threads. Ainsi, pour crer un thread dans votre application, vous pouvez mettre une dclaration semblable celle-ci :
Thread monPremierThread = new Thread();

Cette dclaration cre une occurrence de Thread appele monPremierThread ; cependant, elle ne sert pas grand chose, car vous navez aucun moyen de dire monPremierThread ce quil doit faire. La classe Thread dfinit des mthodes qui prcisent le comportement gnral de tous les threads ; elle ne dispose daucune mthode ni proprit pouvant excuter les tches particulires que le thread doit faire. La classe Thread serait donc inutile ? Non, cela signifie simplement que nous ne savons pas encore en faire bon usage. Soyez patient et poursuivez votre lecture. Il y a deux faons de crer des threads : la premire met en jeu une sous-classe de la classe Thread ; la deuxime met en jeu une implmentation de linterface Runnable. Nous allons les tudier toutes les deux.

Sous-classe de la classe Thread


Dans la section prcdente, nous avons dit quun objet de type Thread ne pouvait pas tre programm directement par lutilisateur pour excuter une tche particulire. Dans ce cas, comment programmer les threads ? La rponse rside dans une des mthodes dfinies par la classe Thread :
public void run() {}

Dans cette mthode se trouve la principale logique dexcution des threads ; la mthode run() est au thread ce que la mthode main() est lapplication. Tout comme main() est le point de dpart de lexcution dune application, run() est la premire instruction qui sexcute au dmarrage dun thread.

4-2

Introduction Java

Cration dun thread

Par elle-mme, la mthode run() par dfaut ne fait rien ; par consquent, crer directement une occurrence de la classe Thread donne un thread qui dispose dune mthode run() inutile. La solution vidente consiste crer une sous-classe de la classe Thread et redfinir sa mthode run(). Voici comment faire :
public class monThreadUtile extends Thread { //constructeurs public void run() { //faire quelque chose dutile } }

A partir de maintenant, quand vous crerez une occurrence de monThreadUtile, lobjet tirera sa fonctionnalit de la mthode run() redfinie. Enfin, pour dmarrer le thread, il suffit dappeler sa mthode start() de la faon suivante :
monThreadUtile t = new monThreadUtile(); t.start();

Exemple : Implmentation dun thread de comptage


threadComptage est une classe Thread simple qui effectue un comptage entre deux nombres. Bien quil sagisse dun exemple simplifi, il montre nanmoins comment crer des threads spars et comment les faire coexister dans le mme environnement. threadComptage est illustr ci-dessous :
public class threadComptage extends Thread { private int start; private int finish; public threadComptage(int from, int to) { this.start = from; this.finish = to; } public void run() { System.out.println(this.getName()+ " dbut dexcution..."); for (int i = start; i <= finish; i++) { System.out.print (i + " "); } //for System.out.println(this.getName() + " fin dexcution."); } //run }

Le constructeur de threadComptage prend deux paramtres de type int pour initialiser ses proprits start et finish. La mthode run() identifie dabord lobjet thread en cours en affichant son nom lcran. Ensuite, elle utilise une boucle for pour effectuer le comptage entre start et finish, et elle affiche chaque nombre lcran. Avant de terminer, elle affiche un message de fin dexcution. threadComptage peut tre utilis dans une application de la faon suivante :
public class threadTester { static public void main(String[] args) {

Techniques de thread

4-3

Cration dun thread

threadComptage thread1 = new threadComptage (1, 10); threadComptage thread2 = new threadComptage (20, 30); thread1.start(); thread2.start(); } }

La mthode main() ci-dessus cre deux objets threadComptage : thread1 compte de 1 10 ; thread2 compte de 20 30. Elle dmarre ensuite les deux threads en appelant leurs mthodes start(). Quand cette mthode main() est excute dans une application, le rsultat ressemble ceci :
Thread-1 dbut dexcution... Thread-2 dbut dexcution... 20 21 22 23 24 25 26 27 28 29 30 Thread-2 fin dexcution. 1 2 3 4 5 6 7 8 9 10 Thread-1 fin dexcution.

En premier lieu, remarquez que le rsultat ne garde pas aux threads les noms thread1 et thread2, comme vous pourriez vous y attendre. Sauf si vous attribuez un nom spcifique un thread, Java lui donne automatiquement un nom sous la forme Thread-n, o n est un numro unique. Dans ce cas, le premier thread dmarr reoit le nom Thread-1 et le deuxime le nom Thread-2. Si vous prfrez donner des noms plus descriptifs, utilisez la mthode setName(String) de la classe Thread. Ensuite, remarquez que Thread-1 a dmarr en premier mais se termine en dernier. Pourquoi ? La rponse est que, dans Java, les threads ne sexcutent pas toujours dans le mme ordre. En fait, chaque excution de threadTester, vous pouvez obtenir un rsultat diffrent. Voici un autre rsultat gnr par threadTester :
Thread-1 dbut dexcution... 1 2 3 4 5 6 7 8 Thread-2 dbut dexcution... 20 21 22 23 9 10 Thread-1 fin dexcution. 24 25 26 27 28 29 30 Thread-2 fin dexcution.

Dans ce rsultat, remarquez que Thread-2 a dmarr avant mme la fin de Thread-1. Lordre dexcution des threads est contrl par le programmateur de threads de Java et non pas par le programmeur.

Implmentation de linterface Runnable


Comme le montre la section prcdente, crer des sous-classes de la classe Thread est une faon de crer des threads. Cette mthode convient si vous concevez une nouvelle classe dont les objets doivent sexcuter dans des threads spars. Mais comment faire pour que des objets dune classe existant dj sexcutent dans leurs propres threads ? Il suffit dimplmenter linterface Runnable. Cette interface sert ajouter un support de thread aux classes qui nhritent pas de la classe Thread. Elle ne dclare quune mthode :
public void run() { }

4-4

Introduction Java

LAPI des threads

Ainsi, pour que des objets dune classe existante sexcutent dans leurs propres threads, procdez comme suit :

1 Demandez la classe dimplmenter linterface Runnable 2 Implmentez la mthode run() pour cette classe
Pour crer threadComptage2, utilisez linterface Runnable au lieu de crer une sous-classe de la classe Thread ; il suffit de modifier sa dclaration selon lexemple ci-dessous :
public class threadComptage2 implements Runnable { //la suite nest pas modifie }

Bien que limplmentation de la classe threadComptage2 nait besoin daucune modification pour implmenter Runnable, la faon de crer ses objets doit tre modifie. Au lieu dinstancier threadComptage, comme nous lavons fait auparavant, il faut crer un objet Runnable partir de threadComptage2 et le transmettre un des constructeurs de threads. Voici comment crer lobjet thread1 selon cette mthode :
Runnable rThread = new threadComptage2(1, 10); Thread thread1 = new Thread(rThread);

Etudions maintenant pourquoi nous avons travaill ainsi. threadComptage est une sous-classe de la classe Thread ; elle hrite par consquent du comportement dun thread Java. Cela signifie que vous disposez dans un objet de threadComptage de toutes les fonctionnalits prises en charge par la classe Thread, comme appeler start(). Cependant, threadComptage2 nhrite en rien de la classe Thread et ne prend donc pas en charge le comportement de la classe Thread. threadComptage2 na fait que dfinir la mthode run(), qui peut tre appele quand un objet threadComptage2 est excut dans un thread.

LAPI des threads


Constructeurs
La classe Thread dfinit les constructeurs suivants :
public public public public public public public Thread() Thread(Runnable cible) Thread(Runnable cible, String nom) Thread(String nom) Thread(ThreadGroup groupe, Runnable cible) Thread(ThreadGroup groupe, String nom) Thread(ThreadGroup groupe, Runnable cible, String nom)

Pour construire des objets Thread, il ny a que trois types de paramtres : Un objet Runnable dont la mthode run() sexcute lintrieur du thread Un objet ThreadGroup auquel attribuer le thread Un objet String pour identifier le thread

Techniques de thread

4-5

Le cycle de vie dun thread

La classe ThreadGroup sert principalement organiser des threads ayant un lien entre eux en groupes. Par exemple, un navigateur Web peut dfinir un ThreadGroup pour tous les threads dune applet.

La mthode start()
public void start()

Pour dmarrer un thread, appelez sa mthode start(). Si vous essayez dappeler plusieurs fois la mthode start() dun thread, une exception se produit.

La mthode sleep()
Pour mettre un thread au repos, utilisez une des deux mthodes suivantes :
public static void sleep(long milliseconde) public static void sleep(long milliseconde, int nanoseconde)

Par exemple, pour quun thread sarrte pendant une seconde, appelez sleep(1000) sur le thread.

La mthode yield()
Dans certains cas, de nombreux threads sont en attente de la fin de lexcution du thread en cours avant de pouvoir sexcuter. Pour que le programmateur de threads bascule lexcution sur les autres threads, appelez la mthode yield() sur le thread en cours. Pour que yield() fonctionne, il doit y avoir au moins un thread de priorit gale ou suprieure au thread actuel.

La mthode join()
public final void join() public final void join(long milliseconde)

Pour quun deuxime thread attende la fin dexcution dun premier thread, appelez la mthode join() sur le premier thread. Vous pouvez prciser un dlai laide dun paramtre de temps donn en millisecondes. join() attend jusqu la fin du dlai ou jusqu la fin de lexcution du premier thread. Pour savoir si un thread sest termin, join() utilise la mthode isAlive(). Si isAlive() renvoie true, join() nest pas renvoye et continue attendre que le premier thread se termine. Si isAlive() renvoie false, join() est renvoye et le deuxime thread peut sexcuter.

Le cycle de vie dun thread


Du dbut la fin, un thread passe par plusieurs tats. Quand vous crez un objet thread, il prend ltat NEW. Quand vous appelez la mthode start() du thread, il prend ltat Runnable. Noubliez pas quun thread ne dmarre pas

4-6

Introduction Java

Protection de votre code par rapport aux threads

toujours immdiatement aprs lappel de sa mthode start(), comme nous lavons vu dans lapplication threadTester. De ltat Runnable, le thread peut passer ltat Not Runnable ou Dead. Appeler sleep(), suspend() ou wait() fait passer un thread ltat Not Runnable, alors quappeler destroy() ou stop() le fait passer ltat Dead (un thread passe galement ltat Dead quand sa mthode run() se termine). Un thread peut repasser ltat Runnable si vous appelez sa mthode resume() ou la fin de la mthode sleep() ; mais un thread Dead ne peut jamais revivre. Dautres conditions affectent le cycle de vie dun thread ; par exemple, un thread ltat Runnable qui doit attendre la fin dune opration particulire avant de sexcuter prend ltat Not Runnable.

Protection de votre code par rapport aux threads


Dans cette section, nous allons examiner pourquoi il est important de protger certaines parties du code contre une excution simultane par plusieurs threads et comment y parvenir. A la fin de cette section, nous parlerons des moniteurs Java et de leur rle dans les programmes multithreads.

Le mot cl synchronized
Dans certains cas, il est ncessaire quune mthode ou un bloc de code ne soit excut que par un thread la fois. Le mot cl synchronized est utilis dans ce but. Avant de voir son utilisation, regardons dans quel cas sen servir. Pour mieux comprendre quand utiliser le mot cl synchronized, considrons le code suivant :
public class Swapper { int from; int to; public void swap() { int temp = from; from = to; to = temp; } }

Cette classe dclare une mthode swap() qui intervertit les valeurs de ses deux proprits, from et to. La mthode prend la proprit from, la stocke dans une variable temp, puis stocke la valeur de to dans from et la valeur de temp dans to. Envisageons le cas o deux mthodes diffrentes dmarrent leurs propres threads pour excuter swap() simultanment appelons-les thread1 et thread2. Par hypothse, le thread1 excute la mthode en premier et, au moment de lexcution, from a la valeur 5 et to la valeur 6. thread1 excute la premire ligne de code et donne temp la valeur 5. A la fin de la deuxime ligne, from reoit la valeur 6. A ce moment, thread2 dmarre lexcution de la mthode. Pour thread2, from a la valeur 6 (attribue par thread1) et to a aussi la valeur 6. thread2 excute la totalit de la mthode et intervertit les valeurs 6 et 6. Une fois thread2 termin,

Techniques de thread

4-7

Rcapitulatif

thread1 reprend son excution la troisime ligne et attribue to la valeur de temp (maintenant 6). A la fin de thread1, from et to ont la valeur 6; lopration attendue (intervertir 5 et 6) na jamais eu lieu ! Pour viter ce scnario, il suffit dajouter le mot cl synchronized la signature de swap(), comme ceci :
public synchronized void swap()

Maintenant, un seul thread peut excuter swap() un moment donn. Dans ce cas, thread1 excute la totalit de la mthode et intervertit correctement les valeurs de from et de to. Une fois thread1 termin, thread2 excute swap() et intervertit une nouvelle fois les valeurs.
Remarque

Comme rgle de base, toute mthode qui modifie des proprits dobjets devrait tre dclare synchronized.

Moniteurs
Un environnement qui prend en charge plusieurs threads doit implmenter quelques techniques de contrle de la simultanit. Il en existe plusieurs, comme : les smaphores, les sections critiques et le verrouillage des enregistrements de bases de donnes. Java implmente un mcanisme de contrle de la simultanit appel moniteur. Traditionnellement, un moniteur est un objet, qui contrle quelque chose, comme une procdure. Le travail du moniteur consiste vrifier quun seul thread la fois peut excuter la procdure quil contrle. Dans Java, chaque objet dispose dun moniteur associ. Le moniteur sassure quun seul thread la fois excute les mthodes synchronized appartenant lobjet quil contrle. Le moniteur interdit tout autre thread dexcuter la mme mthode synchronized tant que le thread en cours dexcution nest pas termin. Si aucun thread nexcute la mthode cible synchronized, un thread peut entrer dans le moniteur (ou verrouiller le moniteur pour lui-mme). A partir de ce moment, aucun autre thread ne peut excuter la mthode tant que le thread actuel ne quitte pas le moniteur.
Remarque

Les moniteurs Java ne sont pas des objets rels, puisquils nont ni mthode ni proprit. Ils sont intgrs limplmentation multithread de Java et restent invisibles au programmeur. Pour cette raison, notre prsentation des moniteurs reste purement conceptuelle.

Rcapitulatif
Sujets abords dans ce chapitre : Un thread reprsente une seule et mme entit de travail qui sexcute sparment dans un programme.

4-8

Introduction Java

Rcapitulatif

Les threads sont particulirement utiles lorsque les programmes doivent effectuer plusieurs fonctions simultanment, sans que lune dentre elles ne les utilise en totalit. Un thread peut tre cr de deux faons : avec une sous-classe de la classe Thread ou en implmentant linterface Runnable dans une classe. Pendant sa dure de vie, un thread passe par les tats suivants : NEW, RUNNABLE, NOT RUNNABLE et DEAD. Pour viter quune mthode ne soit excute par plusieurs threads la fois, ajoutez le prfixe synchronized sa signature.

Techniques de thread

4-9

4-10

Introduction Java

Chapitre

Chapitre 5

Srialisation

Ce chapitre traite des sujets suivants : Enregistrement dun objet dans un fichier et relecture ultrieure.

Gnralits
La srialisation dun objet est le processus de stockage dun objet complet sur disque ou tout autre systme de stockage, do il pourra tre restaur tout moment. Le processus inverse de la restauration est connu sous le nom de dsrialisation. Dans cette section, nous allons voir lutilit de la srialisation et la faon dont Java implmente la srialisation et la dsrialisation. Un objet srialis est dit persistant. Par contraste, la plupart des objets en mmoire sont transiants, ce qui signifie quils sen vont quand leurs rfrences sortent de la porte ou quand lordinateur est teint Les objets, quant eux, existent tant quil reste une copie stocke quelque part sur disque, bande ou CD-ROM.

Pourquoi srialiser ?
Traditionnellement, enregistrer des donnes sur disque ou une autre unit de stockage ncessite la dfinition dun format de donnes spcial, lcriture de fonctions de lecture et dcriture pour ce format et la cration dune mappe entre le format du fichier et le format des donnes. Les fonctions de lecture et dcriture des donnes taient soit simples et sans possibilit dextension soit complexes et difficiles crer et maintenir. Comme vous devez le savoir maintenant, Java est totalement bas sur les objets et la programmation oriente objet. Pour cela, le langage fournit un mcanisme de stockage des objets, appel srialisation. Avec la faon de faire de Java, vous

Srialisation

5-1

Srialisation dans le JDK 1.1

navez plus besoin de vous proccuper des dtails concernant les formats des fichiers et les E/S. La conception et limplmentation dobjets permet de consacrer plus de temps la rsolution des tches du monde rel. Si, par exemple, vous rendez une classe persistante et y ajoutez de nouveaux champs par la suite, vous navez pas vous proccuper de la modification des programmes de lecture et dcriture des donnes. Tous les champs qui se trouvent dans un objet srialis sont automatiquement crits et restaurs.

Srialisation dans le JDK 1.1


La srialisation est une nouvelle fonction du JDK 1.1. La prise en charge de la srialisation par Java se compose de linterface Serializable, des classes ObjectOutputStream et ObjectInputStream, ainsi que de quelques classes et interfaces de support. Nous allons illustrer ces trois lments par une application qui enregistre sur disque des informations sur les utilisateurs et les relit. Par exemple, supposons que vous vouliez enregistrer des informations sur un utilisateur particulier comme lillustre la figure ci-dessous. Une fois que lutilisateur a tap son nom et son mot de passe dans les champs appropris, lapplication doit enregistrer ces informations sur disque. Naturellement, cet exemple est trs simple, mais il est applicable lenregistrement de donnes sur les prfrences des utilisateurs relatives leurs applications, du dernier document ouvert, etc.
Figure 5.1 Enregistrement dun nom utilisateur et dun mot de passe

Linterface Serializable
Crons un objet qui reprsente lutilisateur actuel. Ses proprits doivent reprsenter la fois le nom de lutilisateur et son mot de passe :
package Serialize; public class InfoUtil implements java.io.Serializable { private String nomUtil = "";

5-2

Introduction Java

Utilisation des flux de sortie

private String motPasseUtil = ""; public String obtientNomUtil() { return nomUtil; } public void dfinitNomUtil(String s) { nomUtil = s; } public String obtientMotPasseUtil() { return motPasseUtil; } public void dfinitMotPasseUtil(String s) { motPasseUtil = s; } }

Remarquez que la classe ci-dessus implmente linterface java.io.Serializable. Serializable est connue sous le nom dinterface de balisage, puisquelle ne spcifie aucune mthode implmenter, mais balise plutt ses objets comme tant dun type particulier. Tout objet prvu pour tre srialis doit implmenter cette interface. Cela est important, car, sinon, les techniques utilises dans la suite de ce chapitre ne fonctionnent pas. Si, par exemple, vous essayez de srialiser un objet qui nimplmente pas cette interface, une NotSerializableException est mise.

Utilisation des flux de sortie


Avant de srialiser lobjet InfoUtil, donnez-lui les valeurs saisies par lutilisateur dans les zones de texte. Cette attribution de valeurs aura lieu lorsquil cliquera sur le bouton Srialiser :
void button1_mouseClicked(MouseEvent e) { u.dfinitNomUtil (textFieldName.getText()); u.dfinitMotPasseUtil (textFieldPassword.getText());

Ensuite, ouvrez un FileOutputStream vers le fichier qui va contenir les donnes srialises. Dans cet exemple, le fichier sappelle C:\InfoUtil.txt :
try { FileOutputStream file = new FileOutputStream ("c:\\InfoUtil.txt");

Ensuite, crez un ObjectOutputStream qui srialisera lobjet et lenverra au FileOutputStream.


ObjectOutputStream out = new ObjectOutputStream(file);

Vous pouvez maintenant envoyer lobjet InfoUtil au fichier. Pour cela, appelez la mthode writeObject() de ObjectOutputStream. Appeler la mthode flush() videra le tampon de sortie pour garantir lcriture effective de lobjet dans le fichier.
out.writeObject(u); out.flush();

Srialisation

5-3

Utilisation des flux dentre

Enfin, fermez le flux de sortie pour librer les ressources utilises par le flux, comme les descripteurs du fichier.
out.close(); }

Remarquez que, en cas de problme dcriture sur le fichier ou si lobjet ne prend pas en charge linterface Serializable, vous recevez une IOException.
catch (java.io.IOException IOE) { labelOutput.setText ("IOException"); } }

Vrifiez dans un diteur de texte que lobjet a t crit. (Nessayez pas de le modifier, sinon le fichier risquerait dtre endommag !) Notez quun objet srialis contient un mlange de texte ASCII et de donnes binaires :
Figure 5.2 Objet srialis

Mthodes ObjectOutputStream
La classe ObjectOutputStream contient plusieurs mthodes utiles pour mettre des donnes dans un flux. Vous ntes pas limit aux objets dcriture. Appeler writeInt(), writeFloat(), writeDouble() crira dans un flux nimporte quel type fondamental. Pour crire plusieurs objets ou types fondamentaux dans le mme flux, appelez ces mthodes plusieurs fois sur le mme objet ObjectOutputStream. Cependant, faites attention relire les objets dans le mme ordre.

Utilisation des flux dentre


Lobjet a maintenant t crit sur disque, mais comment le rcuprer ? Une fois que lutilisateur a cliqu sur le bouton Dsrialiser, il vous faut relire les donnes du disque et les mettre dans un nouvel objet. Pour commencer le processus, crez un nouvel objet FileInputStream pour lire le fichier que vous venez dcrire :
void button2_mouseClicked(MouseEvent e) { try { FileInputStream file = new FileInputStream ("c:\\InfoUtil.txt");

Ensuite, crez un ObjectInputStream, ce qui permet de lire les objets de ce fichier.


ObjectInputStream input = new ObjectInputStream(file);

5-4

Introduction Java

Utilisation des flux dentre

Ensuite, appelez la mthode readObject() de ObjectInputStream pour lire le premier objet de ce fichier. readObject() renvoie un type Object quil faut transtyper dans le type appropri (InfoUtil).
InfoUtil u = (InfoUtil) input.readObject();

Aprs la lecture, noubliez pas de fermer lObjectInputStream pour librer les ressources qui lui sont associes, comme les descripteurs du fichier.
input.close();

Enfin, servez-vous de lobjet u comme vous utiliseriez nimporte quel objet de la classe InfoUtil :
labelOutput.setText ("Le nom est : "+u.obtientNomUtil()+", le mot de passe est : "+ u.obtientMotPasseUtildfinitMotPasseUtil()); }

La lecture partir dun fichier peut provoquer une IOException quil vous faut grer. Vous risquez de recevoir aussi une StreamCorruptedException (sous-classe de IOException) si le fichier a t endommag dune manire ou dune autre :
catch (java.io.IOException IOE) { labelOutput.setText ("IOException"); }

Tenez galement compte de lexception suivante. Si vous essayez de lire un objet pour lequel vous navez pas dimplmentation, la mthode readObject() peut envoyer une ClassNotFoundException. Par exemple, si lobjet a t crit par un autre programme ou si vous avez renomm la classe InfoUtil depuis la dernire criture du fichier, vous obtenez une ClassNotFoundException.
catch (ClassNotFoundException cnfe) { labelOutput.setText ("ClassNotFoundException"); } }

Figure 5.3

Objet restaur

Srialisation

5-5

Ecriture et lecture des flux dobjets

Mthodes ObjectInputStream
ObjectInputStream a aussi des mthodes comme readDouble(), readFloat(), etc., qui correspondent aux mthodes writeDouble(), writeFloat(), etc. Appelez chaque mthode en squence, comme pour crire des objets dans le flux.

Ecriture et lecture des flux dobjets


Vous pouvez vous demander ce qui se passe quand un objet en cours de srialisation contient un champ qui fait rfrence un autre objet plutt qu un type primitif. Dans ce cas, lobjet de base, ainsi que lobjet secondaire, sont crits dans le flux. Cependant, noubliez pas que les deux objets crits dans le flux doivent implmenter linterface Serializable. Si ce nest pas le cas, un appel de la mthode writeObject() provoquera une NotSerializableException. Cette srialisation des objets peut poser des problmes de scurit potentiels. Dans lexemple ci-dessus, vous avez crit un mot de passe dans un objet srialis. Bien que cela soit acceptable dans la plupart des cas, prtez-y attention quand vous dcidez de srialiser un objet. Finalement, pour crer un objet persistant sans utiliser le mcanisme de srialisation par dfaut, linterface Serializable documente deux mthodes, writeObject() et readObject(), que vous pouvez implmenter pour excuter une srialisation personnalise. Linterface Externalizable fournit aussi un mcanisme similaire. Pour avoir des informations sur ces techniques, consultez la documentation JDK.

Rcapitulatif
Sujets abords dans ce chapitre : Les mcanismes de srialisation de Java servent stocker un objet dans un fichier et le restaurer.

5-6

Introduction Java

Chapitre

Chapitre 6

Scurit de la machine virtuelle Java

Ce chapitre traite des sujets suivants : Prsentation de la machine virtuelle Java. Dfinition des bytecodes Java. Que reprsente Java rellement ? Utilit de la machine virtuelle Java. Principaux rles de la machine virtuelle Java. Elments constituant le modle de scurit de Java. Rle du vrificateur Java. Rle du gestionnaire de scurit. Rle du chargeur de classe. Contribution des spcifications du langage Java sa scurit. Impact des compilateurs Just-In-Time sur la scurit de Java. Le modle de scurit de Java a-t-il des points faibles ?

Gnralits
Avant dexplorer la machine virtuelle Java, nous allons prsenter certains des termes utiliss dans ce chapitre. Tout dabord, la machine virtuelle Java (Java Virtual Machine ou JVM) est lenvironnement dexcution des programmes Java. Elle dfinit principalement un ordinateur abstrait et prcise les instructions que ce dernier peut excuter. Ces instructions sont appeles bytecodes. De faon gnrale, les bytecodes Java sont la JVM ce que le jeu dinstructions est une CPU. Un bytecode est une instruction dun octet de long gnre par le compilateur Java et excute par linterprteur Java. Lors de la compilation dun fichier .java, le compilateur produit une suite de bytecodes quil stocke dans un fichier .class. Linterprteur Java peut ensuite excuter les bytecodes stocks dans le fichier .class. Dans ce chapitre, il sera galement fait mention dapplications et dapplets Java. Il est parfois utile de faire la distinction entre une application Java et une applet

Scurit de la machine virtuelle Java

6-1

Gnralits

Java. Dans certaines sections de ce chapitre, la distinction est superflue. Nous utiliserons dans ce cas le mot app pour faire rfrence aux applications Java comme aux applets Java. Enfin, il est important de clarifier ce que reprsente exactement le mot Java. Java est plus quun simple langage informatique ; cest un environnement informatique. En effet, Java reprsente deux composants insparables : Java de conception (le langage lui-mme) et Java dexcution (la JVM). Cest une interprtation technique du mot Java. Son interprtation pratique est quil reprsente lenvironnement dexcution et non le langage. Une phrase comme cet ordinateur peut excuter Java signifie en fait que cet ordinateur prend en charge lenvironnement dexcution de Java plus prcisment quil implmente une machine virtuelle Java.

Pourquoi la machine virtuelle Java est-elle ncessaire ?


Il peut sembler trange quun langage rellement portable ncessite une machine spcifique pour sexcuter nimporte o ; en dautres termes, comment Java peut-il sexcuter sur nimporte quel ordinateur et ne pas fonctionner sans la JVM ? La rponse est relativement simple : pour quun langage soit rellement portable, il doit respecter les impratifs suivants : Les spcifications du langage doivent tre prcises et non modifiables. Lenvironnement dexcution doit tre galement prcis. En ce qui concerne le premier impratif, les spcifications du langage Java sont bien dfinies. Il ny a quun type de Java pour lequel il existe une bibliothque standard (celle du JDK de Sun). En ce qui concerne le deuxime impratif, la JVM est lenvironnement dexploitation. Cela signifie quexcuter des programmes Java sous la JVM garantit un environnement dexcution commun. Mme sil y a des implmentations diffrentes de la JVM, elles doivent toutes respecter certains impratifs pour garantir la portabilit. Les diffrences entre les diverses implmentations naffectent pas la portabilit.

Quels sont les principaux rles de la JVM ?


La JVM est responsable de lexcution des fonctions suivantes : Affectation de mmoire aux objets crs Rcupration des donnes primes (garbage collection) Gestion du recensement et des piles Appel du systme hte pour certaines fonctions, comme laccs aux priphriques Suivi de la scurit des apps Java Dans la suite de ce chapitre, nous allons nous concentrer sur la scurit.

6-2

Introduction Java

Scurit de la machine virtuelle Java

Scurit de la machine virtuelle Java


Un des rles les plus importants de la JVM consiste grer la scurit des apps Java. La JVM utilise un mcanisme spcifique pour forcer certaines restrictions de scurit sur les apps Java. Ce mcanisme (ou modle de scurit) joue les rles suivants : Il vrifie que tout fichier tlcharg lest partir dune source certifie Il contrle que les bytecodes neffectuent pas doprations interdites Il vrifie que chaque bytecode est gnr correctement Dans les sections suivantes, nous allons voir comment cette scurit est assure par Java.

Le modle de scurit
Dans cette section, nous allons nous intresser aux diffrents lments du modle de scurit de Java. Nous allons en particulier examiner les rles du vrificateur Java, du gestionnaire de scurit et du chargeur de classe. Ces composants scurisent les apps Java. Nous verrons en outre comment les spcifications du langage Java sont un facteur important pour faire de Java un environnement sr.

Le vrificateur Java
A chaque chargement dune classe, il faut commencer par une vrification. Le rle principal de cette vrification consiste sassurer que chaque bytecode de la classe ne viole pas les spcifications de la machine virtuelle Java. Par exemple, des erreurs de syntaxe et des oprations arithmtiques en dbordement ou en sous-dbordement sont des violations. La vrification est effectue par le vrificateur Java et se dcompose en quatre tapes :

1 2 3 4

Vrification de la structure des fichiers classe. Excution des vrifications au niveau systme. Validation des bytecodes. Excution des contrles de types et daccs au moment de lexcution.

La premire tape du vrificateur concerne le contrle de la structure du fichier classe. Tous les fichiers classe partagent une structure commune ; ils doivent, par exemple, toujours commencer par ce quil est convenu dappeler le nombre magique dont la valeur est 0xCAFEBABE. A la suite du nombre magique, quatre octets reprsentent les versions mineure et majeure du compilateur. Pendant cette tape, le vrificateur contrle aussi la validit de la rserve de constante (la rserve de constante est lemplacement o sont stocks les chanes et les nombres des fichiers classe). En outre, le vrificateur sassure quaucun octet na t ajout la fin du fichier classe. La deuxime tape excute des vrifications au niveau systme : validit de toutes les rfrences la rserve de constante et assurance que toutes les sous-classes sont correctes.

Scurit de la machine virtuelle Java

6-3

Scurit de la machine virtuelle Java

La troisime tape valide les bytecodes. Cest ltape du processus de vrification la plus importante et la plus complexe. Valider un bytecode signifie contrler la validit de son type ainsi que le nombre et le type de ses arguments. Le vrificateur contrle aussi que les appels aux mthodes transmettent des arguments dont le nombre et le type sont corrects et que chaque fonction externe renvoie le type exact. Pour terminer, le vrificateur sassure de la bonne initialisation de toutes les variables. Ltape finale effectue les contrles dexcution. Les classes rfrences en externe sont charges et leurs mthodes sont contrles. Ce contrle vrifie que les appels aux mthodes correspondent la signature des mthodes dans les classes externes. Le vrificateur suit aussi les tentatives daccs par la classe actuellement charge pour sassurer quelle ne viole pas les restrictions daccs. Un autre contrle daccs a lieu sur les variables pour vrifier que les variables private et protected ne subissent aucun accs interdit. A cette tape se produisent aussi certaines optimisations dexcution comme le remplacement de rfrences indirectes par des rfrences directes. Avec ce processus de vrification exhaustive, nous pouvons mesurer limportance du vrificateur Java pour le modle de scurit. Il est galement important de noter que le processus de vrification doit avoir lieu au niveau du vrificateur et non celui du compilateur, puisque nimporte quel compilateur peut tre programm pour gnrer des bytecodes Java. Il est donc clair que se fier au compilateur pour excuter la vrification est dangereux, puisque le compilateur peut tre programm pour ne pas en tenir compte. Ce point montre pourquoi la JVM est ncessaire.

Le gestionnaire de scurit
La classe SecurityManager est une des classes dfinies dans le paquet java.lang. Elle dfinit la stratgie de scurit appliquer aux apps Java. Le rle principal de cette stratgie consiste dterminer les droits daccs. Voici un aperu de son fonctionnement : chaque app Java charge dans la JVM existe dans son propre espacenom. Lespacenom dune app dfinit ses limites daccs. Cela signifie que lapp ne peut pas accder aux ressources situes au-del de son espacenom. Avant quune app puisse accder une ressource du systme, comme un fichier local ou sur rseau, lobjet SecurityManager vrifie que cette ressource se trouve lintrieur de lespacenom de lapp. Dans ce cas, lobjet SecurityManager accorde les droits daccs ; sinon, il les refuse. La classe SecurityManager contient le nombreuses mthodes qui servent contrler si une opration particulire est autorise. Par exemple, les mthodes checkRead() et checkWrite() contrlent si lappelant de la mthode a le droit deffectuer une lecture ou une criture, respectivement, sur un fichier donn. Dans leur implmentation par dfaut, toutes les mthodes de la classe SecurityManager considrent que lopration nest pas autorise ; les mthodes interdisent lopration en envoyant une SecurityException. Dans le JDK, de nombreuses mthodes utilisent la classe SecurityManager avant deffectuer des oprations dangereuses.

6-4

Introduction Java

Scurit de la machine virtuelle Java

Pour prciser votre propre stratgie de scurit, crez des sous-classes de la classe SecurityManager. Une fois que vous disposez de votre propre classe SecurityManager, vous pouvez utiliser la mthode statique System.setSecurityManager() pour la charger dans lenvironnement. Ainsi, ds quune app Java doit effectuer une opration dangereuse, elle peut consulter lobjet SecurityManager charg dans lenvironnement. Gnralement, toutes les apps java utilisent la classe SecurityManager de la mme faon. Une occurrence de la classe SecurityManager est tout dabord cre de la faon suivante :
SecurityManager security = System.getSecurityManager();

La mthode System.getSecurityManager() renvoie une occurrence de la classe SecurityManager actuellement charge. Si aucune classe SecurityManager na t dfinie avec la mthode System.setSecurityManager(), System.getSecurityManager() renvoie null ; sinon, elle renvoie une occurrence de la classe SecurityManager charge dans lenvironnement. Maintenant, considrons que lapp veut vrifier si elle a le droit de lire un fichier. Elle le fait de la faon suivante :
if (security != null) { security.checkRead (nomFichier); }

Linstruction if regarde dabord si un objet SecurityManager existe, puis elle appelle la mthode checkRead(). Si checkRead() nautorise pas cette opration, une SecurityException est mise et lopration na pas lieu ; sinon, elle continue correctement.
Remarque

Noubliez pas que, bien que par dfaut toutes les mthodes de la classe SecurityManager envoient automatiquement une SecurityException, sauf si vous utilisez System.setSecurityManager() pour prciser une classe SecurityManager, tenter dinstancier la classe SecurityManager renvoie toujours null, ce qui signifie que la SecurityException ne sera jamais mise et que tous les accs seront autoriss.

Le chargeur de classe
Le chargeur de classe sassocie au gestionnaire de scurit pour grer la scurit des apps Java. Les rles principaux du chargeur de classe sont rsums ci-dessous : Il charge des fichiers classe dans la machine virtuelle Il identifie le paquet auquel une classe charge appartient Il trouve et charge toutes les classes rfrences par la classe actuellement charge Il vrifie les tentatives daccs effectues par la classe charge des classes situes en dehors de son paquet Il garde une trace des sources des classes charges et vrifie que les classes sont charges partir de sources valides

Scurit de la machine virtuelle Java

6-5

Rcapitulatif

Il fournit au gestionnaire de scurit certaines informations relatives aux classes charges A chaque classe est associ un objet chargeur de classe. Avant quune classe puisse tre charge dans un certain paquet, son chargeur de classe doit vrifier quel paquet la classe appartient. Pour cela, le chargeur de classe appelle SecurityManager.checkPackageDefinition(). Aprs le chargement, le chargeur de classe rsout la classe, ce qui signifie quil charge toutes les autres classes rfrences par la classe charge. La rsolution dune classe implique la vrification des droits daccs de la classe aux classes quelle rfrence et lassurance que les classes rfrences ne sont pas charges partir de sources non valides.

Scurit de Java en tant que langage


Jusquici, nous avons vu comment le vrificateur Java, la classe SecurityManager et le chargeur de classe fonctionnent pour assurer la scurit des apps Java. En outre, dautres mcanismes, comme le cryptage et les classes signes, non dcrits dans ce chapitre, augmentent la scurit des apps Java. Tous ces mcanismes finissent par assurer une scurit trs pousse du langage Java lui-mme. Un certain nombre de techniques scurisent les spcifications du langage Java, dont : Le contrle systmatique, lexcution, des rfrences des tableaux Limpossibilit de manipuler directement les pointeurs La gestion automatique de la mmoire par la JVM pour viter tout manque de mmoire Limpossibilit de violer les rgles de transtypage

Les compilateurs Just-In-Time


Dans ce chapitre, il convient dinclure une brve remarque sur les compilateurs Just-In-Time (JIT). Ces compilateurs convertissent les bytecodes Java en instructions machine natives excutes directement par la CPU. Cela augmente de faon vidente les performances des apps Java. Mais si des instructions natives sont excutes la place des bytecodes, quadvient-il du processus de vrification dj mentionn ? En fait, le processus de vrification ne change pas, puisque le vrificateur Java vrifie toujours les bytecodes avant leur conversion.

Rcapitulatif
Sujets abords dans ce chapitre : La machine virtuelle Java (JVM) est lenvironnement dans lequel les programmes Java sexcutent. Cet environnement est essentiellement un ordinateur abstrait qui excute un jeu dinstructions spcial.

6-6

Introduction Java

Rcapitulatif

Les bytecodes Java sont les instructions converties par le compilateur partir dun programme Java et excutes par linterprteur. Le mot Java reprsente la fois le langage Java et lenvironnement dexcution Java (ou JVM). La JVM permet de garantir la portabilit des apps Java. Les rles principaux de la JVM sont : attribuer de la mmoire aux objets crs, rcuprer les donnes primes, assurer le rencensement et la gestion des piles, appeler le systme hte pour certaines fonctions et suivre la scurit des apps Java. Les lments suivants constituent le modle de scurit de Java : vrificateur Java, classe SecurityManager, chargeur de classe et spcifications du langage. Le vrificateur effectue en quatre tapes un processus de vrification qui permet de contrler la validit des bytecodes. La classe SecurityManager est responsable des droits daccs aux ressources du systme. Le chargeur de classe excute de nombreuses fonctions, dont le chargement des classes dans la JVM et la mise disposition de la classe SecurityManager dinformations relatives la classe charge. Les spcifications du langage Java sont sres puisquelles interdisent les manipulations du pointeur, les oprations de transtypage illgales, les indexations de tableaux incorrectes ou les manques de mmoire. Les compilateurs JIT naffectent pas la scurit des apps Java puisque les bytecodes quils convertissent sont toujours vrifis en premier.

Scurit de la machine virtuelle Java

6-7

6-8

Introduction Java

Chapitre

Chapitre 7

Utilisation de linterface de code natif

Ce chapitre traite des sujets suivants : Dfinition et fonctionnement de linterface de code natif. Comment rendre une mthode Java native ? Gnration de fichiers den-tte C pour des classes Java.

Gnralits
Dans ce chapitre, nous allons expliquer comment appeler des mthodes natives dans les applications Java en utilisant linterface Java (Java Native Interface ou JNI) prvue cet effet. Nous allons commencer par voir comment la JNI fonctionne dans le JDK 1.1. Nous prsenterons ensuite le mot cl native et la faon de rendre native nimporte quelle mthode Java. Nous terminerons par ltude de loutil javah du JDK, utilis pour gnrer des fichiers den-tte C pour des classes Java.

Utilisation de la JNI
Pour que Java atteigne son but principal, cest--dire lindpendance vis--vis des plates-formes, Sun na pas standardis son implmentation de la machine virtuelle Java ; la socit a voulu conserver larchitecture de la JVM une certaine souplesse, qui permet aux fournisseurs de personnaliser leurs implmentations. Java reste indpendant des plates-formes, puisque chaque implmentation de la JVM doit se conformer certaines rgles impratives pour respecter lindpendance vis--vis des plates-formes (comme la structure standard dun fichier .class). Avec ce scnario, le seul problme est un accs difficile aux bibliothques natives partir des apps Java, puisque le systme dexcution diffre selon les implmentations de la JVM. Pour cette raison, Sun propose la JNI comme moyen standard daccs aux bibliothques natives partir des apps Java.
Utilisation de linterface de code natif

7-1

Gnralits

La faon daccder aux mthodes natives partir des apps Java a chang dans le JDK 1.1. Dans lancien JDK, une classe Java pouvait accder directement aux mthodes dune bibliothque native. La nouvelle implmentation utilise la JNI comme couche intermdiaire entre une classe Java et une bibliothque native. Au lieu dappeler directement les mthodes natives, la JVM utilise pour ses appels rels un pointeur vers la JNI. De cette faon, mme si les implmentations de la JVM sont diffrentes, la couche utilise pour accder aux mthodes natives (la JNI) est toujours la mme.

Utilisation du mot cl native


Il ne peut pas y avoir de mthode plus simple pour rendre natives des mthodes Java. Voici un rsum des tapes ncessaires :

1 Supprimer le corps principal de la mthode. 2 Ajouter un point-virgule la fin de la signature de la mthode. 3 Ajouter le mot cl native au dbut de la signature de la mthode. 4 Inclure le corps de la mthode dans une bibliothque native charger lors de lexcution.
Considrons par exemple que la mthode suivante existe dans une classe Java :
public void nativeMethod () { //corps de la mthode }

Voici comment rendre la mthode native :


public native void nativeMethod ();

Une fois la mthode dclare comme native, o se trouve son implmentation relle ? Elle est incluse dans une bibliothque native. Cest la classe laquelle cette mthode appartient qui doit appeler la bibliothque, ce qui rend son implmentation disponible qui en a besoin. Pour quune classe appelle la bibliothque, le plus simple consiste ajouter ce qui suit la classe :
static { System.loadLibrary (nomDeBibliothque); }

Un bloc de code static est toujours excut une fois, lors du premier chargement de la classe. Vous pouvez mettre pratiquement tout ce que vous voulez dans un bloc static ; le plus souvent, il sert au chargement des bibliothques. Si, pour une raison quelconque, le chargement de la bibliothque choue, une exception UnsatisfiedLineError est mise ds quune mthode de cette bibliothque est appele. Si le chargement russit, la JVM ajoute la bonne extension son nom (.dll dans Windows et .so dans UNIX).

7-2

Introduction Java

Rcapitulatif

Utilisation de loutil javah


Le JDK fournit un outil appel javah, qui gnre des fichiers den-tte C pour des classes Java. Voici la syntaxe gnrale dutilisation de javah :
javah [options] nomClasse

nomClasse reprsente le nom de la classe (sans lextension .class) pour laquelle vous voulez gnrer un fichier den-tte C. Vous pouvez prciser plusieurs classes sur une ligne de commande. Pour chaque classe, javah ajoute par dfaut un fichier .h au rpertoire des classes. Si vous voulez que les fichiers .h soient placs ailleurs, utilisez loption -o. Si une classe se trouve dans un paquet, prcisez le paquet et le nom de la classe. Par exemple, pour gnrer un fichier den-tte pour la classe maClasse du paquet monPaquet, procdez comme suit :
javah monPaquet.maClasse

Le fichier den-tte gnr inclura le nom du paquet, (monPaquet_maClasse.h). Voici une liste de quelques options utilises avec javah :
Option
-jni -verbose -version -o nomRpertoire -classpath chemin

Description
Cre un fichier den-tte JNI Affiche des informations sur lavancement des oprations Affiche la version de javah Met le fichier .h rsultant dans un rpertoire prcis Redfinit le chemin par dfaut de la classe

Le contenu du fichier .h file gnr par javah inclut tous les prototypes de fonctions pour les mthodes native de la classe. Les prototypes sont modifis pour que le systme dexcution de Java trouve et appelle les mthodes natives. Cette modification implique un changement du nom de la mthode selon une convention de nom tablie pour lappel des mthodes natives. Le nom modifi comprend le prfixe Java_ et les noms de la classe et de la mthode. Ainsi, si une mthode native appele mthodeNative se trouve dans la classe maClasse, le nom qui figure dans le fichier maClasse.h est Java_maClasse_mthodeNative.

Rcapitulatif
Sujets abords dans ce chapitre : La JNI est une interface intermdiaire entre la JVM et les bibliothques natives. Avec cette interface, lutilisation des bibliothques natives est la mme quelle que soit limplmentation de la JVM. Si la JVM doit accder une mthode dune bibliothque native, elle transmet la JNI un pointeur vers la mthode.

Utilisation de linterface de code natif

7-3

Rcapitulatif

Pour quune mthode Java devienne native, il suffit denlever limplmentation de la mthode et de la mettre dans un fichier bibliothque, dajouter un point-virgule et un prfixe native la signature de la mthode, puis de faire en sorte que la classe de la mthode charge le fichier bibliothque. Loutil javah sert gnrer des fichiers den-tte .h pour des classes qui incluent des mthodes native.

7-4

Introduction Java

Index
Symboles
. (point), oprateur 2-3 ?:, oprateur 1-13 _ (trait de soulignement) comme prfixe des noms 1-2 blocs de code 1-6 blocs de code static 7-2 boolens littraux 1-4 boucles 1-191-22 fin 1-20 instructions de contrle 1-22 break, instructions 1-22 bytecodes 6-1 conversion 6-6 flux dentre 3-9 flux de sortie 3-11 implmentation des interfaces 2-14 instanciation 2-2 spcifiques Java 3-1 classes dcriture 3-11 classes denveloppe de type 3-2 classes de flux dentre 3-9 classes de flux de sortie 3-11 classes de lecture 3-9 classes de niveau suprieur 2-8 classes enfant 2-6 classes et interfaces utilitaires 3-6 classes parent 2-6, 3-2 classes signes 6-6 ClassNotFoundException, exceptions 5-5 ClassType, mthode 3-3 clone, mthode 3-2 code blocs 1-6 blocs de code static 7-2 excution conditionnelle 1-19 rutilisation 2-17 code natif 7-1 commentaires 1-7 commentaires sur plusieurs lignes 1-7 comparaisons 3-2 oprateurs 1-10 compareTo, mthode 3-4 compilateurs 6-1 compilateurs Just-In-Time 6-6 complment 1-12 complment logique unaire 1-10 concat, mthode 3-4 conditions instructions 1-22 conditions de test, interruption 1-22 constantes 1-3 constructeurs 2-4 appel 2-8 classes denveloppe 3-3 classes de niveau suprieur 2-8 construction 3-4 continue, instructions 1-22 contrle des instructions 1-22
Index

A
accs mthodes 2-10 modificateurs 2-9 addition 1-9, 1-11 affectation 1-8 oprateurs 1-11 affectation de la mmoire 1-13, 1-16 et StringBuffer 3-5 affectation des objets 1-8 affectation des variables 1-8 algorithmes 3-14 AND, oprateur 1-10, 1-11, 1-12 API des threads 4-2, 4-5 appel des mthodes 1-8 appels des mthodes 2-4, 7-2 Append, mthode 3-5 applets 2-17, 6-1 applications 6-1 excution 4-1 exemple de dveloppement 2-4 applications multi-threads 4-1, 4-8 arithmtique oprateurs 1-9 ASCII 8 bits 1-4

C
C fichiers den-tte 7-3 calculs 1-8 Calendar, classe 3-6 Capacity, mthode 3-5 caractre de continuation 1-5, 1-6 caractres de contrle 1-4 caractres espace vide 1-6 caractres littraux 1-4 caractres Unicode 1-4 lecture 3-9 chanes 1-5, 1-17, 3-2, 3-4 modification du contenu 1-17 chanes de caractres 1-5 chanes sur plusieurs lignes 1-6 charAt, mthode 3-4 chargeur de classe 6-5 checkerror, mthode 3-12 checkRead(), mthode 6-4 checkWrite(), mthode 6-4 chemins de recherche 2-18 chemins de sortie 2-18 chemins des classes 2-18 chemins des sources 2-18 chiffres binaires 1-12 classes 2-22-12 abstraites 2-11 accs aux membres 2-9 chanes 3-4 chemins daccs 2-18 dclaration 2-2 dfinitions dans un groupe 2-17 et objets 2-2 fichiers 2-18, 3-12

B
bibliothque gnrique Java 3-13 bibliothques 1-13 accs aux bibliothques natives 7-1 chargement 3-6 et blocs de code static 7-2 gnrique de Java 3-13 bibliothques de liens dynamiques 3-6 bibliothques des classes Java 3-1 blocages 3-9

I-1

conversions 1-18 copie des objets 3-2 court-circuit AND/OR oprations 1-10 cration des threads 4-24-5 cryptage 6-6 currentTimeMillis, mthode 3-6

D
Date, classe 3-6 dcalage non sign 1-12 dcimal littraux 1-3 dclarations interfaces 2-13 paquets 2-18 tableaux 1-15 threads 4-2 variables 1-14 dcrmentation, oprateur 1-9 default, mot cl 2-9 dfinitions des classes 2-2 dfinitions des types 2-2 dlais dattente 4-6 dmarrage threads 4-6 droulement structures de contrle 1-19 1-24 dsaffectation de la mmoire 2-4 dsrialisation 5-1 exemple 5-4 destructeurs 2-4 dveloppement des applications 2-4 Dictionary, classe 3-6 division 1-9, 1-11 do, boucles 1-20 donnes obtention du type 3-3 types 1-141-17 types, criture dans un flux 5-4 types, lecture 5-6 donnes membre 2-3 accs 2-9 droite oprateur de dcalage vers la 1-12

accs partir des tableaux 1-16 lments du langage 1-1, 1-5, 1-19 endsWith, mthode 3-4 entiers 1-3 entre flux 5-4 entres flux 3-6 Enumeration, interface 3-7 enveloppes de types classes 3-2 environnement dexploitation 6-2 environnements multiplatesformes 4-2 equals, mthode 3-2, 3-3 espacenom 6-4 excution des applications 4-1 exponentiation 1-3 expressions 1-8 expressions doprateurs 1-8 extend, mot cl 2-6

Garbage collector 2-3 gauche oprateur de dcalage vers la 1-12 gc, mthode 3-6 Gestionnaire de scurit 6-4 Get 2-10 groupes dinstructions 1-6

H
Hashtable, classe 3-6 hasMoreElements, mthode 3-7 hritage 2-6 et implmentation des interfaces 2-13 hritage multiple 2-13 heure du systme 3-6 hexadcimal littraux 1-3

I
identificateurs 1-2 prdfinis 1-5 if-else, instructions 1-22 imbrication des commentaires 1-7 implements, mot cl 2-14 import, instructions 2-17 importation des paquets externes 2-17 incrmentation automatique, oprateur 1-9 indpendance vis--vis des plates-formes 7-1 indexOf, mthode 3-4 ingalit 1-11 infrieur , oprateur 1-10 infrieur ou gal , oprateur 1-11 initialisation des variables 1-15 instanciation 2-2 dfinition 2-2 et classes abstraites 2-11 instructions 1-6, 1-22, 6-1 conditionnelles 1-22 groupes 1-6 instructions machine natives 6-6 interface de code natif 7-1 interface, mot cl 2-14 interfaces 2-13, 5-2 utilitaire intgr 3-6 interprteur Java 6-1 itrateurs 3-14

F
fichier dentre/sortie 3-12 fichiers classe 2-18, 6-1 fichiers den-tte 7-3 fichiers des projets 2-18 fichiers source 2-18 FileInputStream, classe 3-10, 3-12, 5-4 FileOutputStream, classe 3-12, 5-3 files dattente 3-7 filtrage 3-13 finaliseurs 2-4 flush(), mthode 5-3 flush, mthode 3-12 flux 3-12 entre 3-9 lecture/criture 5-6 partition en jetons 3-13 sortie 3-11 flux dentre 3-6, 3-12, 5-4 flux derreur 3-6 flux de sortie 3-6, 3-12, 5-3 fonctions mathmatiques 3-3 for, boucles 1-201-22

E
critures 3-9, 3-12, 5-4, 5-6 effets indsirables 1-19 galit 1-11 lments I-2
Introduction Java

G
garbage collection force 3-6

J
Java 6-2 bases du langage 1-1 bibliothques des classes 3-1 classes spcifiques 3-1 interprteur 6-1 machine virtuelle 6-1, 7-1 mots cls 1-5 types de donnes 1-13 vrificateur 6-3 Java Native Method Interface 7-1 java.applet, paquet 2-17 java.io, paquet 3-9, 3-12 java.lang, paquet 3-2 java.math, paquet 3-4 java.util, paquet 3-6 javah 7-3 options 7-3 JDK 1.1 paquets intgrs 3-1 jetons 3-13 jeux de caractres ASCII 1-4 JGL (Java Generic Library) 3-13 JIT (compilateur) 6-6 JNI 7-1 utilisation 7-1 join, mthode 4-6 JVM (Java virtual machine) 6-1 avantages 6-2 implmentation 7-1

M
machine virtuelle Java 6-1 avantages 6-2 machine virtuelle Java) implmentation 7-1 main(), mthode 4-2 Math, classe 3-3 mathmatiques 1-9 membres 2-9 mmoire 1-13 affectation 1-16 mmoire affecte et StringBuffer 3-5 mthodes 2-3, 2-10 accs 7-2 et interfaces 2-14 restriction de limplmentation des 2-11 surcharge 2-13 modles de scurit 6-3 modificateurs accs 2-9 modulo 1-9 moniteurs 4-8 mots cls 1-5 mots rservs 1-5 multiplates-formes 4-2 multiplication 1-9, 1-11

N
native, mot-cl 7-2 nettoyage 2-4 new, oprateur 1-16, 2-2 nextElement, mthode 3-7 niveau bits oprateurs 1-12 nombres entiers signs 1-12 noms 1-2 prdfinis 1-5 noms de classes 1-2 noms de constantes 1-3 noms de fonctions 1-2 noms de variables 1-3 non imprimables, caractres 1-4 NOT, oprateur 1-10 notation scientifique 1-3 NotSerializableException, exceptions 5-3

ObjectOutputStream, classe 5-2, 5-4 objets 5-1 affectation de la mmoire 1-8 copie 3-2 et classes 2-2 persistants 5-1 rfrences 5-6 objets transiants 5-1 octal caractres 1-4 littraux 1-3 octets lecture 3-10 oprandes 1-8 oprateur ternaire 1-13 oprateurs 1-81-13 ?: 1-13 affectation 1-11 arithmtique 1-9 comparaison 1-10 logique 1-10 niveau bits 1-12 oprateurs arithmtiques 1-11 oprateurs boolens 1-10, 1-12 oprateurs dvaluation valuation oprateurs 1-10 oprateurs de dcalage 1-12 oprateurs unaires 1-9 OR, oprateur 1-10, 1-11, 1-12

L
lectures 3-9, 3-12, 5-6 length, mthode 3-4 libration des ressources 2-4, 5-4, 5-5 lignes multiples chanes 1-6 commentaires 1-7 limites daccs 6-4 listes lies 3-7 littraux 1-3 boolens 1-4 caractres 1-4 chane 1-5 virgule flottante 1-3 littraux numriques 1-3 loadLibrary, mthode 3-6 logique oprateurs 1-10

P
package, instructions 2-18 paquet des E/S 3-9 paquet des utilitaires 3-6 paquet du langage 3-2 paquets 2-17 accs aux membres des classes 2-9 dclaration 2-18 importation 2-17 JDK 1.1 3-1 options relatives aux projets 2-18 paquets de prise en charge 3-1 paquets externes 2-19 priphriques 3-9 priphriques dentre 3-11 priphriques de sortie 3-11 persistance des objets 5-1 point, oprateur 2-3 pointeurs 7-2 polymorphisme 2-13 exemple 2-14
Index

O
Object, classe 3-2 ObjectInputStream, classe 5-2, 5-4, 5-6

I-3

portabilit 6-2 porte 1-14, 1-18, 2-9 prdfinition des identificateurs 1-5 print, mthode 3-12 println, mthode 3-12 PrintStream, classe 3-12 private, mot cl 2-9 programmation lments du langage 1-1, 1-5, 1-19 programmation oriente objet 2-1 exemples 2-4 projets chemins de recherche des fichiers 2-18 options 2-18 protected, mot cl 2-9 prototypes 7-3 public, mot cl 2-9

R
RandomAccessFile, classe 3-12 readObject(), mthode 5-5 rfrences 1-14, 2-2 rfrences un autre objet 5-6 rgles syntaxique et restrictions 1-1 ressources 2-4, 3-6 accs 6-4 libration 5-4, 5-5 restrictions 6-4 run(), mthode 4-2 Runnable, interface 4-4

S
sauvegarde 5-1 scurit 6-1, 6-3 et srialisation 5-6 gestionnaire 6-5 SecurityException, exceptions 6-5 SecurityManager, classe 6-4 squences dchappement 1-4 srialisation 5-1 et scurit 5-6 Serializable, interface 5-2 Set 2-10 setCharAt(), mthode 1-17 setSecurityManager(), mthode 6-5 SimpleTimeZone, classe 3-6

simultanit, techniques de contrle 4-8 sleep, mthode 4-6 sortie flux 5-3 sorties flux 3-6 source excution conditionnelle 1-19 rutilisation du code 2-17 sources chemins daccs 2-18 sous-classe dun thread 4-2 sous-routines 2-3 soustraction 1-9, 1-11 Stack, classe 3-6 start, mthode 4-6 startsWith, mthode 3-4 static blocs de code 7-2 stratgies de scurit 6-4 StreamTokenizer, classe 3-13 String, classe 3-4 StringBuffer, classe 1-17, 3-5 StringTokenizer, classe 3-6 structures de contrle du droulement 1-191-24 structures de donnes 1-15, 3-7, 3-13 structures des donnes 3-6 substring, mthode 3-4 super, mot cl 2-8 suprieur , oprateur 1-10 suprieur ou gal , oprateur 1-11 surcharge des mthodes 2-13 switch, instructions 1-23 sychronized, mot cl 4-7 System, classe 3-6

T
tableaux 1-15 accs aux lments 1-16 cration 1-16 initialisation 1-16 reprsentant des chanes 3-4 tableaux plusieurs dimensions 1-16 tableaux de caractres 3-4 texte Voir chanes this, mot cl 2-8 thread dfinition 4-1 Thread, classe 4-2, 4-5 sous-classe 4-2

ThreadGroup, classe 4-6 threads 4-1 attente 4-6 cration 4-24-5 cycle de vie 4-6 dlais 4-6 dmarrage 4-6 et protection du code 4-7 excution bascule 4-6 exemple de cration 4-3 mise au repos 4-6 moniteurs 4-8 synchronisation 4-7 toLowerCase, mthode 3-4 toString, mthode 3-2, 3-3 toUpperCase, mthode 3-4 trait de soulignement comme prfixe des noms 1-2 transtypage 1-18 implicite 1-18 types de donnes 1-18 tri 3-13 type chanes 1-17 types criture dans un flux 5-4 lecture 5-6 obtention 3-3 types composites 1-13 types de donnes 1-131-141-17 boolens 1-15 caractre 1-15 composites 1-15 numriques 1-14 tableaux 1-15 transtypage 1-18 types de donnes intgrs 1-13, 1-14 types de donnes primitifs 1-13, 1-14 typeValue, mthode 3-3

U
Unicode 1-4 caractres 1-4 lecture des caractres 3-9 page daccueil 1-4 UnsatisfiedLineError, exceptions 7-2

V
valeurs 1-8, 1-13 affectation aux variables 1-11, 1-13 comparaison 1-10

I-4

Introduction Java

valeurs alatoires 1-15 valeurs de retour 2-4 valueOf, mthode 3-4 variable doccurrence 2-2 variables 1-11, 1-13 affectation 1-8 en tant quobjets 2-2 initialisation 1-15 porte 1-18 prcaution pour les globales 1-19 types

conversions 1-18 variables globales 1-18 prcaution 1-19 variables locales 1-18 variables non initialises 1-15 Vector, classe 3-6, 3-7 vrification 6-3 violations 6-3 virgule flottante littraux 1-3

W
while, boucles 1-20 writeObject(), mthode 5-3

X
XOR, oprateur 1-10, 1-11, 1-12

Y
yield, mthode 4-6

Index

I-5

I-6

Introduction Java