Vous êtes sur la page 1sur 69

Initiation la programmation oriente-objet

avec le langage Java


Ple Informatique -

cours Fauriel
Saint-tienne Cedex

Gauthier Picard
gauthier.picard@emse.fr
Institut Henri Fayol, ENSM.SE
Laurent Vercouter
laurent.vercouter@insa-rouen.fr
LITIS, INSA Rouen

Table des matires

Introduction au langage Java


. Environnement Java . . . . . . .
..
Compilation . . . . . .
..
Interprtation . . . . . .
. Programmation oriente-objet
..
Classe . . . . . . . . . .
..
Objet . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

Syntaxe du langage
. Types de donnes . . . . . . . . . . . . .
..
Types primitifs . . . . . . . . . .
..
Tableaux et matrices . . . . . . .
..
Chanes de caractres . . . . . .
. Oprateurs . . . . . . . . . . . . . . . . .
. Structures de contrle . . . . . . . . . . .
..
Instructions conditionnelles . .
.. Instructions itratives . . . . . .
.. Instructions break et continue

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

lments de programmation Java


. Premiers pas . . . . . . . . . . . . . . . .
..
Classe HelloWorld . . . . . . . .
..
Packages . . . . . . . . . . . . . .
. Variables et mthodes . . . . . . . . . . .
..
Visibilit des champs . . . . . .
.. Variables et mthodes de classe

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.

Hritage
. Principe de lhritage . . . . . .
..
Rednition . . . . . . .
.. Polymorphisme . . . .
. Interfaces . . . . . . . . . . . . .
. Classes abstraites . . . . . . . . .
. Classes et mthodes gnriques

.
.
.
.
.
.

.
.
.
.
.
.

Gestion des exceptions


. Dclaration . . . . . . . . . . . . .
. Interception et traitement . . . .
. Classes dexception . . . . . . . .
. Classication des erreurs en Java

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

iii

Table des matires

Gestion des entres/sorties simples


. Flux dentre . . . . . . . . . . . . . . . . . . . .
..
Lecture des entres clavier . . . . . . .
.. Lecture partir dun chier . . . . . . .
.. Lecture dobjets enregistrs . . . . . . .
. Flux de sortie . . . . . . . . . . . . . . . . . . . .
.. Ecriture sur la sortie standard cran
.. Ecriture dans un chier . . . . . . . . .
.. Ecriture dobjets . . . . . . . . . . . . .
A Applications graphiques (package swing)
A. Le schma Modle-Vue-Contrleur
A. Composants graphiques . . . . . . .
A.. Composants . . . . . . . . . .
A.. Containers . . . . . . . . . .
A.. Exemple dinterface . . . . .
A. Contrleurs dvnements . . . . . .
A.. Evnements . . . . . . . . . .
A.. Interface Listener . . . . . . .
A.. Exemple de contrleur . . .

.
.
.
.
.
.
.
.
.

B Diagramme de classes UML


B. Reprsentation des classes et interfaces
B.. Les classes . . . . . . . . . . . .
B.. Les membres de classe . . . . .
B.. Les classes abstraites . . . . . .
B.. Les interfaces . . . . . . . . . .
B. Les relations . . . . . . . . . . . . . . .
B.. Lhritage . . . . . . . . . . . .
B.. La ralisation . . . . . . . . . .
B. Les associations . . . . . . . . . . . . .
B.. Direction des associations . .
B.. Agrgation et composition . .
B. Correspondance UML-Java . . . . . .
B.. Classes et membres . . . . . .
B.. Classes abstraites . . . . . . . .
B.. Interfaces . . . . . . . . . . . .
B.. Hritage . . . . . . . . . . . . .
B.. Ralisation . . . . . . . . . . .
B.. Associations . . . . . . . . . . .

iv

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Table des matires

La plupart des programmes donns en exemple dans ce cours sont tlchargeables lURL :
http://www.emse.fr/~picard/cours/1A/java

Table des matires

vi

Chapitre 1
Introduction au langage Java
Le langage Java est un langage gnraliste de programmation synthtisant les principaux langages existants lors de sa cration en par Sun Microsystems. Il permet une programmation
oriente-objet ( linstar de SmallTalk et, dans une moindre mesure, C++), modulaire (langage
ADA) et reprend une syntaxe trs proche de celle du langage C.
Outre son orientation objet, le langage Java a lavantage dtre modulaire (on peut crire des
portions de code gnriques, c--d utilisables par plusieurs applications), rigoureux (la plupart
des erreurs se produisent la compilation et non lexcution) et portable (un mme programme
compil peut sexcuter sur dirents environnements). En contre-partie, les applications Java ont
le dfaut dtre plus lentes lexcution que des applications programmes en C par exemple.

1.1 Environnement Java


Java est un langage interprt, ce qui signie quun programme compil nest pas directement
excutable par le systme dexploitation mais il doit tre interprt par un autre programme, quon
appelle interprteur. La gure . illustre ce fonctionnement.

F . Interprtation du langage
Un programmeur Java crit son code source, sous la forme de classes, dans des chiers dont
lextension est .java. Ce code source est alors compil par le compilateur javac en un langage
appel bytecode et enregistre le rsultat dans un chier dont lextension est .class. Le bytecode
1

Chapitre 1. Introduction au langage Java

ainsi obtenu nest pas directement utilisable. Il doit tre interprt par la machine virtuelle de Java
qui transforme alors le code compil en code machine comprhensible par le systme dexploitation. Cest la raison pour laquelle Java est un langage portable : le bytecode reste le mme quelque
soit lenvironnement dexcution.
En , Sun Microsystems est rachet par Oracle Corporation qui fournit dornavant les
outils de dveloppement Java SE (Standard Edition) contenus dans le Java Development Kit (JDK).
Au moment o est crit ce livret, la dernire version stable est le JDK ..

1.1.1

Compilation

La compilation seectue par la commande javac suivie dun ou plusieurs nom de chiers
contenant le code source de classes Java. Par exemple, javac MyProg.java compile la classe MyProg dont le code source est situ dans le chier MyProg.java. La compilation ncessite souvent la
prcision de certains paramtres pour seectuer correctement, notamment lorsque le code source
fait rfrence certaines classes situes dans dautres rpertoires que celui du code compil. Il faut
alors ajouter loption -classpath suivie des rpertoires (spars par un ; sous Windows et : sous
Unix) des classes rfrences. Par exemple :
javac -classpath /prog/exos1:/cours MyProg.java
compilera le chier MyProg.java si celui-ci fait rfrence dautres classes situes dans les rpertoires /prog/exos1 et /cours. Le rsultat de cette compilation est un chier nomm MyProg.class contenant le bytecode correspondant au source compil. Ce chier est cr par dfaut

dans le rpertoire o la compilation sest produite. Il est cependant fortement souhaitable de ne


pas mlanger les chiers contenant le code source et ceux contenant le bytecode. Un rpertoire de
destination o sera cr le chier MyProg.class peut tre prcis par loption -d, par exemple :
javac -d /prog/exos1 -classpath /cours MyProg.java

1.1.2

Interprtation

Le bytecode obtenu par compilation ne peut tre excut qu laide de linterprteur. Lexcution seectue par la commande java suivie du nom de la classe excuter (sans lextension
.class). Comme lors de la compilation, il se peut que des classes dautres rpertoires soient ncessaires. Il faut alors utiliser loption -classpath comme dans lexemple qui suit :
java -classpath /prog/exos1:/cours MyProg

1.2

Programmation oriente-objet

Chaque langage de programmation appartient une famille de langages dnissant une approche ou une mthodologie gnrale de programmation. Par exemple, le langage C est un langage
de programmation procdurale car il suppose que le programmeur sintresse en priorit aux traitements que son programme devra eectuer. Un programmeur C commencera par identier ces
traitements pour crire les fonctions qui les ralisent sur des donnes prises comme paramtres
dentre.
La programmation oriente-objet (introduite par le langage SmallTalk) propose une mthodologie centre sur les donnes. Le programmeur Java va dabord identier un ensemble dobjets,
tel que chaque objet reprsente un lment qui doit tre utilis ou manipul par le programme,
sous la forme densembles de donnes. Ce nest que dans un deuxime temps, que le programmeur va crire les traitements, en associant chaque traitement un objet donn. Un objet peut
2

1.2. Programmation oriente-objet

tre vu comme une entit regroupant un ensemble de donnes et de mthodes (lquivalent dune
fonction en C) de traitement.

1.2.1

Classe

Un objet est une variable (presque) comme les autres. Il faut notamment quil soit dclar
avec son type. Le type dun objet est un type complexe (par opposition aux types primitifs entier,
caractre, ) quon appelle une classe.
Une classe regroupe un ensemble de donnes (qui peuvent tre des variables primitives ou des
objets) et un ensemble de mthodes de traitement de ces donnes et/ou de donnes extrieures
la classe. On parle dencapsulation pour dsigner le regroupement de donnes dans une classe.
Par exemple, une classe Rectangle utilise pour instancier des objets reprsentant des rectangles, encapsule entiers : la longueur et la largeur du rectangle ainsi que la position en abscisse
et en ordonne de lorigine du rectangle (par exemple, le coin en haut gauche). On peut alors
imaginer que la classe Rectangle implmente une mthode permettant de dplacer le rectangle qui
ncessite en entre deux entiers indiquant la distance de dplacement en abscisse et en ordonne.
Laccs aux positions de lorigine du rectangle se fait directement (i.e. sans passage de paramtre)
lorsque les donnes sont encapsules dans la classe o est dnie la mthode. Un exemple, crit
en Java, de la classe Rectangle est donn ci-dessous :
class Rectangle {
int
int
int
int

longueur ;
largeur ;
origine_x ;
origine_y ;

void deplace(int x, int y) {


this.origine_x = this.origine_x + x ;
this.origine_y = this.origine_y + y ;
}
int surface() {
return this.longueur * this.largeur ;
}

Pour crire un programme avec un langage orient-objet, le programmeur crit uniquement


des classes correspondant aux objets de son systme. Les traitements eectuer sont programms
dans les mthodes de ces classes qui peuvent faire appel des mthodes dautres classes. En gnral, on dnit une classe, dite excutable, dont une mthode peut tre appele pour excuter le
programme.
Encapsulation

Lors de la conception dun programme orient-objet, le programmeur doit identier les objets
et les donnes appartenant chaque objet mais aussi des droits daccs quont les autres objets sur
ces donnes. Lencapsulation de donnes dans un objet permet de cacher ou non leur existence
aux autres objets du programme. Une donne peut tre dclare en accs :
public : les autres objets peuvent accder la valeur de cette donne ainsi que la modier ;
3

Chapitre 1. Introduction au langage Java

priv : les autres objets nont pas le droit daccder directement la valeur de cette donne
(ni de la modier). En revanche, ils peuvent le faire indirectement par des mthodes de
lobjet concern (si celles-ci existent en accs public).
Les dirents droits daccs utilisables en Java sont dtaills dans la section ...
Mthode constructeur

Chaque classe doit dnir une ou plusieurs mthodes particulires appeles des constructeurs.
Un constructeur est une mthode invoque lors de la cration dun objet. Cette mthode, qui peut
tre vide, eectue les oprations ncessaires linitialisation dun objet. Chaque constructeur doit
avoir le mme nom que la classe o il est dni et na aucune valeur de retour (cest lobjet cr qui
est renvoy). Dans lexemple prcdent de la classe rectangle, le constructeur initialise la valeur
des donnes encapsules :
class Rectangle {
...
Rectangle(int lon, int lar) {
this.longueur = lon ;
this.largeur = lar ;
this.origine_x = 0 ;
this.origine_y = 0 ;
}
...
}

Plusieurs constructeurs peuvent tre dnis sils acceptent des paramtres dentre dirents.

1.2.2

Objet

Instanciation

Un objet est une instance (anglicisme signiant cas ou exemple ) dune classe et est rfrenc par une variable ayant un tat (ou valeur). Pour crer un objet, il est ncessaire de dclarer
une variable dont le type est la classe instancier, puis de faire appel un constructeur de cette
classe. Lexemple ci-dessous illustre la cration dun objet de classe Cercle en Java :
Cercle mon_rond ;
mon_rond = new Cercle();

Lusage de parenthses linitialisation du vecteur, montre quune mthode est appele pour
linstanciation. Cette mthode est un constructeur de la classe Cercle. Si le constructeur appel
ncessite des paramtres dentre, ceux-ci doivent tre prciss entre ces parenthses (comme lors
dun appel classique de mthode). Linstanciation dun objet de la classe Rectangle faisant appel
au constructeur donn en exemple ci-dessous pourra scrire :
Rectangle mon_rectangle = new Rectangle(15,5);

* Remarque importante : en Java, la notion de pointeur est transparente pour le programmeur.


Il faut nanmoins savoir que toute variable dsignant un objet est un pointeur. Il sensuit alors
que le passage dobjets comme paramtres dune mthode est toujours un passage par rfrence.
A linverse, le passage de variables primitives comme paramtres est toujours un passage par
valeur.
4

1.2. Programmation oriente-objet

Accs aux variables et aux mthodes

Pour accder une variable associe un objet, il faut prciser lobjet qui la contient. Le symbole . sert sparer lidenticateur de lobjet de lidenticateur de la variable. Une copie de la
longueur dun rectangle dans un entier temp scrit :
int temp = mon_rectangle.longueur ;

La mme syntaxe est utilise pour appeler une mthode dun objet. Par exemple :
mon_rectangle.deplace(10,-3);

Pour quun tel appel soit possible, il faut que trois conditions soient remplies :
. La variable ou la mthode appele existe !
. Une variable dsignant lobjet vis existe et soit instancie.
. Lobjet, au sein duquel est fait cet appel, ait le droit daccder la mthode ou la variable
(cf. section ..).
Pour rfrencer lobjet courant (celui dans lequel se situe la ligne de code), le langage Java
fournit le mot-cl this. Celui-ci na pas besoin dtre instanci et sutilise comme une variable
dsignant lobjet courant. Le mot-cl this est galement utilis pour faire appel un constructeur
de lobjet courant. Ces deux utilisations possibles de this sont illustres dans lexemple suivant :
class Carre {
int cote ;
int origine_x ;
int origine_y ;

Carre(int cote, int x, int y) {


this.cote = cote ;
this.origine_x = x ;
this.origine_y = y ;
}
Carre(int cote) {
this(cote, 0, 0);
}
}

Chapitre 1. Introduction au langage Java

Chapitre 2
Syntaxe du langage
Le langage C a servi de base pour la syntaxe du langage Java :
le caractre de n dune instruction est ;
a = c + c;

les commentaires (non traits par le compilateur) se situent entre les symboles /* et */
ou commencent par le symbole // en se terminant la n de la ligne
int a ; // ce commentaire tient sur une ligne
int b ;

ou
/*Ce commentaire ncessite
2 lignes*/
int a ;

les identicateurs de variables ou de mthodes acceptent les caractres {a..z}, {A..Z}, , _


ainsi que les caractres {..} sils ne sont pas le premier caractre de lidenticateur. Il faut
videmment que lidenticateur ne soit pas un mot rserv du langage (comme int ou
for).
Ex : mon_entier et ok4all sont des identicateurs valides mais
mon-entier et 4all ne sont pas valides pour des identicateurs.

2.1 Types de donnes


2.1.1

Types primitifs

Le tableau . liste lensemble des types primitifs de donnes de Java.


En plus de ces types primitifs, le terme void est utilis pour spcier le retour vide ou une
absence de paramtres dune mthode. On peut remarquer que chaque type primitif possde une
classe qui encapsule un attribut du type primitif. Par exemple, la classe Integer encapsule un
attribut de type int et permet ainsi deectuer des oprations de traitement et des manipulations
qui seraient impossibles sur une simple variable de type int.
A linverse du langage C, Java est un langage trs rigoureux sur le typage des donnes. Il est interdit daecter une variable la valeur dune variable dun type dirent si cette seconde variable
nest pas explicitement transforme. Par exemple :
. exception faite des types associs par une relation dhritage, cf. section
7

Chapitre 2. Syntaxe du langage

T . Type primitifs de donnes en Java


Type

Classe q.

boolean
byte
char
short
int
long
float

Boolean
Byte
Character
Short
Integer
Long
Float

Valeurs
true ou false
entier sign
caractre
entier sign
entier sign
entier sign
rel sign

double

Double

rel sign

Porte
N/A
{-128..128}
{/u../uFFFF}
{-32768..32767}
{-2147483648..2147483647}
{-231 ..231 1}
{-3, 402823438 ..3, 402823438 }
{-1, 4023984645 ..1, 4023984645 }
{-1, 797693134308 ..1, 797693134308 }
{-4, 94065645324 ..4, 94065645324 }

Dfaut
false

/u
0
0
0
0.0

0.0

int a ;
double b = 5.0 ;
a = b;

est interdit et doit tre crit de la manire suivante :


int a ;
double b = 5.0 ;
a = (int)b ;

2.1.2

Tableaux et matrices

Une variable est dclare comme un tableau ds lors que des crochets sont prsents soit aprs
son type, soit aprs son identicateur. Les deux syntaxes suivantes sont acceptes pour dclarer
un tableau dentiers (mme si la premire, non autorise en C, est plus intuitive) :
int[] mon_tableau ;
int mon_tableau2[];

Un tableau a toujours une taille xe qui doit tre prcise avant laectation de valeurs ses
indices, de la manire suivante :
int[] mon_tableau = new int[20];

De plus, la taille de ce tableau est disponible dans une variable length appartenant au tableau
et accessible par mon_tableau.length. On peut galement crer des matrices ou des tableaux
plusieurs dimensions en multipliant les crochets (ex : int[][] ma_matrice;). linstar du C,
on accde aux lments dun tableau en prcisant un indice entre crochets (mon_tableau[3] est
le quatrime entier du tableau) et un tableau de taille n stocke ses lments des indices allant de
O n-1.
. pour utiliser des ensembles taille variable, la classe java.util.Vector est trs utile
8

2.2. Oprateurs

2.1.3

Chanes de caractres

Les chanes de caractres ne sont pas considres en Java comme un type primitif ou comme un
tableau. On utilise une classe particulire, nomme String, fournie dans le package java.lang.
Les variables de type String ont les caractristiques suivantes :
leur valeur ne peut pas tre modie
on peut utiliser loprateur + pour concatner deux chanes de caractres :
String s1 =
String s2 =
String s3 =
//Aprs ces

hello ;
world ;
s1 + + s2 ;
instructions s3 vaut hello world

linitialisation dune chane de caractres scrit :


String s = new String(); //pour une chaine vide
String s2 = new String(hello world);
// pour une chane de valeur hello world

un ensemble de mthodes de la classe java.lang.String permettent deectuer des oprations ou des tests sur une chane de caractres (voir la documentaion de la classe String).

2.2 Oprateurs
Une liste des oprateurs disponibles en Java est prsente par ordre de priorit dcroissante
dans le tableau ..

2.3 Structures de contrle


Les structures de contrle permettent dexcuter un bloc dinstructions soit plusieurs fois
(instructions itratives) soit selon la valeur dune expression (instructions conditionnelles ou de
choix multiple). Dans tous ces cas, un bloc dinstruction est
soit une instruction unique ;
soit une suite dinstructions commenant par une accolade ouvrante { et se terminant
par une accolade fermante }.

2.3.1

Instructions conditionnelles

Syntaxe :
if (<condition>) <bloc1> [else <bloc2>]

ou
<condition>?<instruction1>:<instruction2>
<condition> doit renvoyer une valeur boolenne. Si celle-ci est vraie cest <bloc1> (resp.
<instruction1>) qui est excut sinon <bloc2> (resp. <instruction2>) est excut. La partie
else <bloc2> est facultative.

Exemple :
9

Chapitre 2. Syntaxe du langage

T . Oprateurs Java
Pr.

Oprateur

Syntaxe

Rsultat

Signication

++

+
!
(type)
*
/
%
+
+
<<

++<ari>
<ari>++
<ari>
<ari>
+<ari>
-<ari>
!<boo>
(type)<val>
<ari>*<ari>
<ari>/<ari>
<ari>%<ari>
<ari>+<ari>
<ari>-<ari>
<str>+<str>
<ent> << <ent>

<ari>
<ari>
<ari>
<ari>
<ari>
<ari>
<boo>
<val>
<ari>
<ari>
<ari>
<ari>
<ari>
<str>
<ent>

>>

<ent> >>

<ent>

<
<=
>
>=
instanceof
==
!=
&

&&
||
?:
=

<ari> < <ari>


<ari> <= <ari>
<ari> > <ari>
<ari> >= <ari>
<val>instanceof<cla>
<val>==<val>
<val>!=<val>
<ent>&<ent>
<boo>&<boo>
<ent><ent>
<boo><boo>
<ent>|<ent>
<boo>|<boo>
<boo>&&<boo>
<boo>||<boo>
<boo>?<ins>:<ins>
<var>=<val>

pr incrmentation
post incrmentation
pr dcrmentation
post dcrmentation
signe positif
signe ngatif
complment logique
changement de type
multiplication
division
reste de la division
addition
soustraction
concatnation
dcalage de bits
gauche
dcalage de bits
droite
infrieur
infrieur ou gal
suprieur
suprieur ou gal
test de type
gal
dirent de
ET bit bit
ET boolen
OU exclusif bit bit
OU exclusif boolen
OU bit bit
OU boolen
ET logique
OU logique
si...alors...sinon
assignation

<ent>

<boo>
<boo>
<boo>
<boo>
<boo>
<boo>
<boo>
<ent>
<boo>
<ent>
<boo>
<ent>
<boo>
<boo>
<boo>
<ins>
<val>

Lgende
<ari> valeur arithmtique
<boo> valeur boolenne
<cla> classe

<ent> valeur entire


<ins> instruction
<str> chane de caractres (String)

<val> valeur quelconque


<var> variable

if (a == b) {
a = 50 ;
b = 0;
} else {
a = a - 1;
}

2.3.2

Instructions itratives

Les instruction itratives permettent dexcuter plusieurs fois un bloc dinstructions, et ce,
jusqu ce quune condition donne soit fausse. Les trois types dinstruction itratives sont les
suivantes :
TantQue...Faire...

Lexcution de cette instruction suit les tapes suivantes :

. la condition (qui doit renvoyer une valeur boolenne) est value. Si celle-ci est vraie on
passe ltape , sinon on passe ltape ;
. le bloc est excut ;
10

2.3. Structures de contrle

. retour ltape ;
. la boucle est termine et le programme continue son excution en interprtant les instruction suivant le bloc.
Syntaxe :
while (<condition>) <bloc>

Exemple :
while (a != b) a++;

Faire...TantQue...

Lexcution de cette instruction suit les tapes suivantes :

. le bloc est excut ;


. la condition (qui doit renvoyer une valeur boolenne) est value. Si celle-ci est vraie on
retourne ltape , sinon on passe ltape ;
. la boucle est termine et le programme continue son excution en interprtant les instruction suivant le bloc.
Syntaxe :
do <bloc> while (<condition>);

Exemple :
do a++
while (a != b);

Cette boucle est constitue de trois parties : (i) une initialisation (la dclaration de
variables locales la boucle est autorise dans cette partie) ; (ii) une condition darrt ; (iii) un
ensemble dinstructions excuter aprs chaque itration (chacune de ces instructions est spare
par une virgule). Lexcution de cette instruction suit les tapes suivantes :

Pour...Faire

. les initialisations sont eectues ;


. la condition (qui doit renvoyer une valeur boolenne) est value. Si celle-ci est vraie on
passe ltape , sinon on passe ltape ;
. le bloc principal est excut ;
. les instructions excuter aprs chaque itration sont excutes ;
. retour ltape ;
. la boucle est termine et le programme continue son excution en interprtant les instructions suivant le bloc principal.
Syntaxe :
for (<init>;<condition>;<instr_post_itration>) <bloc>

Exemple :
for (int i = 0, j = 49 ; (i < 25) && (j >= 25); i++, j--)
if (tab[i] > tab[j]) {
int tampon = tab[j];

Question : que se passe-t-il si le break situ aprs le case c est omis ?


11

Chapitre 2. Syntaxe du langage

2.3.3

Instructions break et continue

Linstruction break est utilise pour sortir immdiatement dun bloc dinstructions (sans traiter les instructions restantes dans ce bloc). Dans le cas dune boucle on peut galement utiliser
linstruction continue avec la dirence suivante :
break : lexcution se poursuit aprs la boucle (comme si la condition darrt devenait vraie) ;
continue : lexcution du bloc est arrte mais pas celle de la boucle. Une nouvelle itration du
bloc commence si la condition darrt est toujours vraie.
Exemple :
for (int i = 0, j = 0 ; i < 100 ; i++) {
if (i > tab.length) {
break ;
}
if (tab[i] == null) {
continue ;
}
tab2[j] = tab[i];
j++;
}

12

Chapitre 3
lments de programmation Java
3.1 Premiers pas
Un programme crit en Java consiste en un ensemble de classes reprsentant les lments manipuls dans le programme et les traitements associs. Lexcution du programme commence par
lexcution dune classe qui doit implmenter une mthode particulire public static void
main(String[] args). Les classes implmentant cette mthode sont appelles classes excutables.

3.1.1

Classe HelloWorld

Une classe Java HelloWorld qui ache la chane de caractres Hello world scrit :
public class HelloWorld {
public static void main(String[] args) {
System.out.println(Hello world);
}
}

Lexcution (aprs compilation) de cette classe se fait de la manire suivante :


C:\>java HelloWorld
Hello world
C:\>

* Remarque : le tableau de chanes de caractres args qui est un paramtre dentre de la mthode main contient des valeurs prcises lexcution. Si la classe avait t excute par la ligne
de commande java HelloWorld 4 toto _, ce tableau contiendrait lments dont les valeurs
seraient respectivement 4, toto et _.
Dans ce premier programme trs simple, une seule classe est utilise. Cependant, la conception
dun programme orient-objet ncessite, pour des problmes plus complexes, de crer plusieurs
classes et la classe excutable ne sert souvent qu instancier les premiers objets. La classe excutable suivante cre un objet en instanciant la classe Rectangle (cf. section ..) et ache sa
surface :
13

Chapitre 3. lments de programmation Java

public class RectangleMain {


public static void main(String[] args) {
Rectangle rect = new Rectangle(5, 10);
System.out.println(La surface est + rect.surface());
}
}

* Remarque importante : il est obligatoire dimplmenter chaque classe publique dans un


chier spar et il est indispensable que ce chier ait le mme nom que celui de la classe. Dans
le cas prcdent, deux chiers ont ainsi t crs : RectangleMain.java et Rectangle.java.

3.1.2

Packages

Un grand nombre de classes, fournies par Java SE, implmentent des donnes et traitements
gnriques utilisables par un grand nombre dapplications. Ces classes forment lAPI (Application
Programmer Interface) du langage Java. Une documentation en ligne pour lAPI java est disponible
lURL :
http://docs.oracle.com/javase/7/docs/api/

Toutes ces classes sont organises en packages (ou bibliothques) ddis un thme prcis.
Parmi les packages les plus utiliss, on peut citer les suivants :
Package
java.awt
java.io
java.lang
java.util
javax.swing

Description
Classes graphiques et de gestion dinterfaces
Gestion des entres/sorties
Classes de base (import par dfaut)
Classes utilitaires
Autres classes graphiques

Pour accder une classe dun package donn, il faut pralablement importer cette classe ou
son package. Par exemple, la classe Date appartenant au package java.util qui implmente un
ensemble de mthodes de traitement sur une date peut tre importe de deux manires :
une seule classe du package est importe :
import java.util.Date ;

toutes les classes du package sont importes (mme les classes non utilises) :
import java.util.* ;

Le programme suivant utilise cette classe pour acher la date actuelle :


import java.util.Date ;
public class DateMain {
public static void main(String[] args) {
Date today = new Date();
System.out.println(Nous sommes le + today.toString());
}
}
14

3.2. Variables et mthodes

Il est possible de crer vos propres packages en prcisant, avant la dclaration dune classe, le
package auquel elle appartient. Pour assigner la classe prcdente un package, nomm fr.emse,
il faut modier le chier de cette classe comme suit :
package fr.emse ;
import java.util.Date ;
public class DateMain {
...
}

Enn, il faut que le chemin daccs du chier DateMain.java corresponde au nom de son
package. Celui-ci doit donc tre situ dans un rpertoire fr/emse/DateMain.java accessible
partir des chemins daccs dnis lors de la compilation ou de lexcution (voir section ..).

3.2 Variables et mthodes


3.2.1

Visibilit des champs

Dans les exemples prcdents, le mot-cl public apparat parfois au dbut dune dclaration
de classe ou de mthode sans quil ait t expliqu jusquici. Ce mot-cl autorise nimporte quel
objet utiliser la classe ou la mthode dclare comme publique. La porte de cette autorisation
dpend de llment laquelle elle sapplique (voir le tableau .).
T . Porte des autorisations
lment
Variable
Mthode
Classe

Autorisations
Lecture et criture
Appel de la mthode
Instanciation dobjets de cette classe et
accs aux variables et mthodes de classe

Le mode public nest, bien sr, pas le seul type daccs disponible en Java. Deux autres motcls peuvent tre utiliss en plus du type daccs par dfaut : protected et private. Le tableau .
rcapitule ces dirents types daccs (la notion de sous-classe est explique dans la section ).
T . Autorisations daccs

Dans la mme classe


Dans une classe du
mme package
Dans une sous-classe
dun autre package
Dans une classe quelconque dun autre package

private

Oui
Oui

dfaut
Oui
Oui

Oui

Oui

Non

Non

Oui

Non

Non

Non

public

protected

Oui
Oui

Oui
Non

15

Chapitre 3. lments de programmation Java

Si aucun mot-cl ne prcise le type daccs, celui par dfaut est appliqu. En gnral, il est
souhaitable que les types daccs soient limits et le type daccs public, qui est utilis systmatiquement par les programmeurs dbutants, ne doit tre utilis que sil est indispensable. Cette restriction permet dviter des erreurs lors daccs des mthodes ou de modications de variables
sans connatre totalement leur rle.

3.2.2

Variables et mthodes de classe

Dans certains cas, il est plus judicieux dattacher une variable ou une mthode une classe
plutt quaux objets instanciant cette classe. Par exemple, la classe java.lang.Integer possde
une variable MAX_VALUE qui reprsente la plus grande valeur qui peut tre aecte un entier.
Or, cette variable tant commune tous les entiers, elle nest pas duplique dans tous les objets
instanciant la classe Integer mais elle est associe directement la classe Integer. Une telle variable est appele variable de classe. De la mme manire, il existe des mthodes de classe qui
sont associes directement une classe. Pour dclarer une variable ou mthode de classe, on utilise le mot-cl static qui doit tre prcis avant le type de la variable ou le type de retour de la
mthode.
La classe java.lang.Math nous fournit un bon exemple de variable et de mthodes de classes.
public final class Math {
...
public static final double PI = 3.14159265358979323846 ;
...
public static double toRadians(double angdeg) {
return angdeg / 180.0 * PI ;
}
...
}

La classe Math fournit un ensemble doutils (variables et mthodes) trs utiles pour des programmes devant eectuer des opration mathmatiques complexes. Dans la portion de classe reproduite ci-dessus, on peut notamment y trouver une approximation de la valeur de et une mthode convertissant la mesure dun angle dune valeur en degrs en une valeur en radians. Dans
le cas de cette classe, il est tout a fait inutile de crer et dinstancier un objet partir de la classe
Math. En eet, la valeur de ou la conversion de degrs en radians ne vont pas varier suivant
lobjet auquel elles sont rattaches. Ce sont des variables et des mthodes de classe qui peuvent
tre invoques partir de toute autre classe (car elles sont dclares en accs public) de la manire
suivante :
public class MathMain {
public static void main(String[] args) {
System.out.println(pi = + Math.PI);
System.out.println(90 = + Math.toRadians(90));
}
}

Question : Dans les sections prcdentes, nous avons dj utilis une variable de classe et une
mthode de classe. Pouvez-vous trouver lesquelles ?
16

3.2. Variables et mthodes

Rponse :
la mthode main des classes excutables est une mthode de classe car elle est appele
directement partir dune classe ;
lors de lachage dune chane de caractres lcran par linstruction
System.out.println(), on fait appel la variable out de la classe java.lang.System
qui est un objet reprsentant la sortie standard (lcran) et sur laquelle on appelle la
mthode println permettant dacher une chane de caractres.

17

Chapitre 3. lments de programmation Java

18

Chapitre 4
Hritage
Dans certaines applications, les classes utilises ont en commun certaines variables, mthodes
de traitement ou mme des signatures de mthode. Avec un langage de programmation orientobjet, on peut dnir une classe dirent niveaux dabstraction permettant ainsi de factoriser
certains attributs communs plusieurs classes. Une classe gnrale dnit alors un ensemble dattributs qui sont partags par dautres classes, dont on dira quelles hritent de cette classe gnrale.
Par exemple, les classes Carre et Rectangle peuvent partager une mthode surface() renvoyant le rsultat du calcul de la surface de la gure. Plutt que dcrire deux fois cette mthode,
on peut dnir une relation dhritage entre les classes Carre et Rectangle. Dans ce cas, seule la
classe Rectangle contient le code de la mthode surface() mais celle-ci est galement utilisable
sur les objets de la classe Carre si elle hrite de Rectangle.

4.1 Principe de lhritage


Lide principale de lhritage est dorganiser les classes de manire hirarchique. La relation
dhritage est unidirectionnelle et, si une classe B hrite dune classe A, on dira que B est une sousclasse de A. Cette notion de sous-classe signie que la classe B est un cas particulier de la classe A
et donc que les objets instanciant la classe B instancient galement la classe A.
Prenons comme exemple des classes Carre, Rectangle et Cercle. La gure . propose une
organisation hirarchique de ces classes telle que Carre hrite de Rectangle qui hrite, ainsi que
Cercle, dune classe Forme.

Forme

Rectangle

Cercle

Carre
F . Exemple de relations dhritage
Pour le moment, nous considrerons la classe Forme comme vide (cest--dire sans aucune variable ni mthode) et nous nous intressons plus particulirement aux classes Rectangle et Carre.
19

Chapitre 4. Hritage

La classe Rectangle hritant dune classe vide, elle ne peut proter daucun de ses attributs et doit
dnir toutes ses variables et mthodes. Une relation dhritage se dnit en Java par le mot-cl
extends utilis comme dans lexemple suivant :
public class Rectangle extends Forme {
private int largeur ;
private int longueur ;
public Rectangle(int x, int y) {
this.largeur = x ;
this.longueur = y ;
}
public int getLargeur() {
return this.largeur ;
}
public int getLongueur() {
return this.longueur ;
}
public int surface() {
return this.longueur * this.largeur ;
}
public void affiche() {
System.out.println(rectangle + longueur + x + largeur);
}

En revanche, la classe Carre peut bncier de la classe Rectangle et ne ncessite pas la rcriture de ces mthodes si celles-ci conviennent la sous-classe. Toutes les mthodes et variables
de la classe Rectangle ne sont nanmoins pas accessibles dans la classe Carre. Pour quun attribut
puisse tre utilis dans une sous-classe, il faut que son type daccs soit public ou protected, ou,
si les deux classes sont situes dans le mme package, quil utilise le type daccs par dfaut. Dans
cet exemple, les variables longueur et largeur ne sont pas accessibles dans la class Carre qui doit
passer par les mthodes getLargeur() et getLongueur(), dclares comme publiques.

4.1.1

Redfinition

Lhritage intgral des attributs de la classe Rectangle pose deux problmes :


. il faut que chaque carr ait une longueur et une largeur gales ;
. la mthode affiche crit le mot rectangle en dbut de chane. Il serait souhaitable que
ce soit carr qui sache.
De plus, les constructeurs ne sont pas hrits par une sous-classe. Il faut donc crire un constructeur spcique pour Carre. Ceci nous permettra de rsoudre le premier problme en crivant un
constructeur qui ne prend quun paramtre qui sera aect la longueur et la largeur. Pour attribuer une valeur ces variables (qui sont prives), le constructeur de Carre doit faire appel au
20

4.1. Principe de lhritage

constructeur de Rectangle en utilisant le mot-cl super qui fait appel au constructeur de la classe
suprieure comme suit :
public Carre(int cote) {
super(cote,cote);
}

* Remarques :
Lappel au constructeur dune classe suprieure doit toujours se situer dans un constructeur et toujours en tant que premire instruction ;
Si aucun appel un constructeur dune classe suprieure nest fait, le constructeur
fait appel implicitement un constructeur vide de la classe suprieure (comme si la
ligne super() tait prsente). Si aucun constructeur vide nest accessible dans la classe
suprieure, une erreur se produit lors de la compilation.
Le second problme peut tre rsolu par une rednition de mthode. On dit quune mthode
dune sous-classe rednit une mthode de sa classe suprieure, si elles ont la mme signature
mais que le traitement eectu est r-crit dans la sous-classe. Voici le code de la classe Carre o
sont rsolus les deux problmes soulevs :
public class Carre extends Rectangle {
public Carre(int cote) {
super(cote, cote);
}
public void affiche() {
System.out.println(carr + this.getLongueur());
}

Lors de la rednition dune mthode, il est encore possible daccder la mthode rednie
dans la classe suprieure. Cet accs utilise galement le mot-cl super comme prxe la mthode.
Dans notre cas, il faudrait crire super.affiche() pour eectuer le traitement de la mthode
affiche() de Rectangle.
Enn, il est possible dinterdire la rednition dune mthode ou dune variable en introduisant le mot-cl final au dbut dune signature de mthode ou dune dclaration de variable. Il
est aussi possible dinterdire lhritage dune classe en utilisant final au dbut de la dclaration
dune classe (avant le mot-cl class).

4.1.2

Polymorphisme

Le polymorphisme est la facult attribue un objet dtre une instance de plusieurs classes.
Il a une seule classe relle qui est celle dont le constructeur a t appel en premier (cest--dire
la classe gurant aprs le new) mais il peut aussi tre dclar avec une classe suprieure sa classe
relle. Cette proprit est trs utile pour la cration densembles regroupant des objets de classes
direntes comme dans lexemple suivant :
21

Chapitre 4. Hritage

Forme[] tableau = new Forme[4];


tableau[0] = new Rectangle(10,20);
tableau[1] = new Cercle(15);
tableau[2] = new Rectangle(5,30);
tableau[3] = new Carre(10);

Loprateur instanceof peut tre utilis pour tester lappartenance une classe comme suit :
for (int i = 0 ; i < tableau.length ; i++) {
if (tableau[i] instanceof Forme)
System.out.println(element + i + est
if (tableau[i] instanceof Cercle)
System.out.println(element + i + est
if (tableau[i] instanceof Rectangle)
System.out.println(element + i + est
if (tableau[i] instanceof Carre)
System.out.println(element + i + est
}

une forme);
un cercle);
un rectangle);
un carr);

Lexcution de ce code sur le tableau prcdent ache le texte suivant :


element[0]
element[0]
element[1]
element[1]
element[2]
element[2]
element[3]
element[3]
element[3]

est
est
est
est
est
est
est
est
est

une forme
un rectangle
une forme
un cercle
une forme
un rectangle
une forme
un rectangle
un carr

Lensemble des classes Java, y compris celles crites en dehors de lAPI, forme une hirarchie
avec une racine unique. Cette racine est la classe Object dont hrite toute autre classe. En eet, si
vous ne prcisez pas explicitement une relation dhritage lors de lcriture dune classe, celle-ci
hrite par dfaut de la classe Object. Grce cette proprit, des classes gnriques de cration
et de gestion dun ensemble, plus labores que les tableaux, regroupent des objets appartenant
la classe Object (donc de nimporte quelle classe).
Une des proprits induites par le polymorphisme est que linterprteur Java est capable de
trouver le traitement eectuer lors de lappel dune mthode sur un objet. Ainsi, pour plusieurs
objets dclars sous la mme classe (mais nayant pas la mme classe relle), le traitement associ
une mthode donn peut tre dirent. Si cette mthode est rednie par la classe relle dun objet
(ou par une classe situe entre la classe relle et la classe de dclaration), le traitement eectu est
celui dni dans la classe la plus spcique de lobjet et qui rednie la mthode.
Dans notre exemple, la mthode affiche() est rednie dans toutes les sous-classes de Forme
et les traitements eectus sont :
for (int i = 0 ; i < tableau.length ; i++) {
tableau[i].affiche();
}
. voir par exemple les classes java.util.Vector, java.util.Hashtable,
22

4.2. Interfaces

Rsultat :
rectangle 10x20
cercle 15
rectangle 5x30
carr 10

Dans ltat actuel de nos classes, ce code ne pourra cependant pas tre compil. En eet, la
fonction affiche() est appele sur des objets dont la classe dclare est Forme mais celle-ci ne
contient aucune fonction appele affiche() (elle est seulement dnie dans ses sous-classes).
Pour compiler ce programme, il faut transformer la classe Forme en une interface ou une classe
abstraite tel que cela est fait dans les sections suivantes.

4.2 Interfaces
Une interface est un type, au mme titre quune classe, mais abstrait et qui donc ne peut tre
instanci (par appel new plus constructeur). Une interface dcrit un ensemble de signatures de
mthodes, sans implmentation, qui doivent tre implmentes dans toutes les classes qui implmentent linterface. Lutilit du concept dinterface rside dans le regroupement de plusieurs
classes, tel que chacune implmente un ensemble commun de mthodes, sous un mme type. Une
interface possde les caractristiques suivantes :
elle contient des signatures de mthodes ;
elle ne peut pas contenir de variables ;
une interface peut hriter dune autre interface (avec le mot-cl extends) ;
une classe (abstraite ou non) peut implmenter plusieurs interfaces. La liste des interfaces
implmentes doit alors gurer aprs le mot-cl implements plac dans la dclaration de
classe, en sparant chaque interface par une virgule.
Dans notre exemple, Forme peut tre une interface dcrivant les mthodes qui doivent tre
implmentes par les classes Rectangle et Cercle, ainsi que par la classe Carre (mme si celle-ci
peut proter de son hritage de Rectangle). Linterface Forme scrit alors de la manire suivante :
public interface Forme {
public int surface() ;
public void affiche() ;
}

Pour obliger les classes Rectangle, Cercle et Carre implmenter les mthodes surface()
et affiche(), il faut modier lhritage de ce qui tait la classe Forme en une implmentation de
linterface dnie ci-dessus :

public class Rectangle implements Forme {


...
}

et
public class Cercle implements Forme {
...
}
23

Chapitre 4. Hritage

Cette structure de classes nous permet dsormais de pouvoir compiler lexemple donn dans la
section .. traitant du polymorphisme. En dclarant un tableau constitu dobjets implmentant
linterface Forme, on peut appeler la mthode affiche() qui existe et est implmente par chaque
objet.
Si une classe implmente une interface mais que le programmeur na pas crit limplmentation de toutes les mthodes de linterface, une erreur de compilation se produira sauf si la classe
est une classe abstraite.

4.3

Classes abstraites

Le concept de classe abstraite se situe entre celui de classe et celui dinterface. Cest une classe
quon ne peut pas directement instancier car certaines de ses mthodes ne sont pas implmentes. Une classe abstraite peut donc contenir des variables, des mthodes implmentes et des
signatures de mthode implmenter. Une classe abstraite peut implmenter (partiellement ou
totalement) des interfaces et peut hriter dune classe ou dune classe abstraite.
Le mot-cl abstract est utilis devant le mot-cl class pour dclarer une classe abstraite,
ainsi que pour la dclaration de signatures de mthodes implmenter.
Imaginons que lon souhaite attribuer deux variables, origine_x et origine_y, tout objet
reprsentant une forme. Comme une interface ne peut contenir de variables, il faut transformer
Forme en classe abstraite comme suit :
public abstract class Forme {
private int origine_x ;
private int origine_y ;
public Forme() {
this.origine_x = 0 ;
this.origine_y = 0 ;
}
public int getOrigineX() {
return this.origine_x ;
}
public int getOrigineY() {
return this.origine_y ;
}
public void setOrigineX(int x) {
this.origine_x = x ;
}
public void setOrigineY(int y) {
this.origine_y = y ;
}
public abstract int surface();
public abstract void affiche();

}
24

4.4. Classes et mthodes gnriques

De plus, il faut rtablir lhritage des classes Rectangle et Cercle vers Forme :
public class Rectangle extends Forme {
...
}

et
public class Cercle extends Forme {
...
}

Lorsquune classe hrite dune classe abstraite, elle doit :


soit implmenter les mthodes abstraites de sa super-classe en les dotant dun corps ;
soit tre elle-mme abstraite si au moins une des mthodes abstraites de sa super-classe
reste abstraite.

4.4 Classes et mthodes gnriques


Il est parfois utile de dnir des classes paramtres par un type de donnes (ou une classe).
Par exemple, dans le package java.util, de nombreuses classes sont gnriques et notamment
les classes reprsentant des ensembles (Vector, ArrayList, etc.). Ces classes sont gnriques dans
le sens o elles prennent en paramtre un type (classe ou interface) quelconque E. E est en quelque
sorte une variable qui peut prendre comme valeur un type de donn. Ceci se note comme suit, en
prenant lexempe de java.util.ArrayList :
package java.util ;
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, ...
{
...
public E set(int index, E element) {
...
}
public boolean add(E e) {
...
}
...

Nous pouvons remarquer que le type pass en paramtre est not entre chevrons (ex : <E>), et
quil peut ensuite tre rutilis dans le corps de la classe, par des mthodes (ex : la mthode set
renvoie un lment de classe E).
Il est possible de dnir des contraintes sur le type pass en paramtre, comme par exemple
une contrainte de type extends :
. Ici, on utilise T extends E pour signaler que le type T est un sous type de E, que E soit une classe ou une
interface (on nutilise pas implements).
25

Chapitre 4. Hritage

public class SortedList<T extends Comparable<T>> {


...
}

Ceci signie que la classe SortedList (liste ordonne que nous voulons dnir) est paramtre par le type T qui doit tre un type driv (par hritage ou interfaage) de Comparable<T>.
En bref, nous dnissons une liste ordonne dlments comparables entre eux (pour pouvoir
les trier), grce la mthode int compareTo(T o) de linterface Comparable qui permet de
comparer un Comparable un lment de type T.

. Voir java.lang.Comparable pour plus dinformation sur cette interface.


26

Chapitre 5
Gestion des exceptions
Lors de lcriture dun programme, la prise en compte derreurs prend une place trs importante si lon souhaite crire un programme robuste. Par exemple, la simple ouverture dun chier
peut provoquer beaucoup derreurs telles que linexistence du chier, un mauvais format, une interdiction daccs, une erreur de connexion au priphrique, Pour que notre programme soit
robuste, il faut que toutes les erreurs possibles soient dtectes et traites.
Certains langages de programmation, dont le langage Java, proposent un mcanisme de prise
en compte des erreurs, fond sur la notion dexception. Une exception est un objet qui peut tre
mis par une mthode si un vnement dordre exceptionnel (les erreurs rentrent dans cette
catgorie) se produit. La mthode en question ne renvoie alors pas de valeur de retour, mais met
une exception expliquant la cause de cette mission. La propagation dune mission se droule
selon les tapes suivantes :
. Une exception est gnre lintrieur dune mthode ;
. Si la mthode prvoit un traitement de cette exception, on va au point , sinon au point ;
. Lexception est renvoye la mthode ayant appel la mthode courante, on retourne au
point ;
. Lexception est traite et le programme reprend son cours aprs le traitement de lexception.
La gestion derreurs par propagation dexception prsente deux atouts majeurs :
Une facilit de programmation et de lisibilit : il est possible de regrouper la gestion
derreurs un mme niveau. Cela vite des redondances dans lcriture de traitements
derreurs et encombre peu le reste du code avec ces traitements.
Une gestion des erreurs propre et explicite : certains langages de programmation utilisent
la valeur de retour des mthodes pour signaler une erreur la mthode appelante. Etant
donn que ce nest pas le rle de la valeur de retour de dcrire une erreur, il est souvent
impossible de connatre les causes relles de lerreur. La dissociation de la valeur de retour
et de lexception permet cette dernire de dcrire prcisment la ligne de code ayant
provoqu lerreur et la nature de cette erreur.

5.1 Dclaration
Il est ncessaire de dclarer, pour chaque mthode, les classes dexception quelle est susceptible dmettre. Cette dclaration se fait la n de la signature dune mthode par le mot-cl
throws la suite duquel les classes dexceptions (spares par une virgule sil en existe plusieurs)
qui peuvent tre gnres sont prcises. La mthode parseInt de la classe Integer est un bon
exemple :
27

Chapitre 5. Gestion des exceptions

public static int parseInt(String s) throws NumberFormatException {


...
}

Cette mthode convertit une chane de caractres, qui doit contenir uniquement des chires,
en un entier. Une erreur peut se produire si cette chane de caractres ne contient pas que des
chires. Dans ce cas une exception de la classe NumberFormatException est mise.
Une exception peut tre mise dans une mthode de deux manires : (i) par une autre mthode appele dans le corps de la premire mthode ; (ii) par la cration dun objet instanciant la
classe Exception (ou la classe Throwable) et la leve explicite de lexception en utilisant le mot-cl
throw.
Lexemple ci-dessous illustre ce second cas :
public class ExempleException {
/*
* Cette mthode renvoie le nom du mois
* correspondant au chiffre donn en paramtre.
* Si celui-ci nest pas valide une exception de classe
* IndexOutOfBoundsException est leve.
*/
public static String month(int mois)
throws IndexOutOfBoundsException {
if ((mois < 1) || (mois > 12)) {
throw new IndexOutOfBoundsException(
le numero du mois qui est
+ mois
+ doit tre compris entre 1 et 12);
}
if (mois == 1)
return Janvier ;
else if (mois == 2)
return Fvrier ;
...
else if (mois == 11)
return Novembre ;
else
return Dcembre ;
}

La signication des exceptions de la classe IndexOutOfBoundsException est quun index


donn dpasse les bornes minimum et maximum quil devrait respecter. Si une mthode demande
la chane de caractres correspondant des mois inexistants (infrieur ou suprieur ) une
exception signalera cette erreur. On peut remarquer dans cet exemple que la dtection et la formulation de lerreur sont codes dans la mthode mais pas son traitement.

28

5.2. Interception et traitement

5.2 Interception et traitement


Avant de coder le traitement de certaines exceptions, il faut prciser lendroit o elles vont tre
interceptes. Si une mthode A appelle une mthode B qui appelle une mthode C qui appelle une
mthode D, et que cette mthode D lve une exception, celle-ci est dabord transmise C qui peut
lintercepter ou la transmettre B, qui peut aussi lintercepter ou la transmettre A.
Linterception dexceptions se fait par une sorte de mise sur coute dune portion de code.
Pour cela on utilise le mot-cl try suivi du bloc surveiller. Si aucune exception ne se produit
dans le bloc correspondant, le programme se droule normalement comme si linstruction try
tait absente. Par contre, si une exception est leve, le traitement de lexception est excut puis
lexcution du programme reprend son cours aprs le bloc test.
Il est galement ncessaire de prciser quelles classes dexception doivent tre interceptes
dans le bloc test. Linterception dune classe dexception scrit grce au mot-cl catch suivi de
la classe concern, dun nom de variable correspondant lobjet exception, puis du traitement.
Si une exception est leve sans quaucune interception ne soit prvue pour sa classe, celle-ci est
propage la mthode prcdente.
Dans lexemple ci-dessous, le programme demande lutilisateur de saisir le numero dun
mois et ache lcran le nom de ce mois. Les exceptions qui peuvent tre leves par ce programme sont traites.
public class ExempleTraitementException {
public static void main(String[] args) {
System.out.print(Entrez le numero dun mois : );
try {
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
String choix = input.readLine();
int numero = Integer.parseInt(choix);
System.out.println(ExempleException.month(numero));
} catch (IndexOutOfBoundsException e) {
System.err.println(Numero incorrect :
+ e.getMessage());
} catch (NumberFormatException e) {
System.err.println(Entre incorrecte :
+ e.getMessage());
} catch (IOException e) {
System.err.println(Erreur daccs :
+ e.getMessage());
}
}

Trois classes dexception sont ici traites :


IndexOutOfBoundsException (lev par la mthode month) se produit si le numero entr
par lutilisateur est infrieur ou suprieur ;
NumberFormatException (lev par la mthode parseInt) qui se produit si le texte entr
par lutilisateur nest pas convertible en entier ;
IOException (lev par la mthode readLine) qui se produit si il y a eu une erreur daccs
au priphrique dentre.
29

Chapitre 5. Gestion des exceptions

Dans chacun de ces cas, le traitement consiste acher le message derreur associ lexception.

5.3

Classes dexception

Une classe est considre comme une classe dexception ds lors quelle hrite de la classe
Throwable. Un grand nombre de classes dexception sont proposes dans lAPI pour couvrir les

catgories derreurs les plus frquentes. Les relations dhritage entre ces classes permettent de
lever ou dintercepter des exceptions dcrivant une erreur dirents niveaux de prcision. Les
classes dexception les plus frquemment utilises sont rcapitules dans le tableau ..
T . Classes dexception frquentes
Classe
AWTException

ClassCastException

FileNotFoundException
IndexOutOfBoundsException

IOException

NullPointerException

Description
Les exceptions de cette classe peuvent se
produire lors doprations de type
graphique.
Signale une erreur lors de la conversion
dun objet en une classe incompatible
avec sa vraie classe.
Signale une tentative douverture dun
chier inexistant.
Se produit lorsque lon essaie daccder
un lment inexistant dans un
ensemble.
Les exceptions de cette classe peuvent se
produire lors doprations dentres/
sorties.
Se produit lorsquun pointeur null
est reu par une mthode nacceptant
pas cette valeur, ou lorsque lon
appelle une mthode ou une variable
partir dun pointeur null.

* Remarque : Il nest pas indispensable dintercepter les exceptions hritant de la


classe RuntimeException (dans le tableau ci-dessus, les classes qui en hritent sont
ClassCastException, IndexOutOfBoundsException et NullPointerException). Celles-ci
peuvent tre propages jusqu la machine virtuelle et napparatre que pendant lexcution. Ces
exceptions sont appeles exception non vries ou unchecked exceptions.
Si aucune des classes dexception ne correspond un type derreur que vous souhaitez exprimer, vous pouvez galement crire vos propres classes dexception. Pour cela, il sut de faire
hriter votre classe de la classe java.lang.Exception.

5.4

Classification des erreurs en Java

On peut nalement distinguer quatre types de situations derreurs en Java :


30

5.4. Classification des erreurs en Java

Erreurs de compilation. Avant mme de pouvoir excuter le programme, notre code source gnre des erreur par le compilateur. Il faut alors rviser et corriger le code pour ne plus avoir
derreurs.
Erreurs dexcution. Alors que notre programme est en cours dexcution, la JVM tant mal
congure ou corrompue, le programme sarrte ou se gle. A priori, cest une erreur non
pas due notre programme, mais la conguration ou ltat de lenvironnement dexcution de notre programme.
Exception non vrie. Alors que notre programme est en cours dexcution, une trace de la pile
des exceptions est ache, pointant vers une partie de notre code sans gestion dexception.
Visiblement, nous avons utilis du code qui est capable de lever un exception non vrie
(comme NullPointerException). Il faut modier le programme pour que cette situation
ne survienne pas.
Exception vrie. Alors que notre programme est en cours dexcution, une trace de la pile des
exceptions est ache, pointant vers une partie de notre code avec gestion dexception.
Visiblement, nous avons produit du code qui est capable de lever un exception vrie
(comme FileNotFoundException) mais les donnes passes notre programme ne valide pas ces exceptions (par exemple, lorsque lon essaie douvrir un chier qui nexiste
pas). Il faut alors revoir les donnes passes en paramtre du programme. Notre code a
bien dtect les problmes quil fallait dtecter. Le chapitre suivant sur les entres/sorties
prsentent de nombreux exemples relatifs ce cas.

31

Chapitre 5. Gestion des exceptions

32

Chapitre 6
Gestion des entres/sorties simples
Le package java.io propose un ensemble de classes permettant de grer la plupart des entres/sorties dun programme. Cette gestion consiste crer un objet ux dans lequel transitent
les donnes envoyer ou recevoir. Un ux connecte un objet Java un autre lment. Deux cas
sont illustrs dans ce chapitre : les interactions avec un utilisateur (entre clavier et sortie cran)
et les accs en lecture ou criture un chier.

6.1 Flux dentre


Un ux dentre est une instance dune sous-classe de InputStream. Chaque classe de ux
dentre a son propre mode dchange de donnes qui spcie un format particulier de donnes
ou un accs particulier. Les classes les plus couramment utilises sont :
ByteArrayInputStream permet de lire le ux dentre sous la forme doctets (byte) ;
DataInputStream permet de lire le ux dentre sous la forme de types de donnes primitifs de Java. Il existe des mthodes pour rcuprer un entier, un rel, un caractre,
FileInputStream est utilis pour lire le contenu dun chier. Les objets de cette classe sont
souvent encapsuls dans un autre objet de classe InputStream qui dnit le format des
donnes lire.
ObjectInputStream permet de lire des objets (c--d des instances de classes Java) partir du ux dentre, si ces objets implmentent les interfaces java.io.Serializable ou
java.io.Externalizable.
Reader nest pas une sous-classe de InputStream mais reprsente un ux dentre pour
chanes de caractres. Plusieurs sous-classes de Reader permettent la cration de ux pour
chanes de caractres.
Scanner nest pas une sous-classe de InputStream, mais un Iterator qui permet de lire
un ux (chier ou chane de caractres par exemple) mot par mot en dnissant le
dlimiteur entre les mots (espace par dfaut).
La lecture de donnes partir dun ux dentre suit le droulement suivant :
. Ouverture du ux : Elle se produit la cration dun objet de la classe InputStream.
Lors de lappel au constructeur, on doit prciser quel lement externe est reli au ux (par
exemple un nom de chier ou un autre ux).
. Lecture de donnes : Des donnes provenant du ux sont lues au moyen de la mthode
read()) ou dune mthode quivalente. La mthode prcise employer dpend du type
de ux ouvert.
. Fermeture du ux : Quand le ux nest plus ncessaire, il doit tre ferm par la mthode
close().
33

Chapitre 6. Gestion des entres/sorties simples

6.1.1

Lecture des entres clavier

Les donnes provenant de lutilisation du clavier sont transmises dans un ux dentre cr


automatiquement pour toute application Java. On accde ce ux par la variable statique de la
classe java.lang.System qui sappelle in. Ce ux est alors utilis comme paramtre dentre du
constructeur dun autre ux dentre. Pour cet autre ux, on utilise gnralement une sous-classe
de Reader pour rcuprer les entres de lutilisateur sous la forme dune chane de caractres. La
classe Clavier en donne un exemple :

import java.io.* ;
public class Clavier {
public static void main(String[] args) {
try {
BufferedReader flux = new BufferedReader(
new InputStreamReader(System.in));
System.out.print(Entrez votre prenom : );
String prenom = flux.readLine();
System.out.println(Bonjour + prenom);
flux.close();
} catch (IOException ioe) {
System.err.println(ioe);
}
}
}

6.1.2

Lecture partir dun fichier

Un chier est reprsent par un objet de la classe java.io.File. Le constructeur de cette classe
prend en paramtre dentre le chemin daccs du chier. Le ux dentre est alors cr laide
de la classe FileInputStream sur lequel on peut lire caractre par caractre grce la mthode
read(). Lexemple suivant prsente une mthode pour acher le contenu dun chier :
34

6.1. Flux dentre

import java.io.* ;
public class LectureFichier {
public static void main(String[] args) {
try {
File fichier = new File(monFichier.txt);
FileInputStream flux = new FileInputStream(fichier);
int c ;
while ((c = flux.read()) > -1) {
System.out.write(c);
}
flux.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

Il arrive souvent denregistrer des donnes dans des chiers textes. Il peut alors tre utile dutiliser un BufferedReader ou un Scanner pour eectuer la lecture. Dans les exemples suivants, on
considre une matrice 10 10 enregistre dans un chier texte matrice.txt ligne par ligne, avec
les colonnes spares par des espaces :
import java.io.* ;
public class LectureMatrice {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader(matrice.txt);
BufferedReader reader = new BufferedReader(fileReader);
while (reader.ready()) {
String[] line = reader.readLine().split( );
for (String s : line) {
System.out.print(s);
}
System.out.println();
}
reader.close();
fileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}
35

Chapitre 6. Gestion des entres/sorties simples

On peut eectuer un traitement similaire avec un Scanner :


import java.io.* ;
import java.util.Scanner ;
public class LectureMatriceScanner {
public static void main(String[] args) {
try {
Scanner fileScanner = new Scanner(new File(matrice.txt));
while (fileScanner.hasNextLine()) {
Scanner lineScanner = new Scanner(fileScanner.nextLine());
while (lineScanner.hasNext())
System.out.print(lineScanner.next());
System.out.println();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

6.1.3

Lecture dobjets enregistrs

Il est parfois utile denregistrer ltat dobjet (de nimporte quelle classe implmentant les interfaces java.io.Serializable ou java.io.Externalizable) pour des excutions futures. Le
ux dentre est encore cr laide de la classe FileInputStream et est ensuite encapsul dans
un autre ux spciant le format des donnes lire. Lexemple suivant illustre la lecture dun objet
de la classe Date dans un chier nomm monFichier.dat :
import java.io.* ;
import java.util.Date ;
public class LectureDate {
public static void main(String[] args) {
try {
File fichier = new File(monFichier.dat);
ObjectInputStream flux = new ObjectInputStream(
new FileInputStream(fichier));
Date laDate = (Date) flux.readObject();
System.out.println(laDate);
flux.close();
} catch (IOException ioe) {
System.err.println(ioe);
} catch (ClassNotFoundException cnfe) {
System.err.println(cnfe);
}
}
}

Lobjet qui est lu dans le chier doit tre une instance de la classe java.util.Date.
36

6.2. Flux de sortie

6.2 Flux de sortie


Un ux de sortie est une instance dune sous-classe de OutputStream. Comme pour les ux
dentre, chaque classe de ux de sortie a son propre mode dcriture de donnes. Les classes les
plus couramment utilises sont :

ByteArrayOutputStream permet dcrire des octets vers le ux de sortie ;


DataOutputStream permet dcrire des types de donnes primitifs de Java vers le ux de
sortie.
FileOutputStream est utilis pour crire dans un chier. Les objets de cette classe sont
souvent encapsuls dans un autre objet de classe OutputStream qui dnit le format des
donnes crire.
ObjectOutputStream permet dcrire des objets (c--d des instances de classes Java) vers
le ux de sortie, si ces objets implmentent les interfaces Serializable ou Externalizable.
Writer nest pas une sous-classe de OutputStream mais reprsente un ux de sortie pour
chanes de caractres. Plusieurs sous-classes de Writer permettent la cration de ux pour
chanes de caractres.
Lcriture de donnes vers un ux de sortie suit le mme droulement que la lecture dun ux
dentre :
. Ouverture du ux : Elle se produit lors de la cration dun objet de la classe OutputStream.
. Ecriture de donnes : Des donnes sont crites vers le ux au moyen de la mthode
write() ou dune mthode quivalente. La mthode prcise employer dpend du type
de ux ouvert.
. Fermeture du ux : Quand le ux nest plus ncessaire, il doit tre ferm par la mthode
close().

6.2.1

Ecriture sur la sortie standard cran

Comme pour les entres du clavier, lcriture vers lcran fait appel la variable statique out de
la classe System. On appelle gnralement la mthode System.out.print ou System.out.println
comme cela a t fait dans de nombreux exemples de ce livret.

6.2.2

Ecriture dans un fichier

Lcriture dans un chier se fait par un ux de la classe FileOutputStream qui prend en entre
un chier (instance de la classe File). Ce ux de sortie permet dcrire des caractres dans le chier
grce la mthode write(). Lexemple suivant prsente une mthode pour crire un texte dans
un chier :
37

Chapitre 6. Gestion des entres/sorties simples

import java.io.* ;
public class EcritureFichier {
public static void main(String[] args) {
try {
File fichier = new File(monFichier.txt);
FileOutputStream flux = new FileOutputStream(fichier);
String texte = Hello World! ;
for (int i = 0 ; i < texte.length(); i++) {
flux.write(texte.charAt(i));
}
flux.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

On peut galement utiliser un Writer comme un FileWriter pour crire des chanes de
caractres dans un chier assez simplement. Dans lexemple suivant, on crit une srie de 10
lignes de 10 entiers alatoires spars par des espaces dans un chier pouvant tre lu par la classe
LectureMatrice :

import java.io.* ;
import java.util.Random ;
public class EcritureMatrice {
public static void main(String[] args) {
try {
FileWriter writer = new FileWriter(random.txt);
Random generator = new Random(System.currentTimeMillis());
for (int i = 0 ; i < 9 ; i++) {
for (int j = 0 ; j < 9 ; j++)
writer.write(generator.nextInt() + );
writer.write(\n);
}
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}
38

6.2. Flux de sortie

6.2.3

Ecriture dobjets

Le ux de sortie peut galement tre encapsul dans un ux de type ObjectOutputStream,


comme le montre lexemple suivant pour crire la date courante dans un chier :
import java.io.* ;
import java.util.Date ;
public class EcritureDate {
public static void main(String[] args) {
try {
File fichier = new File(monFichier.dat);
ObjectOutputStream flux = new ObjectOutputStream(
new FileOutputStream(fichier));
flux.writeObject(new Date());
flux.close();
} catch (IOException ioe) {
System.err.println(ioe);
}
}

Ce chier peut ensuite tre lu par la classe LectureDate.

* Remarque importante : Nous avons prsent dans ce chapitre plusieurs exemples dentre/sortie utilisant dirents modes de lecture/criture (avec ou sans ux). Nous conseillons toutefois
dutiliser en priorit un Scanner pour la lecture dans un chier, et un FileWriter pour lcriture
dans un chier.

39

Chapitre 6. Gestion des entres/sorties simples

40

Annexes

41

Annexe A
Applications graphiques (package swing)
Annexe
Lors des premires versions du langage Java, le seul package fourni par dfaut par Java SE
permettant de construire des interfaces graphiques tait le package java.awt. Depuis la version
. du JDK, il est trs fortement recommand dutiliser les classes du package javax.swing pour
crire des interfaces graphiques. En eet, le package swing apporte deux avantages conceptuels
par rapport au package awt :
Les composants swing sont dits lgers (lightweight) contrairement aux composants lourds
(heavyweight) dawt. Lapparence graphique dun composant dit lourd dpend du systme
dexploitation car elle fait appel un composant correspondant dans le systme dexploitation. Avec un composant lger, son apparence (look-and-feel) est xe et peut tre modie
dans le code Java et il est donc possible de donner une fentre une apparence la Windows tout en utilisant Linux.
Il applique compltement le schma Modle-Vue-Contrleur (cf. section A.).
La plupart des classes de composants du package swing hritent de classes du package awt en
rednissant certaines mthodes pour assurer les deux avantages prcdemment cits. Cependant,
le package awt nest pas entirement obsolte et certaines de ces classes sont encore utilises pour
la gestion dvnements (cf. section A.) ou la disposition des composants (classes implmentant
linterface LayoutManager).

A.1 Le schma Modle-Vue-Contrleur


Le schma Modle-Vue-Contrleur (MVC) est un mode de conception dapplications graphiques prconisant la distinction des donnes, de leur apparence graphique et des traitements
qui peuvent tre eectus. Un composant graphique est dcompos en trois parties :
le modle contenant ses donnes et son tat courant ;
la vue qui correspond son apparence graphique ;
le contrleur associant des traitements des vnements pouvant se produire au sein du
composant.
La gure A. donne un exemple dune interface graphique simple contenant un bouton Quitter.
la dcomposition MVC de ce bouton (instance de la classe JButton) est constitue : (i) du
modle contenant la chane de caractres Quitter ; (ii) de la vue constitue dun rectangle gris
bord noir, dune taille donne, une position donne et au sein duquel est crite la chane de
caractres du modle ; (iii) du contrleur implmentant le traitement eectuer lors dun click
sur le bouton, cest--dire lappel linstruction de fermeture de la fentre.
Tous les composants graphiques du package swing ont un modle, une vue et peuvent avoir
plusieurs contrleurs. Pour faciliter la programmation, certaines classes (tel que JButton) encapsulent le modle et la vue dans une seule classe disposant de mthodes daccs et de modications
43

Annexe A. Applications graphiques (package swing)

F A. Exemple de JButton

des donnes ou de lapparence. Dans ces cas-l, un modle par dfaut est utilis.

A.2 Composants graphiques


Dans un programme Java, une classe de composant graphique est une classe qui hrite de
java.awt.Component. Il est indispensable dhriter de cette classe car elle implmente de nom-

breuses mthodes ncessaires lachage du composant, en renvoyant la dimension du composant, sa police de caractres, sa couleur de fond, etc.
La seconde classe essentielle pour lcriture dinterfaces graphiques est la classe Container.
Un container est un composant (qui hrite donc de Component) mais avec la particularit de pouvoir contenir dautres composants. Ainsi, une interface graphique est un objet dune classe de
type java.awt.Container (par exemple une fentre ou une bote de dialogue) regroupant des
simples composants et dautres containers qui, eux aussi, contiennent dautres simples composants et containers, et ainsi de suite.

A.2.1

Composants

Nous ne prsentons pas ici toutes les classes de composants du package swing pour nous intresser plutt la vue et au modle de chaque composant. Lutilisation de certains composants
est illustre dans la section A...
Vue

Lapparence graphique dun composant est le rsultat de limplmentation de la mthode


paint() de la classe Component. Quasiment toutes les classes hritant de Component rednissent
cette mthode an de dnir lachage du composant. Si vous crivez une classe hritant dune
classe de composant existante, il est donc fortement dconseill de rednir la mthode paint
pour la plupart des composants existants car vous empcheriez son achage normal.
Si vous souhaitez dnir lachage dun composant personnalis (par exemple pour acher
une image ou des formes gomtriques), vous devrez faire hriter votre classe de composant de la
classe java.awt.Canvas qui reprsente un composant vide. Dans ce cas-l, il est souhaitable de
rednir la mthode paint() qui est vide dans la classe Canvas.
Modle

Il existe pour chaque classe de composant, une seconde classe qui gre le modle de ce composant (par exemple, ButtonModel reprsente un modle de bouton). En gnral un modle par
dfaut est cr dans le constructeur du composant. Laccs ce modle est trs souvent masqu car
il existe des mthodes, telles que setText() pour changer le texte dun bouton ou setSelected()
pour changer ltat dune case cocher, de la classe de composant qui peuvent tre directement
appeles pour changer les donnes du modle. Cependant, pour des composants plus complexes
44

A.2. Composants graphiques

tels que des tables (JTable) ou des arborescences (JTree), il est parfois indispensable de crer un
modle personnalis.

A.2.2

Containers

En premier lieu, il convient de rappeler quun container est un composant, et, par consquent,
que tout ce qui a t prsent prcdemment est aussi vrai pour les containers. En plus des caractristiques dun composant simple, un container contient un ensemble de composants ainsi que
des contraintes sur leur disposition. Lajout dun composant un container se fait par une mthode add(). Il existe plusieurs mthodes add() acceptant des paramtres dentre dirents. La
mthode utiliser dpend du type de disposition choisi.
Disposition des composants

Lobjet qui gre la disposition des composants est une instance dune classe qui doit implmenter linterface java.awt.LayoutManager. Cet objet doit tre ajout au container, soit lors de
lappel son constructeur, soit par la mthode setLayout(). Un seul LayoutManager est autoris par container. Quelques classes utilises pour la disposition des composants sont prsentes
ci-dessous.
Le container est dcoup en cinq cases : une case par ct (gauche, droite, haut
et bas) et une au centre. Lajout dun composant se fait en prcisant la case utiliser grce des
variables de classe de BorderLayout :
BorderLayout.

MyContainer.add(MyComponent,BorderLayout.NORTH);
MyContainer.add(MyComponent2,BorderLayout.CENTER);

La taille de chaque case dpend : (i) de la largeur maximale entre la case du nord, du sud et
laddition des largeurs des cases du centre, de lest et de louest ; (ii) de la hauteur maximale entre
la case lest, louest et laddition des hauteurs des cases du centre, du nord et du sud. La case
du centre est tire pour remplir tout lespace restant.
BorderLayout.NORTH

BorderLayout.WEST

BorderLayout.CENTER

BorderLayout.EAST

BorderLayout.SOUTH

F A. Dcoupage du BorderLayout

45

Annexe A. Applications graphiques (package swing)

Comp1

Comp2

Comp3

...

F A. Dcoupage du FlowLayout

Comp1

Comp2

Comp3

Comp4

Comp5

Comp6

Comp7

Comp8

Comp9

Comp10

Comp11

Comp12

F A. Dcoupage dun GridLayout x

Les composants sont ajouts les uns la suite des autres et de la gauche vers la
droite. Ds quune ligne est remplie de composants (cest--dire ds que la largeur du container
est atteinte, les composants restants sont ajouts sur une ligne en dessous. Il ny a pas dautres
contraintes de disposition :

FlowLayout.

MyContainer.add(MyComponent);

Le container est dcoup en une grille compose de n cases de taille gale. Le constructeur du GridLayout requiert en paramtres dentre le nombre de lignes et le nombre de colonnes
de la grille. Les composants sont ajouts les uns la suite des autres en remplissant dabord la
premire ligne, puis la seconde, etc. Il ny a pas dautres contraintes de disposition :
GridLayout.

MyContainer.add(MyComponent);

Containers classiques

La classe de container la plus simple est javax.swing.JPanel. Un panel est un composant


initialement vide auquel on va ajouter des composants suivant la disposition choisie. La disposition peut tre spcie lors de lappel au constructeur du panel (par ex, JPanel myPanel =
new JPanel(new BorderLayout());) ou par un appel explicite la mthode setLayout, par
exemple :
myPanel.setLayout(new GridLayout(4,5));

Les composants peuvent ensuite tre ajouts avec la mthode add() approprie.
Une interface graphique consiste donc en une hirarchie de composants telle que certains
composants sont des containers spciant la disposition dautres composants. La racine de cette
46

A.2. Composants graphiques

hirarchie est galement un container qui peut sacher librement (c--d. sans que sa disposition soit prcise dans un container). Parmi ces containers de haut niveau, on trouve la classe
javax.swing.JFrame qui reprsente une fentre et javax.swing.JDialog qui reprsente une
bote de dialogue. La cration dune fentre suit gnralement les tapes suivantes :
. Cration dune instance de JFrame (ou dune sous-classe).
. Ajout des composants au panel de la fentre. Ce panel est accessible par la mthode
getContentPane(). On peut galement attribuer la fentre un nouveau panel par la mthode setContentPane().
. Calcul de la taille de la fentre laide de la mthode pack(). Ce calcul est automatique et
prend en compte la dimension prferre de chaque composant ainsi que leur disposition.
. Achage de la fentre par la mthode setVisible().
Par exemple, la gure A. (p. ) est une instance dune sous-classe de JFrame :
import java.awt.* ;
import javax.swing.* ;
public class ExBouton extends JFrame {
public ExBouton() {
super();
JLabel label = new JLabel(Exemple de bouton);
JPanel panel = new JPanel(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
JButton b = new JButton( Quitter );
panel.add(b, BorderLayout.SOUTH);
this.setContentPane(panel);
this.pack();
}
public static void main(String[] args) {
ExBouton bouton = new ExBouton();
bouton.setVisible(true);
}

A.2.3

Exemple dinterface

Le meilleur moyen dapprendre crire des interfaces graphiques est de sinspirer dexemples dinterfaces existantes. La gure A. est un exemple de fentre produit avec le code suivant la
gure.

47

Annexe A. Applications graphiques (package swing)

F A. Exemple dinterface graphique

48

java.awt.* ;
java.util.Vector ;
javax.swing.* ;
javax.swing.border.EmptyBorder ;

// le groupe de bouton permet dinterdire la selection


// de plusieurs cases en meme temps

// creation des cases a cocher


JLabel label = new JLabel(Forme:);
button1 = new JRadioButton(Carre, true);
button2 = new JRadioButton(Cercle, false);
button3 = new JRadioButton(Triangle, false);
JLabel label2 = new JLabel(Couleur:);
couleur = new JComboBox();
couleur.addItem(Bleu);
couleur.addItem(Rouge);
couleur.addItem(Vert);

// creation du panel gauche


JPanel gauche = new JPanel(new GridLayout(6, 1, 0, 5));

//le programme doit se terminer quand la fenetre est fermee


this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

public ExInterface() {
super(Un exemple de fenetre);

/**
* Les variables pointant chaque composant sont declarees
* en variables dinstance et en type protected. Elles
* auraient tres bien pu etre des variables locales au
* constructeur mais, pour des raisons pedagogiques,
* la gestion des evenements nest presentee que plus
* tard (section events) dans une classe heritant
* de ExInterface. Les variables sont de type protected
* afin de pouvoir y accder dans cette sous-classe.
*/
protected JRadioButton button1, button2, button3 ;
protected JComboBox couleur ;
protected JTextField text ;
protected JButton ajout ;
protected JList textList ;
protected Vector<String> listData ;
protected Dessin dessin ;

public class ExInterface extends JFrame {

import
import
import
import

// remplissage du panel bas

// linclusion de la liste dans un JScrollPane permet


// de la faire defiler par des ascenceurs
JScrollPane scrollPane = new JScrollPane(textList);
scrollPane.setPreferredSize(new Dimension(200, 100));

// creation de la liste
textList = new JList(listData);
textList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

// creation du modele de la liste


listData = new Vector<String>();
listData.addElement(Hello World);
listData.addElement(Une belle figure);
listData.addElement(Champions du monde !);
listData.addElement(A ciao, bonsoir...);
listData.addElement(Changez la couleur);
listData.addElement(Jadore Java);
listData.addElement(Allez les verts !);
listData.addElement(Ca marche);
listData.addElement(blablabla);

// creation et remplissage du panel dajout de texte


JPanel textPanel = new JPanel(new GridLayout(3, 1, 0, 5));
label = new JLabel(Ajouter un texte possible:);
textPanel.add(label);
text = new JTextField(16);
textPanel.add(text);
ajout = new JButton(Ajouter);
textPanel.add(ajout);

// creation du panel bas


JPanel bas = new JPanel(new BorderLayout(0, 10));

// remplissage du panel gauche


gauche.add(label);
gauche.add(button1);
gauche.add(button2);
gauche.add(button3);
gauche.add(label2);
gauche.add(couleur);

ButtonGroup group = new ButtonGroup();


group.add(button1);
group.add(button2);
group.add(button3);

A.2. Composants graphiques

49

50

public void paint(Graphics g) {


// un rectangle noir encadre le composant
g.setColor(Color.black);
g.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1);

// le constructeur de la classe
public Dessin() {
figure = Carre ;
couleur = Color.blue ;
text = Hello World ;
this.setBackground(Color.white);
}

String figure ;
Color couleur ;
String text ;

// La redfinition de cette methode permet de specifier


// la taille preferree du composant
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

public void setFigure(String fig) {


figure = fig ;
}

public void setCouleur(String coul) {


if (coul.equals(Bleu)) {
couleur = Color.blue ;
} else if (coul.equals(Rouge)) {
couleur = Color.red ;
} else {
couleur = Color.green ;
}
}

// ces methodes permettent de changer le texte,


// la couleur ou la figure a afficher
public void setText(String txt) {
text = txt ;
}

public static void main(String[] args) {


ExInterface myInterface = new ExInterface();
myInterface.setVisible(true);
}

// Cette classe herite de canvas pour redfinir la


// methode paint. La vue est codee dans cette classe
class Dessin extends Canvas {

// calcul de la dimension de la fenetre


this.pack();

// une bordure permet daerer laffichage


mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));

// la couleur est choisie


g.setColor(couleur);

// remplissage du panel principal


JPanel mainPanel = (JPanel) this.getContentPane();
mainPanel.setLayout(new BorderLayout(10, 10));
mainPanel.add(gauche, BorderLayout.WEST);
dessin = new Dessin();
mainPanel.add(dessin, BorderLayout.CENTER);
mainPanel.add(bas, BorderLayout.SOUTH);
// la figure est affichee
if (figure.equals(Carre)) {
g.drawRect(50, 30, 100, 100);
} else if (figure.equals(Cercle)) {
g.drawOval(50, 30, 100, 100);
} else {
g.drawLine(50, 130, 100, 30);
g.drawLine(100, 30, 150, 130);
g.drawLine(50, 130, 150, 130);
}

// le texte est affiche


g.drawString(text, 10, 15);

bas.add(scrollPane, BorderLayout.NORTH);
bas.add(textPanel, BorderLayout.SOUTH);

Annexe A. Applications graphiques (package swing)

A.3. Contrleurs dvnements

A.3 Contrleurs dvnements


Le rle des contrleurs est dintercepter certains vnements et deectuer un traitement associ au type de lvnement. Un vnement peut tre produit par un click sur un bouton, la slection
dun lment dune liste, un dplacement de souris, la pression dune touche du clavier, etc.

A.3.1

Evnements

Un vnement graphique est reprsent dans le langage Java comme un objet dont la classe
hrite de java.awt.AWTEvent. Parmi les sous-classes de AWTEvent, on peut citer les plus couramment utilises :
ActionEvent : Se produit lorsquune action est eectue sur un composant. Ex : click sur
un bouton.
ItemEvent : Se produit lorsquune slection a t eectue sur un composant. Ex : cochage
dune case.
KeyEvent : Se produit lorsque un vnement provient du clavier. Ex : pression dune
touche.
MouseEvent : Se produit lorsque un vnement provient de la souris. Ex : dplacement de
la souris.
WindowEvent : Se produit lorsquune action est eectue sur une fentre. Ex : click sur
licone de fermeture dune fentre.
Des mthodes sont attaches chacune de ces classes pour avoir accs plus de dtails sur
lvnement. On peut, par exemple, rcuprer le composant source de lvnement, la position de
la souris lors du click, etc.

A.3.2

Interface Listener

Le contrleur qui intercepte un certain type dvnement doit implmenter une des interfaces
hritant de java.util.EventListener. Linterface implmenter dpend du type dvnement
intercepter. La table A. prsente les interfaces correspondant aux vnements dcrits ci-dessus.
Certaines de ces interfaces demandent quun grand nombre de mthodes soient implmentes (par ex, WindowListener). Des classes, appeles adapter, implmentant ces interfaces sont
proposes dans lAPI, pour lesquelles toutes les mthodes ont des implmentations vides. Cette
facilit de programmation permet de nimplmenter que la mthode souhaite. Par exemple, on
utilisera la classe WindowAdapter pour implmenter un traitement eectuer la fermeture dun
fentre (mthode windowClosing()) sans avoir crire des mthodes vides pour tous les autres
cas o aucun traitement nest requis.
Aprs la cration dun objet contrleur, il est ncessaire de le rattacher un ou plusieurs composants. Le contrleur intercepte uniquement les vnements des composants auquel il est rattach. Cette opration se fait par lappel une mthode du composant de la forme add...Listener.
Par exemple, le rattachement dun contrleur myActionListener un bouton scrit :
myButton.addActionListener(myActionListener);

A.3.3

Exemple de contrleur

Dans lexemple donn plus loin, des traitements ont t associs aux dirents composants
de linterface prsente en section A... Les contrleurs ont t volontairement crs de manire
dirente pour illustrer plusieurs cas :
51

Annexe A. Applications graphiques (package swing)

T A. Quelques interfaces pour contrleur


Contrleur

Evnement

ActionListener
ItemListener
KeyListener

ActionEvent
ItemEvent
KeyEvent

MouseListener

MouseEvent

WindowListener

WindowEvent

Mthodes implmenter
- actionPerformed(ActionEvent)
- itemStateChanged(ItemEvent)
- keyPressed(KeyEvent)
- keyReleased(KeyEvent)
- keyTyped(KeyEvent)
- mouseClicked(MouseEvent)
- mouseEntered(MouseEvent)
- mouseExited(MouseEvent)
- mousePressed(MouseEvent)
- mouseReleased(MouseEvent)
- windowActivated(WindowEvent)
- windowClosed(WindowEvent)
- windowClosing(WindowEvent)
- windowDeactivated(WindowEvent)
- windowDeiconified(WindowEvent)
- windowIconified(WindowEvent)
- windowOpened(WindowEvent)

le contrleur de la fentre est un objet instanci partir dune classe WindowControler


qui hrite de la classe WindowAdapter. Le seul traitement qui est prcis est de quitter le
programme quand lutilisateur clique sur le bouton de fermeture.
le contrleur des boutons de choix est utilis sur plusieurs composants. Il traite les vnements provenant des boutons JRadioButton et JComboBox. Ce contrleur est une instance
de ChoiceControler qui implmente linterface ItemListener. Le traitement eectu est
une mise jour du dessin.
le contrleur de la liste est en fait le mme objet que celui reprsentant la fentre. Cest la
classe ExControleur qui implmente linterface ListSelectionListener et met jour le
dessin chaque fois que la slection de la liste change.
le contrleur de la zone de texte est aussi implment par lobjet fentre. Si la touche
entre est presse dans la zone de texte, la liste est mise jour.
le contrleur du bouton a une forme un peu spciale mais frquemment utilise. Il est
possible, en Java, de rednir une mthode dune classe pendant une instanciation. Lors de
linstanciation du contrleur (new ActionListener()), la mthode actionPerformed()
est rednie directement avant le point virgule de n dinstruction. Cest le seul cas o
linstanciation dune interface est permise si toutes ses mthodes sont implmentes.

52

// Cette methode est appelee si la selection de la liste


// change
public void valueChanged(ListSelectionEvent e) {
String selected = (String) textList.getSelectedValue();

public void actionPerformed(ActionEvent e) {


String str = text.getText();
if (str.length() > 0) {
listData.addElement(text.getText());
text.setText();
textList.setListData(listData);
}
}
});

// Le controleur du bouton est ecrit directement dans


// la classe
ajout.addActionListener(new ActionListener() {

// le role de contrleur pour la liste et le champ de


// texte est assure par lobjet courant ExControleur
textList.addListSelectionListener(this);
text.addActionListener(this);

// Un contrleur unique est cr pour les boutons


// de choix
ChoiceControler controleur = new ChoiceControler(dessin);
button1.addItemListener(controleur);
button2.addItemListener(controleur);
button3.addItemListener(controleur);
couleur.addItemListener(controleur);

// ajout dun contrleur la fentre


this.addWindowListener(new WindowControler());

public ExControleur() {
// appel au constructeur de ExInterface pour creer la
// fenetre et ses composants
super();

public class ExControleur extends ExInterface


implements ListSelectionListener, ActionListener {

import java.awt.event.* ;
import javax.swing.* ;
import javax.swing.event.* ;

// Il est necessaire que le dessin soit passe en parametre


// pour sa mise a jour apres un evenement.

Dessin dessin ;

// Une classe pour le controle des boutons de choix.


// Cette classe est utilisee pour les JRadioButton et}
// le JComboBox
class ChoiceControler implements ItemListener {

public void windowClosing(WindowEvent e) {


System.exit(0);
}

// Une classe de controleur de fenetre


class WindowControler extends WindowAdapter {

// Le main doit etre redefinie pour creer un objet de la


// classe ExControleur et non ExInterface
public static void main(String[] args) {
ExControleur myControleur = new ExControleur();
myControleur.setVisible(true);
}

// Cette methode est appelee si la touche entree est


// pressee dans le champ de texte
public void actionPerformed(ActionEvent e) {
String str = text.getText();
// Le texte du champ est ajoute la liste des textes
if (str.length() > 0) {
listData.addElement(text.getText());
text.setText();
textList.setListData(listData);
}
}

// Le texte affiche est mis a jour en fonction de la


// nouvelle selection
if (selected != null) {
dessin.setText(selected);
} else {
dessin.setText();
}
dessin.repaint();

A.3. Contrleurs dvnements

53

54

// Cette mthode est appelee si la selection dun bouton


// change
public void itemStateChanged(ItemEvent e) {
// On teste que levenement est bien une selection
if (e.getStateChange() == ItemEvent.SELECTED) {
// traitement effectuer si levenement sest
// produit sur un JRadioButton
if (e.getSource() instanceof JRadioButton) {
dessin.setFigure(((JRadioButton) e.getItem()).getText());
} // traitement a effectuer si levenement sest
// produit sur un JComboBox
else if (e.getSource() instanceof JComboBox) {
dessin.setCouleur((String) e.getItem());
} else {
System.err.println(Erreur - composant non valide);
}
dessin.repaint();
}
}

public ChoiceControler(Dessin d) {
dessin = d ;
}

Annexe A. Applications graphiques (package swing)

Annexe B
Diagramme de classes UML
UML (Unied Modeling Language) a t cr en pour tre le langage standard de modlisation orient-objet. UML contient dirents diagrammes utiliss pour dcrire de nombreux
aspects du logiciel. Dans le cadre de ce cours, nous utiliserons uniquement le diagramme de
classes .
Le diagramme de classes reprsente la structure statique du logiciel. Il dcrit lensemble des
classes qui sont utilises ainsi que leurs associations. Il est inspir des diagrammes Entit-Relation
utiliss en modlisation de bases de donnes, en y ajoutant les aspects oprationnels (les mthodes)
et quelques subtilits smantiques (la composition, par exemple).

B.1 Reprsentation des classes et interfaces


B.1.1 Les classes
En UML, une classe est au minimum dcrite par un nom. Graphiquement, elle est reprsente
par un rectangle, ventuellement divis en parties : son nom, ses attributs et ses oprations. On
appelle membres de la classe ses attributs et mthodes (ou oprations).
Nom de
classe

Nom de
classe

Nom de
classe
Attribut
Attribut
Opration
Opration

F B. Reprsentations UML possible dune classe, avec ou sans les membres

B.1.2 Les membres de classe


Chaque attribut est dcrit au moins par un nom (unique dans une mme classe) et par un type
de donnes.
Une opration, ou mthode, est dcrite au moins par un nom, par un ensemble darguments
ncessaires son invocation et par un type de retour. Chaque argument est dcrit par un nom
et un type de donnes.
. le langage UML pourra tre tudi en profondeur lors du cours Analyse et Conception de Systmes Informatiques de laxe Ingnierie des Systmes Informatiques
55

Annexe B. Diagramme de classes UML

Un niveau de visibilit est galement attribu chaque membre. La visibilit dun membre
dune classe dnit quelles autres classes y ont accs (en terme de lecture/criture). UML utilise
niveaux de visibilit :
public (not par +), le membre est visible par toutes les classes
priv (not par -), le membre nest visible par aucune classe sauf celle qui le contient
protg (not par ), le membre est visible par toutes les sous-classes de celle qui le contient
(cette visibilit est explique ultrieurement)
Personne
+ surnom : String
- nom : String
- prenom : String
# dateNaissance : Date
+ calculerDureePret() : int
+ getAge() : int

F B. Exemple de classe Personne avec attributs et oprations

La gure B. est un exemple dune classe Personne avec toutes les possibilits de visibilit.

B.1.3 Les classes abstraites


En UML, le mot-cl {abstrait} (ou {abstract}) est accol aux classes et mthodes abstraites. Une autre manire souvent usite de reprsenter ces mthodes ou classes est dcrire leur
nom en italique. Les attributs et mthodes de classe sont souligns. La classe Personne dcrite dans
la gure ci-dessous montre un exemple dattribut et de mthode de classe.
Personne
{abstract}

Personne

F B. Deux reprsentations possibles pour une classe abstraite Personne


Personne
+ surnom : String
- nom : String
- prenom : String
# dateNaissance : Date
- ageMajorite : int = 18
+ calculerDureePret() : int
+ setAgeMajorite(a : int)
+ getAge() : int

F B. Exemple dun attribut et dune mthode de classe pour la classe Personne

B.1.4 Les interfaces


En UML, une interface est dcrite par le mot-cl interface dans le bloc dentte, comme
prsent dans la gure B..
56

B.2. Les relations

<<interface>>
Interface

F B. Exemple dinterface

B.2 Les relations


En conception oriente objet, les relations englobent notamment les relations dhritage et de
ralisation dinterface.

B.2.1 Lhritage
En UML, lhritage se reprsente par une che la pointe creuse. La gure B. dcrit deux
classes Super-classe et Sous-classe. La classe Sous-classe hrite de la classe Super-classe.
Super-classe

Sous-classe

F B. Exemple dhritage

B.2.2 La ralisation
La ralisation dune interface par une classe se reprsente par une che pointille pointe
creuse, comme illustr dans la gure B..
<<interface>>
Interface

Classe

F B. Exemple de ralisation de linterface Interface par la classe Classe

B.3 Les associations


Certaines relations entre classes dun mme diagramme sont reprsentes en UML sous la
forme dassociations. Le plus souvent une association ne relie que deux classes. Une association peut tre identie par un nom et chacune de ses extrmits dnit le nombre dinstances
57

Annexe B. Diagramme de classes UML

des classes relies qui sont impliques dans cette association. On appelle multiplicit ce nombre
dinstances qui peut prendre les valeurs suivantes :
Multiplicit

..
N
M..N
*
..*
..*

Responsable

1
chef

Interprtation
un et un seul
zro ou un
exactement N
de M N
zro ou plus
zro ou plus
un ou plus

manage

* Collaborateur
subordonn

F B. Exemple dassociation manage


Lexemple de la gure B. dcrit une association manage entre la classe Responsable et la
classe Collaborateur. Un responsable gre plusieurs collaborateurs, ses subordonns. Un collaborateur est gr par un seul responsable, son chef. Les lments subordonn et chef sont des
rles dassociation.

B.3.1 Direction des associations


Les associations peuvent tre diriges, ce qui contraint la visibilit et la navigation dans le modle. La direction se reprsente par une che classique. Par dfaut, sil ny a pas de che, lassociation est bidirectionnelle (comme sil y avait une che chaque extrmit de lassociation).
A

F B. Exemples dassociations diriges

La gure B. prsente des exemples de directions, dont voici les interprtations. La premire
ligne signie que A connat tous les B auxquels elle est associe, et rciproquement, un B connat le
A auquel il est associ. La deuxime ligne signie que seul le A connat les B auxquels il est associ,
mais pas linverse. Finalement, dans la troisime ligne, un B connat le A auquel il est associ, mais
pas linverse. En fait, ceci va impliquer la prsence ou non dun attribut a de type A dans la classe
B ou b de type B dans la classe A en fonction de la direction. Par exemple, pour la deuxime ligne,
A possde une liste dobjet de type B mais B ne possde pas dattribut de type A.
58

B.4. Correspondance UML-Java

B.3.2 Agrgation et composition


Deux sous-types dassociations permettent de prciser un sens particulier ces relations :
lagrgation et la composition. Elles peuvent galement tre diriges.
A

F B. Exemples de compositions et dagrgations.

Lagrgation est une association avec relation de subordination, souvent nomme possde
reprsente par un trait reliant les deux classes et dont lorigine se distingue de lautre extrmit
(la classe subordonne) par un losange creux. Une des classes regroupe dautres classes. On peut
dire que lobjet A utilise ou possde une instance de la classe B.
La composition est une association liant le cycle de vie des deux classes concernes. Une association de composition sinterprte comme une classe est compose de un ou plusieurs lment
de lautre classe. Elle est reprsente par un trait reliant les deux classes et dont lorigine se distingue de lautre extrmit (la classe composant) par un losange plein. On peut dire que lobjet A
est compos instance de la classe B, et donc si lobjet de type A est dtruit, les objets de type B qui
le composent sont galement dtruit. Ce sera galement souvent les objets de type A qui creront
les objets de type B.

B.4 Correspondance UML-Java


Java permet de programmer tout modle sous forme de diagramme de classe UML tel que
prsent ci-dessus. Voici quelques exemples de correspondance entre le modle UML et le codage
Java.

B.4.1 Classes et membres


Personne
+ surnom : String
- nom : String
- prenom : String
# dateNaissance : Date
+ calculerDureePret() : int
+ getAge() : int

public class Personne {


public String surnom ;
private String prenom ;
private String nom ;
protected Date dateNaissance ;
public int calculerDureePret() {...}
public int getAge() {...}
}

B.4.2 Classes abstraites


59

Annexe B. Diagramme de classes UML

Personne
+ surnom : String
- nom : String
- prenom : String
# dateNaissance : Date
- ageMajorite : int = 18
+ calculerDureePret() : int
+ setAgeMajorite(a : int)
+ getAge() : int

public abstract class Personne {


public String surnom ;
private String prenom ;
private String nom ;
protected Date dateNaissance ;
private static int ageMajorite = 18 ;
public int calculerDureePret() {...}
public static void setAgeMajorite(int a) {...}
public int getAge() {...}
}

B.4.3 Interfaces
interface IAffichable {
void afficher();
}

<<interface>>
IAffichable
+ afficher()

B.4.4 Hritage
public class Adherent extends Personne {
private int iD ;
}

Personne
- nom : String

Adherent
- iD : int

B.4.5 Ralisation
<<interface>>
IAffichable

<<interface>>
IImprimable

+ afficher()

+ imprimer()

public class Image implements IAffichable, IImprimable {


private String nom ;
private File fichier ;
public void afficher(){...}
public void imprimer(){...}
}

Image
- nom : String
- fichier : File
+ afficher()
+ imprimer()

B.4.6 Associations
A1

60

B1

public class A1 {
private B1 b1 ;
...
}

B.4. Correspondance UML-Java


*

A2

B2

public class Homme {


private Femme epouse ;
...
}

Homme

0..1

mari

0..1
epouse
Femme

Personne

public class A2 {
private ArrayList<B2> b2s ;
...
}

1
chef

0..*
subordonne

public class Femme {


private Homme mari ;
...
}
public class Personne {
private ArrayList<Personne> subordonnes ;
private Personne chef ;
...
}

61

Annexe B. Diagramme de classes UML

62

Rfrences
Livres :
Programmer en Java, e Edition, Claude Delannoy, Eyrolles,
e Java Tutorial : A Short Course on the Basics, th Edition, Collectif, Prentice Hall,

Eective Java, nd Edition, Joshua Bloch, Prentice Hall,


Java in a nutshell, th edition, David Flanagan, OReilly,
Sites web :
Le site ociel Java, http://www.oracle.com/technetwork/java/index.html
Le tutorial Java, http://docs.oracle.com/javase/tutorial/
lAPI du JDK ., http://docs.oracle.com/javase/7/docs/api/
Un site (franais) de dveloppeurs, http://www.javafr.com/
Le site JavaWorld, http://www.javaworld.com
Quelques autres liens :
des liens en rapport avec Java, http://www.javamug.org/mainpages/Java.html
Tutoriaux jGuru, http://java.sun.com/developer/onlineTraining/
plein dautres cours, http://java.developpez.com/cours/

63