Cours Java Programmation
Cours Java Programmation
Alexandre Mesle
15 juillet 2009
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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 ) ;
}
}
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
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
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
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
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
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
}
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
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
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
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
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
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
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
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
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
1.8.6
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
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 ;
}
}
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
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
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
44
2.1.3
Pour le sport
45
2.2
2.2.1
Objets
Cr
eation dune classe
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
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
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
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
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
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
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 .
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 ();
}
}
}
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 .
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
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 ;
}
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 ;
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
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
95
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 .
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
i ++)
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
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 )
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 )
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 ;
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
106