Vous êtes sur la page 1sur 102

Ministre de l'Enseignement Suprieur et de la Recherche Scientifique

Centre universitaire de BBA


Institut des Sciences et de la Technologie
Dpartement d'lectronique
Filire : lectronique et Tlcommunication
SUPPORT DE COURS
JAVA
INTRODUCTION ET PROGRAMMATION OBJET
AVANCE
Par :
Mezaache Salah Eddine
ANNEE UNIVERSITAIRE 2011/2012
1
Partie 1
Introduction au langage
Java
2
1.Introduction
Nous traitons Java d'abord comme un langage de programmation classique. Nous
aborderons les objets ultrieurement.
Le langage Java est un langage orient-objet fortement typ.
un des langages objets les plus utiliss !
Parmi les avantages de Java, on peut citer :
langage populaire,
une grande bibliothque de fonctionnalit prdfinies,
un typage fort, ce qui permet au compilateur deffectuer de nombreuses
vrifications lors de la compilation ==> moins de bugs... ,
langage indpendant de la plate-forme,
langage adapt aux systmes de communications (programmation distribue).
2.La structure d'un programme Java
Un programme Java n'utilisant pas de classe dfinie par l'utilisateur ni de fonctions
autres que la fonction principale main pourra avoir la structure suivante :
public class test1{
public static void main(String arg[]){
... code du programme
}// fin de la mthode ou fonction statique main
} // fin de la class test1
La fonction main, appele aussi mthode est la premire mthode tre excute lors de
l'excution d'un programme Java. Elle doit avoir obligatoirement la signature :
public static void main(String arg[])
Ou
public static void main(String[] arg)
Le nom de l'argument arg peut tre quelconque. C'est un tableau de chanes de
caractres reprsentant les arguments de la ligne de commande. Nous y reviendrons un
peu plus loin.
Au dbut du code source et avant la dfinition de la classe, il est usuel de trouver des
instructions d'importation de classes. Par exemple :
import java.io.*;
public class test1{
public static void main(String arg[]){
... code du programme
}// main
}// class
Prenons un exemple. Soit l'instruction d'criture suivante :
3
System.out.println("Hello, world");
qui crit Hello, world l'cran. Il y a dans cette simple instruction beaucoup de choses :
System est une classe dont le nom complet est java.lang.System
out est une proprit de cette classe de type java.io.PrintStream, une autre classe
println est une mthode de la classe java.io.PrintStream.
On peut assimiler une classe une ressource. Ici, le compilateur aura besoin d'avoir
accs aux deux classes java.lang.System et java.io.PrintStream.
Les centaines de classes de Java sont rparties dans des archives aussi appeles des
paquetages (package). Les instruction import places en dbut de programme servent
indiquer au compilateur de quelles classes externes le programme a besoin (celles utilises
mais non dfinies dans le fichier source qui sera compil). Ainsi dans notre exemple, notre
programme a besoin des classes java.lang.System et java.io.PrintStream. On le spcifie avec
l'instruction import. On pourrait crire en dbut de programme :
import java.lang.System;
import java.io.PrintStream;
Un programme Java utilisant couramment plusieurs dizaines de classes externes, il
serait pnible d'crire toutes les fonction import ncessaires. Les classes ont t regroupes
dans des paquetages et on peut alors importer le paquetage entier. Ainsi pour importer les
paquetages java.lang et java.io, on crira :
import java.lang.*;
import java.io.*;
Le paquetage java.lang contient toutes les classes de base de Java et il est import
automatiquement par le compilateur. Aussi finalement n'crira-t-on que :
import java.io.*;
2.1.Compilation et excution d'un programme Java
Le cycle de dveloppement d'un programme en java est illustr par la figure.
la diffrence des langages classiques, le compilateur java ne produit pas du code
binaire directement excutable par le processeur cible, mais un code intermdiaire appel
bytecode.
2.2.2.2.Notion de bytecode
Bytecodes
1
Java est un langage intermdiaire entre compilation et excution :
1 Le terme bytecode vient de byte car chaque instruction de la JVM est code laide dun byte ==> chaque instruction correspond un opcode de 8 bits.
!emple " laddition de deu! entiers est reprsent par lopcode #$%% et correspond &' en he!adcimal.
4
Langage dans lequel est compile un programme Java :
javac Salut.java produit Salut.class contenant des
bytecodes.
Pas vraiment humainement lisible et dans ce
sens, il ressemble du code assembleur, mais
attention, les bytecodes sont interprts par la
machine virtuelle et donc pas excuts directement
par le processeur. Cest la machine virtuelle de traduire ces bytecodes en code
machine : java Salut
La machine virtuelle va ouvrir le fichier Salut.class et interprter les bytecodes
contenus !
2.3.Indpendance de la plateforme
Java : La JVM pour processeurs Intel ou AMD peut
interprter du bytecode gnr sur Sparc (voire figure ci-
dessus)
C++ : le code machine gnr sur Pentium est
inutilisable sur Sparc (sauf ventuelle cross-compilation)
Le bytecode rend le programme indpendant de la
plateforme;
Possibilit de dmarrer le programme sur un autre
processeur sans r-compilation Pour autant que la JVM soit installe;
Lide de la platform independence (et de Java) :
Write once, run anywhere;
Salut.java ==> autre processeur;
Compilation + interprtation ncessaire;
La compilation est lente;
Le compilateur est un gros programme.
Salut.class ==> autre processeur
Seulement l'interprtation est ncessaire;
L'interprtation est rapide;
La JVM est petite.
5
2.4.Cycle de dveloppement
Les phases d'criture et de Correction sont effectues laide dun diteur de texte
(emacs, Xemacs, gedit, notepad, . . . ).
Exemple : gedit Salut.java (systme Gnu/Linux)
La phase de Compilation se fait laide de la commande javac.
Exemple : javac Salut.java
La compilation produit un fichier avec l'extension .class
Exemple : javac Salut.java produira le fichier Salut.class
La phase d'interprtation se fait laide de la commande java.
Exemple : java Salut
6
3.lments du langage Java
Cette section prsente les concepts fondamentaux relatifs aux lments du langage de
programmation Java.
3.1.Identificateur
Lidentificateur est le nom que vous choisissez pour appeler un lment (une variable ou
une mthode, par exemple). Java accepte tout identificateur correct, mais, pour un bon
usage, il vaut mieux utiliser un terme simple du langage modifi pour rpondre aux
exigences suivantes :
Il doit commencer par une lettre. A vrai dire, il peut commencer par un symbole
montaire Unicode ou par un caractre de soulignement (_), mais certains de ces
symboles peuvent tre utiliss dans les fichiers imports ou par les traitements
internes. Il vaut donc mieux les viter.
Il peut contenir tous les caractres alphanumriques (lettres ou chiffres), des
caractres de soulignement ou des symboles montaire Unicode ( ou $, par
exemple), mais pas dautres caractres spciaux.
Il doit tre constitu dun seul mot (sans espace ni tiret).
Lutilisation des majuscules dans un identificateur dpend de son type. Java distingue les
majuscules des minuscules, soyez donc attentif lutilisation des majuscules.
3.2.Type de donnes
Les types de donnes permettent de rpertorier le type dinformation que peuvent
contenir certains lments de programmation Java. Les types de donnes se divisent en
deux catgories :
Primitifs ou de base
Composites ou de rfrence
Diffrents types de donnes peuvent contenir diffrentes quantits dinformations. Vous
pouvez convertir le type de donnes dune variable en un autre type en respectant certains
rgles,
Java vous empche de faire courir un risque vos donnes. Cela veut dire quil vous
laissera convertir une variable ou un objet en un type plus grand, mais essaiera de vous
empcher de les convertir en un type plus petit. Pour changer un type de donnes ayant
une grande capacit en un type de capacit moindre, vous devez utiliser une instruction
particulire, quon appelle le transtypage.
3.2.1.Types de donnes primitifs
Les types de donnes primitifs, ou de base, sont les boolens (qui spcifient un tat actif
ou inactif), les caractres (simples ou Unicode), les entiers (nombres entiers) ou les
nombres en virgule flottante (nombres dcimaux). Dans le code, les types primitifs sont
tout en minuscules.
Le type de donnes boolen est appel boolean, et prend une des deux valeurs : true ou
false. Java ne stocke pas ces valeurs sous forme numrique, mais utilise pour cela le type de
7
donnes boolean.
Le type de donnes caractre est appel char et prend comme valeurs des caractres
Unicode simples dune longueur de 16 bits. Dans Java, les caractres Unicode (lettres,
caractres spciaux et marques de ponctuation) sont placs entre apostrophes : b. La
valeur par dfaut dun caractre Unicode dans Java est \u0000, et les valeurs vont de
\u0000 \uFFFF.
En Java, la taille des types de donnes primitifs est absolue, elle ne dpend pas de la
plate-forme. Cela renforce la portabilit.
Les types de donnes numriques acceptent les nombres de diffrentes sortes et de
diffrentes tailles. Leurs noms et leurs capacits sont numrs ci-dessous :
Type Attributs
double Type en virgule flottante qui prend un nombre sur 8 octets.
int Type entier qui prend un nombre entier sur 4 octet.
long Type entier qui prend un nombre entier sur 8 octets.
float Type en virgule flottante qui prend un nombre sur 4 octets .
short Type entier qui prend un nombre entier sur 2 octet.
byte Type entier qui prend un nombre entier sur 1 octet.
3.2.2.Types de donnes composites
Chacun des types de donnes prcdents accepte un nombre, un caractre ou un tat.
Les types de donnes composites, ou de rfrence, sont constitus de plusieurs lments.
Les types de donnes composites sont de deux sortes :
classes
Tableaux.
Les noms de classes et de tableaux commencent par une lettre majuscule et la premire
lettre de chaque mot qui les constitue est en majuscule (capitalisation en dents de scie), par
exemple, NomDeClasse. C'est une recommandation pas une obligation.
Une classe est un morceau de code complet et cohrent qui dfinit un ensemble dobjets
unifis logiquement ainsi que leur comportement.
Toute classe peut tre utilise comme type de donnes une fois quelle a t cre et
importe dans le programme (la classe String est un exemple typique, car le plus souvent,
elle est utilise comme type de donnes).
Chanes de caractres
Le type de donnes String est en ralit la classe String. La classe String stocke toute
8
squence de caractres alphanumriques, espaces et ponctuation normale (ce quon
appelle des chanes), entoure de guillemets. Les chanes peuvent contenir nimporte
quelle squence dchappement Unicode et ncessitent \" pour placer des guillemets
lintrieur de la chane, mais, en gnral, la classe String elle-mme indique au programme
comment interprter correctement les caractres.
3.3.Dclaration des variables
dclarer une variable rserve de la mmoire pour cette variable. La dclaration dun
variable requiert seulement deux choses : un type de donnes et un identificateur, dans cet
ordre. Le type de donnes indique au programme combien de mmoire allouer.
Lidentificateur donne un libell la mmoire alloue.
Une fois la variable dclare de faon approprie, il suffit de faire rfrence son
identificateur pour accder ce bloc de mmoire.
Les dclarations de variables ressemblent ceci :
boolean maried; Le type de donnes boolean peut tre dfini par true ou par
false. Lidentificateur maried est le nom que le programmeur a
donn la mmoire alloue cette variable. Le nom maried est
significatif pour celui qui le lit, et reprsente quelque chose qui
devrait logiquement accepter les valeurs true/false.
3.4.Mthodes
Les mthodes Java sont quivalentes aux fonctions ou aux sous-routines des autres
langages. La mthode dfinit une action effectuer sur un objet.
Les mthodes sont constitues dun nom et dune paire de parenthses :
obtenirDonnees();
Ici, obtenirDonnees est le nom et les parenthses indiquent au programme quil sagit
dune mthode.
Si la mthode a besoin dinformations particulires pour faire son travail, on les passent
entre les parenthses. On appelle ces informations les arguments (abrg parfois en arg).
Dans la dclaration dune mthode, largument inclut un type de donnes et un
identificateur :
afficherChaine(String remarque);
Ici, afficherChaine est le nom de la mthode et String remarque est le type de donnes et le
nom de variable de la chane que la mthode doit afficher. On doit spcifier au programme
quel type de donnes la mthode doit renvoyer ou si elle ne doit rien renvoyer du tout.
Cela sappelle le type de retour. La mthode peut renvoyer des donnes de nimporte quel
type primitif. Si une mthode na pas besoin de renvoyer quelque chose (comme dans la
plupart des mthodes qui excutent une action), le type de retour doit tre void.
Le type de retour, le nom et les parenthses avec tous les arguments ncessaires forment
une dclaration de mthode (signature):
9
String afficherChaine(String remarque);
La mthode est probablement plus complique que cela. Une fois qu'on lui attribue un
type et un nom et qu'on lui indique les arguments dont elle aura besoin (le cas chant), on
doit la dfinir compltement. On fait cela en-dessous du nom de la mthode, en
incorporant le corps de la dfinition dans une paire daccolades. Cela donne une
dclaration de mthode plus complexe :
String afficherChaine(String remarque)
{ //Dclare la mthode
String remarque = "Quel gchis !"
//Dfinit ce qui est dans la mthode.
} //Ferme le corps de la mthode.
Une fois que la mthode est dfinie, il reste y faire rfrence par son nom et lui passer
les arguments dont elle a ventuellement besoin pour faire correctement son travail :
afficherChaine(remarque);
4. Structure du langage Java
4.1.Identificateur
Dans un langage de programmation, un identificateur est une suite de caractres servant
dsigner les diffrentes entits manipules par un programme : variables, fonctions,
classes, objets...
En Java comme dans la plupart des autres langages, un identificateur est form de lettres
ou de chiffres, le premier caractre tant obligatoirement une lettre. Les lettres
comprennent les majuscules A-Z et les minuscules a-z, ainsi que le caractre "soulign" (_)
et le caractre $1.
Remarque :
Bien quelles ne soient nullement imposes par le langage, certaines rgles sont
traditionnellement utilises dans le choix des identificateurs dun programme Java. Ainsi,
les noms de variables et les noms de fonctions sont crits en minuscules, sauf sils sont
forms de la juxtaposition de plusieurs mots, auquel cas chaque mot sauf le premier
comporte une majuscule, par exemple : valeur, nombreValeurs, tauxEmprunt,
nombreReponsesExactes. Les noms de classes suivent la mme rgle, mais leur premire
lettre est crite en majuscules : Clavier, PremProg. Les noms de constantes sont crits
entirement en majuscules. Notez que ces rgles permettent de savoir que System est une
classe et que out nen est pas une.
4.2.Mots cls
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 (exemples entre parenthses) :
Types de donnes, types de retour et termes (int, void, return)
Paquet, classe, membre et interface (package, class, static)
Modificateurs daccs (public, private, protected)
10
Boucles et contrles de boucles (if, switch, break)
Gestion des exceptions (throw, try, finally)
Mots rservs non encore utiliss, mais non disponibles (goto, assert, const)
4.3.Oprateurs
Les oprateurs permettent daccder ou de faire rfrence des lments du langage
Java, des variables aux classes, et de les manipuler ou de les lier. Les oprateurs ont des
proprits de priorit et dassociativit.
Quand plusieurs oprateurs agissent sur le mme lment (ou oprande), la priorit des
oprateurs dtermine lequel agit en premier. Quand plusieurs oprateurs ont la mme
priorit, les rgles dassociativit sappliquent. Ces rgles sont gnralement
mathmatiques ; par exemple, les oprateurs sont habituellement utiliss de gauche
droite, et les expressions doprateurs qui sont lintrieur de parenthses sont values
avant celles qui sont lextrieur des parenthses.
Les oprateurs sont gnralement classs en six catgories : affectation, arithmtique,
logique, comparaison, niveau bits et ternaire.
Laffectation signifie le stockage de la valeur qui est la droite du signe = dans la
variable qui est sa gauche. On peut soit affecter une valeur une variable au moment de
la dclaration ou aprs lavoir dclare.
double soldeBanque; //Dclaration
soldeBanque = 100.35; //Affectation
double soldeBanque = 100.35; //Dclaration avec affectation
Dans les deux cas, la valeur 100.35 est stocke dans la mmoire rserve par la
dclaration de la variable soldeBanque.
Les oprateurs daffectation permettent de donner des valeurs aux variables. Ils
permettent galement deffectuer une opration sur une expression et puis daffecter la
nouvelle valeur loprande de droite, en utilisant une seule expression combine.
Les oprateurs arithmtiques effectuent des calculs mathmatiques la fois sur des
valeurs entires et sur des valeurs en virgule flottante. Les signes mathmatiques usuels
sappliquent : "+" ajoute, "-" soustrait, "*" multiplie et "/" divise deux nombres.
Les oprateurs logiques, ou boolens, permettent au programmeur de regrouper des
expressions de type boolean, en indiquant au programme exactement comment dterminer
une condition spcifique.
Les oprateurs de comparaison comparent des expressions uniques dautres parties du
code. Les comparaison plus complexes (les comparaisons de chanes, par exemple) sont
faites par programme.
Les oprateurs au niveau bits agissent sur les nombres binaires 0 et 1. Les oprateurs au
niveau bits de Java peuvent prserver le signe du nombre initial ; tous les langages ne le
font pas.
Loprateur ternaire, ?:, fournit un raccourci pour crire une instruction if-then-else trs
simple. La premire expression est value ; si elle vaut true, la deuxime expression est
11
value ; si la deuxime expression vaut false, la troisime expression est utilise.
4.4.Commentaires
Commenter le code est une excellente habitude de programmation. De bons
commentaires peuvent aider analyser plus rapidement un code donn, garder la trace
de ce qu'on fait au fur et mesure qu'on construit un programme complexe et se
souvenir de ce quil faudra ajouter ou modifier.
Java utilise trois sortes de commentaires : les commentaires sur une ligne, les
commentaires sur plusieurs lignes et les commentaires Javadoc.
Commentaire Balise But
Une ligne
//...
Convient de courtes remarques sur la fonction ou
lastructure dune instruction ou dune expression. Ils
ncessitent uniquement une balise douverture : ds que vous
commencez une nouvelle ligne, vous revenez au code.
Plusieurs
lignes
/*...*/
Destin tout commentaire dpassant une ligne, comme
lorsque vous voulez dtailler ce qui se passe dans le code ou
quand vous avez besoin dincorporer au code des
informations lgales. Il requiert une balise douverture et une
balise de fermeture.
Javadoc /**...*/
Il sagit dun commentaire multiligne que lutilitaire Javadoc
du JDK peut lire et transformer en documentation HTML.
Javadoc a recours des balises que vous pouvez utiliser pour
tendre ses fonctionnalits. Il est utilis pour fournir de laide
aux API, gnrer des listes A faire et incorporer des drapeaux
dans le code. Il requiert une balise douverture et une balise
de fermeture. Pour en savoir plus sur loutil Javadoc, allez la
page Javadoc de Sun, ladresse
http://java.sun.com/products//jdk/1.2/docs/tooldocs/javadoc/.
4.5.Instructions
Une instruction est une seule commande. Une commande peut occuper plusieurs lignes
de code, mais le compilateur lit lensemble comme une seule commande. Les instructions
individuelles (habituellement sur une seule ligne) se terminent par un point-virgule (;), et
les groupes dinstructions (sur plusieurs lignes) sont regroupes entres deux accolades ({}).
Les instructions sur plusieurs lignes sont gnralement appeles blocs de code.
4.6.Porte des variables
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 dans toute une classe.
Variables locales : Variables reconnues uniquement dans le bloc de code o elles
sont dclares.
12
La rgle de porte gnrale est : 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 Example
{
int x = 0;
void mthode1()
{
int y;
y = x; // Cela fonctionne. mthode1 peut accder y.
}
void mthode2()
{
int z = 1;
z = y; // Cela ne fonctionne pas :
// y est dfinie hors de la porte de mthode2.
}
}
Ce code dclare une classe appele Example, 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.
La variable x est dclare dans le bloc principal et elle est donc visible (reconnue par le
compilateur) dans la mthode mthode1() et dans 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:
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.
Terminez chaque instruction simple par un point-virgule. Vrifiez que chaque accolade a sa
correspondante. Organisez vos accolades de faon cohrente (comme dans les exemples prcdents)
afin de pouvoir reprer les paires.
4.7.Utilisation des oprateurs
Il y a six sortes doprateurs (arithmtique, logique, affectation, comparaison, niveau bits
et ternaire), et les oprateurs affectent un, deux ou trois oprandes, selon quils sont
unaires, binaires ou ternaires. Ils possdent des proprits de priorit et dassociativit,
qui dterminent lordre dans lequel ils sont traits.
On affecte des numros aux oprateurs pour tablir leur priorit. Un oprateur dont la
priorit est 1 (la plus haute) sera valu en premier, et un oprateur dont la priorit est 15
(la plus basse) sera valu en dernier.
Les oprateurs de mme priorit sont normalement valus de gauche droite. La
priorit est value avant lassociativit. Par exemple, lexpression
a + b - c * d : ne sera pas value de gauche droite ; la multiplication tant prioritaire
13
sur laddition, c*d sera value dabord. Laddition et la soustraction ayant la mme
priorit, lassociativit sapplique : a et b seront additionns dabord, puis cette somme
sera soustraite du produit c*d.
Cest une bonne habitude dutiliser des parenthses autour des expressions
mathmatiques qu'on veut valuer en premier indpendamment de leur priorit; par
exemple : (a + b) - (c * d). Le programme valuera cette opration de la mme faon, mais
pour celui qui lit le programme, ce sera plus clair.
4.7.1. Oprateurs arithmtiques
Oprateur
Dfinition
Priorit Associativit
!
NOT boolen (unaire).
Change true en false ou false en true. En
raison de sa priorit basse, on doit inclure
cette instruction entre parenthses.
2 Droite
&
AND valuation (binaire).
Renvoie true seulement si les deux oprandes
valent true. value toujours deux oprandes.
Rarement utilis comme oprateur logique.
9 Gauche
^
XOR valuation (binaire).
Renvoie true si un des deux oprandes
seulement vaut true. value deux oprandes.
10 Gauche
|
OR valuation (binaire).
Renvoie true si un ou les deux oprandes
valent true. value deux oprandes.
11 Gauche
&&
AND conditionnel (binaire).
Renvoie true seulement si les deux oprandes
valent true. Il est dit conditionnel car il
nvalue le second oprande que si le premier
vaut true.
12 Gauche
||
OR conditionnel (binaire). Renvoie true si un
ou les deux oprandes valent true ; renvoie
false si les deux valent false. Le second
oprande nest pas valu si le premier vaut
true.
13 Gauche
Les oprateurs dvaluation valuent toujours deux oprandes. Les oprateurs
conditionnels, eux, valuent toujours le premier oprande et, si cela suffit dterminer la
valeur de la totalit de lexpression, ils nvaluent pas le deuxime. Par exemple :
if ( !HautePression && (temprature1 > temprature2)) {
14
...
} //Instruction 1 : conditionnelle
boolean1 = (x < y) || ( a > b); //Instruction 2 : conditionnelle
boolean2 = (10 > 5) & (5 > 1); //Instruction 3 : valuation
La premire instruction value dabord !HautePression. Si !tHautePression vaut false
(cest--dire si la pression est haute), le deuxime oprande, temprature1 > temprature2, na
pas besoin dtre valu.
Dans la deuxime instruction, la valeur de boolen1 sera true si x est infrieur y. Si x est
suprieur y, la deuxime expression sera value ; si a est infrieur b, la valeur de
boolen1 sera encore true.
Dans la troisime instruction, cependant, le compilateur calculera la valeur des deux
oprandes avant daffecter true ou false boolean2, car & est un oprateur dvaluation et
non un oprateur conditionnel.
4.7.2.Oprateurs daffectation
Loprateur daffectation de base (=) permet daffecter une valeur une variable. Avec
lensemble des oprateurs daffectation de Java, on peut en une seule tape effectuer une
opration sur un oprande et affecter la valeur une variable.
Le tableau suivant donne la liste des oprateurs daffectation :
Oprateur
Dfinition
Priorit Associativit
=
Affecte la valeur de droite la variable de
gauche
15 Droite
+=
Ajoute la valeur de droite la valeur de la
variable de gauche ; affecte la nouvelle
valeur la variable initiale
15 Droite
-=
Soustrait la valeur de droite de la valeur de
la variable de gauche ; affecte la nouvelle
valeur la variable initiale.
15 Droite
*=
Multiplie la valeur de droite avec la valeur
de la variable de gauche ; affecte la nouvelle
valeur la variable initiale.
15 Droite
/=
Divise la valeur de la variable de gauche par
la valeur de droite ; affecte la nouvelle
valeur la variable initiale.
15 Droite
Exemple :
int y = 2;
y *= 2; //identique (y = y * 2)
15
4.7.3.Oprateurs de comparaison
Les oprateurs de comparaison permettent de comparer une valeur une autre.
Oprateur
Dfinition
Priorit

Associativit
<
Infrieur
7 Gauche
>
Suprieur
7 Gauche
<=
Infrieur ou gal
7 Gauche
>=
Suprieur ou gal
7 Gauche
==
gal
8 Gauche
!=
Diffrent de
8 Gauche
4.7.4.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 entier
vers la droite ou vers la gauche.
Soit lexemple suivant (le type entier short est utilis la place du type int pour plus de
concision) :
short i = 13; //i a la valeur 0000000000001101
i = i << 2; //i a la valeur 0000000000110100
Dans la deuxime ligne, loprateur de dcalage des bits dcale tous les bits de i de deux
positions vers la gauche.
Oprateur
Dfinition
Priorit Associativit
~
NOT au niveau bits
Inverse chaque bit de loprande, 0 devient 1
et rciproquement.
2 Droite
<<
Dcalage gauche sign
Dcale gauche les bits de loprande
gauche, du nombre de chiffres spcifi dans
loprande droit, complte la droite par des
0. Les bits de poids fort sont perdus.
6 Gauche
>>
Dcalage droit sign
Dcale droite les bits de loprande gauche,
du nombre de chiffres spcifi dans
loprande droit. Si loprande gauche est
ngatif, la partie gauche est complte par
6 Gauche
16
des 0 ; sil est positif, elle est complte par
des 1. Cela prserve le signe initial.
>>>
Dcalage droit par ajout de zros
Dcale droite et remplit toujours par des 0.
6 Gauche
&
AND au niveau bits
Peut tre utilis avec = pour affecter la
valeur.
9 Gauche
|
OR au niveau bits
Peut tre utilis avec = pour affecter la
valeur.
10 Gauche
^
XOR au niveau bits
Peut tre utilis avec = pour affecter la
valeur.
11 Gauche
<<=
Dcalage gauche avec affectation
15 Gauche
>>=
Dcalage droite avec affectation
15 Gauche
>>>=
Dcalage droit par ajout de zros avec affectation
15 Gauche
4.7.5. Loprateur ternaire
?: est un oprateur ternaire que Java a emprunt au C. Il fournit un raccourci pratique
pour crer une instruction de type if-then-else trs simple.
Syntaxe :
<expression 1> ? <expression 2> : <expression 3>;
expression1 est value en premier. Si elle est vraie, alors expression2 est value. Si
expression2 est fausse, expression3 est utilise. Par exemple :
int x = 3, y = 4, max;
max = (x > y) ? x : y;
Dans ce code, max reoit la valeur de x ou de y, selon celui qui est le plus grand.
4.8.Tableaux
Un tableau est une structure de donnes contenant un groupe de valeurs du mme type.
Par exemple, un tableau accepte un groupe de valeurs String, un groupe de valeurs int ou
un groupe de valeurs boolean. Tant que les valeurs sont du mme type, elles peuvent tre
places dans le mme tableau.
Les tableaux sont caractriss par une paire de crochets droits. Quand on dclare un
tableau dans Java, on peut placer les crochets soit aprs lidentificateur, soit aprs le type
17
de donnes :
int idEtudiant[];
char[] grades;
On peut remarquer que la taille du tableau nest pas spcifie. La dclaration dun
tableau ne lui alloue pas de mmoire. Dans la plupart des autre langages, la taille du
tableau doit tre indique dans la dclaration, mais dans Java, on ne spcifie pas sa taille
jusquau moment ou on lutilise. La mmoire approprie est alors alloue.
Pour initialiser le tableau (et donc allouer rellement de la mmoire), on doit utiliser
loprateur new comme ceci :
int idEtudiant[] = new int[20];//Cre un tableau de 20 lments int.
char[] grades = new char[20]; //Cre un tableau de 20 lments char.
float[][] coordonnes=new float[10][5] ; //tableau bidimensionnel de 10x5 lments float.
Remarque :
Quand on cre des tableaux bidimensionnels, le premier nombre dfinit le nombre de
colonnes et le second le nombre de lignes.
Java compte les positions en commenant par 0. Cela veut dire que les lments dun
tableau de 20 lments seront numrots de 0 19 : le premier lment sera 0, le deuxime
1, etc.
Quand un tableau est cr, la valeur de tous ses lments est nulle ou 0 ; les valeurs
sont affectes plus tard.
Dans Java, lutilisation de loprateur new est semblable lutilisation de la commande
malloc en C et de loprateur new en C++.
Pour initialiser un tableau, on spcifie les valeurs des lments du tableau lintrieur
dun ensemble daccolades. Pour les tableaux plusieurs dimensions, il faut utiliser des
accolades imbriques. Par exemple :
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 initialises.
Par consquent, la premire instruction cre un tableau de type char de 5 lments. La
deuxime instruction cre un tableau bidimensionnel de type float appel coordonnes,
avec une taille de 2 sur 2. Au fond, coordonnes est un tableau constitu de deux lments
de tableau : la premire ligne du tableau est initialise 0.0 et 0.1, et la deuxime ligne 0.2
et 0.3.
4.9.L'instruction conditionnelle
Dans Java, il existe deux structures conditionnelles : linstruction if-else et linstruction
switch
18
4.9.1.Linstruction if-else
Syntaxe :
Les conditions sont de deux types :
if ( Expr ) Instr ;
if ( Expr ) Instr ; else Instr ;
La dfinition de l'instruction conditionnelle de java est classiquement celle des langages
algorithmiques; comme en pascal l'expression doit tre de type boolen (diffrent du C).
Exemple :
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");
4.9.2.Linstruction switch
Linstruction switch est semblable linstruction if-else. Voici la syntaxe gnrale de
linstruction switch :
switch (<expression>)
{
case <value1>: <blocCode1>;
break;
case <value2>: <blocCode2>;
break;
default : <blocCode3>;
}
Remarques:
Sil ny a quune seule instruction dans un bloc de code, il nest pas ncessaire de
lentourer daccolades.
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 <expression> doit tre de type entier (ou dun type qui peut tre
converti en int sans risque, comme char).
Les valeurs case doivent tre des expressions constantes du mme type que
lexpression initiale.
Le mot cl break est facultatif. Il est utilis pour terminer lexcution de linstruction
switch une fois quun code de bloc est excut. Sil nest pas utilis aprs
blocCode1, alors blocCode2 sexcute immdiatement aprs lexcution de
19
blocCode1.
Si un bloc de code doit sexcuter quand expression prend une valeur parmi un
certain nombre de valeurs, chacune doit tre spcifie comme ceci : case <valeur>:.
Voici un exemple, o c est de type char :
switch (c){
case 1: case 3: case 5: case 7: case 9:
System.out.println("c est un chiffre impair");
break;
case 0: case 2: case 4: case 6: case 8:
System.out.println("c est un chiffre pair");
break;
case :
System.out.println("c est un espace");
break;
default :
System.out.println("c nest ni un chiffre ni un espace");
}
Linstruction switch value la variable 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.
4.10.les boucles
Dans un programme, chaque instruction est excute une fois. Cependant, il est
quelquefois ncessaire dexcuter des 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.
4.10.1.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 ( <instruction de condition boolenne> )
{
<code excuter tant que la condition est vraie>
}
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 arrte
de sexcuter. Par exemple, pour imprimer Bouclage 10 fois :
int x = 0; //Initialise x 0.
while (x < 10)
{ //Instruction de condition boolenne.
System.out.println("Bouclage"); //Imprime "Bouclage" une fois.
x++; //Incrmente x pour litration suivante.
}
4.10.2.La boucle do-while
La boucle do-while 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
20
boucle do :
int x = 0;
do
{
System.out.println("Bouclage");
x++;
} while (x < 10);
La diffrence principale entre les deux boucles est que la boucle do-while sexcute
toujours au moins une fois, alors que la boucle while ne sexcute pas si la condition
initiale nest pas remplie.
4.10.3.La boucle for
La boucle for est la plus puissante des constructions de boucles. Voici la syntaxe gnrale
dune boucle for :
for ( <initialisation> ; <condition boolenne> ; <itration> )
{
<code dexcution>
}
La boucle for est constitue de trois parties : une expression dinitialisation, une
expression conditionnelle boolenne et une expression ditration. La troisime
expression met gnralement jour la variable de la boucle initialise par la premire
expression. Voici la boucle for quivalente la boucle while prcdente :
for (int x = 0; x < 10; x++)
{
System.out.println("Bouclage");
}
Cette boucle for et la boucle while quivalente sont pratiquement identiques. Pour
presque chaque boucle for, il existe une boucle while quivalente.
4.11.Instructions de contrle des boucles
Ces instructions contrlent les instructions de boucles.
4.11.1.Linstruction break
Linstruction break permet de sortir dune structure de boucle avant que la condition du
test soit remplie. Quand la boucle rencontre une instruction break, elle se termine
immdiatement en ignorant le code restant. Par 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.
21
4.11.2.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, mais continue limprimer
pour 6, 7, 8 et 9.
22
Partie 2
Programmation oriente
objet
23
5.Programmation oriente objet dans Java
La programmation classique ou procdurale telle qu'on la connat travers des langages
de programmation comme Pascal, C etc... traite les programmes comme un ensemble de
donnes sur lesquelles agissent des procdures.
Cette manire de concevoir les programmes consiste traiter indpendamment les
donnes et les algorithmes (traduits par des procdures) sans tenir compte des relations
qui les lient.
Au contraire de la programmation structure traditionnelle, la programmation oriente
objet met dans une mme et unique structure les donnes et les oprations qui leurs sont
associes. 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 objet, ce qui signifie que le niveau le plus externe de la
structure des donnes est lobjet. Il ny a pas de constante, de variable ni de fonction
indpendante en Java. On accde toute chose via les classes et les objets. Cest un des
aspects les plus agrables de Java.
Les langages objets sont fonds sur la connaissance dune seule catgorie dentit
informatique : lobjet.
5.1.Concepts fondamentaux de La P.O.O
Nous crirons P.O.O pour : programmation oriente objet.
Voici trois concepts qui contribuent la puissance de la P.O.O.
Encapsulation et abstraction
Hritage
Polymorphisme
5.1.1.Notion d'encapsulation
Le principe dencapsulation consiste regrouper dans le mme objet informatique des
structures de donnes particulires et les mthodes qui leur sont spcifiques :
Les structures de donnes dfinies dans un objet seront appeles les attributs de
cet objet;
Les traitements dfinis dans un objet seront appeles les mthodes de cet objet.
5.1.2.Notion d'abstraction
Pour tre vritablement intressant, un objet doit permettre un certain degr
dabstraction. Le processus dabstraction consiste identifier pour un ensemble
d'lments:
des caractristiques communes tous les lments
des mcanismes communs tous les lments
il s'agit de dfinir une description gnrique de lensemble considr ===> se focaliser
sur lessentiel, cacher les dtails.
24
Objet
=
Attributs
+
mthodes
Exemple : Rectangles
La notion d "objet rectangle" nest intressante que si lon peut lui associer des
proprits et/ou mcanismes gnraux
==> Proprits et mcanismes valables pour lensemble des rectangles et non pas
pour un rectangle particulier.
Les notions de largeur et hauteur sont des proprits gnrales des rectangles
(attributs),
Le mcanisme permettant de calculer la surface dun rectangle (surface = largeur
hauteur) est commun tous les rectangles
5.1.3.Abstraction et Encapsulation
Un intrt de lencapsulation est que cela permet dabstraire; en plus du regroupement
des donnes et des traitements relatifs a une entit, lencapsulation permet en effet de
dfinir deux niveaux de perception :
Le niveau externe : partie visible (par les programmeurs-utilisateurs) de lobjet :
==> Prototype des mthodes et attributs accessibles hors de lobjet : C'est
linterface de lobjet avec lextrieur rsultat du processus d'abstraction
Le niveau interne : dtails dimplmentation de lobjet
==> Mthodes et attributs accessibles uniquement depuis lintrieur de lobjet (ou
lintrieur dobjets similaires) :
Dfinition de lensemble des mthodes de lobjet Cest le corps de lobjet
5.1.4.Encapsulation et Interface
Il y a donc deux facettes lencapsulation :
Regroupement de tout ce qui caractrise lobjet : donnes (attributs) et traitements
(mthodes)
Isolement et dissimulation des dtails dimplmentation; Interface = ce que le
programmeur-utilisateur (hors de lobjet) peut utiliser
==> Concentration sur les attributs/mthodes concernant lobjet (abstraction)
Exemple : Linterface dune voiture
Volant, acclrateur, pdale de freins, etc.
Tout ce quil faut savoir pour la conduire (mais pas la rparer ! ni comprendre
comment a marche)
Linterface ne change pas, mme si lon change de moteur... et mme si on change
de voiture (dans une certaine mesure) : abstraction de la notion de voiture (en tant qu
"objet conduire" ).
5.1.5.Pourquoi abstraire/encapsuler ?
Lintrt de regrouper les traitements et les donnes conceptuellement relies est de
permettre une meilleure visibilit et une meilleure cohrence au programme, doffrir une
plus grande modularit.
Lintrt de sparer les niveaux interne et externe est de donner un cadre plus rigoureux
lutilisation des objets utiliss dans un programme.
Les objets ne peuvent tre utiliss quau travers de leur interfaces (niveau externe) et
25
donc les ventuelles modifications de la structure interne restent invisibles lextrieur et
l'utilisateur finale n'aura rien rcrire.
Rgle : les attributs dun objet ne doivent pas tre accessibles depuis lextrieur, mais
uniquement par des mthodes.
5.2.Classes
En programmation oriente objet, une classe dclare des proprits communes un
ensemble d'objets. La classe dclare des attributs reprsentant l'tat des objets et des
mthodes reprsentant leur comportement.
Les classes et les objets ne sont pas la mme chose. Une classe est la dfinition dun type,
alors quun objet est la dclaration dune instance dun type de classe. Aprs avoir cr une
classe, on peut crer autant dobjets que voulu bass sur cette classe.
Entre les classes et les objets, il y a la mme relation quentre une recette d'un gteau et
le gteau lui-mme ; partir dune mme recette de gteau, on peut faire autant de
gteaux qu'on veut.
Le processus de cration dun objet partir dune classe est appel instanciation dun
objet ou cration dune instance dune classe.
5.2.1.Dclaration et instanciation des classes
Une classe Java peut tre trs simple. Voici la dfinition dune classe vide :
class MaClasse
{
............// classe vide
}
Alors que cette classe nest pas encore utile, elle est correcte dans Java. Une classe plus
utile contiendra quelques donnes membre et mthodes.
Pour crer une instance de cette classe, on utilise loprateur new avec la nom de la
classe. On devrai dclarer une variable dinstance pour lobjet :
MaClasse monObjet;
Mais, dclarer simplement une variable dinstance nalloue pas de mmoire ni aucune
autre des ressources ncessaires lobjet. Cela cre une rfrence appele monObjet, mais
ninstancie pas lobjet. Cest le rle de loprateur new.
monObjet = new MaClasse();
Remarquez que le nom de la classe est utilis comme sil sagissait dune mthode. on va
expliquer a dans une section ultrieure. Aprs lexcution de cette ligne de code, il est
possible daccder aux variables et aux mthodes membre de la classe avec loprateur ..
Les objets en Java sont automatiquement limins par le ramasse-miettes (garbage
collector), autrement dit, lorsquune rfrence lobjet nest plus utilise, la machine
virtuelle dsalloue automatiquement toutes les ressources alloues par loprateur new.
5.2.2.Donnes membre
Comme nous lavons dit, une classe Java peut contenir des donnes membre et des
mthodes. Une donne membre ou une variable membre (appele aussi champ ou
attribut) est une variable dclare dans la classe. Une mthode est une fonction ou une
routine effectuant une certaine tche. Voici une classe qui ne contient que des donnes
26
membre :
public class Etudiant {
String nom, adresse;
int age;
}
Cet exemple cre une classe appele Etudiant qui contient les donnes membre : nom,
adresse, age. On peut inclure nimporte quel type de donnes comme variable membre
dune classe. Pour accder une donne membre, il faut dabord crer une instance de la
classe puis accder aux donnes avec loprateur ..
5.2.3.Mthodes de classe
Les classes peuvent contenir aussi des mthodes. En fait, il nexiste pas de fonction ni de
procdure indpendante dans Java. Toutes les sous-routines sont dfinies comme
mthodes de classes. Voici un exemple de la classe Etudiant laquelle est ajoute la
mthode affiche():
public class Etudiant
{
String nom, adresse;
int age;
public void affiche()
{
System.out.println(" Etudiant:"+nom+");
System.out.println(" adresse:"+adresse+");
System.out.println(" age:"+age+");
}
}
On remarque que, lors de la dfinition des mthodes, limplmentation de la mthode
figure juste sous la dclaration. Cela est diffrent de certains autres langages orients objet
dans lesquels la classe est dfinie un emplacement et le code dimplmentation est situ
ailleurs.
Une mthode (except le constructeur, voir plus loin) doit spcifier un type de retour et
tous les paramtres quelle accepte. La mthode affiche() ne prend pas de paramtres. Elle
ne renvoie pas de valeur non plus, son type de retour est donc void.
Laccs une mthode seffectue de la mme faon que laccs aux variables membre,
cest--dire en utilisant loprateur .. Par exemple,
Etudiant etudiant = new Etudiant();
etudiant.age = 4;
etudiant.affiche ();
5.2.4.Constructeurs et Finaliseurs
Chaque classe Java possde une mthode spcialise appele un constructeur. Le
constructeur a toujours le mme nom que la classe et il ne peut spcifier de valeur de
retour.
Le constructeur affecte toutes les ressources dont lobjet a besoin et renvoie une instance
de lobjet. Quand on utilise loprateur new, on appelle en ralit le constructeur. On na
pas besoin de spcifier un type de retour pour le constructeur car linstance de lobjet est
toujours le type renvoy.
Dans la plupart des langages orients objet, il existe une mthode correspondante
27
nomme destructeur, appele pour librer les ressources affectes par le constructeur.
Mais, comme Java dsalloue pour nous toutes les ressources automatiquement, il nexiste
pas de mcanisme destructeur en Java.
Cependant, certaines situations ncessitent un nettoyage spcial que le ramasse-miettes
ne peut pas effectuer lorsque la classe disparat. Par exemple, certains fichiers ont t
ouverts pendant la dure de vie de lobjet et on voudrai 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 ramasse-miettes
immdiatement avant la destruction de lobjet.
Exemple:
public class Point
{
private int x;
private int y;
// constructeur 1
public Point(){
this.initialise(0,0);
}
//constructeur 2
public Point(int x, int y){
this.initialise(x,y);
}
public void initialise(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
public boolean isOrigin() { return (x == 0) && (y == 0); }
public void translate(int dx, int dy) {
this.x +=dx;
this.y +=dy;
}
public void affiche(){
System.out.println ("Je suis un point de coordonnees " + x + " " + y) ;
}
}
l'entte de la mthode public void translate(int dx, int dy) prcise:
le nom de la mthode: ici translate ;
le mode daccs: nous avons choisi public pour que cette mthode soit effectivement
utilisable depuis un programme quelconque ; nous avons dj rencontr private pour
des donnes membres; nous aurons loccasion de revenir en dtails sur ces problmes
daccs;
les arguments: qui seront fournis la mthode lors de son appel, que nous avons
choisi de nommer dx et dy;
le type de la valeur de retour: nous verrons plus tard quune mthode peut fournir
un rsultat, cest--dire se comporter comme ce que lon nomme une fonction dans la
28
plupart des langages (et aussi en mathmatiques) ; ici, notre mthode ne fournit aucun
rsultat, ce que lon doit prciser en utilisant le mot-cl void.
On peut thoriquement disposer de champs publics mais cest fortement dconseill. Par
ailleurs, nous verrons quil existe galement un mode daccs dit "de paquetage", ainsi
quun accs protg (protected) partiellement li lhritage.
5.2.5.Utilisation de la classe Point
La classe Point va permettre dinstancier des objets de type Point et de leur appliquer
volont les mthodes publiques initialise, getX, getY, isOrigin,translate et affiche.
Cette utilisation ne pourra se faire que depuis une autre mthode puisque, en Java,
toute instruction appartient toujours une mthode. Mais il pourra sagir de la mthode
particulire main (mthode indpendante de la classe), et cest ainsi que nous procderons
dans notre exemple de programme complet.
lintrieur dune mthode quelconque, une dclaration telle que :
Point a;
est tout fait correcte. Cependant, contrairement la dclaration dune variable dun
type primitif (comme int n;), elle ne rserve pas demplacement pour un objet de type
Point, mais seulement un emplacement pour une rfrence (pointeur sur un objet) un
objet de type Point. Lemplacement pour lobjet proprement dit sera allou sur une
demande explicite du programme, en faisant appel un oprateur unaire nomm new.
Ainsi, lexpression :
new Point(); // attention la prsence des parenthses ()
cre un emplacement pour un objet de type Point et fournit sa rfrence en rsultat. Par
exemple, on pourra procder cette affectation :
a = new Point(); //cre dun objet de type Point et place sa rfrence dans a.
Comme nous lavons dj dit, nous pouvons employer notre classe Point depuis toute
mthode dune autre classe, ou depuis une mthode main. Cette dernire doit de toute
faon tre elle aussi une mthode (statique) dune classe. A priori, nous pourrions faire de
main une mthode de notre classe Point. Mais la dmarche serait alors trop particulire :
nous prfrons donc quelle appartienne une autre classe. Voici un exemple complet
dune classe nomme TstPoint contenant (seulement) une fonction main utilisant notre
classe Point :
public class TstPoint {
public static void main (String args[]) {
Point a ;
a = new Point() ;
a.initialise(3, 5) ; a.affiche() ;
a.deplace(2, 0) ; a.affiche() ;
Point b = new Point(6,8) ; b.affiche() ;
}
}
l'excution du programme produit l'affichage suivant :
Je suis un point de coordonnees 3 5
Je suis un point de coordonnees 5 5
Je suis un point de coordonnees 6 8
Remarque
Dans notre classe Point, les champs x et y ont t dclars privs. Une tentative
29
dutilisation directe, en dehors des mthodes de Point, conduirait une erreur de
compilation. Ce serait notamment le cas si, dans notre mthode main, nous cherchions
introduire des instructions telles que :
a.x = 5 ; // erreur : x est priv
System.out.println ("ordonnee de a " + a.y) ; // erreur : y est priv
5.2.6.Le mot clef this
Le paramtre this (qui est un mot cl du langage) est implicitement prsent dans chaque
objet instanci et il contient la rfrence l'objet actuel.
Il peut arriver quau sein dune mthode, on ait besoin de faire rfrence lobjet dans sa
globalit (et non plus chacun de ses champs). Ce sera par exemple le cas si lon souhaite
transmettre cet objet en argument dune autre mthode. Un tel besoin pourrait apparatre
dans une mthode destine ajouter lobjet concern une liste chane ou tout
simplement pour diffrencier une variable locale une mthode d'une variable de classe
de mme nom.
Pour ce faire, Java dispose du mot-cl this :
class A
{ .....
public void f(...) // mthode de la classe A
{ ..... // ici this dsigne la rfrence lobjet ayant appel la mthode f
}
}
5.3.Les paquetages (paquets)
La notion de paquetage correspond un regroupement logique sous un identificateur
commun dun ensemble de classes. Elle est proche de la notion de bibliothque que lon
rencontre dans dautres langages.
Un paquetage est caractris par un nom qui est soit un simple identificateur, soit une
suite didentificateurs spars par des points, comme dans :
MesClasses
Utilitaires.Mathematiques
Utilitaires.Tris
Lattribution dun nom de paquetage se fait au niveau du fichier source; toutes les
classes dun mme fichier source appartiendront donc toujours un mme paquetage.
Pour ce faire, on place, en dbut de fichier, une instruction de la forme :
package xxxxxx;
dans laquelle xxxxxx reprsente le nom du paquetage.
En labsence dinstruction package dans un fichier source, le compilateur considre que
les classes correspondantes appartiennent au paquetage par dfaut. Celui-ci est unique
pour une implmentation donne.
5.3.1.Utilisation dune classe dun paquetage
Lorsque, dans un programme, on fait rfrence une classe, le compilateur la recherche
dans le paquetage par dfaut. Pour utiliser une classe appartenant un autre paquetage, il
est ncessaire de fournir linformation correspondante au compilateur. Pour ce faire, on
30
peut :
citer le nom du paquetage avec le nom de la classe,
utiliser une instruction import en y citant soit une classe particulire dun
paquetage, soit tout un paquetage.
Exemple
En citant le nom de la classe :
MesClasses.Point p = new MesClasses.Point (2, 5) ;
En important des classes :
import MesClasses.Point, MesClasses.Cercle ;
En important tous un paquetage :
import MesClasses.*
5.4.Modificateurs daccs
Il est important de comprendre quel moment les membres (variables et mthodes) de
la classe sont accessibles. Dans Java, plusieurs options permettent de personnaliser
laccessibilit aux membres.
Rgle
Il vaut mieux limiter autant que possible la porte des lments dun programme, y
compris celle des membres des classes. 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).
5.4.1.Accs depuis lintrieur du paquetage dune classe
Modificateur daccs Hritage Accessible
Par dfaut(pas de modificateur) Oui Oui
Public Oui Oui
Protected Oui Oui
Private Non Non
5.4.2.Accs depuis lextrieur du paquetage
Modificateur daccs Hritage Accessible
Par dfaut(pas de modificateur) Non non
Public Oui Oui
Protected Oui Non
Private Non Non
Dans les deux tableaux prcdents, il faut noter 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 priv sont inaccessibles et quil est impossible den
hriter en dehors de leur classe. Ainsi, on doit dclarer prive toute variable ou mthode
membre devant rester interne la classe.
31
En programmation oriente objet, il est recommand de cacher les informations l
intrieur de la classe en rendant priv es toutes les variables membre de la classe, et en y
accdant au moyen de mthodes, de format spcifique, appel es mthodes daccs.
5.4.3.Mthodes daccs
Les mthodes daccs (parfois appel es getter et setter) fournissent linterface publique
de la classe accessible depuis lextrieur, tout en conservant au stockage des donnes de la
classe son caractre priv .
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 de la variable interne prive associ au prfixe get (obtient). La
mthode Set fait de mme avec set (dfinit). Une proprit en lecture seule possde
uniquement une mthode Get. En gnral, les mthodes Get boolennes utilisent is (est)
ou has (a) comme prfixe la place de get. Les mthodes daccs permettent aussi de
valider facilement les donnes attribues une variable membre particulire.
Exemple
public class personne
{
private String prenom;
private String nom;
private int age;
private boolean male;
public personne(String prenom, String nom, int age, boolean male)
{
this.prenom=prenom;
this.nom=nom;
this.age=age;
this.male=male;
}
public personne(personne P)
{
this.prenom=P.prenom;
this.nom=P.nom;
this.age=P.age;
this.male=P.male;
}
public void identifie()
{
System.out.println(prenom+","+nom+","+age+" male :" +male );
}
// accesseurs
public String getPrenom()
{
return prenom;
}
public String getNom()
{
return nom;
}
public int getAge()
32
{
return age;
}
public boolean isMale()
{
return male;
}
//modifieurs
public void setPrenom(String prenom)
{
this.prenom=prenom;
}
public void setNom(String nom)
{
this.nom=nom;
}
public void setAge(int age)
{
this.age=age;
}
public void setMale(boolean male)
{
this.male=male;
}
}
33
5.5.Hritage
Le concept dhritage constitue lun des fondements de la programmation oriente objet.
Il est notamment lorigine des possibilits de rutilisation des composants logiciels que
sont les classes. En effet, il permet de dfinir une nouvelle classe, dite classe drive (enfant),
partir dune classe existante dite classe de base (parent). Cette nouvelle classe hrite
automatiquement des fonctionnalits de la classe de base (champs et mthodes) quelle
pourra modifier ou complter volont, sans quil soit ncessaire de remettre en question
la classe de base.
Cette technique permet donc de dvelopper de nouveaux outils en se fondant sur un
certain acquis, ce qui justifie le terme dhritage. Il sera possible de dvelopper partir
dune classe de base, autant de classes drives quon le dsire. De mme, une classe
drive pourra son tour servir de classe de base pour une nouvelle classe drive.
5.5.1.Drivations successives
Java permet la drivation successive; une classe D peut driver d'une classe B qui elle
mme est drive d'une classe A est ainsi de suite (Fig. 1)
5.5.2.La notion dhritage
Nous allons voir comment mettre en uvre lhritage en Java, partir dun exemple
simple de classe ne comportant pas encore de constructeur.
Supposez que nous disposions de la classe Point suivante (pour linstant, peu importe
quelle ait t dclare publique ou non) :
class Point
{
private int x, y ;

public void initialise (int abs, int ord)
{ x = abs ; y = ord ;
}
public void deplace (int dx, int dy)
{ x += dx ; y += dy ;
}
34
(i). *" Mcanisme de drivation successive dans Java
public void affiche ()
{ System.out.println ("Je suis en " + x + " " + y) ;
}
}
Imaginons que nous ayons besoin dune classe Pointcol, destine manipuler des points
colors dun plan. Une telle classe peut manifestement disposer des mmes fonctionnalits
que la classe Point, auxquelles on pourrait adjoindre, par exemple, une mthode nomme
colore, charge de dfinir la couleur. Dans ces conditions, nous pouvons chercher dfinir
la classe Pointcol comme drive de la classe Point. Si nous prvoyons, outre la mthode
colore, un membre nomm couleur, de type byte, destin reprsenter la couleur dun
point, voici comment pourrait se prsenter la dfinition de la classe Pointcol (ici encore,
peu importe quelle soit publique ou non) :
class Pointcol extends Point // Pointcol drive de Point
{
private byte couleur ;
public void colore (byte couleur)
{
this.couleur = couleur ;
}
}
La mention extends Point prcise au compilateur que la classe Pointcol est une classe
drive de Point.
Disposant de cette classe, nous pouvons dclarer des variables de type Pointcol et crer
des objets de ce type de manire usuelle, par exemple :
Pointcol pc ; // pc contiendra une rfrence un objet de type Pointcol
Pointcol pc2 = new Pointcol() ; // pc2 contient la rfrence un objet de
// type Pointcol cr en utilisant le pseudo-constructeur par dfaut
pc = new Pointcol() ;
Un objet de type Pointcol peut alors faire appel :
aux mthodes publiques de Pointcol, ici colore ;
mais aussi aux mthodes publiques de Point : initialise, deplace et affiche.
Dune manire gnrale, un objet dune classe drive accde aux membres publics de
sa classe de base, exactement comme sils taient dfinis dans la classe drive elle-mme.
Remarque :
Dans Java, les classes ne peuvent hriter que dune seule classe la fois (hritage unique). Au
contraire de Java, certains langages (comme C++) permettent quune classe hrite de plusieurs
classes la fois (hritage multiple).
35
5.5.3.Accs dune classe drive aux membres de sa classe de base
Une classe drive hrite des champs et mthodes de sa classe de base. Dans lexemple
prcdent, nous avons vu comment les membres publics de la classe de base restent des
membres publics de la classe drive. Cest ainsi que nous avons pu appliquer la mthode
intialise un objet de type Pointcol.
Une mthode dune classe drive na pas accs aux membres privs de sa classe de
base. Cette rgle garantie le principe d'encapsulation. En effet, en son absence, il suffirait
de crer une classe drive pour pouvoir accder la totalit de la classe et ainsi violer le
principe dencapsulation.
Si lon considre la classe Pointcol prcdente, elle ne dispose pour linstant que dune
mthode affiche, hrite de Point qui, bien entendu, ne fournit pas la couleur. On peut
chercher la doter dune nouvelle mthode nomme par exemple affichec, fournissant la
fois les coordonnes du point color et sa couleur. Il ne sera pas possible de procder ainsi :
void affichec() // mthode affichant les coordonnes et la couleur
{
System.out.println("Je suis en " + x + " " + y) ; // NON : x et y sont privs
System.out.println(" et ma couleur est : " + couleur) ;
}
En effet, la mthode affichec de Pointcol na pas accs aux champs privs x et y de sa
classe de base.
Une mthode dune classe drive a accs aux membres publics de sa classe de base.
Ainsi, pour crire la mthode affichec, nous pouvons nous appuyer sur la mthode
affiche de Point en procdant ainsi:
public void affichec()
{
affiche() ;
System.out.println(" et ma couleur est : " + couleur) ;
}
On notera que lappel affiche() dans la mthode affichec est en fait quivalent :
this.affiche();
Autrement dit, il applique la mthode affiche lobjet (de type Pointcol) ayant appel la
mthode affichec.
Nous pouvons procder de mme pour dfinir dans Pointcol une nouvelle mthode
dinitialisation nomme initialisec, charge dattribuer les coordonnes et la couleur un
point color :
public void initialisec (int x, int y, byte couleur)
{
initialise (x, y);
this.couleur = couleur;
}
36
5.5.4.Construction et initialisation des objets drivs
Il possible davoir plus dun constructeur par classe. Lorsque plusieurs mthodes
portant le mme nom existent dans la mme classe, les mthodes sont dites surcharges. Il
est frquent quune classe ait plusieurs constructeurs.
Appels des constructeurs
Rappelons que dans le cas dune classe simple (non drive), la cration dun objet par
new entrane lappel dun constructeur ayant la signature voulue (nombre et type des
arguments).
Si aucun constructeur ne convient, on obtient une erreur de compilation sauf si la classe
ne dispose daucun constructeur et que lappel de new sest fait sans argument. On a
affaire alors un pseudo-constructeur par dfaut (qui ne fait rien de plus que rserver la
mmoire).
Exemple:
soit la classe de base (Point) et la classe drive (Pointcol) disposent toutes les deux dun
constructeur.
On suppose que la classe Point dispose dun constructeur deux arguments et la classe
Pointcol dun constructeur trois arguments :
class Point
{ .....
private int x, y ;
public Point (int x, int y)
{ .....
}

}
class Pointcol extends Point
{ .....
private byte couleur ;
public Pointcol (int x, int y, byte couleur)
{ .....
}
}
En Java, le constructeur de la classe drive doit prendre en charge lintgralit de la
construction de lobjet.
Sil est ncessaire dinitialiser certains champs de la classe de base et quils sont
convenablement encapsuls, il faudra disposer de fonctions daltration ou bien recourir
un constructeur de la classe de base.
Ainsi, le constructeur de Pointcol pourrait :
Initialiser le champ couleur (accessible, car membre de Pointcol),
Appeler le constructeur de Point pour initialiser les champs x et y.
Rgle
Si un constructeur dune classe drive appelle un constructeur dune classe de base, il doit
obligatoirement sagir de la premire instruction du constructeur et ce dernier est dsign par le
mot-cl super.
Le constructeur de Pointcol pourra se prsenter comme suit :
37
public Pointcol (int x, int y, byte couleur)
{
super (x, y); /* appel dun constructeur de la classe de base, auquel on fournit en
arguments les valeurs de x et de y obligatoirement comme premire instruction */
this.couleur = couleur;
}
Remarques
1. Il est possible dappeler dans un constructeur un autre constructeur de la mme
classe, en utilisant le mot-cl this comme nom de mthode. Comme celui effectu
par super, cet appel doit correspondre la premire instruction du constructeur.
Dans ces conditions, on voit quil nest pas possible dexploiter les deux possibilits
en mme temps.
2. Une classe peut driver dune classe qui drive elle mme dune autre. Lappel par
super ne concerne que le constructeur de la classe de base du niveau
immdiatement suprieur.
Cas gnral
En gnral, il existe trois cas possible :
1. La classe drive et la classe de base possdent tous les deux un constructeur au
moins.
2. la classe de base ne possde aucun constructeur
3. la classe drive ne possde aucun constructeur
La classe de base ne possde aucun constructeur
Il reste possible dappeler le constructeur par dfaut dans la classe drive, comme
dans :
class A
{ ..... // aucun constructeur
}
class B extends A
{
public B (...) // constructeur de B
{
super() ; // appelle ici le pseudo-constructeur par
// dfaut de A
.....
}
}
La classe drive ne possde aucun constructeur
Dans ce cas, il est prvu un appel d'un constructeur par dfaut qui son tour fait appelle
d'un constructeur sans argument de la classe de base.
ce qui signifie que la classe de base devra :
soit possder un constructeur public sans argument, lequel sera alors appel,
38
soit ne possder aucun constructeur ; il y aura appel du pseudo-constructeur par
dfaut.
Exemple 1
class A
{ public A() { ..... } // constructeur 1 de A
public A (int n) { ..... } // constructeur 2 de A
}
class B extends A
{ ..... // pas de constructeur
}
B b = new B() ; //construction de B --> appel de constructeur 1 de A
La construction dun objet de type B entrane lappel du constructeur sans argument de
A.
Exemple 2
class A
{ public A(int n) { ..... } // constructeur 2 seulement
}
class B extends A
{ ..... // pas de constructeur
}
Ici, on obtient une erreur de compilation car le constructeur par dfaut de B cherche
appeler un constructeur sans argument de A. Comme cette dernire dispose dau moins
un constructeur, il nest plus question dutiliser le constructeur par dfaut de A.
Exemple 3
class A
{ ..... // pas de constructeur
}
class B extends A
{ ..... // pas de constructeur
}
Cet exemple ressemble au prcdent, avec cette diffrence que A ne possde plus de
constructeur. Aucun problme ne se pose plus. La cration dun objet de type B entrane
lappel du constructeur par dfaut de B, qui appelle le constructeur par dfaut de A.
5.5.5.Redfinition et surcharge
1. Redfinition des champs
Les champs dclars dans la classe drive sont toujours des champs supplmentaires.
Si lon dfinit un champ ayant le mme nom quun champ de la classe de base, il existera
alors deux champs de mme nom. Le nom de champ dsignera celui dclar dans la classe
39
drive. Pour avoir accs celui de la classe de base, il faudra changer le type de la
rfrence pointant sur lobjet, ou utiliser super. Voici un exemple :
class A
{
public int i;
...
}
class B extends A
{
public int i;
public void uneMethode()
{
i=0; // champ dfini dans la classe B
this.i=0; // champ dfini dans B
super.i=1; // champ dfini dans A
((A) this).i=1; // champ dfini dans A
}
}
class C extends B
{
public int i;
public void uneMethode()
{
i=0; // champ dfini dans la classe C
this.i=0; // champ dfini dans C
super.i=1; // champ dfini dans B
((B) this).i=1; // champ dfini dans B
((A) this).i=1; // champ dfini dans A
...
}
}
Mais attention linstruction suivante est incorrecte ! super.super.i=1;
De plus, le mot-cl super ne peut pas tre utilis dans les mthodes qualifies de static.
2. Redfinition des mthodes
La redfinition dune mthode consiste fournir une implmentation diffrente de la
mthode de mme signature fournie par la classe mre.
Exemple
class Fruit{
public String nom;
public Fruit(String n)
{
nom=n;
}
public void imprimer() {
System.out.println("je suis un(e) "+nom);
}
public String getNom(){
40
return nom;
}
}
class Pomme extends Fruit{
public Pomme(){
super("pomme");
}
public void imprimer() {
System.out.println("je suis une "+nom);
}
}
class Test{
public static void main(String[] arg){
Fruit f=new Fruit("ananas");
Pomme p=new Pomme();
f.imprimer();
System.out.println(f.getNom());
p.imprimer();
f=(Fruit)p;
f.imprimer();
System.out.println(p.getNom());
System.out.println(f.getNom());
}
}
exemple d'excution :
je suis un(e) ananas
ananas
je suis une pomme
je suis une pomme
pomme
pomme
Quelques prcisions supplmentaires :
Pour avoir accs une mthode redfinie de la classe de base, il faudra utiliser le
mot cl super.
Une mthode static peut aussi tre redfinie seulement par une autre mthode
static.
la redfinition dune mthode sapplique une classe et toutes ses descendantes
jusqu ce quventuellement lune dentre elles redfinisse nouveau la mthode.
Considrons par exemple larborescence suivante, dans laquelle la prsence dun
astrisque (*) signale la dfinition ou la redfinition dune mthode f:
41
Dans ces conditions, lappel de la mthode f conduira, pour chaque classe, lappel de
la mthode indique en regard :
classe A : mthode f de A ,
classe B : mthode f de A ,
classe C : mthode f de C ,
classe D : mthode f de D ,
classe E : mthode f de A ,
classe F : mthode f de C .
5.5.6.Le polymorphisme
Dans cette section on va voir comment Java permet de mettre en uvre ce quon nomme
gnralement le polymorphisme.
Il sagit dun concept extrmement puissant en P.O.O., qui complte lhritage. On peut
caractriser le polymorphisme en disant quil permet de manipuler des objets sans en
connatre (tout fait) le type.
Par exemple, on pourra construire un tableau dobjets (donc en fait de rfrences des
objets), les uns tant de type Point , les autres tant de type Pointcol (driv de Point ) et
appeler la mthode affiche pour chacun des objets du tableau. Chaque objet ragira en
fonction de son propre type.
Mais il ne sagira pas de traiter ainsi nimporte quel objet. Nous montrerons que le
polymorphisme exploite la relation "est" induite par lhritage en appliquant la rgle
suivante : un point color est aussi un point, on peut donc bien le traiter comme un point,
la rciproque tant bien sr fausse.
1. Les bases du polymorphisme
Considrons cette situation dans laquelle les classes Point et Pointcol sont censes
disposer chacune dune mthode affiche , ainsi que des constructeurs habituels
(respectivement deux et trois arguments) :
class Point
{
public Point (int x, int y) { ..... }
public void affiche () { ..... }
}
class Pointcol extends Point
42
(i). +" ,ed-inition de mthode et drivations successives
{
public Pointcol (int x, int y, byte couleur)
public void affiche () { ..... }
}
Avec ces instructions :
Point p ;
p = new Point (3, 5);
On aboutit tout naturellement cette situation :
Mais il se trouve que Java autorise ce genre daffectation (p tant toujours de type Point )
p = new Pointcol (4, 8, (byte)2) ; /* p de type Point contient la rfrence un objet de type
Pointcol */
La situation correspondante est la suivante :
Dune manire gnrale, Java permet daffecter une variable objet non seulement la
rfrence un objet du type correspondant, mais aussi une rfrence un objet dun type
driv.
On peut dire quon est en prsence dune conversion implicite (lgale) dune rfrence
un type classe T en une rfrence un type ascendant de T ; on parle aussi de compatibilit
par affectation entre un type classe et un type ascendant.
Considrons maintenant ces instructions :
Point p = new Point (3, 5) ;
p.affiche () ; // appelle la mthode affiche de la classe Point
p = new Poincol (4, 8, 2) ;
p.affiche () ; // appelle la mthode affiche de la classe Pointcol
Dans la dernire instruction, la variable p est de type Point , alors que lobjet rfrenc
par p est de type Pointcol . Linstruction p.affiche() appelle alors la mthode affiche de la
classe Pointcol. C'est--dire, elle se fonde, non pas sur le type de la variable p , mais bel et
bien sur le type effectif de lobjet rfrenc par p au moment de lappel (ce type pouvant
voluer au fil de lexcution). Ce choix dune mthode au moment de lexcution (et non
plus de la compilation) porte gnralement le nom liaison dynamique.
En rsum, le polymorphisme en Java se traduit par :
la compatibilit par affectation entre un type classe et un type ascendant,
la liaison dynamique des mthodes
43
5.5.7.Limites de lhritage et du polymorphisme
La puissance des techniques dhritage et de polymorphisme finit parfois par en faire
oublier les rgles exactes et les limitations qui en dcoulent.
Considrez la situation suivante dans laquelle :
la classe Point dispose dune mthode identique fournissant la valeur true lorsque
le point fourni en argument a les mmes coordonnes que le point courant :
Point p1, p2 ;
.....
p1.identique(p2) // true si p1 et p2 ont mmes coordonnes
La classe Pointcol, drive de Point, redfinit cette mthode pour prendre en
compte non seulement lgalit des coordonnes, mais aussi celle de la couleur :
Pointcol pc1, pc2 ;
.....
pc1.identique(pc2); /* true si pc1 et pc2 ont mmes coordonnes et mme couleur */
Considrons alors :
Point p1 = new Pointcol (1, 2, (byte)5);
Point p2 = new Pointcol (1, 2, (byte)8);
Lexpression p1.identique(p2) a pour valeur true alors que nos deux points colors nont
pas la mme couleur. Lexplication rside tout simplement dans la bonne application des
rgles relatives au polymorphisme.
En effet, lors de la compilation de cette expression p1.identique(p2), on sest fond sur le
type de p1 pour en dduire que len-tte de la mthode identique appeler tait de la
forme Point identique(Point). Lors de lexcution, la liaison dynamique tient compte du type
de lobjet rellement rfrenc par p1 (ici Pointcol ) pour dfinir la classe partir de laquelle
se fera la recherche de la mthode voulue. Mais comme dans Pointcol , la mthode
identique na pas la signature voulue, on poursuit la recherche dans les classes
ascendantes et, finalement, on utilise la mthode identifie de Point . Do le rsultat
constat.
5.5.8.mthodes abstraites
Une mthode est qualifie d'abstract lorsquon la dclare sans donner son
implmentation (on na que son prototype). Une classe doit tre dclare abstract ds lors
quelle contient une mthode abstraite. Il est interdit de crer une instance dune classe
abstraite (en fait, son implmentation nest pas complte).
Puisquune classe abstraite ne peut pas tre instancie, il faudra videmment la driver
pour pouvoir lutiliser. Une sous-classe dune classe abstraite sera encore abstraite si elle ne
dfinit pas toutes les mthodes abstraites de la classe mre.
Une mthode final ne peut tre dclare abstraite, puisquon ne peut pas redfinir une
telle mthode.
Une classe abstraite peut tre utilise pour regrouper des classes.
1. Intrt des classes abstraites
Le recours aux classes abstraites facilite largement la conception oriente objet. En effet,
on peut placer dans une classe abstraite toutes les fonctionnalits dont on souhaite
disposer pour toutes ses descendantes :
44
soit sous forme dune implmentation complte de mthodes (non abstraites) et de
champs (privs ou non) lorsquils sont communs toutes ses descendantes,
soit sous forme dinterface de mthodes abstraites dont on est alors sr quelles
existeront dans toute classe drive instanciable.
Cest cette certitude de la prsence de certaines mthodes qui permet dexploiter le
polymorphisme, et ce ds la conception de la classe abstraite, alors mme quaucune classe
drive na peut-tre encore t cre. Notamment, on peut trs bien crire des canevas
recourant des mthodes abstraites. Par exemple, si on avait dfini :
abstract class X
{ public abstract void f() ; // ici, f nest pas encore dfinie
.....
}
On peut alors crire une mthode (dune classe quelconque) telle que :
void algo (X x)
{ .....
x.f() ; // appel correct ; accept en compilation
..... // on est sr que tout objet dune classe drive de X
// disposera bien dune mthode f
}
Bien entendu, la redfinition de f devra respecter la smantique prvue dans le contrat
de X.
45
5.6.Interfaces
Java ne permet pas lhritage multiple. Il pallie ce manque par lintroduction des
interfaces. Les interfaces peuvent tre vues comme des modles, sortes de classes ne
possdant que des champs static final (cest--dire des constantes) et des mthodes
abstraites. On pourrait dire que les interfaces sont des classes abstraites dont toutes les
mthodes sont abstraites et publiques et tous les champs sont publics et constants.
Les interfaces servent :
garantir aux clients dune classe que ses instances peuvent assurer certains services
faire du polymorphisme avec des objets dont les classes nappartiennent pas la
mme hirarchie dhritage.
5.6.1.Dclarer des interfaces
Comme les classes, les interfaces sont constitues de champs (ou attributs) et de
mthodes. Il existe nanmoins de trs fortes contraintes dans la dfinition dune interface :
toutes les mthodes qui sont dclares sont abstraites : aucune implmentation nest
donne. Toutes les mthodes tant publiques et abstraites, les mots cls public et
abstract sont implicites et napparaissent pas,
aucune mthode nest static,
tous les champs sont public, static et final, il dfinissent des constantes. Les mots
cls static et final sont implicites.
Une interface peut tre qualifie de public, auquel cas elle sera utilisable par nimporte
quelle classe. En labsence de ce qualificatif, elle ne peut tre utilise que par les classes du
mme paquetage. Contrairement aux classes, on ne peut qualifier une interface de private
ni protected.
Comme pour les classes, on peut organiser les interfaces de faon hirarchique. Mais
contrairement aux classes, une interface peut driver plusieurs autres interfaces.
5.6.2.Implmentation des interfaces
Les interfaces dfinissent des promesses de services. Mais seule une classe peut rendre
effectivement ces services. Une interface seule ne sert rien. Il faut une classe qui
implmente linterface. Une telle classe dclare dans son entte quelle implmente une
interface :
interface Service {
...
}
class X implements Service {
...
}
Par lutilisation du mot cl implements, la classe promet d'implmenter toutes les
mthodes dclares dans linterface. La signature dune mthode implmente doit
videmment tre identique celle qui apparat dans linterface, sinon la mthode est
46
considre comme une mthode de la classe et non de linterface.
Comme pour des classes, on peut dfinir des rfrences ayant le type dune interface.
Par contre, il ne sera pas possible de dfinir un objet de ce type ! Si lon dclare par
exemple Service s; s est une rfrence qui contient soit la valeur null, soit une rfrence un
objet dune classe implmentant linterface Service.
5.6.3.Interface et classe drive
La clause implements est une garantie quoffre une classe dimplmenter les
fonctionnalits proposes dans une interface. Elle est totalement indpendante de
lhritage ; autrement dit, une classe drive peut implmenter une interface (ou plusieurs)
:
interface I
{
void f(int n) ;
void g() ;
}
class A { ..... }
class B extends A implements I
{ // les mthodes f et g doivent soit tre dj dfinies dans A,
// soit dfinies dans B
}
On peut mme rencontrer cette situation :
interface I1 { ..... }
interface I2 { ..... }
class A implements I1 { ..... }
class B extends A implements I2 { ..... }
5.6.4.Interfaces et constantes
Lessentiel du concept dinterface rside dans les en-ttes des mthodes qui y figurent.
Mais une interface peut aussi renfermer des constantes symboliques qui seront alors
accessibles toutes les classes implmentant linterface :
interface I
{
void f(int n) ;
void g() ;
static final int MAXI = 100 ;
}
class A implements I
{ // doit dfinir f et g
// dans toutes les mthodes de A, on a accs au symbole MAXI :
// par exemple : if (i < MAXI) .....
}
47
Ces constantes sont automatiquement considres comme si elles avaient t dclares
static et final . Il doit sagir obligatoirement dexpressions constantes.
Elles sont accessibles en dehors dune classe implmentant linterface. Par exemple, la
constante MAXI de linterface I se notera simplement I.MAXI .
48
5.7.Les Exceptions
5.7.1.Introduction
Dans un programme, il faut soigner la gestion des erreurs. Ce nest pas toujours facile
avec les langages classiques. Java, comme d'autres langages modernes, propose une
approche trs diffrente des approches traditionnelles, travers le mcanisme des
exceptions.
Une exception est une sorte de signal indiquant quune erreur ou une situation anormale
a eu lieu. On dit quune mthode ayant dtect une situation anormale dclenche (throws)
une exception. Cette exception pourra tre capture (catch) par le code.
En Java, on distingue trois types d'erreurs, qui sont de degrs de gravit diffrents,
savoir :
Les erreurs graves qui causent gnralement l'arrt du programme et qui sont
reprsentes par la classe java.lang.Error .
Les erreurs qui doivent gnralement tre traites et qui sont reprsentes par la
classe java.lang.Exception.
Les erreurs qui peuvent ne pas tre traites et qui sont des objets de la
classe java.lang.RuntimeException qui hrite de java.lang.Exception.
Toutes ces classes hritent directement ou indirectement de la
classe java.lang.Throwable. La figure (Fig. 3) montre le diagramme rcapitulatif des
classes de gestion des exceptions.
Lorsquune mthode dclenche une exception, la JVM remonte la suite des invocations
des mthodes jusqu atteindre une mthode qui capture cette exception. Si une telle
mthode nest pas rencontre, lexcution est arrte.
49
(i). ."%ia)ramme des classes de )estion des
e!ceptions
L'utilisation des exceptions permet de :
sparer le code correspondant au fonctionnement normal dun programme, du
code concernant la gestion des erreurs,
propager de proche en proche les exceptions dune mthode la mthode appelante
jusqu atteindre une mthode capable de grer lexception. Il nest donc pas
ncessaire que la gestion dune exception figure dans la mthode qui est susceptible
de dclencher cette exception. Une mthode peut ignorer la gestion dune exception
condition quelle transmette lexception la mthode appelante,
regrouper par types la gestion des exceptions.
5.7.2.Mcanisme de gestion des exceptions
Lorsquune exception est lance, elle se propage dans la pile des mthodes jusqu tre
capture. Si elle ne lest pas, elle provoque la fin du programme, et la pile des mthodes
traverses est indique lutilisateur.
Supposons quune instruction instruct dune mthode uneMethode lance une exception,
alors :
si instruct se trouve dans un bloc try, suivi dun bloc catch alors,
1. les instructions du bloc try suivant instruct ne sont pas excutes,
2. les instructions du bloc catch sont excutes,
3. le programme reprend son cours normalement avec linstruction suivant le
bloc catch.
si instruct ne se trouve pas dans un bloc try comme dcrit prcdemment, alors la
mthode uneMethode est termine. Si uneMethode est la mthode main, le
programme se termine, et lexception na pas t capture. Sinon, on se retrouve
dans une mthode qui a appel la mthode uneMethode via une instruction
instruct2 qui lance son tour lexception.
Une mthode susceptible de lancer une exception sans la capturer doit lindiquer dans
son entte avec la clause throws. Cependant, on est dispens de dclarer le lancement des
erreurs les plus courantes, comme par exemple :
ArrayOutOfBoundsException,
ArrayStoreException,
ArithmeticException,
NullPointerException,
NumberFormatException...
Exemple
class AttrapExcep {
static int moyenne(String[] liste)
{
int somme=0, entier, nbNotes=0;
for (int i=0;i<liste.length;i++)
50
{
try
{
entier=Integer.parseInt(liste[i]);
somme+=entier;
nbNotes++;
}
catch(NumberFormatException e)
{
System.out.println("La "+(i+1)+"ime note pas entire");
//exit(0);
}
}
return somme/nbNotes;
}
public static void main(String [] arg)
{
System.out.println("La moyenne est :"+moyenne(arg));
}
}
Voici quelques exemples dexcution du programme prcdent:
mezaache@mezaache-laptop:~$ java AttrapExcep 5 b 10
La 2ime note pas entire
La moyenne est :7
mezaache@mezaache-laptop:~$ java AttrapExcep 5 10 15
La moyenne est :10
mezaache@mezaache-laptop:~$ java AttrapExcep 5 10 15 n
La 4ime note pas entire
La moyenne est :10
mezaache@mezaache-laptop:~$ java AttrapExcep 10.5 xx
La 1ime note pas entire
La 2ime note pas entire
Exception in thread "main" java.lang.ArithmeticException: / by zero
at AttrapExcep.moyenne(AttrapExcep.java:15)
at AttrapExcep.main(AttrapExcep.java:18)
5.7.3.Blocs finally
La clause finally est en gnral utilise pour faire le mnage (par exemple fermer les
fichiers, librer les ressources, ...). Un bloc finally est utilise en association avec un bloc
try. On sort dun bloc try par une instruction break ou return ou continue ou par une
propagation dexception. Un bloc finally suit un bloc try suivi, en gnral, dun bloc catch.
Dans tous les cas, quelque soit la faon dont on est sorti du bloc try, les instructions du
bloc finally sont excutes.
5.7.4.Cration d'un type d'exception personnel
Pour crer son propre type d'exception, il faut crire une classe hritant de la
classe Exception.
Exemple : On va crer une exception note NombreNonValideException qu'on lvera si
l'utilisateur du programme entre un nombre non compris entre 0 et 9.
51
public class NombreNonValideException extends Exception{
/** Cre une nouvelle instance de NombreNonValide
public NombreNonValideException(String message) {
super(message);
}
}
public class Nombre
{
public void parseAndPrint(String number) throws NombreNonValideException{
int i = Integer.parseInt(number); // throw NumberFormatException
if (i < 0 || i > 9)
throw new NombreNonValideException("Valeur non valide [0-9] :" +i);
System.out.println(i);
}
public static void main(String[] args)
{
Nombre a = new Nombre();
try
{
a.parseAndPrint("bb");
}
catch (NombreNonValideException e)
{
System.out.println(e.toString());
}
catch (NumberFormatException e) {
// encapsulation de l'exception
System.out.println(e.toString());
}
}
}
Il y a ici deux choses remarquer.
Tout d'abord la prsence de la clause throws dans la signature de la mthode, celle-ci est
obligatoire pour toute mthode qui peut lever une exception non traite dans la mthode
elle mme. Ensuite on voit que pour lever une exception il faut user du mot cl throw suivi
du type de l'exception qu'on instancie.
Voici quelques exemples dexcution du programme prcdent :
pour une valeur en entre "bb", c'est l'exception NumberFormatException qui est
dclenche.
java.lang.NumberFormatException: For input string: "bb"
pour une valeur en entre "11", c'est l'exception NombreNonValideException qui est
dclenche.
personnelExcep.NombreNonValideException: Valeur non valide [0-9] :11
52
5.7.5.La classe RuntimeException
Les exceptions hritant de java.lang.RuntimeException reprsentent des erreurs qui
peuvent survenir lors de l'excution du programme. Le compilateur n'oblige pas le
programmeur ni les traiter ni les dclarer dans une clause throws.
Les classes java.lang.ArithmeticException (qui peut survenir lors d'une division par 0 par
exemple) et la classe java.langArrayIndexOutOfBoundException (qui survient lors d'un
dpassement d'indice dans un tableau) sont des exemples de RuntimeException. Autrement
dit ce genre de code passe sans problme la compilation :

public class CompilationRuntimeException {

public static void main(String[] args) {
String[] tableau={"A","B","C"};
for(int i=0;i<=3;i++){
System.out.println(tableau[i]);
}
}
}
Mais l'excution, on obtient bien une ArrayIndexOfBoundsException sans l'avoir
pralablement dclare dans une clause throws.
53
5.8.Les classes internes
Jusqu' prsent, les classes (et interfaces) que nous avons vues taient toutes des classes
(et interfaces) de haut-niveau (c'est- dire des membres directs des paquetages, sans
imbrication).
Le langage Java permet cependant ( partir de la version 1.1 du JDK) de dfinir des
classes l'intrieur d'autres classes. On parle dans ce cas de classes internes (Nested Class).
Il existe quatre types de classes internes :
Les classes membres statiques (Static Nested Class)
Les classes membres (Inner Class)
Les classes locales (Local Inner Class)
Les classes anonymes (Anonymous Inner Class)
Une classe est dite interne lorsque sa dfinition est situe lintrieur de la dfinition
dune autre classe.
5.8.1.Classes membres statiques
Une classe membre statique est une classe dfinie comme un membre statique d'une
autre classe.
Des interfaces peuvent galement tre dclares comme membres statiques d'une
classe. Les remarques qui suivent s'appliquent donc galement aux interfaces membres
statiques.
Une classe membre statique se comporte comme une classe ordinaire de haut-
niveau avec en outre la possibilit d'accder aux membres statiques de la classe qui la
contient (classe englobante).
Une classe membre statique a accs tous les membres statiques de sa classe
englobante, y compris les membres privs (private).
L'inverse est galement vrai : les mthodes de la classe englobante ont accs tous
les membres (statiques ou non-statiques) d'une classe membre statique, y compris les
membres privs.
Une classe membre statique a mme accs tous les membres des autres classes
membres statiques, y compris aux membres dclars private de ces classes.
Une classe membre statique peut tre dclare avec ses propres modificateurs de
contrle d'accs. Ces modificateurs (public, protected, private, aucun) possdent les
mmes significations que pour les autres membres d'une classe (champs et mthodes).
Exemple :
public class ClasseExterne
{
private int compteur = 0;
private static String nom = "Exemple";

54
static class ClasseInterne
{
private int index = 0;
public ClasseInterne()
{
System.out.println("Cration d'un objet dans "+nom);
// compteur ne peut tre accd
}
}
}
Depuis lextrieur de ClasseExterne , on peut instancier un objet de classe ClasseInterne
de cette faon :
ClasseExterne.ClasseInterne CI = new ClasseExterne.ClasseInterne() ;
Lobjet CI nest associ aucun objet de type ClasseExterne . Bien entendu, la classe
ClasseInterne na plus accs aux membres de ClasseExterne, sauf sil sagit de membres
statiques.
5.8.2.Classes membres
Une classe membre est une classe qui est dclare comme un membre non-statique
d'une classe englobante.
Les interfaces ne peuvent pas tre dclares comme membres non-statiques d'une
classe.
Une instance d'une classe membre est toujours associe une instance (un objet) de
la classe englobante.
Le code d'une classe membre a accs tous les champs et toutes les mthodes
(autant statiques que non-statiques) de sa classe englobante (mme s'ils sont dclars
privs).
Comme tous les autres membres de la classe, une classe membre peut tre dclare
avec ses propres modificateurs de contrle d'accs. Ces modificateurs (public, protected,
private, aucun) possdent les mmes significations que pour les autres membres de la
classe (champs et mthodes).
Exemple :
public class ClasseExterne
{
private int compteur = 0;
class ClasseInterne Swing
{
private int index = 0;
public ClasseInterne()
{
compteur++;
}
}
}
55
Depuis la classe interne, dans le cas o plusieurs variables ou mthodes portent le mme
nom dans la classe interne et la classe externe, le pointeur this seul dsigne l'instance de la
classe interne, tandis que le pointeur this prcd du nom de la classe externe dsigne
l'instance de la classe externe.
public class ClasseExterne
{
private int compteur = 10;

class ClasseInterne
{
private int compteur = 0;
public void count()
{
this.compteur++; // -> 1
ClasseExterne.this.compteur--; // -> 9
}
}
}
Remarques
Une mthode statique nest associe aucun objet. Par consquent, une mthode
statique dune classe externe ne peut crer aucun objet dune classe membre.
Une classe membre ne peut pas contenir de membres statiques.
5.8.3.Dclaration et instanciation dun objet dune classe interne
Dclarer et instancier un objet dune classe interne depuis une classe englobante
constitue la dmarche la plus naturelle. En thorie, Java permet aussi dutiliser une classe
interne depuis une classe indpendante (non englobante). Mais, il faut quand mme
rattacher un objet dune classe interne un objet de sa classe englobante. Supposons que
lon ait :
public class ClasseExterne // classe englobante de I
{ .....
public class ClasseInterne // classe interne ClasseExterne
{
.....
}
.....
}
En dehors de ClasseExterne , on peut toujours dclarer une rfrence un objet de type
ClasseInterne , de cette manire :
56
ClasseExterne.ClasseInterne i ; // rfrence un objet de type
ClasseInterne
Mais la cration dun objet de type ClasseInterne ne peut se faire quen le rattachant un
objet de sa classe englobante. Par exemple, si lon dispose dun objet e cr ainsi :
ClasseExterne e = new ClasseExterne() ;
on pourra affecter i la rfrence un objet de type ClasseInterne , rattach e , en
utilisant new comme suit :
i = new e.ClasseInterne() ; // cration dun objet de type ClasseInterne, rattach lobjet e
// et affectation de sa rfrence i
57
5.9.Programmation graphique
Dans le cas des applications console, cest le programme qui pilote lutilisateur en le
sollicitant au moment voulu pour quil fournisse des informations ; le dialogue se fait en
mode texte et de faon squentielle, dans une fentre nomme "console".
Dans le cas des applications graphiques, au contraire, lutilisateur a limpression de
piloter le programme qui ragit des demandes quil exprime en slectionnant des
lments de menu, en cliquant sur des boutons, en remplissant des botes de dialogue.
Malgr ladjectif "graphique" utilis dans lexpression "interface graphique", la principale
caractristique de ces programmes rside dans la notion de programmation
vnementielle.
5.9.1.AWT vs SWING
L'objectif initial de la conception de la bibliothque d'interface utilisateur graphique
[Graphical User Interface (GUI)] en Java 1.0 tait de permettre au programmeur de
construire une GUI qui a un aspect agrable sur toutes les plates-formes. Ce but n'a pas t
atteint. L'Abstract Window Toolkit (AWT) de Java 1.0 produit au contraire une GUI
d'aspect mdiocre sur tous les systmes.
De plus, elle est restrictive : on ne peut utiliser que quatre fontes, et on n'a accs aucun
des lments de GUI sophistiqus disponibles dans son systme d'exploitation. Le modle
de programmation de l'AWT Java 1.0 est non orient objet.
La situation s'est amliore avec le modle d'vnements de l'AWT de Java 1.1, qui a une
approche beaucoup plus claire et oriente objet.
Java 2 termine la transformation depuis l'ancien AWT de Java 1.0 en remplaant peu
prs tout par les Java Foundation Classes (JFC), dont la partie GUI est appele Swing .
Swing contient tous les composants attendus dans une interface utilisateur moderne,
depuis des boutons contenant des images jusqu' des arborescences et des tables.
Pour des question de rapidit, tous les composants sont lgers , et Swing est crit
entirement en Java pour la portabilit.
La navigation au clavier est automatique ; on peut excuter une application Swing sans
utiliser la souris, et ceci ne rclame aucune programmation supplmentaire. Le scrolling se
fait sans effort, on emballe simplement notre composant dans un JScrollPane lorsque on
l'ajoute notre formulaire. Des fonctionnalits telles que les infobulles [tool tips] ne
demandent qu'une seule ligne de code pour les utiliser.
Swing possde galement une fonctionnalit assez avance, appele le pluggable look
and feel , qui signifie que l'apparence de l'interface utilisateur peut tre modifie
dynamiquement pour s'adapter aux habitudes des utilisateurs travaillant sur des plates-
formes et systmes d'exploitation diffrents.
Une interface utilisateur Swing est un assemblage de composants (components en
anglais) affichs dans une fentre ou un autre type de conteneur (container). Lutilisateur
actionne ces composants pour piloter un programme.
58
Le paquetage javax.swing contient les classes utilises pour construire une interface
utilisateur graphique.
5.9.2.La classe JFrame
Pour crer une fentre graphique, on dispose, dans le paquetage nomm javax.swing ,
dune classe standard nomme JFrame , possdant un constructeur sans arguments. Par
exemple, avec:
JFrame fen = new JFrame() ;
On cre un objet de type JFrame et on place sa rfrence dans fen.
Mais si on se limite cela, rien napparatra lcran. Il est en effet ncessaire de
demander laffichage de la fentre en appelant la mthode setVisible :
fen.setVisible(true) ; // rend visible la fentre de rfrence fen
Comme par dfaut, une telle fentre est cre avec une taille nulle, il est ncessaire den
dfinir les dimensions auparavant ; par exemple :
fen.setSize (300, 150);// donne la fentre une hauteur de 150 pixels
// et une largeur de 300 pixels
En gnral, on choisira dafficher un texte prcis dans la barre de titre. Pour ce faire, on
utilisera la mthode setTitle , par exemple :
fen.setTitle ("Ma premiere fenetre");
import javax.swing.* ;
public class Fenetre //
{

public static void main (String args[])
{
JFrame fen = new JFrame() ;
fen.setSize (300, 150) ;
fen.setTitle ("Ma premiere fenetre") ;
fen.setVisible (true) ;
}

}
Bien que nous n'avons rien prvu de particulier, lutilisateur peut manipuler cette
fentre comme nimporte quelle fentre graphique dun logiciel du commerce, et en
59
La fentre graphique cre par le programme prcdent
particulier :
la retailler,
la dplacer,
la rduire une icne.
Ces fonctionnalits, communes toutes les fentres, sont prises en charge par la classe
JFrame elle-mme.
A priori,nous pouvons penser que lexcution de la mthode main arrivant son terme,
lapplication sinterrompt. Fort heureusement, la fentre graphique reste convenablement
affiche. En fait, un programme Java peut comporter plusieurs processus indpendants
quon nomme threads . Ici, on trouve un thread principal correspondant la mthode main
et un thread utilisateur lanc par laffichage de la fentre graphique. la fin de la mthode
main , seul le thread principal est interrompu.
Remarque:
On peut fermer la fentre graphique (par clic sur sa case de fermeture, par loption
Fermeture de son menu systme, par double clic sur sa case systme). Mais cela ne met pas
fin au thread dinterface utilisateur. Si on veut terminer le thread de l'interface utilisateur
lors de la fermeture de la fentre, en appelant la mthode setDefaultCloseOperation de
JFrame avec l'argument EXIT_ON_CLOSE.
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
5.9.3.Dessiner sur un composant
Dans cette section, nous allons voir comment dessiner des formes (figures) sur une
fentre.
On ne peut pas dessiner directement sur la fentre. Si on veut afficher une forme ou un
bouton sur une fentre, il nous faut construire un objet de type Component et l'ajouter la
fentre. Dans le paquetage Swing, la classe JComponent reprsente un composant vide.
Comme nous ne voulons pas ajouter un composant vide, il nous faut modifier la classe
JComponent et spcifier comment le composant doit tre dessin. La solution est d'tendre
la classe JComponent.
Exemple:
public class RectangleComponent extends JComponent
{
public void paintComponent(Graphics g)
{
//instructions du peint ici
}
}
La mthode paintComponent doit tre surcharge pour dessiner la forme qu'on veut (ici
un rectangle).
Lorsque la fentre est affiche pour la premire fois, la mthode paintComponent est
60
appele automatiquement. Elle est aussi appele lors du redimensionnement de la fentre
ou si la fentre devient visible aprs un recouvrement par une autre fentre .
La mthode paintComponent reoit comme argument un objet de type Graphics. L'objet
Graphics stocke l'tat du graphe- couleur, font,...qui sont utiliss pour les oprations de
dessin.
Actuellement, le paquetage Swing passe un objet de type Graphics2D, qui est une classe
qui tend la classe Graphics pour un comportement plus orient objet et de meilleur
qualit.
Dans notre programme, pour utiliser un objet Graphics2D, il suffit d'utiliser l'oprateur
de cast.
Exemple:
public class RectangleComponent extends JComponent
{
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g; // rcuprer une rfrence sur un objet
Graphics2D
//instructions du peint ici
}
}
Maintenant, on est prt pour dessiner des formes (lignes, ellipses, cercles, rectangles,...).
Dans l'exemple suivant, nous allons dessiner un rectangle.
Exemple:
public class RectangleComponent extends JComponent
{
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g; // rcuprer une rfrence sur un objet
Graphics2D
Rectangle box = new Rectangle(5, 10, 20, 30); // crer un rectangle
g2.draw(box);
}
}
Voici le code source de la classe RectangleComponent. Notez que la mthode
paintComponent de la classe RectangleComponent dessine deux rectangles.
Comme on peut le voir sur les dclarations d'importation, les classes Graphics et
Graphics2D font partie du package java.awt.
RectangleComponent.java
import java.awt.Graphics;
import java.awt.Graphics2D;
61
import java.awt.Rectangle;
import javax.swing.JComponent;
/**
Composant qui dessine deux rectangles
*/
public class RectangleComponent extends JComponent
{
public void paintComponent(Graphics g)
{
// Rcuprer une classe Graphics2D
Graphics2D g2 = (Graphics2D) g;
// Construire un rectangle et le dessiner
Rectangle box = new Rectangle(5,10,20,30);
g2.draw(box);
// dplacer le rectangle 15 units droite et 25 units au dessous
box.translate(15,25);
// Dessiner le rectangle dplac
g2.draw(box);
}
}
Pour finir, On doit afficher la fentre cadre (Frame) dans laquelle on a ajout l'objet
Component. Il faut suivre ces tapes:
1. Construction d'un cadre tel que dcrit dans la section prcdente.
2. Construire un objet de votre classe de composant:
RectangleComponent rectComp = new RectangleComponent ();
3. Ajoutez le composant l'image:
frame.add(rectComp);
4. Rendre l'image visible, comme dcrit dans la section prcdente.
Le listing ci-dessous montre le processus suivant:
import javax.swing.JFrame;
public class RectangleViewer
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle(Deux rectangles);
frame.setDefaultCloseOperation(JFrame.EXIT
RectangleComponent rectComp = new RectangleComponent();
frame.add(rectComp);
62
frame.setVisible(true);
}
}
5.9.4.Ellipses, Lignes, Texte, et Couleurs
Pour dessiner une ellipse, on spcifie le cadre qui englobe l'ellipse (figure)
Ellipse2D.Double ellipse = new Ellipse2D.Double(x,y,width,height);
La classe Ellipse2D.Double est une classe interne de la classe Ellipse2D, de sorte que pour
la directive import, on doit importer la classe externe :
import java.awt.geom.Ellipse2D;
Pour dessiner un cercle, il suffit de dfinir la largeur et la hauteur pour les mmes
valeurs:
Ellipse2D.Double circle = new Ellipse2D.Double(x, y, diameter, diameter);
g2.draw(circle);
Pour tracer une ligne, on utilise un objet de la classe Line2D.Double. Une ligne est
construit en prcisant ses deux points terminaux. On peut le faire de deux faons. Donner
les coordonnes x et y des deux points.
Line2D.Double segment = new Line2D.Double(x1,y1,x2,y2);
Ou spcifier chaque point final comme un objet de la classe Point2D.Double:
Point2D.Double from = new Point2D.Double(x1, y1);
Point2D.Double to = new Point2D.Double(x2, y2);
Line2D.Double segment = new Line2D.Double(from, to);
Si on veut mettre du texte l'intrieur d'un dessin, par exemple, une tiquette, on utilise
la mthode drawString de la classe Graphics2D pour dessiner une chane n'importe o dans
une fentre. On doit spcifier la chane de caractre afficher et le x et y, les coordonnes
du point de base du premier caractre dans la chane (figure).
63
g2.drawString(Message, 50, 100);
5.9.5.Les couleurs
Quand on commence dessiner, toutes les formes et les chanes sont dessins avec un
stylo noir. Pour changer la couleur, on doit fournir un objet de type Color.
Java utilise le modle de couleur en RGB. On spcifie une couleur par les valeurs des
couleurs primaires rouge, vert et bleu qui composent la couleur. Les valeurs sont indiqus
comme des entiers entre 0 (la couleur primaire n'est pas prsente) et 255 (valeur
maximale).
Par exemple:
Color magenta = new Color(255,0,255);
construit un objet de type Color avec une valeur maximale pour le rouge, pas de bleu et
une valeur maximale pour le vert, ce qui nous donne une couleur violet brillante appele
magenta.
Pour une utilisation plus commode des couleurs, une varit de couleurs ont t
prdfinis dans la classe Color. Le tableau 1 montre les couleurs prdfinies et leurs
valeurs RGB.
Couleur Valeurs RGB
Color.BLACK 0, 0, 0
Color.BLUE 0, 0, 255
Color.CYAN 0, 255, 255
Color.GRAY 128, 128, 128
Color.DARKGRAY 64, 64, 64
Color.LIGHTGRAY 192, 192, 192
Color.GREEN 0, 255, 0
Color.MAGENTA 255, 0, 255
Color.ORANGE 255, 200, 0
Color.PINK 255, 175, 175
Color.RED 255, 0, 0
Color.WHITE 255, 255, 255
Color.YELLOW 255, 255, 0
Lorsque on dfinit une nouvelle couleur dans un contexte graphique, il est utilis pour
64
toutes les oprations de dessin ultrieurs.
Pour dessiner un rectangle dans une couleur diffrente, il faut d'abord, dfinir la couleur
de l'objet Graphics2D, puis appelez la mthode de draw:
g2.tricolore(Color.RED);
g2.draw(circle); // dessine le cercle en couleur rouge
Si on veut remplissez la forme avec la couleur choisie, on utilisera la mtode fill au lieu
de la mthode draw. Par exemple:
g2.fill(circle);
65
5.9.6.Les Applets
Une Applet est une classe particulire de composant Swing qui saffiche dans une page
HTML visualise par un navigateur. En voici les principales caractristiques.
I. La classe dune Applet doit driver de la classe javax.swing.JApplet, tre public et
avoir un constructeur public sans paramtre (ventuellement, celui fourni par
dfaut).
II. La balise <applet code="ClassApplet" ...> est incluse dans un fichier HTML pour
faire appel une Applet de classe ClassApplet).
III. Les Applets ont deux avantages, ils n'ont pas besoin de composants distincts et des
classes spares pour les excuter; on implmente seulement une classe. Et le plus
important est que les Applets s'excutent l'intrieur d'un navigateur web.
Les Applets sont des programmes qui s'excutent dans un navigateur Web.
1. Qu'est-ce qu'une Applet ?
Une Applet est une application Java :
C'est une classe Java compile sous forme bytecode
Elle drive d'une classe mre :
java.applet.Applet pour Java 1 (support nativement par les navigateurs
compatibles Java)
javax.swing.JApplet pour Java 2 (ncessite un plug-in Java 2)
Elle est excute par une machine virtuelle Java(JVM)
Elle possde nanmoins certaines particularits :
Elle rside sur un serveur web;
Elle est vhicule par une page HTML qui contient son URL;
Le navigateur Java-compatible qui charge cette page tlcharge alors le code de
l'Applet et l'excute grce sa propre JVM ou une JVM extrieure dans le cas d'un
plug-in;
Les conditions de scurits sont plus strictes que pour une application ordinaire,
et sont gres par le navigateur lui-mme :
Pas d'accs au systme de fichier de l'hte (une Applet ne peut lire ou
crire sur le disque de l'utilisateur);
Pas d'excution de code natif sur l'hte;
Communication restreinte avec le serveur d'origine (elle ne peut
communiquer qu'avec la machine partir de laquelle elle a t tlcharge
par le navigateur).
La structure gnrale d'une application Web simple est la suivante :
66
le client demande un document HTML au serveur Web gnralement avec un
navigateur. Ce document peut contenir une Applet qui fonctionnera comme une
application graphique autonome au sein du document HTML affich par le
navigateur du client.
cette Applet pourra avoir accs des donnes mais seulement celles situes sur le
serveur web. Elle n'aura pas accs ni aux ressources de la machine cliente qui
l'excute ni celles d'autres machines du rseau autres que celle partir de laquelle
elle a t tlcharge.
2. La classe JApplet
Une application peut tre tlcharge par un navigateur Web si c'est une instance de la
classe java.applet.Applet ou de la classe javax.swing.JApplet. Cette dernire drive de la
premire qui est elle-mme est drive de la classe Panel elle-mme drive de la classe
Container. Une instance Applet ou JApplet tant de type container, pourra donc contenir des
composants (Component) tels que boutons, cases cocher, listes,
La classe JApplet a amen quelques amliorations la classe Applet , notamment la
capacit contenir des composants JmenuBar c.a.d. des menus, ce qui n'tait pas possible
avec la classe Applet.
3. Excution d'une Applet : les mthodes init, start et stop
Lorsqu'un navigateur charge une Applet, il appelle trois mthodes de celle-ci :
init : Cette mthode est appele lors du chargement initial de l'Applet. On y
mettra donc les initialisations ncessaires l'application.
start : Cette mthode est appele chaque fois que le document contenant
l'Applet devient le document courant du navigateur. Ainsi lorsqu'un utilisateur
charge une Applet, les mthodes init et start vont tre excutes dans cet ordre.
Lorsqu'il va quitter le document pour en visualiser un autre, la mthode stop va tre
excute. Lorsqu'il reviendra dessus plus tard, la mthode start sera excute.
stop : Cette mthode est appele chaque fois que l'utilisateur quitte le
document contenant l'Applet.
Pour beaucoup d'Applets, seule la mthode init est ncessaire. Les mthodes start et
67
Structure d'une application web
stop ne sont ncessaires que si l'application lance des tches (threads) qui tournent en
parallle (en continu souvent l'insu de l'utilisateur).
Lorsque celui-ci quitte le document, la partie visible de l'application disparat, mais ces
tches de fond continuent travailler. On pourra alors exploiter l'appel du navigateur la
mthode stop pour les arrter. Si l'utilisateur revient sur le document, on profite de l'appel
du navigateur la mthode start pour les relancer.
Prenons par exemple une Applet qui a une horloge dans son interface graphique. Celle-
ci est maintenue par une tche de fond (thread). Lorsque dans le navigateur l'utilisateur
quitte la page de l'Applet, il est inutile de maintenir l'horloge qui est devenue invisible :
dans la mthode stop de l'Applet, on arrtera le thread qui gre l'horloge. Dans la mthode
start, on le relancera afin que lorsque l'utilisateur revient sur la page de l'Applet, il
retrouve une horloge l'heure.
Pour implmenter une Applet, on utilise une squelette de programme comme suit :
public class MyApplet extends JApplet
{
public void paint(Graphics g)
{
// Rcuprer une classe Graphics2D
Graphics2D g2 = (Graphics2D) g;
// Instructions pour dessiner
. . .
}
}
C'est presque le mme schma que pour un composant, avec deux diffrences mineures:
1. On tend la classe JApplet, non pas JComponent.
2. On place le code de dessin l'intrieur de la mthode de paint, et non pas
l'intrieur de la mthode paintComponent.
L'Applet suivant dessine deux rectangles: (RectangleApplet.java)
RectangleApplet.java
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JApplet;
/**
Un Applet qui dessine deux rectangles.
*/
public class RectangleApplet extends JApplet
{
public void paint(Graphics g)
{
// Rcuprer une classe graphique Graphics2D
68
Graphics2D g2 = (Graphics2D) g;
// Construire un rectangle et le dessiner
Rectangle box = new Rectangle(5, 10, 20, 30);
g2.draw(box);
// dplacer le rectangle 15 units droite et 25 units au dessous
box.translate(15, 25);
// Dessiner le rectangle dplac
g2.draw(box);
}
}
Pour excuter cette Applet, on a besoin d'un fichier HTML avec une balise applet. HTML
(HyperText Markup Language), le langage de balisage hypertexte, est le langage utilis
pour dcrire des pages Web.
Voici le fichier le plus simple possible pour afficher l'Applet rectangle:
RectangleApplet.html
<applet code=RectangleApplet.class
width=300 height=400>
</applet>
On peut allez loin si on connait le HTML, en ajoutant du texte et plus de balises HTML:
Exemple : RectangleAppletExplained.html
<html>
<head>
<title>Two rectangles</title>
</head>
<body>
<p>Here is my <i>first
applet</i>:</p>
<applet code=RectangleApplet.class
width=300 height=400>
</applet>
</body>
</html>
Un fichier HTML peut avoir plusieurs Applets. Il suffit d'ajouter une balise applet
spare pour chaque Applet.
On peut donner au fichier HTML n'importe quel nom, mais, il est plus facile de donner
le mme nom que celui de l'Applet.
Pour excuter l'Applet, on a deux choix; soit, on utilise le visualiseur de l'Applet, qui est
un programme inclus avec le Kit de dveloppement Java de Sun Microsystem (JDK). On
dmarre simplement le visualiseur de l'applet, en lui donnant le nom du Fichier HTML
qui contient l'Applet:
appletviewer RectangleApplet.html
69
on peut galement afficher l'Applet l'intrieur de n'importe quel navigateur Internet
compatible Java 2 (Firefox, Opera, ).
70
5.9.7.Composants et Conteneurs de Swing
La figure ci-dessous prsente lensemble des composants et des containers disponibles
dans la bibliothque standard Java.
71
72
Composats de saisie
Classe Utilisation
JTextField Champ de saisie simp!e
JPasswordField Champ de saisie pour !es mots de
passe
JTextArea Champ de saisie mu!ti!i"e
JFormattedTextField Champ de saisie pour !es ombres
et !es dates #$a%a 1&4'
JEditorPane (e)te *ormat #+(,- ou .(/'
JTextPane (e)te a%e0 *eui!!e de st1!es de
mise e *orme
Composats de 0hoi)
Classe Utilisation
JButton 2outo
JCheckBox 2oite 3 0o0her
JRadioButton 2outo radio
JList -iste de %a!eurs
JComboBox Choi) das ue !iste drou!ate
JSinner (oupie 45+ #$a%a 1&4'
JSlider Choi) de %a!eur a%e0 "!issi6re
JScrollBar As0eseur
Composats de prsetatio
Classe Utilisation
JLabel -abe! #te)te brut ou mis e *orme
si !e te)te 0omme0e par !a ba!ise
7htm!8' ou i09e
JToolTi :*o bu!!e a**i0he au sur%o! d;u
0omposat&
JSearator <parateur
JPro!ressBar 2arre de pro"ressio
Composats de meus
Utilisation Utilisation
J"enuBar 2arre de meu
J"enu ,eu
J"enu#tem =!met de meu
JCheckBox"enu#tem =!met de meu 0o0h
JRadioButton"enu#tem =!met de meu radio
JPou"enu ,eu 0ote)tue!
Coteeurs *e>tres
Classe Utilisation
JFrame /e>tre a%e0 barre de titre et bords
J$indow /e>tre sas d0oratio uti!ise
pour !?0ra d?a00uei! d?ue
app!i0atio
J%ialo! 2o@te de dia!o"ue moda!e #b!oAuat
!?app!i0atio' ou o moda!e
J#nternalFrame /e>tre itere d?ue app!i0atio
,B:#,u!tip!e Bo0umet :ter*a0e'
JAlet App!et <Ci" it"re 3 u
a%i"ateur :tere t
Coteeurs itermdiaires
Classe Utilisation
JToolBar 2arre d?outi! do0Dab!e #peut se
d0ro0her et se ra00ro0her'
JTabbedPane Eaeau 3 o"!ets
JSlitPane Eaeau parta" %erti0a!emet ou
horiFota!emet
JScrollPane Eaeau 3 as0eseurs
JLa&eredPane Eaeau mu!ti0ou0he
J%esktoPane Eaeau des *e>tres iteres ,B:
JRootPane Eaeau pri0ipa! d?ue *e>tre
JPanel Eaeau %ide uti!is pour !a mise
e pa"e des 0omposats 3 !?0ra
Composats arbre et tab!eau
Classe Utilisation
JTree Arbre hirar0hiAue
JTable (ab!eau 0apab!e d?a**i0her
di**rets t1pes de does
ditab!es ou o
2o@tes de dia!o"ues stadards
Classe Utilisation
JColorChooser Bia!o"ue de 0hoi) de 0ou!eur
J'ileChooser Bia!o"ue de 0hoi) de *i0hier
J(tionPane Bia!o"ues stadards #messa"eG
0o*irmatioG saisie simp!e'
5.9.8.Mise en page des composants avec les Layouts
Pour faciliter la portabilit et la traduction dune application Java, la position et les
dimensions des composants Swing ne sont pas spcifies en coordonnes pixel, mais
plutt grce des positions logiques spatiales (par exemple en haut, droite, dans la
premire cellule dune grille...).
Chaque conteneur dtermine la position et les dimensions des composants quil contient
grce son gestionnaire de mise en page associ (layout en anglais), chaque classe de
gestionnaire respectant une rgle de mise en page dfinie lavance.
Bien que le gestionnaire par dfaut des classes des fentres et des botes de dialogue
convienne quelquefois, il est souvent ncessaire de changer le gestionnaire de leur
panneau intrieur, grce la mthode setLayout. Le layout pass en paramtre cette
mthode est gnralement une instance dune des classes FlowLayout, BorderLayout ou
GridLayout du paquetage java.awt.
Une fois le layout du panneau intrieur dune fentre dtermin, chacun des composants
est ajout ce panneau au moyen dune des mthodes de la super-classe des conteneurs
java.awt.Container.
5.9.9.Agencer les composants les uns la suite des autres (java.awt.FlowLayout)
La classe java.awt.FlowLayout dispose les composants du conteneur qui lui est associ les
uns derrire les autres, leur taille optimale (preferred). Chaque composant est ajout son
conteneur avec la mthode add. Si le conteneur nest pas assez large, les composants sont
mis sur plusieurs lignes.
Exemple : afficher des champs de saisie et leurs labels
Lapplication de classe SwingUI (voir exemple ci-dessous) cre une fentre utilisant un
layout de classe java.awt.FlowLayout qui aligne les composants sur la gauche de la fentre
(voir figure ci-dessus).
SwingUI.java
73
volution de la disposition des composants dun conteneur utilisant un layout de
classe java.awt.FlowLayout
Taille )otimale) d*un comosant
-a mise e pa"e des 0omposats d;u 0oteeur est 0a!0u!e par !e "estioaire
#layout' e *o0tio des dimesios optima!es des 0omposats& Ce 0a!0u! est *ait pour
0haAue 0omposat pour "aratir Au;i! est 0orre0temet dimesio& -a tai!!e obteue
est re%o1e par !a mthode )et/re-erred0i1e e pi)e!sG et %arie d;u 0omposat 3
!;autre& Ear e)emp!eG !e 0a!0u! de !a tai!!e d;u !abe! se *ait e *o0tio de !a !o"ueur du
te)te Au;i! 0otiet et de !a po!i0e de 0ara0t6res uti!ise H das !e 0as d;u 0hamp de
saisieG 0;est !e ombre de 0o!oes sp0i*i !ors de sa 0ratio Aui est dtermiat&
package swingui.mez.dz;
import java.awt.*;
import javax.swing.*;
public class SwingUI{
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setTitle("Example") ;
frame.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)) ;
frame.add(new JLabel("Identificateur :"));
frame.add(new JTextField(10));
frame.add(new JLabel("Mot de Passe :"));
frame.add(new JPasswordField(10));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Appel de add
Java 5.0 permet dajouter un composant une fentre en appelant directement la
mthode add sur une instance de javax.swing.JFrame.
Quatre composants sont ajouts la fentre dans lordre de leur apparition lcran. Par
dfaut, une fentre na pas de taille (seule la barre de titre apparait); la mthode pack est
donc ensuite appele pour calculer la taille prfrence de la fentre avant quelle ne soit
affiche.
5.9.10.Disposer les composants dans une grille (java.awt.GridLayout)
La classe java.awt.GridLayout dispose les composants du conteneur qui lui est associ
dans un tableau o toutes les cellules ont les mmes dimensions. Chaque composant est
ajout son conteneur avec la mthode add qui remplit ce tableau ligne par ligne (dans le
mme sens que celui de lcriture -de gauche droite-).
Exemple : interface utilisateur dun clavier de calculatrice
Lapplication de classe ClavierCalculatrice cre une fentre utilisant un gestionnaire de
74
volution de la disposition des composants dun conteneur utilisant un layout de
classe java.awt.GridLayout
classe qui divise le panneau intrieur de la fentre en 4 lignes et 4 colonnes de mme
largeur et de mme hauteur. chaque cellule est ajout un bouton pour reprsenter un
clavier de calculatrice.
ClavierCalculatrice.java
package com.clavier.mez;
import java.awt.*;
import javax.swing.*;
public class ClavierCalculatrice{
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Clavier");
frame.setLayout(new GridLayout( 4, 4, 1, 1));
frame.add(new JButton("7"));
frame.add(new JButton("8"));
frame.add(new JButton("9"));
frame.add(new JButton("C"));
frame.add(new JButton("4"));
frame.add(new JButton("5"));
frame.add(new JButton("6"));
frame.add(new JButton("\u00f7"));
frame.add(new JButton("1"));
frame.add(new JButton("2"));
frame.add(new JButton("3"));
frame.add(new JButton("x"));
frame.add(new JButton("0"));
frame.add(new JButton(","));
frame.add(new JButton("+"));
frame.add(new JButton("-"));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
5.9.11.Placer les composants aux bords du conteneur (java.awt.BorderLayout)
La classe java.awt.BorderLayout divise lespace du conteneur qui lui est associ en 5
cellules, une chaque bord et une au centre. Chacune des cellules peut contenir, ou non,
un composant, et un seul.
Chaque composant est ajout son conteneur avec la mthode prenant en second
75
paramtre une des constantes BorderLayout.NORTH, BorderLayout.SOUTH,
BorderLayout.EAST, BorderLayout.WEST ou BorderLayout.CENTER, reprsentant la
cellule o sera plac ce composant. Quelle que soit la taille du conteneur, les distances de
chacun de ses composants au bord du conteneur sont dtermines en fonction de sa
largeur ou de sa hauteur "prfrence" en respectant le schma de la figure ci-dessous.
Exemple : interface utilisateur dun diteur de textes
Un conteneur tant aussi, par hritage, un composant, on peut aussi ajouter au panneau
dune fentre certains conteneurs : barres doutils, panneaux avec ascenseurs, panneaux
onglets
EditeurText.java
import javax.swing.*;
import java.awt.*;
class EditeurText
{
/**
* @param args
*/
public static void main(String [] args) {
JToolBar outils = new JToolBar ();
outils.add (new JButton ("New"));
outils.addSeparator ();
outils.add (new JButton ("Cut"));
outils.add (new JButton ("Copy"));
outils.add (new JButton ("Paste"));

JFrame fenetre = new JFrame ("Editeur");
fenetre.setLayout (new BorderLayout (2, 2));
fenetre.add (outils, BorderLayout.NORTH);
//fenetre.add (outils, BorderLayout.NORTH);
fenetre.add (new JScrollPane (new JTextArea (10, 50)),
BorderLayout.CENTER);
JLabel etat = new JLabel ("Application demaree");
76
Utilisation des tailles prfres avec un layout de classe java.awt.BorderLayout
etat.setBorder (BorderFactory.createLoweredBevelBorder());
fenetre.add (etat, BorderLayout.SOUTH);
fenetre. pack();
fenetre.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
fenetre.setVisible (true);
}
}
Cette application dispose ces trois composants avec un layout de classe
java.awt.BorderLayout pour obtenir une configuration typique des applications d'dition
(diteur de textes, tableur, logiciel de dessin): une barre d'outils en haut, une barre d'tat
en bas, le reste de l'espace de la fentre tant ddi au composant d'dition (figure ci-
dessous).
5.9.12.Mise en page volue par combinaison de layouts
Les trois layouts prcdents sont souvent insuffisants pour mettre en page un ensemble
complexe de composants dans une fentre ou une bote de dialogue. Au lieu d'utiliser un
seul layout pour le panneau intrieur, on rsout ce problme en dcomposant l'ensemble
des composants en plusieurs sous ensembles ayant des caractristiques gomtriques
communes (alignement, taille ... ). Les composants d'un sous-ensemble sont mis en page
avec le layout qui correspond le mieux leurs caractristiques gomtriques, et sont ajouts
un panneau intermdiaire vide de classe javax.swing.JPanel qui utilise ce layout. Chaque
instance de JPanel tant elle-mme un composant, on construit donc le panneau intrieur
d'une fentre en lui ajoutant les panneaux intermdiaires et leurs composants.
Exemple: panneau de saisie des coordonnes d'un contact
La classe PanneauContact, sous-classe de javax.swing.JPanel, met en page dans son propre
panneau un ensemble de composants utiliss pour saisir les coordonnes d'un contact
(titre, nom, prnom, adresse). L'adresse d'un contact est saisie dans un champ de saisie
multiple-lignes de classe javax.swing.JTextArea. Ce champ est plac sous les autres
composants pour pouvoir occuper tout la largeur du panneau (voir figure ci-dessous).
Le panneau de saisie d'un contact utilise un layout de classe BorderLayout auquel sont
ajouts les composants suivants:
77
l'ouest (gauche) sont placs les labels regroups dans un panneau utilisant un
layout de classe GridLayout.
Au centre sont placs la liste d roulante du titre et les deux champs de saisie du
nom et du prnom dans un panneau utilisant un layout de classe GridLayout. Notez
que la grille est dcompose en quatre cellules dont la dernire n'est pas utilise
afin que les champs de saisie soient positionns en regard de leurs labels.
Au sud (bas) est plac un champ de saisie multiple-lignes dans un panneau
ascenseurs.
PanneauContact.java
import java.awt.*;
import javax.swing.*;
public class PanneauContact extends JPanel
{
private final static String [] TITRES = {"Mr", "Mme", "Melle"};
private JComboBox saisieTitre = new JComboBox (TITRES);
private JTextField saisieNom = new JTextField (10);
private JTextField saisiePrenom = new JTextField (10);
private JTextArea saisieAdresse = new JTextArea (4, 20);
public PanneauContact ()
{
JPanel panneauLabels = new JPanel (new GridLayout (4, 1, 5, 5));
panneauLabels.add (new JLabel ("Titre :"));
panneauLabels.add (new JLabel ("Nom :"));
panneauLabels.add (new JLabel ("Pr\uOOe9nom :"));
panneauLabels.add (new JLabel ("Adresse :"));
JPanel panneauSaisie = new JPanel (new GridLayout (4, 1, 5, 5
panneauSaisie.add (this.saisieTitre);
panneauSaisie.add (this.saisieNom);
panneauSaisie.add (this.saisiePrenom);
setLayout (new BorderLayout (5, 5));
add (panneauLabels, BorderLayout.WEST);
78
ise en pa!e du panneau de saisie d"un contact
add (panneauSaisie, BorderLayout.CENTER);
add (new JScrollPane (saisieAdresse), BorderLayout.SOUTH);
}
public String getTitre () {
return (String)this.saisieTitre.getSelectedItem ();
}
public String getNom (){
return this.saisieNom.getText ();
}
public String getPrenom (){
return this.saisiePrenom.getText ();
}
public String getAdresse (){
this.saisieAdresse.getText ();
}
}
Ce panneau de saisie est mis en uvre dans l'application de classe SaisieContact avec la
mthode static showConfirmDialog de la classe javax.swing.JOptionPane. Cette mthode
affiche le panneau pass en paramtre sa taille prfre dans une bote de dialogue
modale, avec les boutons de confirmation ou d'annulation Ok / Annuler, puis renvoie une
valeur correspondant au choix Ok ou Annuler de l'utilisateur. Il est particulirement
intressant de l'utiliser; elle vite en effet:
de crer les deux boutons Ok / Annuler dans la langue de l'utilisateur et de les
mettre en page (sachant que ces boutons doivent apparatre selon un ordre et un
alignement diffrents selon le systme d'exploitation) ;
de grer la fermeture de la bote de dialogue.
SaisieContact.java
import javax.swing.*;
import PanneauContact;
class SaisieContact
{
public static void main(String [] args){
PanneauContact panneau = new PanneauContact();
int reponse = JOptionPane.showConfirmDialog(null, panneau, "Contact",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (reponse == JOptionPane.OK_OPTION)
JOptionPane.showMessageDialog(null, "Contact :\n" +
panneau.getTitreO + " " + panneau. getPrenomO + " " + panneau. getNomO
+ "xn" + panneau.getAdresse());
System.exit (0);
79
}
}
5.9.13.Gestion des vnement en Java
Dans les exemples que nous avons crit jusqu' maintenant, l'entre d'utilisateur est sous
le contrle du programme. Le programme demande l'utilisateur d'entrer les donnes
dans un ordre prcis. Par exemple, un programme peut demander l'utilisateur de fournir
le nom d'une personne, puis un son salaire.
Mais les programmes qu'on utilise chaque jour sur nos ordinateurs ne fonctionne pas de
cette manire. Un programme avec une interface utilisateur graphique, c'est plutt
l'utilisateur qui est le maitre. L'utilisateur peut utiliser simultanment la souris et le clavier
et utiliser les diffrents lments de l'interface dans n'importe quel ordre.
il peut diter des champs de texte , drouler des menus, cliquer sur des boutons et faire
glisser les barres de dfilement. Le programme doit ragir aux commandes de l'utilisateur,
quelle que soit leur ordre d'arrive.
Avoir traiter avec de nombreuses entres dans un ordre alatoire est un peu plus
difficile que de forcer tout simplement l'utilisateur fournir des entres dans un ordre fixe.
Chaque fois que l'utilisateur d'un programme utilise le clavier ou la souris n'importe o
dans l'une des fentres du programme, le gestionnaire de fentres de Java envoie une
notification au programme qu'un vnement s'est produit.
Le gestionnaire de fentres gnre un trs grand nombre d'vnements. Par exemple,
quand la souris se dplace d'un intervalle, mme trs petit sur une fentre, un mouvement
de souris est gnre. Des vnements sont galement gnr lorsque l'utilisateur appuie
sur une touche, clique sur un bouton, ou slectionne un lment d'un menu.
80
Utilisation des la&outs
Ioi0i Aue!Aues 0osei!s Aui de%raiet %ous *a0i!iter !a
mise e pa"e d?u paeau a%e0 !es layouts J
Kti!iseF !e ombre de 0o!oes et de !i"es des
0omposats de saisie te)tue!!e pour !eur doer ue
tai!!e pr*re 0orre0te&
<ou%eeF4%ous Au?u paeau itermdiaire
0oteat des 0omposats est !ui4m>me u 0omposat
dot !a tai!!e pr*re dped du layout uti!is pour
mettre e pa"e ses 0omposats&
,etteF das !a 0e!!u!e 2orderLayout& CLM(L. d?u
layout 3ava.a4t.2orderLayout u 0omposat Aui peut
>tre redimesio e !ar"eur et e hauteur #Foe
d?ditio d?ue *e>treG 0omposats i0!us das ue
ista0e de 3ava!.s4in).J0croll/ane'&
Kti!iseF !es param6tres des 0ostru0teurs des layouts
Aui sp0i*iet !es espa0emets horiFota! h"ap et
%erti0a! %"ap etre !es 0omposats pour arer %otre
iter*a0e uti!isateur&
Appe!eF !a mthode set.esiFab!e#*a!se' sur ue
*e>tre ou ue bo@te de dia!o"ue Aui e doit pas >tre
redimesioe&
Me %ous sou0ieF pas des prob!6mes de tradu0tio et
de porta"e d?ue :+, J !a tai!!e pr*re des
0omposats est 0a!0u!e e *o0tio de !a !o"ueur de
!eur te)te et s?adapte au loo5 and -eel e 0ours #par
e)emp!eG u bouto est beau0oup p!us "rad sous ,a0
O< N Aue sous OidoCs'& Au *ia!G !es layouts 0a!0u!et
0orre0temet !es dimesios pr*res d?ue *e>tre
!ors de !?appe! de !a mthode pa0D&
Kti!iseF des ideti*i0ateurs e)p!i0ites et 0!airs pour
ommer !es paeau) itermdiaires d?:+, 0omp!e)es&
K "rad ombre d?:BL permettet de 0rer de *aPo
itera0ti%e ue :+, 04in) par simp!e "!isser4dposer
des 0omposats das ue *e>tre& Ces e%iroemets
a00!6ret !e d%e!oppemet e "rat
automatiAuemet !e 0ode $a%a permettat de 0ostruire
ue iter*a0e uti!isateur mais %ous de%eF tout de m>me
sa%oir uti!iser !e m0aisme des layouts&
Lutilisateur dun programme interagit avec les composants Swing lcran grce aux
priphriques, comme la souris ou le clavier. Ces interactions sont regroupes par le
systme sous forme dvnements (events en anglais) de deux catgories :
Les vnements primaires, provoqus par un priphrique de lordinateur :
vnements souris (enfoncement /relchement dun bouton de la souris,
dplacement du pointeur de la souris) et vnements clavier (enfoncement
/relchement dune touche du clavier).
Les vnements composites, qui sont crs par le systme de gestion vnementiel
suite un enchanement dvnements primaires sur un composant (double-clic,
choix dun menu...) ou sur un conteneur (redimensionnement, fermeture dune
fentre...).
Le systme adresse chaque composant Swing les vnements qui le concernent. Pour
excuter un traitement en raction un vnement reu par un composant, il faut :
crire les instructions de ce traitement dans une classe implmentant linterface
listener associe lvnement ;
crer une instance de cette classe de listener ;
appeler la mthode adquate du composant en lui passant en paramtre linstance
du listener.
En Java, linterface dcoute (listener) le plus souvent implmente est
java.awt.event.ActionListener Son unique mthode actionPerformed est implmente avec le
traitement excuter en rponse une action de lutilisateur sur un composant. Cet
vnement composite de classe java.awt.event.ActionListener est mis par le systme quand,
par exemple, lutilisateur clique sur un bouton.
Exemple:
Le programme prsent ci-dessous affiche un message chaque fois qu'un bouton est
cliqu. Les objets Listener d'un bouton doivent appartenir une classe qui implmente
l'interface ActionListener:
public interface ActionListener
{
void actionPerformed(ActionEvent event);
}
Cette interface particulire a une seule mthode actionPerformed. Il est ncessaire de
fournir une classe implmentant cette interface et dont la mthode actionPerformed contient
les instructions qui seront excutes lorsque le bouton est cliqu.
ClickListener.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
Une classe listener qui affiche un message.
*/
81
public class ClickListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
System.out.println("I was clicked.");
}
}
Dans un premier temps, nous allons ignorer le paramtre de la mthode actionPerformed.
Ce dernier fournit en fait des dtails supplmentaires sur l'vnement; comme le moment
o elle s'est produite.
Une fois la classe Listener a t dfinie, on construit alors un objet de cette classe et on
l'ajoute au composant correspondant (un bouton ici):
Jbutton button = new Jbutton("Click me");
ActionListener listener = new ClickListener();
button.addActionListener(listener);
Chaque fois que le bouton est cliqu, la mthode:
listener.actionPerformed(event);
est appele. En consquence, le message "I was clicked." est affich.
La classe ButtonViewer est donne par le listing suivant :
ButtonViewer.java
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
Ce programme illsutre comment installer un Event Listener.
*/
public class ButtonViewer
{
private static final int FRAME_WIDTH = 100;
private static final int FRAME_HEIGHT = 60;

public static void main(String[] args)
{
JFrame frame = new JFrame();
JButton button = new JButton(Click me!);
frame.add(button);

ActionListener listener = new ClickListener();
button.addActionListener(listener);
82
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
frame.setVisible(true);
}
}
1. Utilisation de classes internes pour les Listener
Dans la section prcdente, on a vu comment le code excut quand un bouton est
cliqu est plac dans une classe de type Listener. Il est courant d'implmenter les classes
Listener comme des classes internes :
JButton button = new JButton(". . .");
//classe interne dclare dans la mme mthode que la variable bouton
class MyListener implements ActionListener
{
. . .
};
ActionListener listener = new MyListener();
button.addActionListener(listener);
Il y a deux raisons pour un tel arrangement. Premirement, elle place la classe trivial
Listener exactement l o elle est ncessaire, sans encombrer le reste du projet.
En outre, les classes internes ont une caractristique trs attrayante: Leurs mthodes
peuvent accder aux variables dfinies dans le blocs o elles sont dfinies. cet gard, les
dfinitions des mthodes de classes internes ont un comportement similaire celle des
blocs imbriqus.
83
6.Les servlets
Les servlets et les pages JSP permettent de gnrer des pages dynamiques sur un serveur
Web. Aprs une introduction sur larchitecture client-serveur dInternet, cette partie
expose comment installer le serveur Tomcat et crer les servlets et les pages JSP (JavaServer
Pages) dune application Web.
6.1.Protocole HTTP et programme CGI
Un serveur Web et le protocole HTTP (HyperText Transfer Protocol) permettent de
diffuser sur le Web des informations visualises par un navigateur. Ces informations
peuvent tre contenues dans de simples fichiers au format HTML (HyperText Markup
Language) mais peuvent aussi tre gnres grce un programme CGI.
Un script CGI (Common Gateway Interface, o interface de passerelle commune) est un
programme excut par le serveur web (on dit gnralement ct serveur ), permettant
d'envoyer au navigateur de l'internaute un code HTML cr automatiquement par le
serveur (bas par exemple sur une autre application, telle qu'un systme de gestion de base
de donnes, d'o le nom de passerelle).
Un des principaux intrts de l'utilisation de CGI est la possibilit de fournir des pages
dynamiques, c'est--dire des pages personnalises selon un choix ou une saisie de
l'utilisateur. L'application la plus frquente de cette technique repose sur l'utilisation
de formulaires HTML permettant l'utilisateur de choisir ou de saisir des donnes, puis
de cliquer sur un bouton de soumission du formulaire, envoyant alors les donnes du
formulaire en paramtre du script CGI.
6.2.Principe de larchitecture client-serveur
Le mode de programmation client-serveur implique quil y ait au moins deux
interlocuteurs, un client et un serveur communiquant entre eux souvent travers un
rseau :
Un serveur est un programme ou, par extension, une machine programme pour
rendre un service donn, en rponse une requte qui lui est adresse.
84
Architecture d'une application Web
Un client est un programme ou, par extension, une machine qui demande un
serveur un service, en lui adressant une requte.
Le Web est un exemple dapplication darchitecture client serveur : les sites sont anims
par des serveurs qui rendent toujours le mme service aux clients que sont les navigateurs.
Mais quel service au juste? Le serveur Web attend quon lui demande des donnes
(statiques ou rsultant dun traitement). En rponse une requte, il renvoie le contenu des
donnes requises. Le navigateur de son ct est client du serveur auquel il a envoy une
requte HTTP. Le navigateur prsente lutilisateur une rponse une fois les donnes
tlcharges.
La plupart des systmes de gestion de base de donnes sont eux aussi accessibles en
client-serveur, et plusieurs clients peuvent sy connecter en mme temps. La base de
donnes est gre par un serveur qui rpond aux requtes SQL(Structured Query
Language) que lui adressent des clients. Le client est souvent un programme qui tourne
sur un PC et met en page les rponses reues du serveur.
Larchitecture client-serveur spare le serveur qui, gnralement, gre des donnes, du
client qui cherche accder ces donnes.
6.3.Programmation d'une servlet sur le serveur
Les servlets sont intgres l'environnement Java pour excuter des classes capables de
s'interfacer avec un serveur HTTP grce au standard CGI. Toute servlet est une instance
d'une classe drivant de javax.servlet.http.HttpServlet.
6.3.1.Classe javax.servlet.http.HttpServlet
Une nouvelle classe de servlet doit driver de la classe javax.servlet.http.HttpServlet, tre
public et avoir un constructeur public sans paramtre (ventuellement celui fourni par
dfaut). Une classe de servlet redfinit la mthode doGet et/ou doPost pour implmenter la
rponse une requte.
doGet est le point d'entre d'une servlet appele par une requte HTTP GET. Un
navigateur envoie une requte GET dans les conditions suivantes:
Lors de la saisie d'une URL dans le champ d'adresse du navigateur.
un clic sur un lien hypertexte dfinie dans une balise <AHREF="URLLien">.
Pour accder d'autres ressources dpendantes d'un fichier HTML, comme les
images des balises <IMG SRC="URLlmage">.
En confirmation d'un formulaire HTML utilisant une balise form dont l'attribut
method est GET.
doPost est le point d'entre d'une servlet appele par une requte HTTP POST. Un
navigateur envoie une requte POST quand vous confirmez la saisie d'un formulaire
HTML utilisant une balise form dont l'attribut method est POST.
Ces deux mthodes reoivent en paramtre deux objets, l'un reprsentant la requte
reue, et l'autre la rponse de la servlet.
85
6.3.2.Interface javax.servlet.http.HttpServletRequest
Cette interface reprsente la requte HTTP reue par une servlet. getParameter est la
mthode qui est le plus utilise de cette interface: elle renvoie la valeur d'un paramtre
pass avec la requte.
6.3.3.Interface javax.servlet.http.HttpServletResponse
Cette interface reprsente la rponse de la servlet. Les mthodes les plus utilises de
cette interface sont:
setContentType qui spcifie le type MIME de la rponse;
getWriter qui renvoie une instance de java.io.PrintWriter utilise pour envoyer le texte
de la rponse au client de la servlet ;
getOutputStream qui renvoie une instance de javax.servlet.ServletOutputStream, sous-
classe de java.io.OutputStream, utilise pour envoyer au client de la servlet des
informations binaires, comme celles d'une image au format JPEG.
6.3.4.Renvoyer du texte HTML avec une servlet
La classe d'une servlet HTML implmente les mthodes doGet et/ou doPost avec des
instructions qui renvoient au client un texte HTML au moyen des mthodes write, print ou
println de la classe java.io.PrintWriter. Le texte gnr dpend gnralement des paramtres
passs lors de l'appel de la servlet.
Exemple: Bienvenue dans le monde des servlets !
La servlet de classe ServletBienvenue interroge le paramtre nom et renvoie un texte
HTML de bienvenue. Le texte renvoy est diffrent selon que le paramtre existe ou non).
package com.servlet.mez;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
public class ServletBienvenue extends HttpServlet
{ ServletBienvenue.java
public void doGet (HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException
{
String nom = request.getParameter("nom");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
86
out.write("<html><head><title>Bienvenue</title></head>" +
"<body><h1>Bienvenue</h1>" + "<p>Bonjour ");
if (nom != null && nom.length () > 0) E)
out.write(nom);
else
out.write("cher inconnu"); out.write("</p></body></html>");
}
}
6.3.5.Exceptions dclenches par doGet et doPost
Les mthodes doGet et doPost de la classe javax.servlet.HttpServlet sont dclares comme
tant susceptibles de dclencher des exceptions contrles de classe
javax.servlet.ServletException ou java.io.IOException, avec la clause throws correspondante.
Ceci vous permet de rpter les mme classes d'exceptions la redfinition de ses
mthodes sans avoir les traiter avec une instruction try catch. Si une telle exception
survient, le serveur de servlet est programm par dfaut pour renvoyer un message
d'erreur au client de la servlet.
6.3.6.Tomcat de l'Apache Software Foundation
Tomcat est le conteneur (ou moteur d'excution) de servlets utilis par Sun Microsystems
pour l'implmentation de rfrence des servlets et des pages JSP. C'est en fait un serveur
HTTP et un serveur de servlets/JSP tout-en-un crit en Java, ce qui rend cet outil trs
pratique pour tester un site Internet qui gre des pages statiques et des pages dynamiques
avec des servlets et des pages JSP. Tomcat peut aussi tre intgr au serveur Web Apache
ou au serveur Web Microsoft IIS.
http://tomcat.apache.org/
http://java.sun.com/products/servlet
6.3.7.Installation de Tomcat
Pour excuter la servlet prcdente, on doit installer un serveur de servlets tel que
Tomcat distribu sous licence Apache et utilisable librement.
Tomcat a t crit en langage Java, il peut donc s'excuter via la JVM (machine virtuelle
java) sur n'importe quel systme d'exploitation la supportant.
L'installation et la configuration de Tomcat dpend du systme d'exploitation et ne sera
pas discut ici.
6.3.8.Organiser les fichiers dune application Web
Le plus simple pour installer des servlets et des pages JSP sur un serveur Web ou J2EE
(Java 2 Entreprise Edition) tel que Tomcat est de respecter l'organisation d'une application
Web Java (Web Application en anglais).
Le dossier web d'une application Web doit contenir les fichiers et sous dossiers
prsents ci-dessous.
87
Le dossier WEB-INF/classes, ainsi que les bibliothques .jar du dossier WEB-INF/lib d'une
application Web, sont ajouts automatiquement au classpath de cette application, ce qui
simplifie sa mise en route sur un serveur Web.
88
lorganisation dune application Web Java
7.Les rseaux en java
7.1.Introduction
Un rseau informatique est constitu d'un ensemble d'ordinateurs et de priphriques
interconnects. Un noeud du rseau qui correspond un ordinateur est gnralement
appel hte .
TCP/IP est l'architecture rseau la plus rpandue. Contrairement ce que son nom laisse
croire, TCP/IP n'est pas une architecture rduite deux protocoles : IP (Internet Protocol)
et TCP (Transmission Control Protocol). L'architecture TCP/IP inclut de nombreux
"services d'application", des protocoles labors et complexes, sur lesquels les applications
distribues peuvent s'appuyer. Sans rentrer dans les dtails, le schma suivant prcise les
divers couches du rseau o interviennent les protocoles IP, TCP, et UDP.
7.2.Architecture Client/Serveur
Le mode de communication qu'un hte tablit avec un autre hte qui fournit un service
quelconque est dsign par le terme Client/Serveur . Les notions de base de l'architecture
client/serveur sont:
Client: Processus demandant l'excution d'une opration un autre processus
par un envoi de message et attendant la rponse cette question par un message en
retour.
Serveur: Processus accomplissant une opration sur demande d'un client et
transmettant la rponse ce client.
Requte: Message transmis par un client un serveur dcrivant l'opration
excuter pour le compte du client.
Rponse: Message transmis par un serveur un client suite l'excution d'une
opration contenant les paramtres de retour de l'opration
7.3.Dialogue Client/Serveur
7.3.1.Port UDP et TCP
Chaque hte est susceptible de fournir plusieurs services simultanment : serveur HTTP,
89
FTP, MAIL, etc. Selon le type de service que l'on veut utiliser, une machine cliente
s'adressera une machine serveur sur un canal ddi; on appelle ports logiques ces canaux.
Chaque machine sous IP possde quelques 65 535 ports; par exemple, le service HTTP
est li au port 80, le service SMTP (courrier lectronique) est reli au port 25, etc.
Une machine cliente qui s'adresse une machine serveur le fait en spcifiant son adresse
internet et le numro de port qui l'intresse.
Une diffrence importante au niveau de l'utilisation des ports TCP et UDP est la
suivante
tous les messages UDP destins un numro de port UDP seront livrs en un
mme " point"; il y a une seule file d'attente de messages pour le port.
alors que les messages TCP sur des connexions TCP vers un mme port peuvent
tre discrimins: il y a une file d'attente de messages par connexion
Avec TCP, il sera ais de concevoir des applications serveur "multi-processus" : chaque
processus sera en charge de grer une relation client-serveur, via une connexion TCP;
chaque processus possde une file d'attente propre. Avec UDP, c'est impossible : la mme
file d'attente sera utilise par tous les processus.
Avec UDP, les seules applications serveur qui pourront fonctionner en version "multi-
processus" seront celles conues pour accepter une requte et renvoyer immdiatement
une rponse, et une seule. C'est le cas de nombreuses applications dites " transactionnelles"
: les requtes sont srialises par le port UDP; chacune est traite par un processus, la
rponse est ensuite envoye. Les requtes conscutives ne doivent pas tre corrles.
7.3.2.Ports Rservs
Les applications serveurs ncessitent des ports connus de faon globale : un port de
serveur est quivalent un numro de tlphone publi dans un annuaire.
Avec TCP et UDP, un certain nombre de ports sont rservs des services bien connus.
Par exemple, sur TCP :
Serveur FTP, toujours en attente sur le port 21;
Serveur Telnet, toujours en attente sur le port 23;
Serveur SMTP, toujours en attente sur le port 25.
Sur UDP :
Agent SNMP, sur le port 161
Logger SNMP, sur le port 162
Serveur rwhod, sur le port 513,
etc.
Ces ports allous statiquement, aussi appels Well Known Ports , correspondant des
Well Known Services (WKS) , dans un espace de port rserv au serveur :
de 1 1024, ce sont des services fondamentaux (grs par des administrateurs);
90
de 1025 5000, ils sont disponibles aux utilisateurs pour implanter des serveurs
de nature quelconque.
Sous UNIX, les ports rservs pour les "services bien connus" sont visibles dans le fichier
/etc/services. Par exemple :
tcpmux 1/tcp # TCP port multiplexer (RFC 1078)
echo 7/tcp
echo 7/udp
ftp-data 20/tcp
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp mail
domain 53/tcp Nameserver # name-domain server
domain 53/udp nameserver
bootp 67/udp bootps # bootp server
bootpc 68/udp # bootp client
tftp 69/udp
finger 79/tcp
iso-tsap 102/tcp
snmp 161/udp
snmp-trap 162/udpsnmptrap
xdmcp 177/udp# X Display Mgr. Control Prot.
route 520/udprouter routed
7.4.Les URLs
On appelle URL (Uniform Resource Location ) la manire de nommer une ressource sur le
rseau Internet. Par exemple, http://fr.news.yahoo.com/technologies.html dsigne la
page WEB d'accueil de la page des nouvelles des technologies du portail yahoo.
Un URL se compose de trois parties: le protocole, l'hte et le document. La syntaxe
gnrale d'un URL est :
<protocole>://<nom_hote>[:<port>]/<chemin>/<nom_fichier>#<section>
Tout comme pour les fichiers dans un systme de fichiers, une ressource internet peut
tre spcifi soit par son URL absolu soit par son URL relatif. Un URL relatif dsigne une
ressource qui peut tre dsign relativement au document courant. Les URL relatifs ne
peuvent rfrencer que des ressources qui se trouvent dans le mme hte que le document
o figure l'URL.
7.5.Le protocole HTTP
91
Le protocole de communication HHTP consiste :
1. tablir une connexion TCP avec le serveur sur le port ddi (80 par dfaut, ou bien le
port spcifi dans l'URL).
2. mettre la requte d'extraction du document spcifi par l'URL
3. Rception de la rponse
4. clture de connexion
7.5.1.Le package java.net
Tout ce qui concerne la programmation rseau est contenu dans le package java.net
except les manipulations spcifiques aux applets.
la classe java.net contient les classes
Authenticator
ContentHandler
DatagramPacket
DatagramSocket
DatagramSocketImpl
HttpURLConnection
InetAddress
JarURLConnection
MulticastSocket
NetPermission
PasswordAuthentication
ServerSocket
Socket
SocketImpl
SocketPermission
URL
URLClassLoader
URLConnection
URLEncoder
URLStreamHandler
et les interfaces
ContentHandlerFactory
FileNameMap
92
SocketImplFactory
URLStreamHandlerFactory
7.6.Adressage IP
un hte sur le rseau peut tre nomm soit par son adresse internet soit son nom DNS;
leur manipulation se fait par la classe java.net.InetAddress.
public final class InetAddress extends Object implements Serializable {
public boolean isMulticastAddress()
public String getHostName()
public byte[] getAddress()
public String getHostAddress()
public int hashCode()
public boolean equals(Object obj)
public String toString()
public static InetAddress getByName(String host) throws UnknownHostException
public static InetAddress[] getAllByName(String host) throws
UnknownHostException
public static InetAddress getLocalHost() throws UnknownHostException
}
Cette classe ne possde pas de constructeur. En gnral, les instances de InetAddress
s'obtiennent comme rsultat des mthodes static: getByName, getAllByName et
getLocalHost.
public static InetAddress getByName (String host) throws UnknownHostException
Retourne un objet de la classe InetAddress codant l'adresse IP d'un hte. L'argument
host est le nom DNS de l'hte ou son adresse IP.
public static InetAddress[] getAllByName (String host) throws UnknownHostException
Retourne un tableau d'objets de la classe InetAddress codant toutes les adresses IP d'un
hte. L'argument host est le nom DNS de l'hte ou son adresse IP.
public static InetAddress getLocalHost () throws UnknownHostException
Retourne un objet de la classe InetAddress codant l'adresse IP du hte local.
public String getHostName ()
Retourne une chane de caractres contenant le nom d'hte de l'objet InetAddress ou son
adresse IP (si le nom n'existe pas).
public byte[] getAddress ()
Retourne un tableau d'octet contenant les 4 octets de l'adresse IP de l'objet InetAddress.
93
public String getHostAddress ()
Retourne une chane de caractres contenant les 4 octets de l'adresse IP de l'objet
InetAddress; cette chane est de la forme "%d.%d.%d.%d".
7.7.Les URLs
Comme nous l'avons dj dit, une URL dsigne une ressource dans une rseau sous le
format suivant:
protocole://nom_hote[:port]/chemin/nom_fichier#section
En Java , l'URL n'est pas reprsent par une chane de caractres mais par une instance
de la classe java.net.URL.
public final class URL extends Object implements Serializable, Comparable {
public URL(String protocol, String host, int port, String file) throws
MalformedURLException
public URL(String protocol, String host, String file) throws
MalformedURLException
public URL(String spec) throws MalformedURLException
public URL(URL context, String spec) throws MalformedURLException
protected void set(String protocol, String host, int port, String file, String ref)
public int getPort()
public String getProtocol()
public String getHost()
public String getFile()
public String getRef()
public boolean equals(Object obj)
public int hashCode()
public int compareTo(Object url)
public boolean sameFile(URL other)
public String toString()
public String toExternalForm()
public URLConnection openConnection() throws IOException
public final InputStream openStream() throws IOException
public final Object getContent() throws IOException
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
}
La classe URL dispose de quatre constructeurs:
94
public URL (String prot, String h, int p, String f) throws MalformedURLException
Cre une instance de URL partir du protocole prot, de l'hte h, du port p et du fichier f.
Exemple : URL url = new URL("http", "pages.univ-nc.nc", 80, "eleves/index.html");
public URL (String protocol, String host, String file) throws
MalformedURLException
Cre une instance de URL partir du protocole prot, de l'hte h et du fichier f. Le port
choisi est le port par dfaut du protocole spcifi.
Exemple :URL url = new URL("http", "www.univ-nc.nc", "eleves/index.html");
public URL (String spec) throws MalformedURLException
Cre une instance de URL partir de sa reprsentation textuelle.
Exemple : URL url = new URL("http://www.univ-nc.nc/eleves/index.html");
public URL (URL context, String spec) throws MalformedURLException
Exemple :
URL gbm = new URL("http://www.univ-nc.nc");
URL eleves = new URL(gbm, "eleves/index.html");
Tous ces constructeurs peuvent lever une exception MalformedURLException lorsque le
protocole spcifi est inconnu. Une instance de URL est une sorte de constante puisque la
classe URL ne fournit aucune mthode pour modifier le protocole ou l'hte, etc.
Par contre, il est possible de consulter les attributs d'une URL. Les mthodes getPort,
getProtocol, getHost, getFile et getRef permettent de rcuprer le port, le protocole, l'hte,
le fichier et la section du fichier.
Pour illustrer tout ceci, voici un exemple provenant du tutorial de JDK:
import java.net.*;
import java.io.*;
public class ParseURL {
public static void main(String[] args) throws Exception {
URL aURL = new
URL("http://java.sun.com:80/docs/books/tutorial/intro.html#DOWNLOADING");
System.out.println("protocol = " + aURL.getProtocol());
System.out.println("host = " + aURL.getHost());
System.out.println("filename = " + aURL.getFile());
System.out.println("port = " + aURL.getPort());
System.out.println("ref = " + aURL.getRef());
}
95
}
et voici le rsultat de l'excution de ce programme:
protocol = http
host = java.sun.com
filename = /docs/books/tutorial/intro.html
port = 80
ref = DOWNLOADING
Pour rcuprer des donnes partir d'une URL, la classe URL fournit les mthodes
openConnection, openStream et getContent:
public URLConnection openConnection () throws IOException
Retourne une instance de la classe URLConection qui reprsente une connexion vers
vers l'objet dsign par l'url.
public final Object getContent () throws IOException
Retourne le contenu de l'url. C'est un raccourci pour openConnection().getContent()
public final InputStream openStream () throws IOException
Cette mthode tablit la communication entre le client et le serveur en ouvrant un
InputStream . Equivalent openConnection().openStream().
7.8.Les sockets
TCP/IP offre, en particulier, une interface dite sockets pour l'criture d'applications
communicantes. Les sockets a t introduit avec le systme d'exploitation UNIX de
Berkeley. L'ide des sockets est de faire en sorte que deux programmes sur des htes
diffrents puissent communiquer l'un avec l'autre sans se soucier des dtails de bas niveau
de la communication rseau.
Les primitives TCP pour les sockets permettent :
l'attente passive de connexions TCP inities par des applications distantes ;
l'initiation de connexions "actives" vers des applications distantes en attente
passive ;
l'acceptation ou le refus d'une connexion initie par une application distante ;
l'envoi et la rception de donnes sur une connexion tablie ;
la terminaison brutale ou ordonne d'une connexion tablie ;
le test d'une connexion.
Les sockets ne sont pas des objets spcifiquement rseaux, et encore moins
spcifiquement TCP/IP. Ce sont des objets gnriques qui doivent tre paramtrs lors de
leur cration selon l'utilisation prvue :
socket pour communication inter-processus classique
96
socket pour communication rseau en mode datagramme
socket pour communication rseau en mode connect
Dans la communication par sockets, il existe toujours une machine qui joue le rle du
serveur et l'autre (ou les autres) qui joue le rle de client.
Le serveur est une application qui tourne sur un hte et qui est l'coute des requtes
d'un ou de plusieurs clients sur un port particulier.
Le client est une application qui tourne sur un hte (pas forcment diffrent de celui sur
lequel tourne le serveur). Il doit connatre l'hte et le port sur lequel le serveur est
l'coute; le client tente alors une connexion au serveur sur l'hte et le port appropri.
Lorsque le serveur est conu pour communiquer avec plusieurs clients,
il connecte le client sur un nouveau numro de port
il se remet en attente de connexion sur le port original
Le client et le serveur peuvent alors communiquer l'un avec l'autre en crivant et en
lisant sur les sockets.
Les programmes serveurs doivent toujours tre actifs lorsque des clients initient une
connexion. Il existe deux faons d'assurer que ces serveurs soient activs :
lancement "manuel" des programmes serveurs,
utilisation du "super serveur INETD".
7.8.1.Activation "manuelle"
Le lancement manuel signifie que le programme serveur s'excute en permanence,
mme s'il n'est pas appel par des programmes clients. Compte tenu du grand nombre de
services rseaux disponibles sur une machine donne, de nombreux processus, oisifs en
attente mais consommant du temps CPU et des ressources, existent sur le systme. Cette
solution est peu recommande.
7.8.2.Utilisation de INETD sous UNIX
La deuxime solution est l'utilisation d'un serveur particulier, le dmon inetd, qui ralise
les attentes pour le compte d'autres programmes serveurs. De plus, l'utilisation du rseau
par un dmon lanc par inetd est cache : le programmeur utilise les descripteurs de
fichiers correspondant l'entre et la sortie standard du programme. La redirection de
ces deux descripteurs vers un socket est ralise de faon implicite et systmatique par le
processus inetd lui-mme.
1. Le fichier /etc/inetd.conf
Le dmon inetd, lors de son activation, consulte un fichier de configuration dcrivant les
services assurer sur le systme. Le fichier s'appelle /etc/inetd.conf, et contient un
ensemble de lignes au format suivant :
service stream tcp nowait root /usr/etc/progd progd
Une telle ligne signifie que service est implant sur cette machine, que les sockets utiliss
97
sont de type stream, que le protocole utilis est tcp, que le programme activer lors d'une
demande de service est /usr/etc/progd, que le nom donner au programme sera progd,
que le programme doit s'excuter avec comme propritaire root.
Le paramtre nowait indique que plusieurs instances de ce programme peuvent tre
actives sans attendre la terminaison des instances prcdentes.
2. Le fichier /etc/services
Les ports utiliser pour les sockets (ici les sockets TCP) sont dfinis dans un fichier
particulier, /etc/services, qui contiendra la ligne suivante :
service 78/tcp alias_service
Cette ligne indique que pour le service dfini dans le fichier inetd.conf, il faut utiliser le
port 78 du protocole tcp. Le reste de la ligne est un alias possible pour le nom du service.
Une fois ces informations rcupres, le serveur inetd va crer un socket, lui associer le
numro de port, et se mettre en attente d'une indication d'tablissement de connexion ce
port. Comme de nombreux services existent, le super serveur inetd cre de nombreux
sockets, assigne les numros de port adquats, se met en attente, etc..
3. Cas de services UDP
Dans le cas de service utilisant udp, le fichier inetd.conf contient des informations
lgrement diffrentes :
service dgram udp wait root /usr/etc/progd progd
Le paramtre dgram identifie un socket de type datagramme, udp indique que le
protocole utilis est UDP, wait indique qu'il faut attendre la terminaison d'une instance du
service avant de pouvoir en lancer la suivante. Notons que si les programmes serveurs sont
conus pour s'excuter en parallle (voir chapitre 5), on peut trouver la ligne suivante dans
le fichier /etc/inetd.conf :
service dgram udp nowait root /usr/etc/progd progd
Dans les deux cas, on devra trouver la ligne correspondante dans le fichier /etc/services :
service 78/udp alias_service
Connexion TCP et sockets
Java fournit deux classes pour la gestion des sockets:
la classe Socket qui permet d'initialiser la connexion avec un serveur
la classe ServerSocket qui permet de crer un serveur l'coute des connexions
venir.
Le client TCP
public class Socket {
protected Socket()
protected Socket(SocketImpl impl) throws SocketException
public Socket(String host, int port) throws UnknownHostException, IOException
98
public Socket(InetAddress address, int port) throws IOException
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws
IOException
public Socket(String host, int port, boolean stream) throws IOException
public Socket(InetAddress host, int port, boolean stream) throws IOException
public InetAddress getInetAddress()
public InetAddress getLocalAddress()
public int getPort()
public int getLocalPort()
public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException
public void setTcpNoDelay(boolean on) throws SocketException
public boolean getTcpNoDelay() throws SocketException
public void setSoLinger(boolean on, int val) throws SocketException
public int getSoLinger() throws SocketException
public void setSoTimeout(int timeout) throws SocketException
public int getSoTimeout() throws SocketException
public void close() throws IOException
public String toString()
public static void setSocketImplFactory(SocketImplFactory fac) throws IOException
}
Une application cliente doit ouvrir une connexion en crant un socket.
try {
socket sock = new Socket("www.univ-nc.nc", 2000);
}
catch (UnknoxnHostException e) {
System.out.println("Hte inconnu");
System.exit(-1); }
catch (IOException e) {
System.out.println("Erreur lors de connexion");
System.exit(-1);}
La connexion tablie, les canaux d'entre/sortie s'obtiennent grce aux mthode
getInputStream et getOutputStream.
Pour tester le client, mous allons utiliser une application serveur qui existe sur tous les
systmes UNIX et qui est l'coute du port 7: il s'agit du serveur echo qui se contente de
renvoyer au client la chane que ce dernier lui envoie.
import java.io.*;
99
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception, NumberFormatException {
Socket serveur = new Socket("localhost", Integer.parseInt(args[0]));
PrintWriter Sout = new PrintWriter(serveur.getOutputStream());
BufferedReader Sin = new BufferedReader(new InputStreamReader(serveur.getInputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String jEnvoie, jeReois;
do {
jEnvoie = in.readLine();
Sout.println(jEnvoie);
Sout.flush();
jeReois = Sin.readLine();
System.out.println(jeReois);
while (! jEnvoie.equals("fin"));
Sin.close();
Sout.close();
serveur.close();
}
}
Le serveur TCP
public class ServerSocket {
public ServerSocket(int port) throws IOException
public ServerSocket(int port, int backlog) throws IOException
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
public InetAddress getInetAddress()
public int getLocalPort()
public Socket accept() throws IOException
protected final void implAccept(Socket s) throws IOException
public void close() throws IOException
public void setSoTimeout(int timeout) throws SocketException
public int getSoTimeout() throws IOException
public String toString()
public static void setSocketFactory(SocketImplFactory fac) throws IOException
}
Une application serveur doit crer un instance ServerSocket:
try {
100
ServerSocket sock = new ServerSocket(2000);
}
catch (IOException e) {
System.out.println("Erreur de cration du serveur sur le port 2000");
System.exit(-1);
}
Une fois le serveur cre, il va se mettre en attente d'une connexion cliente:
Socket sockClient;
try {
sockClient= serverSocket.accept();
}
catch (IOException e) {
System.out.println("Echec de la mise en attente sur le port 2000");
System.exit(-1);
}
La mthode accept permet au serveur d'tre l'coute du port 2000 et d'attendre une
future connexion cliente. Lorsqu'une telle connexion s'tablit, la variable sockClient
permet de rcuprer le canal de communication tablit avec le client grce aux mthodes
getInputStream et getOutputStream.
Pour illustrer le fonctionnement du serveur, programmons le fameux serveur echo.
import java.io.*;
import java.net.*;
public class TestEcho {
public static void main(String[] args) throws Exception {
ServerSocket serveur = new ServerSocket(2000);
while (true) {
Socket client = serveur.accept();
PrintWriter Cout = new PrintWriter(client.getOutputStream());
BufferedReader Cin = new BufferedReader(new
InputStreamReader(client.getInputStream()));
String jeReois;
do {
jeReois = Cin.readLine();
Cout.println("Vous avez dit " + jeReois);
Cout.flush();
101
} while (! jeReois.equals("fin"));
Cin.close();
Cout.close();
client.close();
}
}
}
Conclusion
On a pass dans ce chapitre, trs rapidement, les quelques notions ncessaires pour la
programmation rseau.
Un accent particulier a t mis sur les sockets et les applications client/serveur.
102

Vous aimerez peut-être aussi