0% ont trouvé ce document utile (0 vote)
233 vues107 pages

Cours Java Programmation

Le document présente les concepts fondamentaux de la programmation orientée objet en Java, notamment les classes, objets, héritage, polymorphisme, exceptions, interfaces graphiques et threads.

Transféré par

foxthrouth
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
233 vues107 pages

Cours Java Programmation

Le document présente les concepts fondamentaux de la programmation orientée objet en Java, notamment les classes, objets, héritage, polymorphisme, exceptions, interfaces graphiques et threads.

Transféré par

foxthrouth
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 107

Programmation en Java

Alexandre Mesle
15 juillet 2009

Table des mati`


eres
1 Notes de cours
1.1 Introduction . . . . . . . . . . . . . . . .
1.1.1 Hello World ! . . . . . . . . . . .
1.1.2 Formats de fichiers . . . . . . . .
1.1.3 Machine virtuelle . . . . . . . . .
1.1.4 Linkage . . . . . . . . . . . . . .
1.2 Le Java procedural . . . . . . . . . . . .
1.2.1 Structure dune classe . . . . . .
1.2.2 Variables . . . . . . . . . . . . .
1.2.3 Entrees-sorties . . . . . . . . . .
1.2.4 Sous-programmes . . . . . . . . .
1.2.5 Main . . . . . . . . . . . . . . . .
1.2.6 Instructions de contr
ole de flux .
1.2.7 Exemple recapitulatif . . . . . .
1.3 Objets . . . . . . . . . . . . . . . . . . .
1.3.1 Creation dun type . . . . . . . .
1.3.2 Les methodes . . . . . . . . . . .
1.3.3 Linstanciation . . . . . . . . . .
1.3.4 Les packages . . . . . . . . . . .
1.3.5 Le mot-cle this . . . . . . . . .
1.4 Tableaux . . . . . . . . . . . . . . . . .
1.4.1 Declaration . . . . . . . . . . . .
1.4.2 Instanciation . . . . . . . . . . .
1.4.3 Acc`es aux elements . . . . . . . .
1.4.4 Longueur dun tableau . . . . . .
1.4.5 Tableaux `
a plusieurs dimensions
1.5 Encapsulation . . . . . . . . . . . . . . .
1.5.1 Exemple . . . . . . . . . . . . . .
1.5.2 Visibilite . . . . . . . . . . . . .
1.5.3 Constructeur . . . . . . . . . . .
1.5.4 Accesseurs . . . . . . . . . . . . .
1.5.5 Surcharge . . . . . . . . . . . . .
1.6 Heritage . . . . . . . . . . . . . . . . . .
1.6.1 Heritage . . . . . . . . . . . . . .
1.6.2 Polymorphisme . . . . . . . . . .
1.6.3 Redefinition de methodes . . . .
1.6.4 Interfaces . . . . . . . . . . . . .
1.6.5 Classes Abstraites . . . . . . . .
1.7 Exceptions . . . . . . . . . . . . . . . .
1.7.1 Rattraper une exception . . . . .
1.7.2 Methodes levant des exceptions .
1.7.3 Propagation dune exception . .
1.7.4 Definir une exception . . . . . .

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

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4
4
4
4
4
5
6
6
6
6
7
7
7
7
9
9
9
10
11
11
12
12
12
12
13
13
14
14
16
18
20
20
23
23
24
24
24
25
27
27
28
28
28

1.7.5 Lever une exception . . . . . . . . . . .


1.7.6 Rattraper plusieurs exceptions . . . . .
1.7.7 Finally . . . . . . . . . . . . . . . . . . .
1.7.8 RuntimeException . . . . . . . . . . . .
1.8 Interfaces graphiques . . . . . . . . . . . . . . .
1.8.1 Fenetres . . . . . . . . . . . . . . . . . .
1.8.2 Un premier objet graphique . . . . . . .
1.8.3 Ecouteurs devenements . . . . . . . . .
1.8.4 Premier exemple . . . . . . . . . . . . .
1.8.5 Classes anonymes . . . . . . . . . . . . .
1.8.6 Gestionnaires de mise en forme . . . . .
1.8.7 Un exemple complet : Calcul dun carre
1.9 Collections . . . . . . . . . . . . . . . . . . . .
1.9.1 Packages . . . . . . . . . . . . . . . . . .
1.9.2 Types parametres . . . . . . . . . . . .
1.9.3 Collections standard . . . . . . . . . . .
1.10 Threads . . . . . . . . . . . . . . . . . . . . . .
1.10.1 Le principe . . . . . . . . . . . . . . . .
1.10.2 Synchronisation . . . . . . . . . . . . . .
1.10.3 Mise en Attente . . . . . . . . . . . . .
2 Exercices
2.1 Le Java procedural . . . . . . . . .
2.1.1 Initiation . . . . . . . . . .
2.1.2 Arithmetique . . . . . . . .
2.1.3 Pour le sport . . . . . . . .
2.2 Objets . . . . . . . . . . . . . . . .
2.2.1 Creation dune classe . . . .
2.2.2 Methodes . . . . . . . . . .
2.3 Tableaux . . . . . . . . . . . . . .
2.3.1 Prise en main . . . . . . . .
2.3.2 Tris . . . . . . . . . . . . .
2.4 Encapsulation . . . . . . . . . . . .
2.4.1 Prise en main . . . . . . . .
2.4.2 Implementation dune Pile .
2.5 Heritage . . . . . . . . . . . . . . .
2.5.1 Heritage . . . . . . . . . . .
2.5.2 Interfaces . . . . . . . . . .
2.5.3 Classes abstraites . . . . . .
2.6 Exceptions . . . . . . . . . . . . .
2.7 Interfaces graphiques . . . . . . . .
2.7.1 Prise en main . . . . . . . .
2.7.2 Maintenant debrouillez-vous
2.8 Collections . . . . . . . . . . . . .
2.8.1 Packages . . . . . . . . . . .
2.8.2 Types parametrees . . . . .
2.8.3 Collections . . . . . . . . .
2.9 Threads . . . . . . . . . . . . . . .
2.9.1 Prise en main . . . . . . . .
2.9.2 Synchronisation . . . . . . .
2.9.3 Debrouillez-vous . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

29
29
29
30
31
31
32
32
32
33
34
35
37
37
37
38
40
40
40
41

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

44
44
44
44
45
46
46
46
47
47
47
48
48
50
54
54
54
54
55
56
56
56
57
57
57
57
58
58
58
58

3 Corrig
es
3.1 Java Procedural . . . . . . . . . . . . .
3.1.1 Initiation . . . . . . . . . . . .
3.1.2 Arithmetique . . . . . . . . . .
3.1.3 Pour le sport . . . . . . . . . .
3.2 Objets . . . . . . . . . . . . . . . . . .
3.2.1 Creation dune classe . . . . . .
3.2.2 Methodes . . . . . . . . . . . .
3.3 Tableaux . . . . . . . . . . . . . . . .
3.3.1 Prise en main . . . . . . . . . .
3.3.2 Tris . . . . . . . . . . . . . . .
3.4 Encapsulation . . . . . . . . . . . . . .
3.4.1 Prise en main . . . . . . . . . .
3.4.2 Implementation dune pile . . .
3.5 Heritage . . . . . . . . . . . . . . . . .
3.5.1 Heritage . . . . . . . . . . . . .
3.5.2 Interfaces . . . . . . . . . . . .
3.5.3 Classes abstraites . . . . . . . .
3.6 Exceptions . . . . . . . . . . . . . . .
3.7 Interfaces graphiques . . . . . . . . . .

3.7.1 Ecouteurs
devenement . . . .
3.7.2 Gestionnaires de mise en forme
3.8 Collections . . . . . . . . . . . . . . .
3.8.1 Deux objets . . . . . . . . . . .
3.8.2 Package Pile . . . . . . . . . .
3.8.3 Parcours . . . . . . . . . . . . .
3.9 Threads . . . . . . . . . . . . . . . . .
3.9.1 Prise en main . . . . . . . . . .
3.9.2 Synchronisation . . . . . . . . .
3.9.3 Mise en attente . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

59
59
59
59
60
62
62
63
64
64
65
67
67
71
75
75
79
84
90
93
93
94
95
95
96
99
100
100
100
102

Chapitre 1

Notes de cours
1.1

Introduction

1.1.1

Hello World !

Copiez le code ci-dessous dans un fichier que vous enregistrerez sous le nom HelloWorld.java.
public c l a s s H e l l o W o r l d
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
System . o u t . p r i n t l n ( H e l l o World ) ;
}
}

Ensuite, executez la commande


javac HelloWorld.java
Lexecution de cette commande doit normalement faire un apparatre un fichier HelloWorld.class.
Saisissez ensuite la commande :
java HelloWorld
Theoriquement, ce programme devrait afficher
Hello World

1.1.2

Formats de fichiers

Les programmes java contiennent ce que lon appelle des classes. Pour le moment nous ne mettrons
quune seule classe par fichier et nous donnerons au fichier le meme nom que la classe quil contient. Les
fichiers sources portent lextension .java tandis que les programmes compiles portent lextension .class.
Le compilateur que nous avons invoque en ligne de commande avec linstruction javac, a genere le fichier
.class correspondant au fichier source passe en argument.

1.1.3

Machine virtuelle

Le fichier .class nest pas un executable, il contient ce que lon appelle du pseudo-code. Le pseudocode nest pas executable directement sur la plate-forme (syst`ele dexploitation) pour laquelle il a ete
compile, il est necessaire de passer par un logiciel appele une machine virtuelle. La machine virtuelle
lit le pseudo-code et lintepr`ete (i.e. lexecute). Le grand avantage de Java est que le pseudo code ne
depend pas de la plate-forme mais de la machine virtuelle. Un programme compile peut etre execute par
nimporte quel OS, la seule necessite est de posseder une machine virtuelle Java (JVM) adaptee `a cette
plateforme.

1.1.4

Linkage

En java, le linkage se fait `


a lexecution, cela signifie que si vous modifiez un fichier, vous aurez une seule
classe `
a recompiler, et vous pourrez immediatement executer votre application.

1.2

Le Java proc
edural

Ce cours vous introduit au Java dans sa dimension procedurale. Le but de ce cours est de vous familiariser
avec les instructions de base avant daborder les concepts de la programmation objet.

1.2.1

Structure dune classe

Pour le moment, nous appellerons classe un programme Java. Une classe se presente de la sorte :
c l a s s NomClasse
{
/
Class contents
/
}
Vous remarquez que de facon analogue au C, une classe est un bloc delimite par des accolades et que
les commentaires decrivent de la meme facon. On ecrit les noms des classes en concatenant les mots
composant ce nom et en faisant commencer chacun deux par une majuscule. Noubliez pas de ne mettre
quune seule classe par fichier et de donner au fichier le meme nom que celui de cette classe.

1.2.2

Variables

Nous disposons en Java des memes types quen C. Tous les types mis `a votre disposition par Java sont
appele types primitifs.
Bool
eens
Lun deux nous servira toutefois `
a ecrire des choses que lon redige habituellement de facon crade en C :
boolean. Une variable de type boolean peut prendre une des deux valeurs true et false, et seulement
une de ces deux valeurs. On declare et utilise les variables exactement de la meme facon quen C.
Chanes de caract`
eres
Il existe un type chane de caract`eres en C. Nous lexaminerons plus details ulterieurement. Les deux
choses `
a savoir est que le type chane de caract`eres est String, et que loperateur de concatenation est +.
final
Les variables dont la declaration de type est precedee du mot-cle final sont non-modifiables. Une fois
quune valeur leur a ete affecte, il nest plus possible de les modifier. On sen sert pour representer des
constantes. Les r`egles typographiqus sont les memes : toutes les lettres en majuscules et les mots separes
par des . Par exemple,
f i n a l int TAILLE = 1 0 0 ;
Declare une constante TAILLE de type int initialisee `a 100.

1.2.3

Entr
ees-sorties

La saisie de variables est un calvaire inutile en Java, nous nous en passerons pour le moment. Pour afficher
un message, quel que soit son type, on utilise le sous-programme System.out.print. Par exemple,
System . out . p r i n t ( H e l l o World\n ) ;
Le sous-programme System.out.println ajoute automatiquement un retour `a la ligne apr`es laffichage.
On aurait donc pu ecrire :
System . out . p r i n t l n ( H e l l o World ) ;

Il est aussi possible dintercaler valeurs de variables et chanes de caract`eres constantes, on separe les
arguments par des +. Par exemple,
System . out . p r i n t l n ( La v a l e u r de a e s t + a +
e t c e l l e de b e s t + b ) ;

1.2.4

Sous-programmes

On definit en Java des sous-programmes de la meme facon quen C, attention toutefois, les sous-programmes
que nous definirons dans ce cours seront declares avec le mot-cle static. Par exemple, si je veux faire un
sous-programme qui retourne le successeur de la valeur passee en argument cela donne
class TestJavaProcedural
{
s t a t i c int s u c c ( int i )
{
return i + 1 ;
}
/
A ut re s sousprogrammes
/
}
Si vous oubliez le mot cle static, le compilateur vous enverra des insultes. Nous verrons plus tard ce que
signifie ce mot et dans quels cas il est possible de sen passer. Attention : Tous les types primitifs en Java
se passent en param`etre par valeur, et cette fois-ci je ne vous mens pas !

1.2.5

Main

Lorsque vous invoquez la machine virtuelle, elle part `a la recherche dun sous-programme particulier
appele main. Il est imperatif quil soit defini comme suit :
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
/
instructions
/
}
La signification du mot-cle public vous sera expliquee ulterieurement. La seule chose dont il faut prendre
note est que vous ne devez pas loubliez, sinon la machine virtuelle vous enverra des insultes !

1.2.6

Instructions de contr
ole de flux

En Java, les instructions if, switch, for, while et do ... while se comportent de la meme facon quen
C. Donc, pas dexplications complementaires...

1.2.7

Exemple r
ecapitulatif

Nous avons maintenant tout ce quil faut pour ecrire un petit programme :
public c l a s s Exemple
{
/
Retourne l e nombre b e l e v e a l a p u i s s a n c e n .
/
static int puissance ( int b , int n)
{

int r e s = 1 ;
for ( int i = 1 ;
r e s = b ;
return r e s ;

i <= n ;

i ++)

}
/
A f f i c h e {2 k | k = 0 , . . . , 3 0 } .
/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
f o r ( i n t k = 0 ; k <= 30 ; k++)
System . o u t . p r i n t l n ( 2 + k + = + p u i s s a n c e ( 2 , k ) ) ;
}
}

1.3

Objets

Dans un langage de programmation, un type est


Un ensemble de valeurs
Des op
erations sur ces valeurs
En plus des types primitifs, il est possible en Java de creer ses propres types. On appelle type construit
un type non primitif, cest-`
a-dire compose de types primitifs. Certains types construits sont fournis dans
les biblioth`eques du langage. Si ceux-l`
a ne vosu satisfont pas, vous avez la possibilite de creer vos propres
types.

1.3.1

Cr
eation dun type

Nous souhaitons creer un type Point dans R2 . Chaque variable de ce type aura deux attributs, une
abscisse et une ordonnee. Le type point se compose donc `a partir de deux types flottants. Un type
construit sappelle une classe. On le definit comme suit :
public c l a s s P oi nt
{
float abscisse ;
f l o a t ordonnee ;
}
Les deux attributs dun objet de type Point sappelle aussi des champs. Une fois definie cette classe, le
type Point est une type comme les autres, il devient donc possible decrire
Po i nt p , q ;
Cette instruction declare deux variables p et q de type Point, ces variables sappellent des objets. Chacun
de ces objets a deux attributs auxquels on acc`ede avec la notation pointee. Par exemple, labscisse du
point p est p.abscisse et son ordonnee est p.ordonnee. Le fonctionnement est, pour le moment, le meme
que pour les structures en C.

1.3.2

Les m
ethodes

Non contents davoir defini ainsi un ensemble de valeurs, nous souhaiterions definir un ensembe doperations
sur ces valeurs. Nous allons pour ce faire nous servir de m
ethodes. Une methode est un sous-programme
propre `
a chaque objet. Cest-`
a-dire dont le contexte dexecution est delimite par un objet. Par exemple,
public c l a s s P oi nt
{
float abscisse ;
f l o a t ordonnee ;
void p r e s e n t e T o i ( )
{
System . out . p r i n t l n ( Je s u i s un p o i n t , mes c o o r d o n ne e s s o n t (
+ a b s c i s s e + , + ordonnee + ) ) ;
}
}
La methode presenteToi sinvoque `
a partir dun objet de type Point. La syntaxe est p.presenteToi()
o`
u p est de type Point. p est alors le contexte de lexecution de presenteToi et les champs auquel
acc`edera cette methode seront ceux de lobjet p. Si par exemple, on ecrit q.presenteToi(), cest q qui
servira de contexte `
a lexecution de presenteToi. Lorsque lon redige une methode, lobjet servant de
contexte `
a lexecution de la methode est appele lobjet courant.

1.3.3

Linstanciation

Essayons maintenant, impatients et nerveux, de verifier ce que donnerait lexecution de


public c l a s s P oi nt
{
float abscisse ;
f l o a t ordonnee ;
void p r e s e n t e T o i ( )
{
System . out . p r i n t l n ( Je s u i s un p o i n t , mes c o o r d o n ne e s s o n t (
+ a b s c i s s e + , + ordonnee + ) ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
P oi nt p ;
p. abscisse = 1;
p . ordonnee = 2 ;
p . presenteToi ( ) ;
}
}
Pas de chance, ce programme ne compile pas. Et davantage pointilleux que le C, le compilateur de Java
sarrete au moindre petit souci... Le message derreur `a la compilation est le suivant :
Point.java:15: variable p might not have been initialized
p.abscisse = 1;
^
1 error
Que peut bien signifier ce charabia ? Cela signifie que le compilateur a de tr`es serieuses raisons de penser
que p contient pas dobjet. En Java, toutes les variables de type construit sont des pointeurs. Et les pointeurs non initialises (avec malloc en C) sont des pointeurs ayant la valeur null. Pour faire une allocation
dynamique en Java, on utilise linstruction new. On fait alors ce que lon appelle une instanciation. La
syntaxe est donnee dans lexemple suivant :
p = new P oi nt ( ) ;
Cette instruction cree un objet de type Point et place son adresse dans p. Ainsi p nest pas un objet,
mais juste un pointeur vers un objet de type Point qui a ete cree par le new. Et `a partir de ce moment-l`
a,
il devient possible dacceder aux champs de p. new fonctionne donc de facon similaire `a malloc et le
programme suivant est valide :
public c l a s s P o i n t
{
float abscisse ;
f l o a t ordonnee ;
void p r e s e n t e T o i ( )
{
System . o u t . p r i n t l n ( Je s u i s un p o i n t , mes c o o r d o n n e e s s o n t (
+ a b s c i s s e + , + ordonnee + ) ) ;
}
public s t a t i c void main ( S t r i n g [ ]
{
Point p ;
p = new P o i n t ( ) ;
p . abscisse = 1;
p . ordonnee = 2 ;
p . presenteToi ( ) ;
}

args )

10

Vous remarquez quil ny a pas de fonction de destruction (free() en C). Un programme appele Garbage
Collector (ramasse-miette en francais) est execute dans la machine virtuelle et se charge deliminer les
objets non references.

1.3.4

Les packages

Bon nombre de classes sont predefinies en Java, elles sont reparties dans des packages, pour utilisez une
classe se trouvant dans un package, on limporte au debut du fichier source. Pour importer un package,
on utilise linstruction import.

1.3.5

Le mot-cl
e this

Dans toute methode, vous disposez dune reference vers lobjets servant de contexte `a lexecution de la
methode, cette reference sappelle this.

11

1.4
1.4.1

Tableaux
D
eclaration

Un tableau en Java est un objet. Il est necessaire de le creer par allocation dynamique avec un new en
precisant ses dimensions. On note
T[ ]
le type tableau delements de type T. La taille du tableau nest precisee qu`a linstanciation. On declare
un tableau t delements de type T de la facon suivante :
T[ ] t ;
Par exemple, si lon souhaite creer un tableau i delements de type int, on utilise linstruction :
int [ ] i ;

1.4.2

Instanciation

Comme un tableau est un objet, il est necessaire dinstancier pendant lexecution. On instancie un tableau
avec linstruction
new T [ t a i l l e ]
Par exemple, si lon souhaite declarer et allouer dynamiquement un tableau de 100 entiers, en utilise
int [ ] i =

1.4.3

new int [ 1 0 0 ] ;

Acc`
es aux
el
ements

On acc`ede aux elements dun tableau avec la notation `a crochets, par exemple,
int [ ] t = new int [ 1 0 0 ] ;
f o r ( int i = 0 ; i < 100 ; i ++)
{
t [ i ] = 100 ( i + 1 ) ;
Sytem . out . p r i n t l n ( t [ i ] ) ;
}
On remarque que la variable i est declaree `a linterieur de la boucle for, cette facon de declarer les
variables est tr`es utile en Java. Dans lexemple,
public c l a s s ExempleTableau
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
f i n a l int T = 2 0 ;
int [ ] t = new int [ T ] ;
f o r ( int i = 0 ; i < T ; i ++)
t[i] = i;
f o r ( int i = 0 ; i < T ; i ++)
System . out . p r i n t l n ( t [ i ] ) ;
}
}
Une tableau est alloue dynamiquement et ses dimensions sont de taille fixee `a la compilation.

12

1.4.4

Longueur dun tableau

Pour connatre la taille dun tableau on utilise lattribut length. Par exemple,
int [ ] t = new int [ T ] ;
f o r ( int i = 0 ; i < t . l e n g t h ; i ++)
t[i] = i;
f o r ( int i = 0 ; i < t . l e n g t h ; i ++)
System . out . p r i n t l n ( t [ i ] ) ;

1.4.5

Tableaux `
a plusieurs dimensions

On cree un tableau `
a plusieurs dimensions (3 par exemple) en juxtaposant plusieurs crochets. Par exemple,
int [ ] [ ] [ ]
f o r ( int i
f o r ( int j
f o r ( int k

t = new int [ 2 ] [ 2 ] [ 2 ] ;
= 0 ; i < 2 ; i ++)
= 0 ; i < 2 ; j ++)
= 0 ; i < 2 ; k++)
T=t [ i ] [ j ] [ k ] = 100 i + 10 i + k ;
Sytem . out . p r i n t l n ( t [ i ] [ j ] [ k ] ) ;

}
On encore,
public c l a s s ExempleCubique
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
f i n a l int T = 3 ;
int [ ] [ ] [ ] u = new int [ T ] [ T ] [ T ] ;
f o r ( int i = 0 ; i < T ; i ++)
f o r ( int j = 0 ; j < T ; j ++)
f o r ( int k = 0 ; k < T ; k++)
{
u [ i ] [ j ] [ k ] = 100 i + 10 j + k ;
System . out . p r i n t l n ( u [ i ] [ j ] [ k ] ) ;
}
}
}

13

1.5

Encapsulation

1.5.1

Exemple

Implementons une file de nombre entiers. Nous avons un exemple dans le fichier suivant :
public c l a s s F i l e P u b l i c
{
/
Elements de l a f i l e
/
int [ ] e n t i e r s ;
/ /
/
I n d i c e de l a t e t e de f i l e e t du p r e m i e r emplacement l i b r e
dans l e t a b l e a u .
/
int f i r s t , f i r s t F r e e ;
/ /
/
I n i t i a l i s e l e s a t t r i b u t s de l a f i l e .
/
public void i n i t ( int t a i l l e )
{
e n t i e r s = new int [ t a i l l e ] ;
f i r s t = firstFree = 0;
}
/ /
/
D e ca l e i d une p o s i t i o n v e r s l a d r o i t e dans l e t a b l e a u ,
r e v i e n t au d e b u t s i i d e b o r d e .
/
public int i n c r e m e n t e I n d i c e ( int i )
{
i ++;
i f ( i == e n t i e r s . l e n g t h )
i = 0;
return i ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i l a f i l e
est pleine .
/
14

public boolean e s t P l e i n ( )
{
return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i
la f i l e est vide .
/
public boolean e s t V i d e ( )
{
return f i r s t == f i r s t F r e e ;
}
/ /
/
A j o u t e l e l e m e n t n dans l a f i l e .
/
public void e n f i l e ( int n )
{
if (! estPlein ())
{
entiers [ firstFree ] = n;
f i r s t F r e e = incrementeIndice ( f i r s t F r e e ) ;
}
}
/ /
/
Supprime l a t e t e de f i l e .
/
public void d e f i l e ( )
{
i f ( ! estVide ( ) )
f i r s t = incrementeIndice ( f i r s t ) ;
}
/ /
/
Retourne l a t e t e de f i l e .
/
public int p r e m i e r ( )
{
i f ( ! estVide ( ) )

15

return e n t i e r s [ f i r s t ] ;
return 0 ;
}
}
Un exemple typique dutilisation de cette file est donne ci-dessous :
public c l a s s T e s t F i l e P u b l i c
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i l e P u b l i c f = new F i l e P u b l i c ( ) ;
f . init (20);
f o r ( int i = 0 ; i < 30 ; i +=2)
{
f . enfile ( i );
f . e n f i l e ( i +1);
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
while ( ! f . e s t V i d e ( ) )
{
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
}
}
Si vous travaillez en equipe, et que vous etes lauteur dune classe FilePublic, vous naimeriez pas que
vos coll`egues programmeurs sen servent nimporte comment ! Vous naimeriez pas par exemple quils
manipulent le tableau entiers ou lattribut first sans passer par les methodes, par exemple :
F i l e P u b l i c f = new F i l e P u b l i c ( ) ;
f . init (20);
f . entiers [ 4 ] = 3;
f . f i r s t += 5 ;
/ . . . a r r e t o n s l a l e s h o r r e u r s . . . /
Il serait appreciable que nous puissions interdire de telles instructions. Cest-`a-dire forcer lutilisateur de
la classe `
a passer par les methodes pour manier la file.

1.5.2

Visibilit
e

La visibilit
e dun identificateur (attribut, methode ou classe) est lensemble des endroits dans le code ou
il est possible de lutiliser. Si un identificateur et precede du mot cle public, cela signifie quil est visible
partout. Si un identificateur et precede du mot cle private, cela signifie quil nest visible qu`a linterieur
de la classe. Seule linstance `
a qui cet identificateur appartient pourra lutiliser. Par exemple :
public c l a s s F i l e P r i v a t e
{
private int [ ] e n t i e r s ;
private int f i r s t , f i r s t F r e e ;
public void i n i t ( int t a i l l e )
{
e n t i e r s = new int [ t a i l l e ] ;
f i r s t = firstFree = 0;
}
16

private int i n c r e m e n t e I n d i c e ( int i )


{
i ++;
i f ( i == e n t i e r s . l e n g t h )
i = 0;
return i ;
}
public boolean e s t P l e i n ( )
{
return f i r s t == f i r s t F r e e + 1 ;
}
public boolean e s t V i d e ( )
{
return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;
}
public void e n f i l e ( int n )
{
if (! estPlein ())
{
entiers [ firstFree ] = n;
f i r s t F r e e = incrementeIndice ( f i r s t F r e e ) ;
}
}
public void d e f i l e ( )
{
i f ( ! estVide ( ) )
f i r s t = incrementeIndice ( f i r s t ) ;
}
public int p r e m i e r ( )
{
i f ( ! estVide ( ) )
return e n t i e r s [ f i r s t ] ;
return 0 ;
}
}
On teste cette classe de la meme facon :
public c l a s s T e s t F i l e P r i v a t e
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i l e P r i v a t e f = new F i l e P r i v a t e ( ) ;
f . init (20);
f o r ( int i = 0 ; i < 30 ; i +=2)
{
f . enfile ( i );
f . e n f i l e ( i +1);
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
17

}
while ( ! f . e s t V i d e ( ) )
{
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
}
}
Sil vous vient lidee saugrenue dexecuter les instructions :
F i l e P r i v a t e f = new F i l e P r i v a t e ( ) ;
f . init (20);
f . entiers [ 4 ] = 3;
f . f i r s t += 5 ;
/ . . . a r r e t o n s l a l e s h o r r e u r s . . . /
vous ne passerez pas la compilation. Comme les champs entiers et first sont private, il est impossible
de les utiliser avec la notation pointee. Cela signifie quils ne sont accessibles que depuis linstance de
la classe FilePrivate qui sert de contexte `a leur execution. De cette facon vous etes certain que votre
classe fonctionnera correctement. En declarant des champs prives, vous avez cache les divers details
de limplementation, cela sappelle lencapsulation. Celle-ci a pour but de faciliter le travail de tout
programmeur qui utilisera cette classe en masquant la complexite de votre code. Les informations `
a
communiquer `
a lutilisateur de la classe sont la liste des methodes publiques. A savoir
public c l a s s F i l e P r i v a t e
{
public void i n i t ( int t a i l l e ) { / . . . / }
public boolean e s t P l e i n ( ) { / . . . / }
public boolean e s t V i d e ( ) { / . . . / }
public void e n f i l e ( int n ) { / . . . / }
public void d e f i l e ( ) { / . . . / }
public int p r e m i e r ( ) { / . . . / }
}
On remarque non seulement quil plus aise de comprendre comment utiliser la file en regardant ces
quelques methodes mais surtout que la facon dont a ete implemente la file est totalement masquee.

1.5.3

Constructeur

Supposons que notre utilisateur oublie dinvoquer la methode init(int taille), que va-t-il se passer ?
Votre classe va planter. Comment faire pour etre certain que toutes les variables seront initialisees ? Un
constructeur est un sous-programme appele automatiquement `a la creation de tout objet. Il porte le
meme nom que la classe et na pas de valeur de retour. De plus, il est possible de lui passer des param`etres
au moment de linstanciation. Remplacons init par un constructeur :
public c l a s s F i l e C o n s t r u c t e u r
{
private int [ ] e n t i e r s ;
private int f i r s t , f i r s t F r e e ;
F i l e C o n s t r u c t e u r ( int t a i l l e )
{
e n t i e r s = new int [ t a i l l e ] ;
f i r s t = firstFree = 0;
}
private int i n c r e m e n t e I n d i c e ( int i )
18

{
i ++;
i f ( i == e n t i e r s . l e n g t h )
i = 0;
return i ;
}
public boolean e s t P l e i n ( )
{
return f i r s t == f i r s t F r e e + 1 ;
}
public boolean e s t V i d e ( )
{
return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;
}
public void e n f i l e ( int n )
{
if (! estPlein ())
{
entiers [ firstFree ] = n;
f i r s t F r e e = incrementeIndice ( f i r s t F r e e ) ;
}
}
public void d e f i l e ( )
{
i f ( ! estVide ( ) )
f i r s t = incrementeIndice ( f i r s t ) ;
}
public int p r e m i e r ( )
{
i f ( ! estVide ( ) )
return e n t i e r s [ f i r s t ] ;
return 0 ;
}
}
On peut alors lutiliser sans la methode init,
public c l a s s T e s t F i l e C o n s t r u c t e u r
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i l e C o n s t r u c t e u r f = new F i l e C o n s t r u c t e u r ( 2 0 ) ;
f o r ( int i = 0 ; i < 30 ; i +=2)
{
f . enfile ( i );
f . e n f i l e ( i +1);
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
while ( ! f . e s t V i d e ( ) )
{
19

System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
}
}

1.5.4

Accesseurs

Il est de bonne programmation de declarer tous les attributs en prive, et de permettre leur acc`es en
forcant lutilisateur `
a passer par des methodes. Si un attribut X est prive, on cree deux methodes getX
et setX permettant de manier X. Par exemple,
public c l a s s ExempleAccesseurs
{
private int f o o ;
public int getFoo ( )
{
return f o o ;
}
public void s e t F o o ( int v a l u e )
{
foo = value ;
}
}
On ainsi la possibilite de manier des attributs prives indirectement.

1.5.5

Surcharge

Il est possible de definir dans une meme classe plusieurs fonctions portant le meme nom. Par exemple,
public c l a s s F i l e S u r c h a r g e
{
private int [ ] e n t i e r s ;
private int f i r s t , f i r s t F r e e ;
F i l e S u r c h a r g e ( int t a i l l e )
{
e n t i e r s = new int [ t a i l l e ] ;
f i r s t = firstFree = 0;
}
FileSurcharge ( FileSurcharge other )
{
this ( other . e n t i e r s . length ) ;
f o r ( int i = 0 ; i < o t h e r . e n t i e r s . l e n g t h ; i ++)
e n t i e r s [ i ] = other . e n t i e r s [ i ] ;
f i r s t = other . f i r s t ;
f i r s t F r e e = other . f i r s t F r e e ;
}
private int i n c r e m e n t e I n d i c e ( int i )
{
i ++;

20

i f ( i == e n t i e r s . l e n g t h )
i = 0;
return i ;
}
public boolean e s t P l e i n ( )
{
return f i r s t == f i r s t F r e e + 1 ;
}
public boolean e s t V i d e ( )
{
return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;
}
public void e n f i l e ( int n )
{
if (! estPlein ())
{
entiers [ firstFree ] = n;
f i r s t F r e e = incrementeIndice ( f i r s t F r e e ) ;
}
}
public void d e f i l e ( )
{
i f ( ! estVide ( ) )
f i r s t = incrementeIndice ( f i r s t ) ;
}
public int p r e m i e r ( )
{
i f ( ! estVide ( ) )
return e n t i e r s [ f i r s t ] ;
return 0 ;
}
}
On remarque quil y a deux constructeurs. Lun prend la taille du tableau en param`etre et lautre est
un constructeur de copie. Selon le type de param`etre passe au moment de linstanciation, le constructeur
correspondant est execute. Dans lexemple ci-dessous, on cree une file g en applicant le constructeur de
copie `
a la file f .
public c l a s s T e s t F i l e S u r c h a r g e
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i l e S u r c h a r g e f = new F i l e S u r c h a r g e ( 2 0 ) ;
f o r ( int i = 0 ; i < 30 ; i +=2)
{
f . enfile ( i );
f . e n f i l e ( i +1);
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
F i l e S u r c h a r g e g = new F i l e S u r c h a r g e ( f ) ;
21

while ( ! f . e s t V i d e ( ) )
{
System . out . p r i n t l n ( f . p r e m i e r ( ) ) ;
f . defile ();
}
while ( ! g . e s t V i d e ( ) )
{
System . out . p r i n t l n ( g . p r e m i e r ( ) ) ;
g. defile ();
}
}
}

22

1.6

H
eritage

1.6.1

H
eritage

Le principe
Quand on dispose dune classe c, on a la possibilite de lagrandir (ou de letendre) en creant une deuxi`eme
classe c0 . On dit dans ce cas que c0 h
erite de c, ou encore que c est la classe m`
ere et c0 la classe fille.
Par exemple, considerons les deux classes suivantes :
public c l a s s ClasseMere
{
private f i n a l int x ;
public ClasseMere ( int x )
{
this . x = x ;
}
public int getX ( )
{
return x ;
}
}
public c l a s s C l a s s e F i l l e extends ClasseMere
{
private f i n a l int y ;
public C l a s s e F i l l e ( int x , int y )
{
super ( x ) ;
this . y = y ;
}
public int getY ( )
{
return y ;
}
}
Le mot-cle extends signifie h
erite de. Le mot-cle super est le constructeur de la classe m`ere. Tout ce
qui peut etre fait avec la classe m`ere peut aussi etre fait avec la classe fille. Notez donc que la classe fille
est une extension de la classe m`ere. On peut par exemple utiliser la classe fille de la facon suivante :
public c l a s s T e s t C l a s s e F i l l e
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
C l a s s e F i l l e o = new C l a s s e F i l l e ( 1 , 2 ) ;
System . out . p r i n t l n ( ( + o . getX ( ) + , +
o . getY ( ) + ) ) ;
}
}
Notes bien que comme la classe m`ere poss`ede une methode getX, la classe fille la poss`ede aussi. Et
lattribut x de tout instance de la classe m`ere est aussi un attribut de toute instance de la classe fille.

23

H
eritage simple Vs. h
eritage multiple
En java, une classe ne peut avoir quune seule classe m`ere. Dans dautres langages (comme le C++) cela
est permis, mais pour des raisons de fiabilite, Java linterdit.
Object
En java, toutes les classes heritent implicitement dune classe Object.

1.6.2

Polymorphisme

Considerons lexemple suivant :


public c l a s s T e s t C l a s s e F i l l e P o l y m o r p h i s m e
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
ClasseMere o = new C l a s s e F i l l e ( 1 , 2 ) ;
System . out . p r i n t l n ( ( + o . getX ( ) + , +
( ( C l a s s e F i l l e ) o ) . getY ( ) + ) ) ;
}
}
On remarque dune part que o reference un objet de la classe fille de son type. Cela sappelle le polymorphisme. Dautre part, si lon souhaite effectuer des operations specifiques aux objets de la classe fille, il
est necessaire deffectuer un cast.

1.6.3

Red
efinition de m
ethodes

La methode toString() appartient initialement `a la classe Object. Elle est donc heritee par toutes les
classes. Vous avez la possibilite de la redefinir, cest `a dire de remplacer la methode par defaut par une
methode davantage adaptee `
a la classe en question.

1.6.4

Interfaces

Une interface est un ensemble de constantes et de methodes vides. Il est impossible dinstancier une
interface. Il est necessaire que la classe qui herite de linterface (mot-cle implements) definisse les methodes
quelle contient. En voici un exemple dutilisation :
interface Presentable
{
public void p r e s e n t e T o i ( ) ;
}
public c l a s s E x e m p l e I n t e r f a c e implements P r e s e n t a b l e
{
public int x , y ;
public void p r e s e n t e T o i ( )
{
System . out . p r i n t l n ( Je s u i s un E x e m p l e I n t e r f a c e , x =
+ x + et y = + y + . ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
E x e m p l e I n t e r f a c e t = new E x e m p l e I n t e r f a c e ( ) ;

24

t . x = 1;
t . y = 2;
Presentable j = t ;
j . presenteToi ( ) ;
}
}
Vous remarquez que la methode PresenteToi est implementee dans la classe fille (sinon ca ne compilerait
pas). Comme t est aussi de type Presentable (en vertu du polymorphisme), il est possible de le placer
dans j. Comme tout objet Presentable poss`ede une methode PresenteToi, on peut invoquer cette
methode depuis j.

1.6.5

Classes Abstraites

Nous voulons representer des sommes dans des devises differentes et implementer automatiquement les
conversions. Nous allons creer une classe devise qui contiendra lattribut somme et nous utiliserons
lheritage pour implementer les specificites des diverses devises (Euros, Dollars, Livres, ...).
public abstract c l a s s D e v i s e
{
private double somme = 0 ;
public abstract double g e t C o u r s ( ) ;
public void setSomme ( D e v i s e d )
{
t h i s . somme = d . sommed . g e t C o u r s ( ) / t h i s . g e t C o u r s ( ) ;
}
public void setSomme ( double somme )
{
t h i s . somme = somme ;
}
public S t r i n g t o S t r i n g ( )
{
return somme = + somme + ;
}
}
La classe devise contient une methode setSomme qui est surchargee et qui peut prendre en param`etre soit
une somme exprimee dans la bonne unite, soit une autre devise.
public c l a s s Euros extends D e v i s e
{
public Euros ( D e v i s e d )
{
setSomme ( d ) ;
}
public Euros ( double somme )
{
setSomme ( somme ) ;
}
public double g e t C o u r s ( )
{
25

return 1 . 4 6 2 5 ;
}
public S t r i n g t o S t r i n g ( )
{
return super . t o S t r i n g ( ) + Euros ;
}
}
On remarque quil est impossible dimplementer getCours() car le cours varie selon la devise. La classe
Euros herite de la classe Devise et implemente getCours(). La classe Dollars fonctionne de facon
similaire :
public c l a s s D o l l a r s extends D e v i s e
{
public D o l l a r s ( D e v i s e d )
{
setSomme ( d ) ;
}
public D o l l a r s ( double somme )
{
setSomme ( somme ) ;
}
public double g e t C o u r s ( )
{
return 1 . ;
}
public S t r i n g t o S t r i n g ( )
{
return super . t o S t r i n g ( ) + D o l l a r s ;
}
}
Ces classes permettent de prendre en charge automatiquement les conversions entre devises :
public c l a s s T e s t D e v i s e s
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
D o l l a r s d = new D o l l a r s ( 1 2 ) ;
System . out . p r i n t l n ( d ) ;
Euros e = new Euros ( d ) ;
System . out . p r i n t l n ( e ) ;
L i v r e s l = new L i v r e s ( e ) ;
System . out . p r i n t l n ( l ) ;
}
}

26

1.7

Exceptions

Le mecanisme des exceptions en Java (et dans dautres langages objets) permet de gerer de facon elegante
les erreurs pouvant survenir `
a lexecution. Elles presentent trois avantages :
Obliger les programmeurs `
a gerer les erreurs.
Separer le code de traitement des erreurs du reste du code.
Rattraper les erreurs en cours dexecution.

1.7.1

Rattraper une exception

Lorsquune sequence dinstructions est susceptible doccasionner une erreur, on la place dans un bloc try.
Comme ci-dessous :
try
{
/
bloc d instructions
/
}
On place juste apr`es ce bloc un bloc catch qui permet de traiter lerreur :
try
{
/
bloc d instructions
/
}
catch ( nomErreur e )
{
/
Traitement de l e r r e u r
/
}
Une exception est une erreur pouvant
etre rattrap
ee en cours dex
ecution. Cela signifie que si
une erreur survient, une exception est lev
ee, le code du try est interrompu et le code contenu dans le
catch est execute. Par exemple,
try
{
int i = 0 ;
while ( true )
{
t [ i ++]++;
}
}
catch ( ArrayIndexOutOfBoundException e )
{
System . out . p r i n t l n ( An e x c e p t i o n has been r a i s e d . ) ;
}
Dans le code precedent lindice i est incremente jusqu`a ce que cet indice depasse la taille du tableau.
Dans ce cas lexception ArrayIndexOutOfBoundException est levee et le code correspondant `a cette
exception dans le catch est execute.

27

1.7.2

M
ethodes levant des exceptions

Si vous redigez une methode susceptible de lever une exception, vous devez le declarer en ajoutant `
a son
entete lexpression throws <listeExceptions>. Par exemple,
public void b o u r r e T a b l e a u ( ) throw ArrayIndexOutOfBoundException
{
int i = 0 ;
while ( true )
{
t [ i ++]++;
}
}
Vous remarquez quil ny a pas de try ... catch. Cela signifie que lerreur doit etre rattrapee dans le
sous-programme appelant. Par exemple,
try
{
bourreTableau ( ) ;
}
catch ( ArrayIndexOutOfBoundException e )
{
System . out . p r i n t l n ( I l f a l l a i t s y a t t e n d r e . . . ) ;
}
Bref, lorsquune instruction est susceptible de lever une exception, vous devez soit la rattraper tout de
suite, soit indiquer dans lentete du sous-programme quune exception peut se propager et quelle doit
donc etre traitee dans le sous-programme appelant.

1.7.3

Propagation dune exception

Par traiter une exception, on entend soit la rattraper tout de suite, soit la propager. Par propager,
on entend laisser le sous-programme appelant la traiter. Il est possible lorsque lon invoque un sousprogramme levant une exception, de la propager. Par exemple,
public void a p p e l l e B o u r r e T a b l e a u ( ) throws ArrayIndexOutOfBoundException
{
bourreTableau ( ) ;
}
On observe que appelleBourreTableau se contente de transmettre lexception au sous-programme appelant. Ce mode de fonctionnement fait quune exception non rattrapee va se propager dans la pile dappels
de sous-programmes jusqu`
a ce quelle soit rattrapee. Et si elle nest jamais rattrapee, cest la JVM, qui
va le faire.

1.7.4

D
efinir une exception

Une exception est tout simplement une classe heritant de la classe Exception.
c l a s s MonException extends E x c e p t i o n
{
public MonException ( )
{
System . out . p r i n t l n ( E x c e p t i o n monException has been r a i s e d . . . ) ;
}
public S t r i n g t o S t r i n g ( )
{
28

return You t r i e d t o do an i l l e g a l a s s i g n e m e n t ! ;
}
}

1.7.5

Lever une exception

On l`eve une exception en utilisant la syntaxe throw new <nomexception>(<parametres>). Linstanciation de lexception se fait donc en meme temps que sa levee. Par exemple,
try
{
/
......
/
throw new MonException ( ) ;
/
......
/
}
catch ( MonException e )
{
System . out . p r i n t l n ( e ) ;
}

1.7.6

Rattraper plusieurs exceptions

Il se peut quune meme instruction (ou suite dinstruction) soit susceptible de lever des exceptions
differentes, vous pouvez dans ce cas placer plusieurs catch `a la suite du meme try.
try
{
bourreTableau ( ) ;
}
catch ( ArrayIndexOutOfBoundException e )
{
System . out . p r i n t l n ( I l f a l l a i t s y a t t e n d r e . . . ) ;
}
catch ( E x c e p t i o n e )
{
System . out . p r i n t l n ( e ) ;
}
Notez bien que comme toute exception herite de Exception, le deuxi`eme catch sera execute quelle que
soit lexception levee (sauf si bien entendu le premier catch est execute).

1.7.7

Finally

Il est quelquefois necessaire quune section de code sexecute quoi quil advienne (pour par exemple fermer
un fichier). On place dans ce cas une section finally.
try
{
/
......;
/
}

29

catch ( / . . . / )
{
/
.....
/
}
finally
{
/
.....
/
}
Par exemple,
c l a s s MonException extends E x c e p t i o n
{
public S t r i n g t o S t r i n g ( )
{
return F a l l a i t pas i n v o q u e r c e t t e methode . . . ;
}
}
public c l a s s F i n a l l y
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i n a l l y f = new F i n a l l y ( ) ;
try
{
try
{
throw new MonException ( ) ;
}
catch ( MonException e )
{
throw new MonException ( ) ;
}
finally
{
System . out . p r i n t l n ( Tu t a f f i c h e r a s q u o i qu i l a d v i e n n e ! ) ;
}
}
catch ( E x c e p t i o n e )
{
System . out . p r i n t l n ( e ) ;
}
}
}

1.7.8

RuntimeException

Je vous vous ai menti au sujet de ArrayIndexOutOfBoundException, il sagit dune exception heritant de


RunTimeException qui lui-meme herite de Exception. Un code Java dans lequel une RunTimeException
nest pas traitee passera la compilation. Par contre, MonException nest pas une RunTimeException et
doit etre rattrapee !
30

1.8

Interfaces graphiques

1.8.1

Fen
etres

La classe JFrame
Une fenetre est un objet de type JFrame, classe `a laquelle on acc`ede avec la commande dimportation
import javax.swing.*. Nous utiliserons les methodes suivantes :
public void setTitle(String title), pour definir le titre de la fenetre.
public void setVisible(boolean b), pour afficher la fenetre.
public void setSize(int width, height), pour preciser les dimensions de la fenetre.
public void setDefaultCloseOperation(int operation), pour determiner le comportement de
la fenetre lors de sa fermeture.
Exemples
Voici un code de creation dune fenetre vide.
import j a v a x . swing . ;
public c l a s s P r e m i e r e F e n e t r e
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
JFrame f = new JFrame ( ) ;
f . s e t V i s i b l e ( true ) ;
f . s e t T i t l e ( My f i r s t window ! ) ;
f . s e t S i z e (200 , 200);
f . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE ) ;
}
}
La facon suivante nous sera utile pour gerer les evenements :
import j a v a x . swing . ;
public c l a s s DeuxiemeFenetre extends JFrame
{
public DeuxiemeFenetre ( )
{
super ( ) ;
s e t T i t l e ( My s e c o n d window ! ) ;
s e t S i z e (200 , 200);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
}
public void a f f i c h e ( )
{
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
DeuxiemeFenetre f = new DeuxiemeFenetre ( ) ;
f . affiche ();
}
}

31

1.8.2

Un premier objet graphique

Nous allons ajouter un bouton dans notre fenetre. Les boutons sont de type JButton, le constructeur de
cette classe prend en param`etre le libelle du bouton. Un des attributs de la classe JFrame est un objet
contenant tous les composants graphiques de la fenetre, on acc`ede `a cet objet par la methode public
Container getContentPane(). Tout Container poss`ede une methode public Component add(Component
comp) permettant dajouter nimporte quel composant graphique (par exemple un JButton...). On ajoute
donc un Bouton de la facon suivante getContentPane().add(new JButton("my First JButton")) ;.
import j a v a x . swing . ;
import j a v a . awt . ;
public c l a s s P r e m i e r s J B u t t o n s extends JFrame
{
public P r e m i e r s J B u t t o n s ( )
{
super ( ) ;
s e t T i t l e ( My t h i r d window ! ) ;
s e t S i z e (200 , 200);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
getContentPane ( ) . s e t L a y o u t (new FlowLayout ( ) ) ;
getContentPane ( ) . add (new JButton ( my F i r s t JButton ) ) ;
getContentPane ( ) . add (new JButton ( my Second JButton ) ) ;
getContentPane ( ) . add (new JButton ( my Third JButton ) ) ;
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
new P r e m i e r s J B u t t o n s ( ) ;
}
}
Linstruction getContentPane().setLayout(new FlowLayout()) ; sert `a preciser de quelle facon vous
souhaitez que les composants soient disposes dans la fenetre. Nous reviendrons dessus.

1.8.3

Ecouteurs d
ev
enements

Un ecouteur devenement est un objet associe `a un composant graphique. Cet objet doit implementer linterface ActionListener et de ce fait contenir une methode public void actionPerformed(ActionEvent
e). Cette methode est appelee `
a chaque fois quun evenement se produit sur le composant. Lobjet
ActionEvent contient des informations sur levenement en question.

1.8.4

Premier exemple

Dans ce premier exemple, nous allons definir une classe public class PremierEcouteur extends JFrame
implements ActionListener. Elle servira donc `a la fois de fenetre et decouteur devenements. Lobjet
de type ActionEvent passe en param`etre contient une methode public Object getSource() retournant
lobjet ayant declenche levenement.
import j a v a x . swing . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s PremierEcouteur extends JFrame implements A c t i o n L i s t e n e r
{
JButton [ ] j B u t t o n s ;
32

public void a c t i o n P e r f o r m e d ( ActionEvent e )


{
int k = 0 ;
while ( j B u t t o n s [ k++] != e . g e t S o u r c e ( ) ) ;
System . out . p r i n t l n ( c l i c k on JButton + k ) ;
}
public PremierEcouteur ( )
{
super ( ) ;
j B u t t o n s = new JButton [ 3 ] ;
s e t T i t l e ( My f o u r t h window ! ) ;
s e t S i z e (200 , 200);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
getContentPane ( ) . s e t L a y o u t (new FlowLayout ( ) ) ;
j B u t t o n s [ 0 ] = new JButton ( my F i r s t JButton ) ;
j B u t t o n s [ 1 ] = new JButton ( my Second JButton ) ;
j B u t t o n s [ 2 ] = new JButton ( my Third JButton ) ;
f o r ( int i = 0 ; i < 3 ; i ++)
{
getContentPane ( ) . add ( j B u t t o n s [ i ] ) ;
jButtons [ i ] . addActionListener ( this ) ;
}
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
new PremierEcouteur ( ) ;
}
}

1.8.5

Classes anonymes

Les classes anonymes sont des classes que lon peut creer `a la volee, cest-`a-dire au moment de leur instanciation.. On sen sert generalement pour implementer une interface, en loccurrence ActionListener.
Voici une autre implementation faisant intervenir des classes anonymes.
import j a v a x . swing . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s EcouteurAnonyme extends JFrame
{
public EcouteurAnonyme ( )
{
super ( ) ;
JButton [ ] j B u t t o n s = new JButton [ 3 ] ;
s e t T i t l e ( My f o u r t h window ! ) ;
s e t S i z e (200 , 200);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
getContentPane ( ) . s e t L a y o u t (new FlowLayout ( ) ) ;
j B u t t o n s [ 0 ] = new JButton ( my F i r s t JButton ) ;
j B u t t o n s [ 1 ] = new JButton ( my Second JButton ) ;
33

j B u t t o n s [ 2 ] = new JButton ( my Third JButton ) ;


f o r ( int i = 0 ; i < 3 ; i ++)
getContentPane ( ) . add ( j B u t t o n s [ i ] ) ;
j B u t t o n s [ 0 ] . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( )
{
public void a c t i o n P e r f o r m e d ( ActionEvent e )
{
System . out . p r i n t l n ( c l i c k on F i r s t JButton ) ;
}
}
);
j B u t t o n s [ 1 ] . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( )
{
public void a c t i o n P e r f o r m e d ( ActionEvent e )
{
System . out . p r i n t l n ( c l i c k on Second JButton ) ;
}
}
);
j B u t t o n s [ 2 ] . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( )
{
public void a c t i o n P e r f o r m e d ( ActionEvent e )
{
System . out . p r i n t l n ( c l i c k on Third JButton ) ;
}
}
);
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
new EcouteurAnonyme ( ) ;
}
}

1.8.6

Gestionnaires de mise en forme

Un gestionnaire de mise en forme (Layout manager) est un objet permettant de disposer les composants
et les conteneurs dans la fenetre. Nous avons utilise un gestionnaire de type FlowLayout, qui dispose les
composants les uns `
a cote des autres (ou au dessus des autres si ce nest pas possible) dans leur ordre
dajout. Le gestionnaire GridLayout represente le conteneur comme une grille
import j a v a x . swing . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s TestGridLayout extends JFrame implements A c t i o n L i s t e n e r
{
JButton [ ] j B u t t o n s ;
public void a c t i o n P e r f o r m e d ( ActionEvent e )
{
int k = 0 ;
34

while ( j B u t t o n s [ k++] != e . g e t S o u r c e ( ) ) ;
System . out . p r i n t l n ( c l i c k on JButton + k ) ;
}
public TestGridLayout ( )
{
super ( ) ;
j B u t t o n s = new JButton [ 4 ] ;
s e t T i t l e ( One More Window ! ) ;
s e t S i z e (200 , 200);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
getContentPane ( ) . s e t L a y o u t (new GridLayout ( 2 , 2 ) ) ;
j B u t t o n s [ 0 ] = new JButton ( my F i r s t JButton ) ;
j B u t t o n s [ 1 ] = new JButton ( my Second JButton ) ;
j B u t t o n s [ 2 ] = new JButton ( my Third JButton ) ;
j B u t t o n s [ 3 ] = new JButton ( my Fourth JButton ) ;
f o r ( int i = 0 ; i < 4 ; i ++)
{
getContentPane ( ) . add ( j B u t t o n s [ i ] ) ;
jButtons [ i ] . addActionListener ( this ) ;
}
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
new TestGridLayout ( ) ;
}
}

1.8.7

Un exemple complet : Calcul dun carr


e

import j a v a x . swing . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s Carre extends JFrame implements K e y L i s t e n e r
{
JTextField operandTextField ;
JLabel r e s u l t T e x t F i e l d ;
public void k e y P r e s s e d ( KeyEvent e ) { }
public void k e y R e l e a s e d ( KeyEvent e )
{
try
{
int k = I n t e g e r . p a r s e I n t ( o p e r a n d T e x t F i e l d . getText ( ) ) ;
k = k ;
resultTextField . setText ( Integer . toString (k ) ) ;
}
catch ( E x c e p t i o n ex )
{
i f ( r e s u l t T e x t F i e l d != null )
35

r e s u l t T e x t F i e l d . setText ( ) ;
}
}
public void keyTyped ( KeyEvent e ) { }
public Carre ( )
{
super ( ) ;
s e t S i z e (200 , 200);
s e t T i t l e ( Square computer ! ) ;
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
getContentPane ( ) . s e t L a y o u t (new GridLayout ( 2 , 2 ) ) ;
getContentPane ( ) . add (new JLabel ( x = ) ) ;
o p e r a n d T e x t F i e l d = new J T e x t F i e l d ( ) ;
operandTextField . addKeyListener ( this ) ;
getContentPane ( ) . add ( o p e r a n d T e x t F i e l d ) ;
getContentPane ( ) . add (new JLabel ( x 2 = ) ) ;
r e s u l t T e x t F i e l d = new JLabel ( ) ;
getContentPane ( ) . add ( r e s u l t T e x t F i e l d ) ;
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
new Carre ( ) ;
}
}

36

1.9

Collections

1.9.1

Packages

Linstruction import que vous utilisez depuis le debut sert `a localiser une classe parmi les packages
standard de Java. Si par exemple vous importez import java.awt.event.*, cela signifie que vous allez
utiliser les classes se trouvant dans le package qui se trouve dans le package event qui se trouve dans le
package awt qui se trouve dans le package java (qui est la biblioth`eque standard).
Cr
eer ses propres packages
Il possible pour un programmeur de creer ses propres packages, deux choses sont necessaires :
Utilisez la meme arborescence dans le syst`eme de fichier que celle des packages
Ajouter au debut de chaque source sa position dans larborescence.
Par exemple,
package c o l l e c t i o n s ;
public c l a s s ExemplePackage
{
public s t a t i c void p r e s e n t e T o i ( )
{
System . out . p r i n t l n ( Je s u i s c o l l e c t i o n s . ExemplePackage ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
presenteToi ( ) ;
}
}
On execute et compile ce fichier en se placant non pas dans le repertoire o`
u se trouve les source, mais
dans le repertoire ou se trouve le package. Par consequent, lexecution en ligne de commande se fait avec
javac collections.ExemplePackage
Utiliser ses propres packages
Vos packages sutilisent comme les packages de la biblioth`eque standard. Si le main se trouve en dehors
de votre package, la variable denvironnement CLASSPATH sera utilisee pour localiser votre package.
Visibilit
e
En labsence de mots-cles public (tout le monde), private (seulement la classe) et protected (classe +
classes derivees), une visibilite par defaut est appliquee. Par defaut, la visibilite des elements est limitee
au package.

1.9.2

Types param
etr
es

Lutilisation du type Object pour faire de la genericite en Java se paye avec des instruction de ce type
m a C o l l e c t i o n . add (new C l a s s e F i l l e ( ) ) ;
C l a s s e F i l l e f = ( C l a s s e F i l l e ) maCollection . get ( 0 ) ;
Il est necessaire deffectuer un cast particuli`erement laid pour passer la compilation. On prend par
consequent le risque quune exception soit levee `a lexecution sil sav`ere que lobjet recupere nest pas de
type ClassFille. Les types parametres fournissent un moyen elegant de resoudre ce probl`eme.

37

Java Vs C++
Le mecanisme des classes parametrees en Java en bien plus fin que les templates utilisees en C++. Les
templates ne sont que de vulgaires rechercher/remplacer, alors quen Java, le code compile est le meme
que si les types ne sont pas parametres. Les types parametres de java ne sont donc quun moyen pour le
compilateur de sassurer que vous faites les choses proprement en vous obligeant `a declarer les types que
vous placez dans les collections.
La syntaxe
La syntaxe est par contre la meme quen C++ : il suffit dutiliser des chevrons pour placer le param`etre.
Par exemple,
public c l a s s ExempleClasseParametree<T>
{
T data ;
public ExempleClasseParametree (T data )
{
t h i s . data = data ;
}
public T g e t ( )
{
return data ;
}
}

On est amene naturellement `


a se demander si ExempleClasseParametree<String> herite de ExempleClasseParametre
Un exercice traite cette question.
Contraintes sur le param`
etre
Il est souvent necessaire que le type servant de param`etre verifie certaines proprietes. Si vous souhaitez
par exemple que lobjet herite de Comparable, vous avez la possibilite de poser cette contrainte avec le
param`etre <T extends Comparable>. La definition ci-avant est incompl`ete, le soin vous est laisse de la
completer...

1.9.3

Collections standard

La distribution officielle de Java est fournie avec plusieurs milliers de classes. Les Collections sont des
structures de donnees permettant doptimiser des operations comme le tri, la recherche de plus petit
element, etc. Les collections sont donc des regroupements dobjets.
Classification des collections
Linterface Collection<T> decrit ce que doit faire chaque collection. Elle plusieurs sous-interfaces, parmi
lesquelles on trouve :
List<T> conserve lordre des elements dans lordre dans lequel le programmeur souhaite quils
soient.
Set<T> ne tient pas compte de lordre des elements.
Queue<T> est optimise pour recuperer rapidement le plus petit element.
Ces interfaces sont implementees dans diverses classes ou divisees avec des sous-interfaces permettent
dobtenir des fonctionnalites plus precises.

38

Parcours dune collection


Il existe, de facon analogue `
a que lon observe en C++, une syntaxe permettant simplement de parcourir
une collection qui est :
f o r (T x : c )
{
/ . . . /
}
Dans la specification ci dessus, c est la collection, T le type (ou un sur-type) des objets de la collection et
x une variable (muette) dans laquelle sera place tour `a tour chaque objet de la collection. Il nest possible
dutiliser cette syntaxe que si le type de c implemente Iterable<T>.
D
etails
Parmi les classes implementant List<T>, on trouve ArrayList<T>, Vector<T> et LinkedList<T>. Les
deux premi`eres sont des tableaux et la derni`ere une liste chanee. Linterface Set<T> poss`ede une sousclasse HashSet<T> et une sous-interface SortedSet<T>. Dans un SortedSet<T>, les elements sont automatiquement maintenus dans lordre. Parmi les classes implementant SortedSet<T> se trouve TreeSet<T>
(arbre binaire de recherche).

39

1.10

Threads

1.10.1

Le principe

Un programme peut etre decoupe en processus legers, ou threads, sexecutant chacun de leur cote. On
definit un thread de deux facon :
En heritant de la classe Thread
En implementant linterface Runnable
Bien que la premi`ere solution soit generalement plus commode, la deuxi`eme est quelquefois le seul moyen
deviter lheritage multiple. Nous detaillerons le premier cas, le deuxi`eme est decrit dans la documentation.
La classe Thread
La classe Thread dispose entre autres de deux methodes
public void start() qui est la methode permettant de demarrer lexecution du thread.
public void run() qui est la methode automatiquement invoquee par start quand le thread est
demarre.
Voici un exemple dutilisation :
public c l a s s B i n a i r e A l e a t o i r e extends Thread
{
private int v a l u e ;
private int n b I t e r a t i o n s ;
public B i n a i r e A l e a t o i r e ( int val ue , int n b I t e r a t i o n s )
{
this . value = value ;
this . n b I t e r a t i o n s = n b I t e r a t i o n s ;
}
public void run ( )
{
f o r ( int i = 1 ; i <= n b I t e r a t i o n s ; i ++)
System . out . p r i n t ( v a l u e ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Thread un = new B i n a i r e A l e a t o i r e ( 1 , 3 0 0 0 0 ) ;
Thread z e r o = new B i n a i r e A l e a t o i r e ( 0 , 3 0 0 0 0 ) ;
un . s t a r t ( ) ;
zero . start ( ) ;
}
}
Linterface Runnable
Le constructeur de la classe Thread est surcharge pour prendre un param`etre une instance Runnable.
Runnable est une interface contenant une methode public void run(), celle-ci sera invoquee par le
thread au moment de son lancement.

1.10.2

Synchronisation

Une section critique se construit avec le mot-cle synchronized.

40

M
ethodes synchronis
ees
Une methode synchronisee ne peut etre executee que par un thread `a la fois. On synchronise une methode
en placant le mot cle synchronized dans sa definition.
Instructions synchronis
ees
On synchronise des instructions en les placant dans un bloc synchronized(o){...}, o`
u o est lobjet ne
pouvant etre accede par deux threads simultanement.

1.10.3

Mise en Attente

Un thread peut decider de se mettre en attente sil a besoin pour sexecuter de donnees qui ne sont pas
encore disponibles. On g`ere cela avec les instructions suivantes :
public void wait() throws InterruptedException met le thread en attente.
public void notify() reveille un thread en attente
public void notifyAll() reveille tous les thread en attente
On place en general ces instructions dans une section critique. Un wait() lib`ere le verrou pour autoriser
dautres threads `
a acceder `
a la ressource. Un notify() choisit un des objets places en attente sur la
meme ressource, lui rend le verrou, et relance son execution. Par exemple,
public c l a s s Counter
{
private int v a l u e = 0 ;
private int upperBound ;
private int lowerBound ;
public Counter ( int lowerBound , int upperBound )
{
t h i s . upperBound = upperBound ;
t h i s . lowerBound = lowerBound ;
}
public synchronized void i n c r e a s e C o u n t e r ( ) throws I n t e r r u p t e d E x c e p t i o n
{
i f ( v a l u e == upperBound )
wait ( ) ;
else
{
v a l u e ++;
System . out . p r i n t l n ( + 1 = + v a l u e ) ;
Thread . s l e e p ( 5 0 ) ;
i f ( v a l u e == lowerBound + 1 )
notify ();
}
}
public synchronized void d e c r e a s e C o u n t e r ( ) throws I n t e r r u p t e d E x c e p t i o n
{
i f ( v a l u e == lowerBound )
wait ( ) ;
else
{
val ue ;
System . out . p r i n t l n ( 1 = + v a l u e ) ;
Thread . s l e e p ( 5 0 ) ;

41

i f ( v a l u e == upperBound 1 )
notify ();
}
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Counter c = new Counter ( 100 , 1 0 0 ) ;
Thread p = new Plus ( c ) ;
Thread m = new Moins ( c ) ;
p. start ();
m. s t a r t ( ) ;
}
}
c l a s s Plus extends Thread
{
private Counter c ;
Plus ( Counter c )
{
this . c = c ;
}
public void run ( )
{
while ( true )
try
{
c . increaseCounter ( ) ;
}
catch ( I n t e r r u p t e d E x c e p t i o n e ) { }
}
}
c l a s s Moins extends Thread
{
private Counter c ;
Moins ( Counter c )
{
this . c = c ;
}
public void run ( )
{
while ( true )
try
{
c . decreaseCounter ( ) ;
}
catch ( I n t e r r u p t e d E x c e p t i o n e ) { }
}
}

42

Ce programme affiche aleatoirement les valeurs prises par un compteur incremente et decremente alternativement par deux threads. Si lon tente de decrementer la valeur minimale, le thread de decrementation
sendort pour laisser la main au thread dincrementation. Si le thread dincrementation est parti de la
valeur minimale, il reveille le thread de decrementation qui peut reprendre son execution. Et vice-versa.

43

Chapitre 2

Exercices
2.1
2.1.1

Le Java proc
edural
Initiation

Exercice 1 - Compte `
a rebours
Ecrire un sous-programme prenant en param`etre un nombre n et affichant les valeurs n, n 1, . . ., 1, 0.

2.1.2

Arithm
etique

Exercice 2 - chiffres et nombres


Rapellons que a % b est le reste de la division enti`ere de a par b.
1. Ecrire la fonction static int unites(int n) retournant le chiffre des unites du nombre n.
2. Ecrire la fonction static int dizaines(int n) retournant le chiffre des dizaines du nombre n.
3. Ecrire la fonction static int extrait(int n, int p) retourant le p-`eme chiffre de representation
decimale de n en partant des unites.
4. Ecrire la fonction static int nbChiffres(int n) retournant le nombre de chiffres que comporte
la representation decimale de n.
5. Ecrire la fonction static int sommeChiffres(int n) retournant la somme des chiffres de n.
Exercice 3 - Nombres amis
Soient a et b deux entiers strictement positifs. a est un diviseur strict de b si a divise b et a 6= b. Par
exemple, 3 est un diviseur strict de 6. Mais 6 nest pas un diviseur strict 6. a et b sont des nombres amis
si la somme des diviseurs stricts de a est b et si la somme des diviseurs de b est a. Le plus petit couple de
nombres amis connu est 220 et 284.
1. Ecrire une fonction static int sommeDiviseursStricts(int n), elle doit renvoyer la somme des
diviseurs stricts de n.
2. Ecrire une fonction static boolean sontAmis(int a, int b), elle doit renvoyer true si a et b
sont amis, f alse sinon.
Exercice 4 - Nombres parfaits
Un nombre parfait est un nombre egal `
a la somme de ses diviseurs stricts. Par exemple, 6 a pour diviseurs
stricts 1, 2 et 3, comme 1 + 2 + 3 = 6, alors 6 est parfait.
1. Est-ce que 18 est parfait ?
2. Est-ce que 28 est parfait ?

44

3. Que dire dun nombre ami avec lui-meme ?


4. Ecrire la fonction static boolean estParfait(int n), elle doit retourner true si n est un nombre
parfait, f alse sinon.
Exercice 5 - Nombres de Kaprekar
Un nombre n est un nombre de Kaprekar en base 10, si la representation decimale de n2 peut etre separee
en une partie gauche u et une partie droite v tel que u + v = n. 452 = 2025, comme 20 + 25 = 45, 45 est
aussi un nombre de Kaprekar. 48792 = 23804641, comme 238 + 04641 = 4879 (le 0 de 046641 est inutile,
je lai juste place pour eviter toute confusion), alors 4879 est encore un nombre de Kaprekar.
1. Est-ce que 9 est un nombre de Kaprekar ?
2. Ecrire la fonction static int sommeParties(int n, int p) qui decoupe n est deux nombres
dont le deuxi`eme comporte p chiffres, et aui retourne leur somme. Par exemple,
sommeP arties(12540, 2) = 125 + 40 = 165
3. Ecrire la fonction static boolean estKaprekar(int n)

2.1.3

Pour le sport

Exercice 6 - Conversion chiffres/lettres


Ecrire un sous-programme prenant un nombre en param`etre et laffichant en toutes lettres. Rappelons
que 20 et 100 saccordent en nombre sils ne sont pas suivis dun autre nombre (ex. : quatre-vingts,
quatre-vingt-un). Mille est invariable (ex. : dix-mille) mais pas million (ex. : deux millions) et milliard
(ex. : deux milliards). Depuis 1990, tous les mots sont separes de traits dunion (ex. : quatre-vingt-quatre),
sauf autour des mots mille, millions et milliard (ex. : deux mille deux-cent-quarante-quatre, deux millions
quatre-cent-mille-deux-cents). (source : http://www.leconjugueur.com/frlesnombres.php).

45

2.2
2.2.1

Objets
Cr
eation dune classe

Exercice 1 - La classe Rationnel


Creez une classe Rationnel contenant un numerateur et un denominateur tous deux de type entier.
1
4
Instanciez deux rationnels a et b et initialisez-les aux valeurs respectives
et . Affichez ensuite les
2
3
valeurs de ces champs.

2.2.2

M
ethodes

Exercice 2 - Op
erations sur les Rationnels
Ajoutez `
a la classe Rationnel les methodes suivantes :
1. public String toString(), retourne une chane de caract`eres contenant une representation du
rationnel courant sous forme de chane de caract`eres.
2. public Rationnel copy(), retourne une copie du rationnel courant.
3. public Rationnel opposite(), retourne loppose du rationnel courant.
4. public void reduce(), met le rationnel sous forme de fraction irreductible.
5. public boolean isPositive(), retourne true si et seulement si le rationnel courant est strictement positif.
6. public Rationnel add(Rationnel other), retourne la somme du rationnel courant et du rationnel other.
7. public void addBis(Rationnel other), additionne le rationnel other au rationnel courant.
8. public Rationnel multiply(Rationnel other), retourne le produit du rationnel courant avec le
rationnel others.
9. public Rationnel divide(Rationnel other), retourne le quotient du rationnel courant avec le
rationnel others.
10. public int compareTo(Rationnel other), retourne 0 si le rationnel courant est egal au rationnel
other, 1 si le rationnel courant est inferieur `a other, 1 dans le cas contraire.

46

2.3
2.3.1

Tableaux
Prise en main

Exercice 1 - Cr
eation et affichage
Creer un tableau de 20 entiers, y placer les nombre de 1 `a 20, inverser lordre des elements avec une
fonction (recursive si vous y arrivez).

2.3.2

Tris

Exercice 2 - Tris
Creer une classe RatTab contenant un tableau de rationnels, ajoutez les methodes suivantes :
1. public void init(int taille), instancie le tableau et y place taille valeurs aleatoires import
java.math.Random ;).
2. public String toString(), retourne une chane de caract`ere representant le tableau.
3. public void triInsertion(), tri le tableau par la methode du tri par insertion.
4. public void triBulle(), tri le tableau par la methode du tri `a bulle.
5. public void triSelection(), tri le tableau par la methode du tri par selection.
6. public void initTab(RatTab otther), place dans le tableau une copie du tableau de other.
7. public RatTab copie(), retourne une copie de linstance courante.
8. public void interclasse(RatTab t1, RatTab t2), place dans le tableau linterclassement des
tableaux t1 et t2.

47

2.4

Encapsulation

2.4.1

Prise en main

Exercice 1 - Rationnels propres


Reprennez la classe Rationnel et faites en une classe RationnelPropre. Vous encapsulerez le numerateur,
le denominateur, et vous utiliserez un constructeur pour initialiser les champs prives. Vous prendrez
ensuite le soin de modifier les corps des methodes de sorte que la classe compile et fonctionne correctement.
Exercice 2 - Listes chan
ees
Completez le code ci-dessous :
public c l a s s I n t L i s t
{
/
Donnee s t o c k e e dans l e m a i l l o n
/
private int data ;
/ /
/
Pointeur vers l e maillon suivant
/
private I n t L i s t next ;
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
l e pointeur vers l element suivant .
/
I n t L i s t ( int data , I n t L i s t next )
{
}
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
mettant l e suivant a n u l l .
/
I n t L i s t ( int data )
{
}
/ /
/
C o n s t r u c t e u r r e c o p i a n t t o u s l e s m a i l l o n s de o t h e r .

48

/
IntList ( IntList other )
{
}
/ /
/
Retourne l a donnee .
/
public int getData ( )
{
return 0 ;
}
/ /
/
M o d i f i e l a donnee
/
public void s e t D a t a ( int data )
{
}
/ /
/
Retourne l e m a i l l o n s u i v a n t .
/
public I n t L i s t getNext ( )
{
return null ;
}
/ /
/
Modifie l e maillon suivant
/
public void s e t N e x t ( I n t L i s t next )
{
}
/ /
/
sentation
c
Retourne une repr A
s o u s forme de
c h a i n e de l a l i s t e .
/

49

public S t r i n g t o S t r i n g ( )
{
return null ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a l i s t e .
/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
I n t L i s t l = new I n t L i s t ( 2 0 ) ;
int i = 1 9 ;
while ( i >= 0 )
l = new I n t L i s t ( i , l ) ;
System . out . p r i n t l n ( l ) ;
}
}

2.4.2

Impl
ementation dune Pile

Exercice 3 - Avec un tableau


Completez le code ci-dessous :
public c l a s s P i l e
{
/
Tableau c o n t e n a n t l e s e l e m e n t s de l a p i l e .
/
private int [ ] tab ;
/ /
/
T a i l l e de l a p i l e
/
private f i n a l int t a i l l e ;
/ /
/
I n d i c e du p r e m i e r e l e m e n t non occupe dans
le tableau .
/
private int f i r s t F r e e ;
/ /

50

/
Constructeur
/
P i l e ( int t a i l l e )
{
this . t a i l l e = 0 ;
}
/ /
/
C o n s t r u c t e u r de c o p i e
/
Pile ( Pile other )
{
this ( other . t a i l l e ) ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return true ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i l a p i l e e s t
pleine .
/
public boolean e s t P l e i n e ( )
{
return true ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
l a p i l e , 1 s i l a p i l e e s t v i d e .
/
public int sommet ( )
{

51

return 0 ;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( )
{
}
/ /
/
A j o u t e d a t a en h a u t de l a p i l e , ne f a i t r i e n
si la pile est pleine .
/
public void e m p i l e ( int data )
{
}
/ /
/
Retourne une r e p r e s e n t a t i o n de l a p i l e
au f o r m a t c h a i n e de c a r a c t e r e s .
/
public S t r i n g t o S t r i n g ( )
{
return null ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a p i l e .
/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
P i l e p = new P i l e ( 3 0 ) ;
int i = 0 ;
while ( ! p . e s t P l e i n e ( ) )
p . e m p i l e ( i ++);
System . out . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
System . out . p r i n t l n ( p . sommet ( ) ) ;

52

p. depile ();
}
}
}
Exercice 4 - Avec une liste chan
ee
Re-telechargez le fichier Pile.java, et sans modifier les methodes publiques, implementez la pile en
utilisant des listes chanees (IntList).

53

2.5

H
eritage

2.5.1

H
eritage

Exercice 1 - Point
Definir une classe Point permettant de representer un point dans R2 . Vous utiliserez proprement les
concepts dencapsulation.
Exercice 2 - Cercle
Definir une classe Cercle heritant de de la classe precedente. Vous prendrez soin de ne pas recoder des
choses dej`
a codees...
Exercice 3 - Pile
Adaptez la pile pour quelle puisse contenir des objets de nimporte quel type.
Exercice 4 - Red
efinition de m
ethode
Reprennez les classes Point et Cercle, codez une methode toString() pour les deux classes (m`ere et
fille). Vous prendrez soin deviter les redondances dans votre code.

2.5.2

Interfaces

Exercice 5 - Animaux
Telechargez larchive animaux.tgz (depuis le site seulement), et completez le code source, sachant quun
chien dit Ouaf !, un chat Miaou ! et une vache Meuh !.
Exercice 6 - Tab
Reprennez la classe RatTab et adaptez-l`a de sorte quon puisse y placer tout objet dun type implementant
linterface predefinie Comparable.

2.5.3

Classes abstraites

Exercice 7 - Animaux
Reprennez le tp sur les animaux, et faites remonter les methodes setNom et getNom dans la classe m`ere.
Exercice 8 - Arbres syntaxiques
Telechargez larchive arbresSyntaxiques.tgz (depuis le site seulement), completez le code source.

54

2.6

Exceptions

Exercice 1 - lexception inutile


Creer une classe ClasseInutile contenant une seule methode nePasInvoquer() contenant une seule
instruction, qui l`eve lexception ExceptionInutile. Lorsquelle est levee, lExceptionInutile affiche
Je vous avais dit de ne pas invoquer cette fonction !. Vous testerez la methode nePasInvoquer() dans
le main de ClasseInutile.
Exercice 2 - Pile
Reprennez le code de la pile, modifiez-le de sorte que si lon tente de depiler une pile vide, une exception
soit levee.

55

2.7
2.7.1

Interfaces graphiques
Prise en main

Exercice 1 - Ecouteur d
ev
enement
Creer une fenetre Gestionnaire de disque dur. Ajouter un bouton ayant pour intitule Formater le
disque dur et affichant dans la console le message formatage en cours. Vous utiliserez les trois methodes
suivantes :
1. La meme que dans le premier exemple du cours : implementation de lecouteur devenement par la
JFrame.
2. Avec une classe anonyme.
3. Avec une classe non anonyme.
Exercice 2 - Gestionnaires de mises en forme
Modifier le programme de lexercice precedent en utilisant un GridLayout. Vous afficherez le message
formatage en cours non pas sur la console mais dans une zone de texte.

2.7.2

Maintenant d
ebrouillez-vous

Exercice 3 - Convertisseur
Coder un convertisseur euro/dollar.
Exercice 4 - Calculatrice
Coder une calculatrice.

56

2.8
2.8.1

Collections
Packages

Exercice 1 - Pile
Recuperer le code source de pile, implementee avec des listes chanees, pour creer un package portant
votre prenom. Vous verifierez votre installation en utilisant la classe pile en dehors du package. Vous
determinerez intelligemment la visibilite des divers objets.

2.8.2

Types param
etr
ees

Exercice 2 - H
eritage
Verifiez experimentalement si ExempleClasseParametree<String> herite de ExempleClasseParametree<Object>.
Trouvez une explication...
Exercice 3 - Types param
etr
es et interfaces
Creez une classe DeuxObjets contenant deux objets de meme type <T> et deux methodes getPetit et
getGrand retournant respectivement le plus petit des deux objets et le plus grand.
Exercice 4 - Pile
Reprennez le package sur la pile et adaptez la pour que la pile, implementee avec des listes chanees puisse
fonctionner avec des objets de nimporte quel type.

2.8.3

Collections

Exercice 5 - Parcours
Creez une ArrayList<T>, placez-y des valeurs quelconques, et parcourez-l`a en affichant ses valeurs.
Exercice 6 - Iterable<T>
Modifiez la Pile pour quelle implemente Iterable<T>. Adaptez la fonction toString() en consequence.
Exercice 7 - Parcours
Creez un TreeSet<T>, placez-y des DeuxObjets<Integer>, et parcourez-le en affichant ses valeurs.

57

2.9
2.9.1

Threads
Prise en main

Exercice 1 - La m
ethode start()
Remplacez les appels `
a start() par run(), que remarquez-vous ?
Exercice 2 - Runnable
Reprennez le code de BinaireAleatoire et adaptez-le pour utiliser linterface Runnable.

2.9.2

Synchronisation

Exercice 3 - M
ethode synchronis
ee
Creez un compteur commun aux deux threads un et zero, vous y placerez une fonction synchronized
boolean stepCounter() qui retournera vrai tant que le compteur naura pas atteint sa limite, et qui
retournera tout le temps faux ensuite. Le but etant dafficher 30000 chiffres, peu importe que ce soit des
1 ou des 0.
Exercice 4 - Instructions synchronis
ees
Reprennez lexercice precedent en synchronisant les appels `a stepCounter() dans la methode run().

2.9.3

D
ebrouillez-vous

Exercice 5 - Producteur consommateur


Implementez une file permettant des acc`es synchronises. Creez une classe ecrivant des valeurs aleatoires
dans la file et une classe lisant ces valeurs et les affichant au fur et `a mesure. Lancez plusiseurs instances
de la classe de lecture et plusieurs instances de la classe decriture sur la meme file.
Exercice 6 - Diner des philosophes
Implementez le probl`eme du diner des philosophes. Faites en sorte quil ny ait ni famine ni interblocage.

58

Chapitre 3

Corrig
es
3.1
3.1.1

Java Proc
edural
Initiation

c l a s s CountDown
{
s t a t i c void countDown ( i n t n )
{
while ( n >= 0 )
{
System . o u t . p r i n t l n ( n ) ;
n;
}
}
public s t a t i c void main ( S t r i n g [ ]
{
countDown ( 2 0 ) ;
}

args )

3.1.2

Arithm
etique

class Arithmetique
{
static int puissance ( int b , int n)
{
int r e s = 1 ;
f o r ( i n t i = 1 ; i <= n ; i ++)
r e s = b ;
return r e s ;
}
static int u n i t e s ( int n)
{
return n%10;
}
static int d i z a i n e s ( int n)
{
return ( n % 1 0 0 ) / 1 0 ;
}
static int e x t r a i t ( int n , int p)
{
return ( n % p u i s s a n c e ( 1 0 , p ) ) / p u i s s a n c e ( 1 0 , p 1 ) ;
}
public s t a t i c i n t n b C h i f f r e s ( i n t n )
{
int r e s = 0 ;
while ( n != 0 )
{
r e s ++;
n /=10;
}

59

return r e s ;
}
static int sommeChiffres ( int n)
{
i n t nbC = n b C h i f f r e s ( n ) ;
i n t somme = 0 ;
f o r ( i n t i = 1 ; i <= nbC ; i ++)
somme += e x t r a i t ( n , i ) ;
return somme ;
}
s t a t i c boolean d i v i s e ( i n t a , i n t b )
{
return b%a == 0 ;
}
static int sommeDiviseursStricts ( int n)
{
i n t somme = 0 ;
f o r ( i n t i = 1 ; i < n ; i ++)
if ( divise ( i , n))
somme += i ;
return somme ;
}
s t a t i c boolean sontAmis ( i n t a , i n t b )
{
return s o m m e D i v i s e u r s S t r i c t s ( a ) == s o m m e D i v i s e u r s S t r i c t s ( b ) ;
}
s t a t i c boolean e s t P a r f a i t ( i n t n )
{
return n == s o m m e D i v i s e u r s S t r i c t s ( n ) ;
}
s t a t i c i n t sommeParties ( i n t n , i n t p )
{
return n%p u i s s a n c e ( 1 0 , p ) + n/ p u i s s a n c e ( 1 0 , p ) ;
}
s t a t i c boolean e s t K a p r e k a r ( i n t n )
{
i n t c a r r e = nn ;
i n t nbc = n b C h i f f r e s ( nn ) ;
f o r ( i n t i = 1 ; i < nbc ; i ++)
i f ( sommeParties ( c a r r e , i ) == n )
return true ;
return f a l s e ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
System . o u t . p r i n t l n ( e s t K a p r e k a r ( 3 4 5 6 7 8 9 ) ) ;
System . o u t . p r i n t l n ( e s t K a p r e k a r ( 4 5 ) ) ;
System . o u t . p r i n t l n ( e s t K a p r e k a r ( 4 8 7 9 ) ) ;
}
}

3.1.3

Pour le sport

class StringOfInt
{
/
A f f i c h e l e nombre p a s s e en parametre s i l
/

e s t compris e n t r e 1 e t 1 9 .

s t a t i c void a f f i c h e U n i t e s ( i n t n )
{
switch ( n )
{
case 1 : System . o u t . p r i n t ( un ) ; break ;
case 2 : System . o u t . p r i n t ( deux ) ; break ;
case 3 : System . o u t . p r i n t ( t r o i s ) ; break ;
case 4 : System . o u t . p r i n t ( q u a t r e ) ; break ;
case 5 : System . o u t . p r i n t ( c i n q ) ; break ;
case 6 : System . o u t . p r i n t ( s i x ) ; break ;
case 7 : System . o u t . p r i n t ( s e p t ) ; break ;
case 8 : System . o u t . p r i n t ( h u i t ) ; break ;
case 9 : System . o u t . p r i n t ( n e u f ) ; break ;

60

case 10
case 11
case 12
case 13
case 14
case 15
case 16
case 17
case 18
case 19
default
}

:
:
:
:
:
:
:
:
:
:
:

System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
System . o u t .
break ;

p r i n t ( d i x ) ; break ;
p r i n t ( o n z e ) ; break ;
p r i n t ( douze ) ; break ;
p r i n t ( t r e i z e ) ; break ;
p r i n t ( q u a t o r z e ) ; break ;
p r i n t ( q u i n z e ) ; break ;
p r i n t ( s e i z e ) ; break ;
p r i n t ( dixs e p t ) ; break ;
p r i n t ( dixh u i t ) ; break ;
p r i n t ( dixn e u f ) ; break ;

}
/
Affiche
/

les

d i z a i n e s de 10n s i n e s t compris e n t r e 2 e t 9 .

s t a t i c void a f f i c h e D i z a i n e s ( i n t n )
{
switch ( n )
{
case 2 : System . o u t . p r i n t ( v i n g t ) ; break ;
case 3 : System . o u t . p r i n t ( t r e n t e ) ; break ;
case 4 : System . o u t . p r i n t ( q u a r a n t e ) ; break ;
case 5 : System . o u t . p r i n t ( c i n q u a n t e ) ; break ;
case 6 :
case 7 : System . o u t . p r i n t ( s o i x a n t e ) ; break ;
case 8 :
case 9 : System . o u t . p r i n t ( q u a t r e v i n g t ) ; break ;
d e f a u l t : break ;
}
}
/
Retourne b n
/
static int puissance ( int b , int n)
{
int r e s = 1 ;
f o r ( i n t i = 1 ; i <= n ; i ++)
r e s = b ;
return r e s ;
}
/
E x t r a i t l e s c h i f f r e s de n par t r a n c h e . On i n d i c e s c e s c h i f f r e s a p a r t i r de 1
en p a r t a n t de l a d r o i t e . d e b u t e s t l i n d i c e du d e b u t de l a t r a n c h e e t f i n
l i n d i c e de l a f i n . Par exemple e x t r a i t T r a n c h e (987654321 , 5 , 2) = 5 4 3 2 .
/
s t a t i c i n t e x t r a i t T r a n c h e ( i n t n , i n t debut , i n t f i n )
{
return ( n%p u i s s a n c e ( 1 0 , debut ) ) / p u i s s a n c e ( 1 0 , f i n 1 ) ;
}
/
A f f i c h e en t o u t e s
0 et 999.
/

lettres

l e nombre n , n d o i t e t r e compris e n t r e

s t a t i c void a f f i c h e T r o i s C h i f f r e s ( i n t n )
{
int u n i t e s = extraitTranche (n , 1 , 1 ) ;
int d i z a i n e s = extraitTranche (n , 2 , 2 ) ;
int d i z a i n e s U n i t e s = extraitTranche (n , 2 , 1 ) ;
int c e n t a i n e s = extraitTranche (n , 3 , 3 ) ;
i f ( c e n t a i n e s >= 2 )
{
afficheUnites ( centaines );
System . o u t . p r i n t ( ) ;
}
i f ( c e n t a i n e s != 0 )
System . o u t . p r i n t ( c e n t ) ;
i f ( d i z a i n e s U n i t e s == 0 && c e n t a i n e s != 1 && c e n t a i n e s != 0 )
System . o u t . p r i n t ( s ) ;
i f ( d i z a i n e s U n i t e s != 0 && c e n t a i n e s != 0 )
System . o u t . p r i n t ( ) ;
afficheDizaines ( dizaines );
i f ( u n i t e s == 0 && d i z a i n e s == 8 )

61

System . o u t . p r i n t ( s ) ;
( d i z a i n e s != 0 && d i z a i n e s != 1 &&
( u n i t e s != 0 | | d i z a i n e s == 7 | | d i z a i n e s == 9 ) )
System . o u t . p r i n t ( ) ;
i f ( u n i t e s == 1 && d i z a i n e s >= 2 && d i z a i n e s <= 6 )
System . o u t . p r i n t ( e t ) ;
i f ( d i z a i n e s == 1 | | d i z a i n e s == 7 | | d i z a i n e s == 9 )
a f f i c h e U n i t e s ( ( d i z a i n e s U n i t e s 10 ( d i z a i n e s 1 ) ) ) ;
else
afficheUnites ( unites );
if

}
/
A f f i c h e l e nombre n s u i v i de l a c h a i n e u n i t e , a c c o r d e
e s t v r a i s i l u n i t e n e s t pas i n v a r i a b l e .
/
s t a t i c void a f f i c h e N o m b r e E t U n i t e ( i n t n ,
{
i f ( a c c o r d e | | n != 1 )
{
afficheTroisChiffres (n ) ;
i f ( n != 0 )
System . o u t . p r i n t ( ) ;
}
System . o u t . p r i n t ( u n i t e ) ;
i f ( a c c o r d e && n > 1 )
System . o u t . p r i n t ( s ) ;
}

S t r i n g u n i t e , boolean a c c o r d e )

s t a t i c void a f f i c h e N o m b r e ( i n t n )
{
int b i l l i o n s = extraitTranche (n , 15 , 1 3 ) ;
int m i l l i a r d s = extraitTranche (n , 12 , 1 0 ) ;
int m i l l i o n s = extraitTranche (n , 9 , 7 ) ;
int m i l l i e r s = extraitTranche (n , 6 , 4 ) ;
int u n i t e s = extraitTranche (n , 3 , 1 ) ;
i f ( b i l l i o n s != 0 )
{
a f f i c h e N o m b r e E t U n i t e ( b i l l i o n s , b i l l i o n , true ) ;
System . o u t . p r i n t ( ) ;
}
i f ( m i l l i a r d s != 0 )
{
a f f i c h e N o m b r e E t U n i t e ( m i l l i a r d s , m i l l i a r d , true ) ;
System . o u t . p r i n t ( ) ;
}
i f ( m i l l i o n s != 0 )
{
a f f i c h e N o m b r e E t U n i t e ( m i l l i o n s , m i l l i o n , true ) ;
System . o u t . p r i n t ( ) ;
}
i f ( m i l l i e r s != 0 )
{
afficheNombreEtUnite ( m i l l i e r s , m i l l e , false ) ;
System . o u t . p r i n t ( ) ;
}
i f ( u n i t e s != 0 )
{
afficheNombreEtUnite ( unites , , f a l s e ) ;
}
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
f o r ( i n t i = 1 ; i <= 30 ; i ++)
{
System . o u t . p r i n t ( p u i s s a n c e ( 3 , i ) + = ) ;
afficheNombre ( puissance (3 , i ) ) ;
System . o u t . p r i n t l n ( ) ;
}
}
}

3.2
3.2.1

Objets
Cr
eation dune classe

La classe Rationnel

62

public c l a s s R a t i o n n e l
{
i n t num , den ;
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Rationnel a , b ;
a = new R a t i o n n e l ( ) ;
b = new R a t i o n n e l ( ) ;
a . num = 1 ;
a . den = 2 ;
b . num = 4 ;
b . den = 3 ;
System . o u t . p r i n t l n ( a = + a . num + / + a . den ) ;
System . o u t . p r i n t l n ( b = + b . num + / + b . den ) ;
}
}

3.2.2

M
ethodes

Op
erations sur les Rationnels
public c l a s s R a t i o n n e l
{
i n t num , den ;
//
public S t r i n g t o S t r i n g ( )
{
return num + / + den ;
}
//
public R a t i o n n e l copy ( )
{
R a t i o n n e l r = new R a t i o n n e l ( ) ;
r . num = num ;
r . den = den ;
return r ;
}
//
public R a t i o n n e l o p p o s i t e ( )
{
R a t i o n n e l r = copy ( ) ;
r . num = r . num ;
return r ;
}
//
private i n t pgcd ( i n t a , i n t b )
{
i f ( b == 0 )
return a ;
return pgcd ( b , a%b ) ;
}
public void r e d u c e ( )
{
i n t p = pgcd (num , den ) ;
num/=p ;
den=p ;
}
//
public boolean i s P o s i t i v e ( )
{
return num > 0 && den > 0 | | num < 0 && den < 0 ;
}
//
public R a t i o n n e l add ( R a t i o n n e l o t h e r )
{
R a t i o n n e l r e s = new R a t i o n n e l ( ) ;

63

r e s . num = num o t h e r . den + den o t h e r . num ;


r e s . den = den o t h e r . den ;
other . reduce ( ) ;
return r e s ;
}
//
public void addB is ( R a t i o n n e l o t h e r )
{
num = num o t h e r . den + den o t h e r . num ;
den = den o t h e r . den ;
reduce ( ) ;
}
//
public R a t i o n n e l m u l t i p l y ( R a t i o n n e l o t h e r )
{
R a t i o n n e l r e s = new R a t i o n n e l ( ) ;
r e s . num = num o t h e r . num ;
r e s . den = den o t h e r . den ;
other . reduce ( ) ;
return r e s ;
}
//
public R a t i o n n e l d i v i d e ( R a t i o n n e l o t h e r )
{
R a t i o n n e l r e s = new R a t i o n n e l ( ) ;
r e s . num = num o t h e r . den ;
r e s . den = den o t h e r . num ;
other . reduce ( ) ;
return r e s ;
}
//
public i n t compareTo ( R a t i o n n e l o t h e r )
{
R a t i o n n e l sub = add ( o t h e r . o p p o s i t e ( ) ) ;
i f ( sub . i s P o s i t i v e ( ) )
return 1 ;
i f ( sub . o p p o s i t e ( ) . i s P o s i t i v e ( ) )
return 1;
return 0 ;
}
//
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Rationnel a , b ;
a = new R a t i o n n e l ( ) ;
b = new R a t i o n n e l ( ) ;
a . num = 1 ;
a . den = 2 ;
b . num = 4 ;
b . den = 3 ;
System . o u t . p r i n t l n ( a = + a ) ;
System . o u t . p r i n t l n ( b = + b ) ;
System . o u t . p r i n t l n ( compareTo ( + a + , +
b + ) = + a . compareTo ( b ) ) ;
System . o u t . p r i n t l n ( a . copy ( ) ) ;
System . o u t . p r i n t l n ( a . o p p o s i t e ( ) ) ;
System . o u t . p r i n t l n ( a . add ( b ) ) ;
System . o u t . p r i n t l n ( a . m u l t i p l y ( b ) ) ;
System . o u t . p r i n t l n ( a . d i v i d e ( b ) ) ;
}
}

3.3
3.3.1

Tableaux
Prise en main

Cr
eation et affichage

64

public c l a s s PriseEnMainTableaux
{
//
public s t a t i c void a f f i c h e ( i n t [ ] t )
{
f o r ( i n t i = 0 ; i < t . l e n g t h ; i ++)
{
System . o u t . p r i n t ( t [ i ] + ) ;
}
System . o u t . p r i n t l n ( ) ;
}
//
public s t a t i c void swap ( i n t [ ]
{
i n t temp = t [ i ] ;
t[ i ] = t[ j ];
t [ j ] = temp ;
}

t , int i , int j )

//
public s t a t i c void r e v e r s e ( i n t [ ] t )
{
int i = 0 , j = t . length 1 ;
while ( i < j )
swap ( t , i ++, j );
}
//
public s t a t i c void r e v e r s e R e c ( i n t [ ] t , i n t i , i n t j )
{
if ( i < j )
{
swap ( t , i , j ) ;
reverseRec ( t , i + 1 , j 1);
}
}
//
public s t a t i c void r e v e r s e B i s ( i n t [ ] t )
{
reverseRec ( t , 0 , t . length 1);
}
//
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
i n t [ ] t = new i n t [ 2 0 ] ;
f o r ( i n t i = 0 ; i < 20 ; i ++)
t[i] = i;
affiche (t );
reverse ( t );
affiche (t );
reverseBis ( t );
affiche (t );
}
}

3.3.2

Tris

Tris
import j a v a . u t i l . Random ;
import j a v a . l a n g . Math ;
public c l a s s RatTab
{
Rationnel [ ] t ;
//
public void i n i t ( i n t
{

taille )

65

t = new R a t i o n n e l [ t a i l l e ] ;
Random r = new Random ( ) ;
f o r ( i n t i = 0 ; i < t a i l l e ; i ++)
{
t [ i ] = new R a t i o n n e l ( ) ;
t [ i ] . num = r . n e x t I n t ( ) % 1 0 ;
t [ i ] . den = Math . ab s ( r . n e x t I n t ()%10)+1;
}
}
//
public S t r i n g t o S t r i n g ( )
{
String res = [ ;
i f ( t . l e n g t h >= 1 )
r e s += t [ 0 ] ;
for ( int i = 1 ; i < t . length
r e s += , + t [ i ] ;
r e s += ] ;
return r e s ;
}

i ++)

//
public void e c h a n g e ( i n t i , i n t j )
{
R a t i o n n e l temp = t [ i ] ;
t[ i ] = t[ j ];
t [ j ] = temp ;
}
//
public void t r i S e l e c t i o n ( )
{
f o r ( i n t i = 0 ; i < t . l e n g t h 1 ; i ++)
{
int indiceMin = i ;
f o r ( i n t j = i + 1 ; j < t . l e n g t h ; j ++)
i f ( t [ i n d i c e M i n ] . compareTo ( t [ j ] ) > 1 )
indiceMin = j ;
echange ( i , indiceMin ) ;
}
}
//
public boolean o rd o nn e ( i n t i , i n t j )
{
i f ( ( i j ) ( t [ i ] . compareTo ( t [ j ] ) ) < 0 )
{
echange ( i , j ) ;
return true ;
}
return f a l s e ;
}
//
public void t r i I n s e r t i o n ( )
{
f o r ( i n t i = 1 ; i < t . l e n g t h ; i ++)
{
int j = i ;
while ( j > 0 && o rd on n e ( j 1 , j ) )
j ;
}
}
//
public void t r i B u l l e ( )
{
f o r ( i n t i = t . l e n g t h 1 ; i > 0 ; i )
f o r ( i n t j = 0 ; j < i ; j ++)
o rd o nn e ( j , j + 1 ) ;
}
//

66

public void i n i t T a b ( RatTab o t h e r )


{
t = new R a t i o n n e l [ o t h e r . t . l e n g t h ] ;
f o r ( i n t i = 0 ; i < t . l e n g t h ; i ++)
t [ i ] = other . t [ i ] ;
}
//
public RatTab c o p i e ( )
{
RatTab o t h e r = new RatTab ( ) ;
other . initTab ( this ) ;
return o t h e r ;
}
//
public void i n t e r c l a s s e ( RatTab t1 , RatTab t 2 )
{
t = new R a t i o n n e l [ t 1 . t . l e n g t h + t 2 . t . l e n g t h ] ;
int i 1 = 0 , i 2 = 0 , i = 0 ;
while ( i < t . l e n g t h )
{
i f ( i 1 == t 1 . t . l e n g t h )
t [ i ++] = t 2 . t [ i 2 ++]. copy ( ) ;
e l s e i f ( i 2 == t 2 . t . l e n g t h )
t [ i ++] = t 1 . t [ i 1 ++]. copy ( ) ;
e l s e i f ( t 1 . t [ i 1 ] . compareTo ( t 2 . t [ i 2 ] ) < 0 )
t [ i ++] = t 1 . t [ i 1 ++]. copy ( ) ;
else
t [ i ++] = t 2 . t [ i 2 ++]. copy ( ) ;
}
}
//
public s t a t i c void main ( S t r i n g [ ]
{
RatTab t = new RatTab ( ) ;
t . init (10);
System . o u t . p r i n t l n ( t ) ;
t . triInsertion ();
System . o u t . p r i n t l n ( t ) ;
t . triSelection ();
System . o u t . p r i n t l n ( t ) ;
t . triBulle ();
System . o u t . p r i n t l n ( t ) ;
RatTab t B i s = new RatTab ( ) ;
tBis . initTab ( t ) ;
System . o u t . p r i n t l n ( t B i s ) ;
tBis = t . copie ( ) ;
System . o u t . p r i n t l n ( t B i s ) ;
tBis . i n i t (10);
System . o u t . p r i n t l n ( t B i s ) ;
RatTab t T e r = new RatTab ( ) ;
tBis . t r i I n s e r t i o n ( ) ;
System . o u t . p r i n t l n ( t B i s ) ;
tTer . i n t e r c l a s s e ( t , t B i s ) ;
System . o u t . p r i n t l n ( t T e r ) ;
tTer . t r i I n s e r t i o n ( ) ;
System . o u t . p r i n t l n ( t T e r ) ;
}

args )

3.4
3.4.1

Encapsulation
Prise en main

Rationnels propres
public c l a s s R a t i o n n e l P r o p r e
{
private i n t num , den ;
//
public R a t i o n n e l P r o p r e ( i n t num , i n t den )
{

67

t h i s . num = num ;
t h i s . den = den ;
}
//
public i n t getNum ( )
{
return num ;
}
//
public i n t getDen ( )
{
return den ;
}
//
public void setNum ( i n t num)
{
t h i s . num = num ;
}
//
public void set Den ( i n t den )
{
i f ( den != 0 )
t h i s . den = den ;
else
System . o u t . p r i n t l n ( D i v i s i o n by Z e r o
}

! ! ! );

//
public S t r i n g t o S t r i n g ( )
{
return num + / + den ;
}
//
public R a t i o n n e l P r o p r e copy ( )
{
R a t i o n n e l P r o p r e r = new R a t i o n n e l P r o p r e (num , den ) ;
return r ;
}
//
public R a t i o n n e l P r o p r e o p p o s i t e ( )
{
R a t i o n n e l P r o p r e r = copy ( ) ;
r . setNum( r . getNum ( ) ) ;
return r ;
}
//
private i n t pgcd ( i n t a , i n t b )
{
i f ( b == 0 )
return a ;
return pgcd ( b , a%b ) ;
}
public void r e d u c e ( )
{
i n t p = pgcd (num , den ) ;
num/=p ;
den=p ;
}
//
public boolean i s P o s i t i v e ( )
{
return num > 0 && den > 0 | | num < 0 && den < 0 ;
}

68

//
public R a t i o n n e l P r o p r e add ( R a t i o n n e l P r o p r e o t h e r )
{
RationnelPropre res =
new R a t i o n n e l P r o p r e (
num o t h e r . getDen ( ) + den o t h e r . getNum ( ) ,
den o t h e r . getDen ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
public void addB is ( R a t i o n n e l P r o p r e o t h e r )
{
num = num o t h e r . getDen ( ) + den o t h e r . getNum ( ) ;
den = den o t h e r . getDen ( ) ;
reduce ( ) ;
}
//
public R a t i o n n e l P r o p r e m u l t i p l y ( R a t i o n n e l P r o p r e o t h e r )
{
R a t i o n n e l P r o p r e r e s = new R a t i o n n e l P r o p r e (num o t h e r . getNum ( ) ,
den o t h e r . getDen ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
public R a t i o n n e l P r o p r e d i v i d e ( R a t i o n n e l P r o p r e o t h e r )
{
R a t i o n n e l P r o p r e r e s = new R a t i o n n e l P r o p r e (num o t h e r . getDen ( ) ,
den o t h e r . getNum ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
public i n t compareTo ( R a t i o n n e l P r o p r e o t h e r )
{
R a t i o n n e l P r o p r e sub = add ( o t h e r . o p p o s i t e ( ) ) ;
i f ( sub . i s P o s i t i v e ( ) )
return 1 ;
i f ( sub . o p p o s i t e ( ) . i s P o s i t i v e ( ) )
return 1;
return 0 ;
}
//
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
RationnelPropre a , b ;
a = new R a t i o n n e l P r o p r e ( 1 , 2 ) ;
b = new R a t i o n n e l P r o p r e ( 3 , 4 ) ;
System . o u t . p r i n t l n ( a = + a ) ;
System . o u t . p r i n t l n ( b = + b ) ;
System . o u t . p r i n t l n ( compareTo ( + a + , +
b + ) = + a . compareTo ( b ) ) ;
System . o u t . p r i n t l n ( a . copy ( ) ) ;
System . o u t . p r i n t l n ( a . o p p o s i t e ( ) ) ;
System . o u t . p r i n t l n ( a . add ( b ) ) ;
System . o u t . p r i n t l n ( a . m u l t i p l y ( b ) ) ;
System . o u t . p r i n t l n ( a . d i v i d e ( b ) ) ;
}
}

Listes chan
ees
public c l a s s I n t L i s t C o r r i g e
{
/
Donnee s t o c k e e dans l e m a i l l o n
/

69

private i n t d a t a ;
/ /
/
Pointeur vers l e maillon suivant
/
private I n t L i s t C o r r i g e n e x t ;
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
l e pointeur vers l element s u i v a n t .
/
I n t L i s t C o r r i g e ( i n t data ,
{
this . data = data ;
this . next = next ;
}

I n t L i s t C o r r i g e next )

/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
mettant l e s u i v a n t a n u l l .
/
I n t L i s t C o r r i g e ( int data )
{
t h i s ( data , n u l l ) ;
}
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
mettant l e s u i v a n t a n u l l .
/
IntListCorrige ( IntListCorrige other )
{
t h i s ( o t h e r . g e t D a t a ( ) , new I n t L i s t C o r r i g e ( o t h e r . g e t N e x t ( ) ) ) ;
}
/ /
/
Retourne l a donnee .
/
public i n t g e t D a t a ( )
{
return d a t a ;
}
/ /
/
M o d i f i e l a donnee
/
public void s e t D a t a ( i n t d a t a )
{
this . data = data ;
}
/ /
/
Retourne l e m a i l l o n s u i v a n t .
/
public I n t L i s t C o r r i g e g e t N e x t ( )
{
return n e x t ;
}
/ /

70

/
Modifie l e maillon suivant
/
public void s e t N e x t ( I n t L i s t C o r r i g e n e x t )
{
this . next = next ;
}
/ /
/
sentation
c
Retourne une repr A
s o u s forme de
c h a i n e de l a l i s t e .
/
public S t r i n g t o S t r i n g ( )
{
S t r i n g r e s = + data ;
i f ( n e x t != n u l l )
r e s += > + n e x t . t o S t r i n g ( ) ;
return r e s ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a
/

liste .

public s t a t i c void main ( S t r i n g [ ] a r g s )


{
I n t L i s t C o r r i g e l = new I n t L i s t C o r r i g e ( 2 0 ) ;
int i = 19;
while ( i >= 0 )
l = new I n t L i s t C o r r i g e ( i , l ) ;
System . o u t . p r i n t l n ( l ) ;
}
}

3.4.2

Impl
ementation dune pile

Avec un tableau
public c l a s s P i l e C o r r i g e
{
/
Tableau c o n t e n a n t l e s e l e m e n t s de l a
/
private i n t [ ]

pile .

tab ;

/ /
/
T a i l l e de l a

pile

/
private f i n a l i n t

taille ;

/ /
/
I n d i c e du premier e l e m e n t non occupe dans
le tableau .
/
private i n t f i r s t F r e e ;
/ /
/
Constructeur
/
P i l e C o r r i g e ( int t a i l l e )
{
this . t a i l l e = t a i l l e ;
t a b = new i n t [ t a i l l e ] ;

71

firstFree = 0;
}
/ /
/
C o n s t r u c t e u r de c o p i e .
/
PileCorrige ( PileCorrige other )
{
this ( other . t a i l l e ) ;
f i r s t F r e e = other . f i r s t F r e e ;
for ( int i = 0 ; i < f i r s t F r e e
tab [ i ] = o t h e r . tab [ i ] ;
}

i ++)

/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return f i r s t F r e e == 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i
pleine .

la

pile

est

/
public boolean e s t P l e i n e ( )
{
return f i r s t F r e e == t a i l l e ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
l a p i l e , 1 s i l a p i l e e s t v i d e .
/
public i n t sommet ( )
{
i f ( estVide ( ) )
return 1;
return t a b [ f i r s t F r e e 1 ] ;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( )
{
i f ( ! estVide ( ) )
f i r s t F r e e ;
}
/ /
/
Ajoute d a t a en hau t de l a p i l e , ne f a i t
si la pile est pleine .

rien

/
public void e m p i l e ( i n t d a t a )
{
if (! estPleine ())
t a b [ f i r s t F r e e ++] = d a t a ;
}

72

/ /
/
Retourne une r e p r e s e n t a t i o n de l a
au format c h a i n e de c a r a c t e r e s .

pile

/
public S t r i n g t o S t r i n g ( )
{
String res = [ ;
for ( int i = 0 ; i < f i r s t F r e e
r e s += + t a b [ i ] ;
return r e s + ] ;
}

i ++)

/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a

pile .

/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
P i l e C o r r i g e p = new P i l e C o r r i g e ( 3 0 ) ;
int i = 0 ;
while ( ! p . e s t P l e i n e ( ) )
p . e m p i l e ( i ++);
System . o u t . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
System . o u t . p r i n t l n ( p . sommet ( ) ) ;
p. depile ();
}
}
}

Avec une liste chan


ee
public c l a s s P i l e I n t L i s t
{
/
L i s t e c o n t e n a n t l e s e l e m e n t s de l a
/
private I n t L i s t C o r r i g e

pile .

l;

/ /
/
T a i l l e de l a

pile

/
private f i n a l i n t

taille ;

/ /
/
Nombre d e l e m e n t s dans l a

liste

/
private i n t nbItems ;
/ /
/
Constructeur
/
P i l e I n t L i s t ( int t a i l l e )
{
l = null ;
this . t a i l l e = t a i l l e ;
nbItems = 0 ;
}
/ /
/
C o n s t r u c t e u r de c o p i e .
/

73

P i l e I n t L i s t ( P i l e I n t L i s t other )
{
t a i l l e = other . t a i l l e ;
l = new I n t L i s t C o r r i g e ( o t h e r . l ) ;
nbItems = o t h e r . nbItems ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return nbItems == 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i
pleine .

la

pile

est

/
public boolean e s t P l e i n e ( )
{
return nbItems == t a i l l e ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
l a p i l e , 1 s i l a p i l e e s t v i d e .
/
public i n t sommet ( )
{
i f ( ! estVide ( ) )
return l . g e t D a t a ( ) ;
return 1;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( )
{
i f ( ! estVide ( ) )
{
l = l . getNext ( ) ;
nbItems ;
}
}
/ /
/
Ajoute d a t a en hau t de l a p i l e , ne f a i t
si la pile est pleine .

rien

/
public void e m p i l e ( i n t d a t a )
{
l = new I n t L i s t C o r r i g e ( data ,
nbItems ++;
}

l );

/ /
/
Retourne une r e p r e s e n t a t i o n de l a
au format c h a i n e de c a r a c t e r e s .

pile

74

/
public S t r i n g t o S t r i n g ( )
{
return l . t o S t r i n g ( ) ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a

pile .

/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
P i l e I n t L i s t p = new P i l e I n t L i s t ( 3 0 ) ;
int i = 0 ;
while ( ! p . e s t P l e i n e ( ) )
p . e m p i l e ( i ++);
System . o u t . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
System . o u t . p r i n t l n ( p . sommet ( ) ) ;
p. depile ();
}
}
}

3.5

H
eritage

3.5.1

H
eritage

Point
public c l a s s P o i n t C o r r i g e
{
private double abs , o r d ;
P o i n t C o r r i g e ( double abs , double o r d )
{
t h i s . ab s = ab s ;
this . ord = ord ;
}
PointCorrige ()
{
this (0 , 0 ) ;
}
public double getAbs ( )
{
return abs ;
}
public double getOrd ( )
{
return o r d ;
}
public void s e t A b s ( double abs )
{
t h i s . ab s = ab s ;
}
public void s e t O r d ( double o r d )
{
this . ord = ord ;
}
public S t r i n g t o S t r i n g ( )
{
return ( + abs + , + o r d + ) ;
}
}

Cercle
public c l a s s C e r c l e C o r r i g e extends P o i n t C o r r i g e

75

{
private double r a d i u s ;
C e r c l e C o r r i g e ( double abs , double ord , double r a d i u s )
{
super ( abs , o r d ) ;
this . radius = radius ;
}
CercleCorrige ()
{
this (0 , 0 , 0 ) ;
}
public double g e t R a d i u s ( )
{
return r a d i u s ;
}
public void s e t R a d i u s ( double abs )
{
this . radius = radius ;
}
public S t r i n g t o S t r i n g ( )
{
return ( + super . t o S t r i n g ()+
}

, + radius + ) ;

Liste dobjets
public c l a s s O b j e c t L i s t
{
/
Donnee s t o c k e e dans l e m a i l l o n
/
private O b j e c t d a t a ;
/ /
/
Pointeur vers l e maillon suivant
/
private O b j e c t L i s t n e x t ;
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
l e pointeur vers l element s u i v a n t .
/
O b j e c t L i s t ( O b j e c t data ,
{
this . data = data ;
this . next = next ;
}

O b j e c t L i s t next )

/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
mettant l e s u i v a n t a n u l l .
/
O b j e c t L i s t ( Object data )
{
t h i s ( data , n u l l ) ;
}
/ /
/
Retourne l a donnee .
/
public O b j e c t g e t D a t a ( )
{
return d a t a ;

76

}
/ /
/
M o d i f i e l a donnee
/
public void s e t D a t a ( O b j e c t d a t a )
{
this . data = data ;
}
/ /
/
Retourne l e m a i l l o n s u i v a n t .
/
public O b j e c t L i s t g e t N e x t ( )
{
return n e x t ;
}
/ /
/
Modifie l e maillon suivant
/
public void s e t N e x t ( O b j e c t L i s t n e x t )
{
this . next = next ;
}
/ /
/
sentation
c
Retourne une repr A
s o u s forme de
c h a i n e de l a l i s t e .
/
public S t r i n g t o S t r i n g ( )
{
S t r i n g r e s = + data ;
i f ( n e x t != n u l l )
r e s += > + n e x t . t o S t r i n g ( ) ;
return r e s ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a
/

liste .

public s t a t i c void main ( S t r i n g [ ] a r g s )


{
O b j e c t L i s t l = new O b j e c t L i s t ( 2 0 ) ;
int i = 3 ;
while ( i >= 0 )
l = new O b j e c t L i s t (new I n t e g e r ( i ) ,
System . o u t . p r i n t l n ( l ) ;
}

l );

Pile dobjets
public c l a s s O b j e c t S t a c k
{
/
L i s t e c o n t e n a n t l e s e l e m e n t s de l a
/
private O b j e c t L i s t

pile .

l;

/ /
/
T a i l l e de l a

pile

77

private f i n a l i n t

taille ;

/ /
/
Nombre d e l e m e n t s dans l a

liste

/
private i n t nbItems ;
/ /
/
Constructeur
/
ObjectStack ( int t a i l l e )
{
l = null ;
this . t a i l l e = t a i l l e ;
nbItems = 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return nbItems == 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i
pleine .

la

pile

est

/
public boolean e s t P l e i n e ( )
{
return nbItems == t a i l l e ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
l a p i l e , 1 s i l a p i l e e s t v i d e .
/
public O b j e c t sommet ( )
{
i f ( ! estVide ( ) )
return l . g e t D a t a ( ) ;
return 1;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( )
{
i f ( ! estVide ( ) )
{
l = l . getNext ( ) ;
nbItems ;
}
}
/ /
/

78

Ajoute d a t a en hau t de l a p i l e , ne f a i t
si la pile est pleine .

rien

/
public void e m p i l e ( i n t d a t a )
{
l = new O b j e c t L i s t ( data , l ) ;
nbItems ++;
}
/ /
/
Retourne une r e p r e s e n t a t i o n de l a
au format c h a i n e de c a r a c t e r e s .

pile

/
public S t r i n g t o S t r i n g ( )
{
return l . t o S t r i n g ( ) ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a

pile .

/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
O b j e c t S t a c k p = new O b j e c t S t a c k ( 3 0 ) ;
int i = 0 ;
while ( ! p . e s t P l e i n e ( ) )
p . e m p i l e (new I n t e g e r ( i ++));
System . o u t . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
System . o u t . p r i n t l n ( p . sommet ( ) ) ;
p. depile ();
}
}
}

3.5.2

Interfaces

Animaux
public i n t e r f a c e Animal
{
public void setNom ( S t r i n g nom ) ;
public S t r i n g getNom ( ) ;
public S t r i n g p a r l e ( ) ;
}
public c l a s s Chien implements Animal
{
private S t r i n g nom ;
public Chien ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public void setNom ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public S t r i n g getNom ( )
{
return nom ;
}
public S t r i n g p a r l e ( )
{
return Waf ! ;
}
}

79

public c l a s s Chat implements Animal


{
private S t r i n g nom ;
public Chat ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public void setNom ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public S t r i n g getNom ( )
{
return nom ;
}
public S t r i n g p a r l e ( )
{
return Miaou ! ;
}
}
public c l a s s Vache implements Animal
{
private S t r i n g nom ;
public Vache ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public void setNom ( S t r i n g nom)
{
t h i s . nom = nom ;
}
public S t r i n g getNom ( )
{
return nom ;
}
public S t r i n g p a r l e ( )
{
return Meuh ! ;
}
}

Tableau de Comparables
import j a v a . u t i l . Random ;
import j a v a . l a n g . Math ;
public c l a s s ComparableTab
{
private Comparable [ ] t ;
//
ComparableTab ( i n t t a i l l e )
{
t = new Comparable [ t a i l l e ] ;
}
//
public S t r i n g t o S t r i n g ( )
{
String res = [ ;
i f ( t . l e n g t h >= 1 )
r e s += t [ 0 ] ;
for ( int i = 1 ; i < t . length
r e s += , + t [ i ] ;
r e s += ] ;
return r e s ;
}

i ++)

//

80

public Comparable g e t ( i n t i n d e x )
{
return t [ i n d e x ] ;
}
//
public void s e t ( i n t i n d e x , Comparable v a l u e )
{
t [ index ] = value ;
}
//
public void e c h a n g e ( i n t i , i n t j )
{
Comparable temp = t [ i ] ;
t[ i ] = t[ j ];
t [ j ] = temp ;
}
//
public void t r i S e l e c t i o n ( )
{
f o r ( i n t i = 0 ; i < t . l e n g t h 1 ; i ++)
{
int indiceMin = i ;
f o r ( i n t j = i + 1 ; j < t . l e n g t h ; j ++)
i f ( t [ i n d i c e M i n ] . compareTo ( t [ j ] ) > 1 )
indiceMin = j ;
echange ( i , indiceMin ) ;
}
}
//
public boolean o rd o nn e ( i n t i , i n t j )
{
i f ( ( i j ) ( t [ i ] . compareTo ( t [ j ] ) ) < 0 )
{
echange ( i , j ) ;
return true ;
}
return f a l s e ;
}
//
public void t r i I n s e r t i o n ( )
{
f o r ( i n t i = 1 ; i < t . l e n g t h ; i ++)
{
int j = i ;
while ( j > 0 && o rd on n e ( j 1 , j ) )
j ;
}
}
//
public void t r i B u l l e ( )
{
f o r ( i n t i = t . l e n g t h 1 ; i > 0 ; i )
f o r ( i n t j = 0 ; j < i ; j ++)
o rd on n e ( j , j + 1 ) ;
}
//
public void i n i t T a b ( ComparableTab o t h e r )
{
t = new Comparable [ o t h e r . t . l e n g t h ] ;
f o r ( i n t i = 0 ; i < t . l e n g t h ; i ++)
t [ i ] = other . t [ i ] ;
}
//
public ComparableTab c o p i e ( )

81

{
ComparableTab o t h e r = new ComparableTab ( t . l e n g t h ) ;
other . initTab ( this ) ;
return o t h e r ;
}
//
public void i n t e r c l a s s e ( ComparableTab t1 , ComparableTab t 2 )
{
t = new Comparable [ t 1 . t . l e n g t h + t 2 . t . l e n g t h ] ;
int i 1 = 0 , i 2 = 0 , i = 0 ;
while ( i < t . l e n g t h )
{
i f ( i 1 == t 1 . t . l e n g t h )
t [ i ++] = t 2 . t [ i 2 ++];
e l s e i f ( i 2 == t 2 . t . l e n g t h )
t [ i ++] = t 1 . t [ i 1 ++];
e l s e i f ( t 1 . t [ i 1 ] . compareTo ( t 2 . t [ i 2 ] ) < 0 )
t [ i ++] = t 1 . t [ i 1 ++];
else
t [ i ++] = t 2 . t [ i 2 ++];
}
}
//
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
ComparableTab t = new ComparableTab ( 1 0 ) ;
Random r = new Random ( ) ;
f o r ( i n t i = 0 ; i < 10 ; i ++)
t . set ( i ,
new R a t i o n n e l C o m p a r a b l e ( r . n e x t I n t ( ) % 1 0 ,
Math . ab s ( r . n e x t I n t ())%10 + 1 ) ) ;
System . o u t . p r i n t l n ( t ) ;
t . triInsertion ();
System . o u t . p r i n t l n ( t ) ;
t . triSelection ();
System . o u t . p r i n t l n ( t ) ;
t . triBulle ();
System . o u t . p r i n t l n ( t ) ;
ComparableTab t B i s = new ComparableTab ( 1 0 ) ;
System . o u t . p r i n t l n ( t B i s ) ;
tBis = t . copie ( ) ;
System . o u t . p r i n t l n ( t B i s ) ;
ComparableTab t T e r = new ComparableTab ( 1 0 ) ;
tBis . t r i I n s e r t i o n ( ) ;
tTer . i n t e r c l a s s e ( t , t B i s ) ;
System . o u t . p r i n t l n ( t T e r ) ;
tTer . t r i I n s e r t i o n ( ) ;
System . o u t . p r i n t l n ( t T e r ) ;
}
}

Rationnels comparables
public c l a s s R a t i o n n e l C o m p a r a b l e implements Comparable
{
private i n t num , den ;
//
public R a t i o n n e l C o m p a r a b l e ( i n t num , i n t den )
{
t h i s . num = num ;
t h i s . den = den ;
}
//
public i n t getNum ( )
{
return num ;
}
//
public i n t getDen ( )
{
return den ;

82

}
//
public void setNum ( i n t num)
{
t h i s . num = num ;
}
//
public void set Den ( i n t den )
{
i f ( den != 0 )
t h i s . den = den ;
else
System . o u t . p r i n t l n ( D i v i s i o n by Z e r o
}

! ! ! );

//
public S t r i n g t o S t r i n g ( )
{
return num + / + den ;
}
//
public R a t i o n n e l C o m p a r a b l e copy ( )
{
R a t i o n n e l C o m p a r a b l e r = new R a t i o n n e l C o m p a r a b l e (num , den ) ;
return r ;
}
//
public R a t i o n n e l C o m p a r a b l e o p p o s i t e ( )
{
R a t i o n n e l C o m p a r a b l e r = copy ( ) ;
r . setNum( r . getNum ( ) ) ;
return r ;
}
//
private i n t pgcd ( i n t a , i n t b )
{
i f ( b == 0 )
return a ;
return pgcd ( b , a%b ) ;
}
public void r e d u c e ( )
{
i n t p = pgcd (num , den ) ;
num/=p ;
den=p ;
}
//
public boolean i s P o s i t i v e ( )
{
return num > 0 && den > 0 | | num < 0 && den < 0 ;
}
//
public R a t i o n n e l C o m p a r a b l e add ( R a t i o n n e l C o m p a r a b l e o t h e r )
{
RationnelComparable r e s =
new R a t i o n n e l C o m p a r a b l e (
num o t h e r . getDen ( ) + den o t h e r . getNum ( ) ,
den o t h e r . getDen ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
public void addB is ( R a t i o n n e l C o m p a r a b l e o t h e r )

83

{
num = num o t h e r . getDen ( ) + den o t h e r . getNum ( ) ;
den = den o t h e r . getDen ( ) ;
reduce ( ) ;
}
//
public R a t i o n n e l C o m p a r a b l e m u l t i p l y ( R a t i o n n e l C o m p a r a b l e o t h e r )
{
R a t i o n n e l C o m p a r a b l e r e s = new R a t i o n n e l C o m p a r a b l e (num o t h e r . getNum ( ) ,
den o t h e r . getDen ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
public R a t i o n n e l C o m p a r a b l e d i v i d e ( R a t i o n n e l C o m p a r a b l e o t h e r )
{
R a t i o n n e l C o m p a r a b l e r e s = new R a t i o n n e l C o m p a r a b l e (num o t h e r . getDen ( ) ,
den o t h e r . getNum ( ) ) ;
other . reduce ( ) ;
return r e s ;
}
//
/
1 s i t h i s < o t h e r
0 si this = others
1 s i t h i s > other
/
public i n t compareTo ( O b j e c t o t h e r )
{
R a t i o n n e l C o m p a r a b l e sub = add ( ( ( R a t i o n n e l C o m p a r a b l e ) o t h e r ) . o p p o s i t e ( ) ) ;
i f ( sub . i s P o s i t i v e ( ) )
return 1 ;
i f ( sub . o p p o s i t e ( ) . i s P o s i t i v e ( ) )
return 1;
return 0 ;
}
//
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
RationnelComparable a , b ;
a = new R a t i o n n e l C o m p a r a b l e ( 1 , 2 ) ;
b = new R a t i o n n e l C o m p a r a b l e ( 3 , 4 ) ;
System . o u t . p r i n t l n ( a = + a ) ;
System . o u t . p r i n t l n ( b = + b ) ;
System . o u t . p r i n t l n ( compareTo ( + a + , +
b + ) = + a . compareTo ( b ) ) ;
System . o u t . p r i n t l n ( compareTo ( + a + , +
a + ) = + a . compareTo ( a ) ) ;
System . o u t . p r i n t l n ( compareTo ( + a + , +
a . o p p o s i t e ( ) + ) = + a . compareTo ( a . o p p o s i t e ( ) ) ) ;
System . o u t . p r i n t l n ( a . copy ( ) ) ;
System . o u t . p r i n t l n ( a . o p p o s i t e ( ) ) ;
System . o u t . p r i n t l n ( a . add ( b ) ) ;
System . o u t . p r i n t l n ( a . m u l t i p l y ( b ) ) ;
System . o u t . p r i n t l n ( a . d i v i d e ( b ) ) ;
}
}

3.5.3

Classes abstraites

Animaux
public abstract c l a s s A n i m a l A b s t r a i t
{
private S t r i n g nom ;
public A n i m a l A b s t r a i t ( S t r i n g nom)
{
setNom (nom ) ;
}
public void setNom ( S t r i n g nom)

84

{
t h i s . nom = nom ;
}
public S t r i n g getNom ( )
{
return nom ;
}
public abstract S t r i n g p a r l e ( ) ;
}
public c l a s s C h i e n A b s t r a i t extends A n i m a l A b s t r a i t
{
public C h i e n A b s t r a i t ( S t r i n g nom)
{
super (nom ) ;
}
public S t r i n g p a r l e ( )
{
return Waf ! ;
}
}
public c l a s s C h a t A b s t r a i t extends A n i m a l A b s t r a i t
{
private S t r i n g nom ;
public C h a t A b s t r a i t ( S t r i n g nom)
{
super (nom ) ;
}
public S t r i n g p a r l e ( )
{
return Miaou ! ;
}
}
public c l a s s V a c h e A b s t r a i t extends A n i m a l A b s t r a i t
{
private S t r i n g nom ;
public V a c h e A b s t r a i t ( S t r i n g nom)
{
super (nom ) ;
}
public S t r i n g p a r l e ( )
{
return Meuh ! ;
}
}

Arbres syntaxiques
/
Fonction d une v a r i a b l e .
/
public abstract c l a s s F u n c t i o n
{
/
Retourne l image de x .
/
public abstract double e v a l u a t e ( double x ) ;
/
Retourne l a d&e a c u t e ; r i v&e a c u t e ; e .
/
public abstract F u n c t i o n d e r i v a t e ( ) ;
/
Retourne l a f o n c t i o n s i m p l i f i&e a c u t e ; e .
/
public abstract F u n c t i o n s i m p l i f y ( ) ;

85

/
S s i l a f o n c t i o n ne c o n t i e n t pas de v a r i a b l e .
/
public abstract boolean i s C o n s t a n t ( ) ;
/
S s i l a f o n c t i o n e s t une f e u i l l e
/
public abstract boolean i s Z e r o ( ) ;

valant 0.

/
Ssi la fonction
e s t une f e u i l l e
/
public abstract boolean i s O n e ( ) ;

valant 1.

/
Retourne l i n t e g r a l e e n t r e a e t b ( a < b ) , c a l c u l&e a c u t e ; e av ec
l a m&e a c u t e ; t h o d e d e s t r a p&e g r a v e ; z e s en
e f f e c t u a n t n b S u b d i v i s i o n s s u b d i v i s i o n s de l i n t e r v a l l e
&a g r a v e ; i n t&e a c u t e ; g r e r .
/
public double i n t e g r a t e ( double a , double b , i n t n b S u b d i v i s i o n s )
{
i f (b < a)
return i n t e g r a t e ( b , a , n b S u b d i v i s i o n s ) ;
double e p s = 1 . / n b S u b d i v i s i o n s ;
double i n t e g r a l = ( e v a l u a t e ( a ) + e v a l u a t e ( b ) ) / 2 ;
f o r ( ; a < b ; a += e p s )
{
i n t e g r a l += e v a l u a t e ( a ) ;
}
return i n t e g r a l e p s ;
}

public s t a t i c void main ( S t r i n g a r g s [ ] )


{
F u n c t i o n f = new Minus (new Times (new C o n s t a n t ( 4 ) , new V a r i a b l e ( ) ) ,
new Div (new C o n s t a n t ( 1 ) , new V a r i a b l e ( ) ) ) ;
System . o u t . p r i n t l n ( f ) ;
System . o u t . p r i n t l n ( f . e v a l u a t e ( 2 ) ) ;
System . o u t . p r i n t l n ( f . d e r i v a t e ( ) ) ;
System . o u t . p r i n t l n ( f . d e r i v a t e ( ) . s i m p l i f y ( ) ) ;
System . o u t . p r i n t l n ( f . e v a l u a t e ( 2 0 ) f . e v a l u a t e ( 2 ) ) ;
f o r ( i n t i = 100000 ; i <= 1 0 0 0 0 0 0 0 ; i +=100000)
System . o u t . p r i n t l n ( i = + i + :
+ f . d e r i v a t e ( ) . i n t e g r a t e (2 , 20 , i ) ) ;
}
}
/
f ( x ) = c , o&u g r a v e ; c e s t une c o n s t a n t e r&e a c u t e ; e l l e .
/
public c l a s s C o n s t a n t extends F u n c t i o n
{
private double v a l u e ;
Co n st a n t ( double v a l u e )
{
this . value = value ;
}
public boolean i s Z e r o ( )
{
return v a l u e == 0 ;
}
public boolean i s O n e ( )
{
return v a l u e == 1 ;
}
public boolean i s C o n s t a n t ( )
{
return true ;
}
public F u n c t i o n d e r i v a t e ( )
{

86

return new C o n s t a n t ( 0 ) ;
}
public double e v a l u a t e ( double x )
{
return v a l u e ;
}
public F u n c t i o n s i m p l i f y ( )
{
return t h i s ;
}
public S t r i n g t o S t r i n g ( )
{
return + v a l u e ;
}
}
/
f (x) = x .
/
public c l a s s V a r i a b l e extends F u n c t i o n
{
Variable ()
{
}
public boolean i s Z e r o ( )
{
return f a l s e ;
}
public boolean i s O n e ( )
{
return f a l s e ;
}
public boolean i s C o n s t a n t ( )
{
return f a l s e ;
}
public F u n c t i o n d e r i v a t e ( )
{
return new C o n s t a n t ( 1 ) ;
}
public double e v a l u a t e ( double x )
{
return x ;
}
public F u n c t i o n s i m p l i f y ( )
{
return t h i s ;
}
public S t r i n g t o S t r i n g ( )
{
return x ;
}
}
/
Fonction s exprimant comme une op&e a c u t e ; r a t i o n b i n a i r e e n t r e
deux a u t r e s f o n c t i o n s .
/
public abstract c l a s s B i n a r y O p e r a t o r extends F u n c t i o n
{
protected F u n c t i o n l e f t S o n ;
protected F u n c t i o n r i g h t S o n ;

BinaryOperator ( Function l e f t S o n , Function rightSon )


{
this . leftSon = leftSon ;
this . rightSon = rightSon ;
}

87

/
Retourne l op&e a c u t e ; r a t e u r b i n a i r e s o u s forme de c a r a c t&e g r a v e ; r e
( + pour une a d d i t i o n pour une s o u s t r a c t i o n , e t c ) .
/
public abstract char toChar ( ) ;
public S t r i n g t o S t r i n g ( )
{
return ( + l e f t S o n
}

+ + toChar ( )

+ + rightSon + ) ;

public boolean i s Z e r o ( )
{
return f a l s e ;
}
public boolean i s O n e ( )
{
return f a l s e ;
}
public boolean i s C o n s t a n t ( )
{
return l e f t S o n . i s C o n s t a n t ( ) && r i g h t S o n . i s C o n s t a n t ( ) ;
}
/
Remplace l e s sousa r b r e s par l e u r s v e r s i o n s s i m p l i f i&e a c u t e ; es ,
r e t o u r n e une f e u i l l e s i l a r b r e e s t c o n s t a n t .
/
protected F u n c t i o n s i m p l i f y S u b T r e e s ( )
{
leftSon = leftSon . simplify ();
rightSon = rightSon . simplify ( ) ;
i f ( isConstant ( ) )
return new C o n s t a n t ( e v a l u a t e ( 0 . 0 ) ) ;
return n u l l ;
}
}
/
f ( x ) = g ( x ) + h ( x ) , o&u g r a v e ; g e t h s o n t l e s sousa r b r e s gauche
et droit .
/
public c l a s s P l u s extends B i n a r y O p e r a t o r
{
Plus ( Function l e f t S o n , Function rightSon )
{
super ( l e f t S o n , r i g h t S o n ) ;
}
public char toChar ( )
{
return + ;
}
public double e v a l u a t e ( double x )
{
return l e f t S o n . e v a l u a t e ( x ) + r i g h t S o n . e v a l u a t e ( x ) ;
}
public F u n c t i o n d e r i v a t e ( )
{
return new P l u s ( l e f t S o n . d e r i v a t e ( ) , r i g h t S o n . d e r i v a t e ( ) ) ;
}
public F u n c t i o n s i m p l i f y ( )
{
Function f = simplifySubTrees ( ) ;
i f ( f != n u l l )
return f ;
if ( leftSon . isZero ())
return r i g h t S o n ;
i f ( rightSon . isZero ( ) )
return l e f t S o n ;
return t h i s ;
}

88

}
/
f ( x ) = g ( x ) h ( x ) , o&u g r a v e ; g e t h s o n t l e s sousa r b r e s gauche
et droit .
/
public c l a s s Minus extends B i n a r y O p e r a t o r
{
Minus ( F u n c t i o n l e f t S o n , F u n c t i o n r i g h t S o n )
{
super ( l e f t S o n , r i g h t S o n ) ;
}
public char toChar ( )
{
return ;
}
public double e v a l u a t e ( double x )
{
return l e f t S o n . e v a l u a t e ( x ) r i g h t S o n . e v a l u a t e ( x ) ;
}
public F u n c t i o n d e r i v a t e ( )
{
return new Minus ( l e f t S o n . d e r i v a t e ( ) , r i g h t S o n . d e r i v a t e ( ) ) ;
}
public F u n c t i o n s i m p l i f y ( )
{
Function f = simplifySubTrees ( ) ;
i f ( f != n u l l )
return f ;
i f ( rightSon . isZero ( ) )
return l e f t S o n ;
if ( leftSon . isZero ())
return new Times (new C o n s t a n t ( 1) , r i g h t S o n ) ;
return t h i s ;
}
}
/
f ( x ) = g ( x ) h ( x ) , o&u g r a v e ; g e t h s o n t l e s sousa r b r e s gauche
et droit .
/
public c l a s s Times extends B i n a r y O p e r a t o r
{
Times ( F u n c t i o n l e f t S o n , F u n c t i o n r i g h t S o n )
{
super ( l e f t S o n , r i g h t S o n ) ;
}
public char toChar ( )
{
return ;
}
public double e v a l u a t e ( double x )
{
return l e f t S o n . e v a l u a t e ( x ) r i g h t S o n . e v a l u a t e ( x ) ;
}
public F u n c t i o n d e r i v a t e ( )
{
return new P l u s (new Times ( l e f t S o n . d e r i v a t e ( ) , r i g h t S o n ) ,
new Times ( l e f t S o n , r i g h t S o n . d e r i v a t e ( ) ) ) ;
}
public F u n c t i o n s i m p l i f y ( )
{
Function f = simplifySubTrees ( ) ;
i f ( f != n u l l )
return f ;
i f ( rightSon . isZero () | | leftSon . isZero ( ) )
return new C o n s t a n t ( 0 ) ;
i f ( ri gh tSo n . isOne ( ) )
return l e f t S o n ;
i f ( l e f t S o n . isOne ( ) )
return r i g h t S o n ;

89

return t h i s ;
}
}
/
f ( x ) = g ( x ) / h ( x ) , o&u g r a v e ; g e t h s o n t l e s sousa r b r e s gauche
et droit .
/
public c l a s s Div extends B i n a r y O p e r a t o r
{
Div ( F u n c t i o n l e f t S o n , F u n c t i o n r i g h t S o n )
{
super ( l e f t S o n , r i g h t S o n ) ;
}
public char toChar ( )
{
return / ;
}
public double e v a l u a t e ( double x )
{
return l e f t S o n . e v a l u a t e ( x ) / r i g h t S o n . e v a l u a t e ( x ) ;
}
public F u n c t i o n d e r i v a t e ( )
{
return new Div (
new Minus (new Times ( l e f t S o n . d e r i v a t e ( ) , r i g h t S o n ) ,
new Times ( l e f t S o n , r i g h t S o n . d e r i v a t e ( ) ) ) ,
new Times ( r i g h t S o n , r i g h t S o n )
);
}
public F u n c t i o n s i m p l i f y ( )
{
Function f = simplifySubTrees ( ) ;
i f ( f != n u l l )
return f ;
if ( leftSon . isZero ())
return new C o n s t a n t ( 0 ) ;
i f ( ri gh tSo n . isOne ( ) )
return l e f t S o n ;
i f ( l e f t S o n . isOne ( ) )
return r i g h t S o n ;
return t h i s ;
}
}

3.6

Exceptions

Classe inutile
public c l a s s C l a s s e I n u t i l e
{
public void n e P a s I n v o q u e r ( ) throws E x c e p t i o n I n u t i l e
{
throw new E x c e p t i o n I n u t i l e ( ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
C l a s s e I n u t i l e o = new C l a s s e I n u t i l e ( ) ;
try
{
o . nePasInvoquer ( ) ;
}
catch ( E x c e p t i o n I n u t i l e e )
{
System . o u t . p r i n t l n ( e ) ;
}
}
}
c l a s s E x c e p t i o n I n u t i l e extends E x c e p t i o n
{
public E x c e p t i o n I n u t i l e ( )

90

{
System . o u t . p r i n t l n ( Je vous a v a i s d i t de ne pas +
invoquer c e tt e fonction ! ) ;
}
public S t r i n g t o S t r i n g ( )
{
return Vous a v e z e s s a y e r d i n v o q u e r une methode +
qu i l ne f a l l a i t pas i n v o q u e r ! ;
}
}

Pile
public c l a s s O b j e c t S t a c k
{
/
L i s t e c o n t e n a n t l e s e l e m e n t s de l a
/
private O b j e c t L i s t

pile .

l;

/ /
/
T a i l l e de l a

pile

/
private f i n a l i n t

taille ;

/ /
/
Nombre d e l e m e n t s dans l a

liste

/
private i n t nbItems ;
/ /
/
Constructeur
/
ObjectStack ( int t a i l l e )
{
l = null ;
this . t a i l l e = t a i l l e ;
nbItems = 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return nbItems == 0 ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t s i
pleine .

la

pile

est

/
public boolean e s t P l e i n e ( )
{
return nbItems == t a i l l e ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
l a p i l e , 1 s i l a p i l e e s t v i d e .
/

91

public O b j e c t sommet ( )
{
i f ( ! estVide ( ) )
return l . g e t D a t a ( ) ;
return 1;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( ) throws P i l e V i d e E x c e p t i o n
{
i f ( ! estVide ( ) )
{
l = l . getNext ( ) ;
nbItems ;
}
else
{
throw new P i l e V i d e E x c e p t i o n ( ) ;
}
}
/ /
/
Ajoute d a t a en hau t de l a p i l e , ne f a i t
si la pile est pleine .

rien

/
public void e m p i l e ( i n t d a t a )
{
l = new O b j e c t L i s t ( data , l ) ;
nbItems ++;
}
/ /
/
Retourne une r e p r e s e n t a t i o n de l a
au format c h a i n e de c a r a c t e r e s .

pile

/
public S t r i n g t o S t r i n g ( )
{
return l . t o S t r i n g ( ) ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a

pile .

/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
O b j e c t S t a c k p = new O b j e c t S t a c k ( 3 0 ) ;
int i = 0 ;
while ( ! p . e s t P l e i n e ( ) )
p . e m p i l e (new I n t e g e r ( i ++));
System . o u t . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
System . o u t . p r i n t l n ( p . sommet ( ) ) ;
try
{
p. depile ();
}
catch ( P i l e V i d e E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
}
}
}

92

3.7

Interfaces graphiques

3.7.1

Ecouteurs
d
ev
enement

import j a v a x . s w i n g . ;
import j a v a . awt . e v e n t . ;
public c l a s s FormaterDisqueDur extends JFrame implements A c t i o n L i s t e n e r
{
public FormaterDisqueDur ( )
{
s e t T i t l e ( G e s t i o n n a i r e du d i s q u e dur ) ;
s e t S i z e (100 , 100);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
JButton f o r m a t e r = new JButton ( Formater l e d i s q u e dur ) ;
g e t C o n t e n t P a n e ( ) . add ( f o r m a t e r ) ;
formater . addActionListener ( this ) ;
s e t V i s i b l e ( true ) ;
}
public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e )
{
System . o u t . p r i n t l n ( Formatage en c o u r s . ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
FormaterDisqueDur f = new FormaterDisqueDur ( ) ;
}
}
import j a v a x . s w i n g . ;
import j a v a . awt . e v e n t . ;
public c l a s s FormaterDisqueDurAnonyme extends JFrame
{

public FormaterDisqueDurAnonyme ( )
{
s e t T i t l e ( G e s t i o n n a i r e du d i s q u e dur ) ;
s e t S i z e (100 , 100);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
JButton f o r m a t e r = new JButton ( Formater l e d i s q u e dur ) ;
g e t C o n t e n t P a n e ( ) . add ( f o r m a t e r ) ;
f o r m a t e r . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( )
{
public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e )
{
System . o u t . p r i n t l n ( Formatage en c o u r s . ) ;
}
}
);
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
FormaterDisqueDurAnonyme f = new FormaterDisqueDurAnonyme ( ) ;
}
}
import j a v a x . s w i n g . ;
import j a v a . awt . e v e n t . ;
public c l a s s FormaterDisqueDurNonAnonyme extends JFrame
{
public FormaterDisqueDurNonAnonyme ( )
{
s e t T i t l e ( G e s t i o n n a i r e du d i s q u e dur ) ;
s e t S i z e (100 , 100);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
JButton f o r m a t e r = new JButton ( Formater l e d i s q u e dur ) ;
g e t C o n t e n t P a n e ( ) . add ( f o r m a t e r ) ;
f o r m a t e r . a d d A c t i o n L i s t e n e r (new A f f i c h a g e F o r m a t a g e ( ) ) ;
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ]

args )

93

{
FormaterDisqueDurNonAnonyme f = new FormaterDisqueDurNonAnonyme ( ) ;
}
}
c l a s s A f f i c h a g e F o r m a t a g e implements A c t i o n L i s t e n e r
{
public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e )
{
System . o u t . p r i n t l n ( Formatage en c o u r s . ) ;
}
}

3.7.2

Gestionnaires de mise en forme

import j a v a x . s w i n g . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s FormaterDisqueDurGridLayout extends JFrame
{
public FormaterDisqueDurGridLayout ( )
{
s e t T i t l e ( G e s t i o n n a i r e du d i s q u e dur ) ;
s e t S i z e (100 , 100);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
JButton f o r m a t e r = new JButton ( Formater l e d i s q u e dur ) ;
f i n a l J L a b e l l a b e l = new J L a b e l ( ) ;
f o r m a t e r . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( )
{
public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e )
{
l a b e l . s e t T e x t ( Formatage en c o u r s . ) ;
}
}
);
g e t C o n t e n t P a n e ( ) . s e t L a y o u t (new GridLayout ( 2 , 1 ) ) ;
g e t C o n t e n t P a n e ( ) . add ( f o r m a t e r ) ;
g e t C o n t e n t P a n e ( ) . add ( l a b e l ) ;
s e t V i s i b l e ( true ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
FormaterDisqueDurGridLayout f = new FormaterDisqueDurGridLayout ( ) ;
}
}

Convertisseur Euro/Dollar
import j a v a x . s w i n g . ;
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
public c l a s s E u r o D o l l a r extends JFrame
{
f i n a l double O n e D o l l a r I n E u r o = 1 . 4 2 3 7 ;
f i n a l JTextField dollarText , euroText ;
f i n a l JLabel d o l l a r L a b e l , euroLabel ;
private void c o n v e r t ( J T e x t F i e l d s o u r c e , J T e x t F i e l d t a r g e t , double r a t e )
{
try
{
double k = new Double ( s o u r c e . g e t T e x t ( ) ) . d o u b l e V a l u e ( ) ;
k = r a t e ;
t a r g e t . s e t T e x t ( ( new Double ( k ) ) . t o S t r i n g ( ) ) ;
}
catch ( NumberFormatException ex )
{
i f ( t a r g e t != n u l l )
t a r g e t . setText ( ) ;
}
}
public E u r o D o l l a r ( )
{
g e t C o n t e n t P a n e ( ) . s e t L a y o u t (new GridLayout ( 2 ,
d o l l a r T e x t = new J T e x t F i e l d ( ) ;
e u r o T e x t = new J T e x t F i e l d ( ) ;

94

2));

d o l l a r L a b e l = new J L a b e l ( D o l l a r s ) ;
e u r o L a b e l = new J L a b e l ( Euros ) ;
g e t C o n t e n t P a n e ( ) . add ( d o l l a r L a b e l ) ;
g e t C o n t e n t P a n e ( ) . add ( e u r o L a b e l ) ;
g e t C o n t e n t P a n e ( ) . add ( d o l l a r T e x t ) ;
g e t C o n t e n t P a n e ( ) . add ( e u r o T e x t ) ;
s e t T i t l e ( C o n v e r t i s s e u r Euros / D o l l a r s ) ;
s e t S i z e (400 , 50);
s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
s e t V i s i b l e ( true ) ;
e u r o T e x t . a d d K e y L i s t e n e r (new K e y L i s t e n e r ( )
{
public void keyTyped ( KeyEvent e ) { }
public void k e y P r e s s e d ( KeyEvent e ) { }
public void k e y R e l e a s e d ( KeyEvent e )
{
c o n v e r t ( euroText , d o l l a r T e x t , O n e D o l l a r I n E u r o ) ;
}
}
);
d o l l a r T e x t . a d d K e y L i s t e n e r (new K e y L i s t e n e r ( )
{
public void keyTyped ( KeyEvent e ) { }
public void k e y P r e s s e d ( KeyEvent e ) { }
public void k e y R e l e a s e d ( KeyEvent e )
{
c o n v e r t ( d o l l a r T e x t , euroText , 1/ O n e D o l l a r I n E u r o ) ;
}
}
);
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
E u r o D o l l a r maFenetre = new E u r o D o l l a r ( ) ;
}
}

3.8

Collections

3.8.1

Deux objets

public c l a s s DeuxObjets<T extends Comparable<T>>


implements Comparable<DeuxObjets<T>>
{
private T f i r s t ;
private T s e c o n d ;
public DeuxObjets (T f i r s t , T s e c o n d )
{
this . f i r s t = f i r s t ;
this . second = second ;
}
public T g e t P e t i t ( )
{
i f ( f i r s t . compareTo ( s e c o n d ) < 0 )
return f i r s t ;
else
return s e c o n d ;
}
public T getGrand ( )
{
i f ( f i r s t . compareTo ( s e c o n d ) >= 0 )
return f i r s t ;
else
return s e c o n d ;
}
public i n t compareTo ( DeuxObjets<T> o t h e r )
{
return
getGrand ( ) . compareTo ( o t h e r . getGrand ( ) ) ;
}
public S t r i n g t o S t r i n g ( )
{
return ( + f i r s t + , + s e c o n d + ) ;
}

95

public s t a t i c void main ( S t r i n g a r g s [ ] )


{
DeuxObjets<I n t e g e r > a = new DeuxObjets<I n t e g e r >(2 , 7 ) ;
System . o u t . p r i n t l n ( a . getGrand ( ) ) ;
}
}

3.8.2

Package Pile

Stack.java
package a l e x a n d r e ;
import j a v a . u t i l . I t e r a t o r ;
public c l a s s Stack<T> implements I t e r a b l e <T>
{
/
L i s t e c o n t e n a n t l e s e l e m e n t s de l a p i l e .
/
private L i s t <T> l ;
/ /
/
Constructeur
/
Stack ( )
{
l = null ;
}
/ /
/
Retourne v r a i s i e t s e u l e m e n t
si la p i l e est vide
/
public boolean e s t V i d e ( )
{
return l == n u l l ;
}
/ /
/
Retourne l e l e m e n t s e t r o u v a n t au sommet de
la pile .
/
public T sommet ( ) throws P i l e V i d e E x c e p t i o n
{
i f ( ! estVide ( ) )
return l . g e t D a t a ( ) ;
throw new P i l e V i d e E x c e p t i o n ( ) ;
}
/ /
/
Supprime l e l e m e n t s e t r o u v a n t au sommet
de l a p i l e , ne f a i t r i e n s i l a p i l e e s t
vide .
/
public void d e p i l e ( )
{
i f ( ! estVide ( ) )
l = l . getNext ( ) ;
}
/ /
/
Ajoute d a t a en hau t de l a

pile .

96

public void e m p i l e (T d a t a )
{
l = new L i s t <T>(data , l ) ;
}
/ /
/
Retourne un i t e r a t e u r s u r l a
/

pile .

public I t e r a t o r <T> i t e r a t o r ( )
{
return l . i t e r a t o r ( ) ;
}
/ /
/
Retourne une r e p r e s e n t a t i o n de l a
au format c h a i n e de c a r a c t e r e s .

pile

/
public S t r i n g t o S t r i n g ( )
{
S t r i n g r e s = ;
f o r (T m : t h i s )
r e s += m + ;
return r e s ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a

pile .

/
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Stack<I n t e g e r > p = new Stack<I n t e g e r > ( ) ;
int i = 0 ;
while ( i < 2 0 )
p . e m p i l e ( i ++);
System . o u t . p r i n t l n ( p ) ;
while ( ! p . e s t V i d e ( ) )
{
try
{
System . o u t . p r i n t l n ( p . sommet ( ) ) ;
}
catch ( P i l e V i d e E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
p. depile ();
}
}
}

List.java
package a l e x a n d r e ;
import j a v a . u t i l . I t e r a t o r ;
c l a s s L i s t <T> implements I t e r a b l e <T>
{
/
Donnee s t o c k e e dans l e m a i l l o n
/
private T d a t a ;
/ /
/
Pointeur vers l e maillon suivant
/
private L i s t <T> n e x t ;

97

/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
l e pointeur vers l element s u i v a n t .
/
L i s t (T data , L i s t <T> n e x t )
{
this . data = data ;
this . next = next ;
}
/ /
/
C o n s t r u c t e u r i n i t i a l i s a n t l a donnee e t
mettant l e s u i v a n t a n u l l .
/
L i s t (T d a t a )
{
t h i s ( data , n u l l ) ;
}
/ /
/
Retourne l a donnee .
/
public T g e t D a t a ( )
{
return d a t a ;
}
/ /
/
M o d i f i e l a donnee
/
public void s e t D a t a (T d a t a )
{
this . data = data ;
}
/ /
/
Retourne l e m a i l l o n s u i v a n t .
/
public L i s t <T> g e t N e x t ( )
{
return n e x t ;
}
/ /
/
Modifie l e maillon suivant
/
public void s e t N e x t ( L i s t <T> n e x t )
{
this . next = next ;
}
/ /
/
Retourne un i t e r a t e u r s u r l a
/

liste .

public I t e r a t o r <T> i t e r a t o r ( )
{
return new M y I t e r a t o r <T>( t h i s ) ;
}
/ /

98

/
sentation
c
Retourne une repr A
s o u s forme de
c h a i n e de l a l i s t e .
/
public S t r i n g t o S t r i n g ( )
{
S t r i n g r e s = + data ;
i f ( n e x t != n u l l )
r e s += > + n e x t . t o S t r i n g ( ) ;
return r e s ;
}
/ /
/
T e s t e l e f o n c t i o n n e m e n t de l a
/

liste .

public s t a t i c void main ( S t r i n g [ ] a r g s )


{
L i s t <I n t e g e r > l = new L i s t <I n t e g e r > ( 2 0 ) ;
int i = 19;
while ( i >= 0 )
l = new L i s t <I n t e g e r >( i , l ) ;
System . o u t . p r i n t l n ( l ) ;
}
}

PileVideException.java
package a l e x a n d r e ;
public c l a s s P i l e V i d e E x c e p t i o n extends E x c e p t i o n
{
public S t r i n g t o S t r i n g ( )
{
return Can t t o p an empty s t a c k . ;
}
}

MyIterator.java
package a l e x a n d r e ;
import j a v a . u t i l . I t e r a t o r ;
public c l a s s M y I t e r a t o r <T> implements I t e r a t o r <T>
{
private L i s t <T> l ;
M y I t e r a t o r ( L i s t <T> l )
{
this . l = l ;
}
public boolean hasNext ( )
{
return
l != n u l l ;
}
public T n e x t ( )
{
L i s t <T> temp = l ;
l = l . getNext ( ) ;
return temp . g e t D a t a ( ) ;
}
public void remove ( )
{
}
}

3.8.3

Parcours

Parcours de ArrayList

99

import j a v a . u t i l . A r r a y L i s t ;
import j a v a . u t i l . Random ;
public c l a s s P a r c o u r s A r r a y L i s t
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
A r r a y L i s t <I n t e g e r > a = new A r r a y L i s t <I n t e g e r > ( ) ;
Random r = new Random ( ) ;
f o r ( i n t i = 1 ; i <= 40 ; i ++)
a . add ( r . n e x t I n t ( ) ) ;
for ( int i : a )
System . o u t . p r i n t l n ( i ) ;
}
}

Parcours de TreeSet
import j a v a . u t i l . T r e e S e t ;
import j a v a . u t i l . Random ;
public c l a s s P a r c o u r s T r e e S e t
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
T r e e S e t<DeuxObjets<I n t e g e r >> a = new T r e e S e t<DeuxObjets<I n t e g e r > >();
Random r = new Random ( ) ;
f o r ( i n t i = 1 ; i <= 40 ; i ++)
a . add (new DeuxObjets<I n t e g e r >( r . n e x t I n t ( ) , r . n e x t I n t ( ) ) ) ;
f o r ( DeuxObjets<I n t e g e r > i : a )
System . o u t . p r i n t l n ( i ) ;
}
}

3.9
3.9.1

Threads
Prise en main

public c l a s s B i n a i r e A l e a t o i r e R u n n a b l e implements Runnable


{
private i n t v a l u e ;
private i n t n b I t e r a t i o n s ;
public B i n a i r e A l e a t o i r e R u n n a b l e ( i n t v a l u e , i n t n b I t e r a t i o n s )
{
this . value = value ;
this . nbIterations = nbIterations ;
}
public void run ( )
{
f o r ( i n t i = 1 ; i <= n b I t e r a t i o n s
System . o u t . p r i n t ( v a l u e ) ;
}

i ++)

public s t a t i c void main ( S t r i n g [ ] a r g s )


{
Runnable un = new B i n a i r e A l e a t o i r e R u n n a b l e ( 1 , 3 0 0 0 0 ) ;
Runnable z e r o = new B i n a i r e A l e a t o i r e R u n n a b l e ( 0 , 3 0 0 0 0 ) ;
Thread tUn = new Thread ( un ) ;
Thread t Z e r o = new Thread ( z e r o ) ;
tUn . s t a r t ( ) ;
tZero . s t a r t ( ) ;
}
}

3.9.2

Synchronisation

Compteur partag
e (m
ethode synchronis
ee)
public c l a s s B i n a i r e S y n c h r o n i s e extends Thread
{
private i n t v a l u e ;
private Counter c ;
public B i n a i r e S y n c h r o n i s e ( i n t v a l u e , Counter c )
{

100

this . value = value ;


this . c = c ;
}
public void run ( )
{
while ( c . s t e p C o u n t e r ( ) )
System . o u t . p r i n t ( v a l u e ) ;
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Counter c = new Counter ( 3 0 0 0 0 ) ;
Thread un = new B i n a i r e S y n c h r o n i s e ( 1 , c ) ;
Thread z e r o = new B i n a i r e S y n c h r o n i s e ( 0 , c ) ;
un . s t a r t ( ) ;
zero . start ( ) ;
}
}
c l a s s Counter
{
private i n t i ;
private f i n a l i n t n b I t e r a t i o n s ;
Counter ( i n t n b I t e r a t i o n s )
{
this . nbIterations = nbIterations ;
i = 1;
}
synchronized boolean s t e p C o u n t e r ( )
{
if ( i > nbIterations )
return f a l s e ;
i ++;
return true ;
}
}

Compteur partag
e (section critique)
public c l a s s B i n a i r e S y n c h r o n i s e B i s extends Thread
{
private i n t v a l u e ;
private Counter c ;
public B i n a i r e S y n c h r o n i s e B i s ( i n t v a l u e , Counter c )
{
this . value = value ;
this . c = c ;
}
public void run ( )
{
boolean okay = true ;
while ( okay )
synchronized ( c )
{
okay = c . s t e p C o u n t e r ( ) ;
i f ( okay )
System . o u t . p r i n t ( v a l u e ) ;
}
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
Counter c = new Counter ( 3 0 0 0 0 ) ;
Thread un = new B i n a i r e S y n c h r o n i s e B i s ( 1 , c ) ;
Thread z e r o = new B i n a i r e S y n c h r o n i s e B i s ( 0 , c ) ;
un . s t a r t ( ) ;
zero . start ( ) ;
}
}
c l a s s Counter
{
private i n t i ;
private f i n a l i n t n b I t e r a t i o n s ;
Counter ( i n t n b I t e r a t i o n s )

101

{
this . nbIterations = nbIterations ;
i = 1;
}
boolean s t e p C o u n t e r ( )
{
if ( i > nbIterations )
return f a l s e ;
i ++;
return true ;
}
}

3.9.3

Mise en attente

import j a v a . u t i l . Random ;
public c l a s s ProducteurConsommateur
{
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
F i l e <I n t e g e r > f = new F i l e <I n t e g e r > ( 3 0 ) ;
Thread p r o d u c t e u r 1 = new P r o d u c t e u r ( f , p r o d u c t e u r 1 ) ;
Thread p r o d u c t e u r 2 = new P r o d u c t e u r ( f , p r o d u c t e u r 2 ) ;
Thread consommateur1 = new Consommateur ( f , consommateur 1 ) ;
Thread consommateur2 = new Consommateur ( f , consommateur 2 ) ;
producteur1 . s t a r t ( ) ;
producteur2 . s t a r t ( ) ;
consommateur1 . s t a r t ( ) ;
consommateur2 . s t a r t ( ) ;
}
}
c l a s s P r o d u c t e u r extends Thread
{
private F i l e <I n t e g e r > f i l e ;
S t r i n g name ;
P r o d u c t e u r ( F i l e <I n t e g e r > f i l e ,
{
this . f i l e = f i l e ;
t h i s . name = name ;
}

S t r i n g name )

public void run ( )


{
Random r = new Random ( ) ;
while ( true )
{
synchronized ( f i l e )
{
try
{
sleep (100);
}
catch ( I n t e r r u p t e d E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
System . o u t . p r i n t l n ( name ) ;
if (! f i l e . isFull ())
{
boolean empty = f i l e . isEmpty ( ) ;
try
{
f i l e . add ( r . n e x t I n t ( ) ) ;
}
catch ( E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
i f ( empty )
f i l e . notifyAll ();
}
else
try
{
f i l e . wait ( ) ;
}
catch ( I n t e r r u p t e d E x c e p t i o n e )

102

{
System . o u t . p r i n t l n ( e ) ;
}
}
}
}
}
c l a s s Consommateur extends Thread
{
private F i l e <I n t e g e r > f i l e ;
private S t r i n g name ;
Consommateur ( F i l e <I n t e g e r > f i l e ,
{
this . f i l e = f i l e ;
t h i s . name = name ;
}

S t r i n g name )

public void run ( )


{
while ( true )
{
synchronized ( f i l e )
{
try
{
sleep (100);
}
catch ( I n t e r r u p t e d E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
System . o u t . p r i n t l n ( name ) ;
i f ( ! f i l e . isEmpty ( ) )
{
boolean f u l l = f i l e . i s F u l l ( ) ;
int f i r s t = 0 ;
try
{
f i r s t = f i l e . getFirst ();
f i l e . removeFirst ( ) ;
}
catch ( E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
System . o u t . p r i n t l n ( f i r s t ) ;
if ( full )
f i l e . notifyAll ();
}
else
try
{
f i l e . wait ( ) ;
}
catch ( I n t e r r u p t e d E x c e p t i o n e )
{
System . o u t . p r i n t l n ( e ) ;
}
}
}
}
}
c l a s s L i s t <T>
{
private T d a t a ;
private L i s t <T> n e x t ;
L i s t (T data , L i s t <T> n e x t )
{
this . data = data ;
this . next = next ;
}
L i s t (T d a t a )
{
t h i s ( data , n u l l ) ;
}

103

public T g e t D a t a ( )
{
return d a t a ;
}
public L i s t <T> g e t N e x t ( )
{
return n e x t ;
}
public void s e t N e x t ( L i s t <T> n e x t )
{
this . next = next ;
}
}
c l a s s E m p t y F i l e E x c e p t i o n extends E x c e p t i o n
{
public E m p t y F i l e E x c e p t i o n ( )
{
System . o u t . p r i n t l n ( Can t r e a d empty f i l e ) ;
}
}
c l a s s F u l l F i l e E x c e p t i o n extends E x c e p t i o n
{
public F u l l F i l e E x c e p t i o n ( )
{
System . o u t . p r i n t l n ( Can t w r i t e f u l l
}
}

file );

c l a s s F i l e <T>
{
private L i s t <T> f i r s t = n u l l ;
private L i s t <T> l a s t = n u l l ;
private i n t nbElements = 0 ;
private f i n a l i n t maxNbElements ;

public F i l e ( i n t maxNbElements )
{
t h i s . maxNbElements = maxNbElements ;
}
public T g e t F i r s t ( ) throws E m p t y F i l e E x c e p t i o n
{
return f i r s t . g e t D a t a ( ) ;
}
public void r e m o v e F i r s t ( ) throws E m p t y F i l e E x c e p t i o n
{
f i r s t = f i r s t . getNext ( ) ;
nbElements ;
}
public void add (T d a t a ) throws F u l l F i l e E x c e p t i o n
{
i f ( isEmpty ( ) )
{
f i r s t = l a s t = new L i s t <T>( d a t a ) ;
}
else
{
l a s t . s e t N e x t (new L i s t <T>( d a t a ) ) ;
l a s t = l a s t . getNext ( ) ;
}
nbElements++;
}
public boolean isEmpty ( )
{
return nbElements == 0 ;
}
public boolean i s F u l l ( )
{
return nbElements == maxNbElements ;
}
}

104

import j a v a . u t i l . Random ;
public c l a s s P h i l o s o p h e s extends Thread
{
private f i n a l i n t n b P l a c e s = 5 ;
private Couvert [ ] c o u v e r t s ;
private P l a c e [ ] p l a c e s ;
public P h i l o s o p h e s ( )
{
c o u v e r t s = new Couvert [ n b P l a c e s ] ;
f o r ( i n t i = 0 ; i < n b P l a c e s ; i ++)
c o u v e r t s [ i ] = new Couvert ( i ) ;
p l a c e s = new P l a c e [ n b P l a c e s ] ;
f o r ( i n t i = 0 ; i < n b P l a c e s ; i ++)
p l a c e s [ i ] = new P l a c e ( i , c o u v e r t s [ i ] ,
c o u v e r t s [ ( i + 1)% n b P l a c e s ] ) ;
}
public void run ( )
{
Random r = new Random ( ) ;
int i = 0 ;
while ( true )
{
P h i l o s o p h e p = new P h i l o s o p h e ( i ++,
p l a c e s [ r . nextInt ( nbPlaces ) ] ) ;
p. start ();
try {
sleep (500);}
catch ( I n t e r r u p t e d E x c e p t i o n e ) { }
}
}
public s t a t i c void main ( S t r i n g [ ] a r g s )
{
P h i l o s o p h e s p = new P h i l o s o p h e s ( ) ;
p. start ();
}
}
class Place
{
private
private
private
private

Couvert c o u v e r t G a u c h e ;
Couvert c o u v e r t D r o i t ;
Philosophe philosophe ;
int i n d i c e ;

P l a c e ( i n t i n d i c e , Couvert couvertGauche , Couvert c o u v e r t D r o i t )


{
this . i n d i c e = i n d i c e ;
this . couvertGauche = couvertGauche ;
this . couvertDroit = couvertDroit ;
}
void o c c u p e r ( P h i l o s o p h e p h i l o s o p h e )
{
this . philosophe = philosophe ;
System . o u t . p r i n t l n ( p h i l o s o p h e + a p r i s
}

la + this ) ;

void l i b e r e r ( )
{
System . o u t . p r i n t l n ( p h i l o s o p h e + a l i b e r e
philosophe = null ;
}

la + this ) ;

void manger ( )
{
synchronized ( c o u v e r t G a u c h e )
{
c o u v e r t G a u c h e . prend ( t h i s ) ;
synchronized ( c o u v e r t D r o i t )
{
c o u v e r t D r o i t . prend ( t h i s ) ;
System . o u t . p r i n t l n ( p h i l o s o p h e +
commence a manger a + t h i s ) ;
try { Thread . s l e e p ( 5 0 0 0 ) ; }
catch ( E x c e p t i o n e ) { }
System . o u t . p r i n t l n ( p h i l o s o p h e +
a f i n i de manger a + t h i s ) ;

105

couvertDroit . repose ( this ) ;


}
couvertGauche . r e p o s e ( this ) ;
}
}
public S t r i n g t o S t r i n g ( )
{
return p l a c e + i n d i c e + ;
}
}
c l a s s Couvert
{
private i n t i n d i c e ;
public Couvert ( i n t i n d i c e )
{
this . i n d i c e = i n d i c e ;
}
void prend ( P l a c e p l a c e )
{
System . o u t . p r i n t l n ( t h i s + p r i s p a r + p l a c e ) ;
}
void r e p o s e ( P l a c e p l a c e )
{
System . o u t . p r i n t l n ( t h i s + r e p o s e p a r + p l a c e ) ;
}
public S t r i n g t o S t r i n g ( )
{
return c o u v e r t + i n d i c e + ;
}
}
c l a s s P h i l o s o p h e extends Thread
{
private P l a c e p l a c e ;
private i n t i n d i c e ;
Philosophe ( int indice , Place place )
{
this . i n d i c e = i n d i c e ;
this . place = place ;
}
public void run ( )
{
System . o u t . p r i n t l n ( t h i s + en a t t e n t e de + p l a c e ) ;
synchronized ( p l a c e )
{
place . occuper ( this ) ;
p l a c e . manger ( ) ;
place . l i b e r e r ( ) ;
}
}
public S t r i n g t o S t r i n g ( )
{
return p h i l o s o p h e + i n d i c e + ;
}
}

106

Vous aimerez peut-être aussi