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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Hritage
. Principe de lhritage . . . . . .
..
Rednition . . . . . . .
.. Polymorphisme . . . .
. Interfaces . . . . . . . . . . . . .
. Classes abstraites . . . . . . . . .
. Classes et mthodes gnriques
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
iii
.
.
.
.
.
.
.
.
.
iv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
La plupart des programmes donns en exemple dans ce cours sont tlchargeables lURL :
http://www.emse.fr/~picard/cours/1A/java
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.
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
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
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
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 ;
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
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);
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 ;
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 ;
Types primitifs
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;
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
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.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
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
==
!=
&
&&
||
?:
=
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
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...
. 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
. 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...
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
Exemple :
for (int i = 0, j = 49 ; (i < 25) && (j >= 25); i++, j--)
if (tab[i] > tab[j]) {
int tampon = tab[j];
2.3.3
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);
}
}
* 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
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.* ;
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 ..).
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
private
Oui
Oui
dfaut
Oui
Oui
Oui
Oui
Non
Non
Oui
Non
Non
Non
public
protected
Oui
Oui
Oui
Non
15
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
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
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
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.
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
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
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);
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 :
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
De plus, il faut rtablir lhritage des classes Rectangle et Cercle vers Forme :
public class Rectangle extends Forme {
...
}
et
public class Cercle extends Forme {
...
}
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
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.
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
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 ;
}
28
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.
5.4
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
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.1
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
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
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
6.1.3
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.1
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
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
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.3
Ecriture dobjets
* 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
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).
F A. Exemple de JButton
des donnes ou de lapparence. Dans ces cas-l, un modle par dfaut est utilis.
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
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
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
Comp1
Comp2
Comp3
...
F A. Dcoupage du FlowLayout
Comp1
Comp2
Comp3
Comp4
Comp5
Comp6
Comp7
Comp8
Comp9
Comp10
Comp11
Comp12
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
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
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
48
java.awt.* ;
java.util.Vector ;
javax.swing.* ;
javax.swing.border.EmptyBorder ;
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 ;
import
import
import
import
// creation de la liste
textList = new JList(listData);
textList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
49
50
// 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 ;
bas.add(scrollPane, BorderLayout.NORTH);
bas.add(textPanel, BorderLayout.SOUTH);
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
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)
52
public ExControleur() {
// appel au constructeur de ExInterface pour creer la
// fenetre et ses composants
super();
import java.awt.event.* ;
import javax.swing.* ;
import javax.swing.event.* ;
Dessin dessin ;
53
54
public ChoiceControler(Dessin d) {
dessin = d ;
}
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).
Nom de
classe
Nom de
classe
Attribut
Attribut
Opration
Opration
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
La gure B. est un exemple dune classe Personne avec toutes les possibilits de visibilit.
Personne
<<interface>>
Interface
F B. Exemple 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
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
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
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.
Personne
+ surnom : String
- nom : String
- prenom : String
# dateNaissance : Date
- ageMajorite : int = 18
+ calculerDureePret() : int
+ setAgeMajorite(a : int)
+ getAge() : int
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()
Image
- nom : String
- fichier : File
+ afficher()
+ imprimer()
B.4.6 Associations
A1
60
B1
public class A1 {
private B1 b1 ;
...
}
A2
B2
Homme
0..1
mari
0..1
epouse
Femme
Personne
public class A2 {
private ArrayList<B2> b2s ;
...
}
1
chef
0..*
subordonne
61
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,
63