Apprendre la Programmation Orientée Objet avec le langage Java
(avec exercices pratiques et corrigés)
3e édition
Editions ENI
Avant-propos
Chapitre 1
Introduction à la POO
1. Histoire de la POO11
2. Historique du langage Java14
Chapitre 2
La conception orientée objet
1. Approche procédurale et décomposition fonctionnelle15
2. La transition vers l'approche objet16
3. Les caractéristiques de la POO17
3.1 L'objet, la classe et la référence17
3.1.1 L'objet17
3.1.2 La classe19
3.1.3 La référence20
3.2 L'encapsulation21
3.3 L'héritage21
3.4 Le polymorphisme23
3.5 L'abstraction24
4. Le développement objet25
4.1 Cahier des charges du logiciel25
4.2 Présentation du cycle en V26
4.3 Rester agile avec le corps en V30
4.4 Modélisation et représentation UML31
4.4.1 Les diagrammes de cas d'utilisation33
4.4.2 Les diagrammes de classes34
4.4.3 Les énumérations41
4.4.4 Les diagrammes de séquences42
4.5 Codage, intégration et mise en production44
5. Exercices45
5.1 Hiérarchie de classes45
5.2 Relations entre objets47
5.3 Agrégation d'objets47
5.4 Diagramme de cas d'utilisation49
5.5 Diagramme de séquences50
Chapitre 3
Introduction à la plate-forme Java
1. Introduction53
2. Environnement d'exécution55
3. Une librairie très complète56
4. Des outils de développement performants57
5. Téléchargement et installation d'intelliJ IDEA58
6. L'incontournable Hello World62
7. Un point sur les acronymes81
Chapitre 4
Les types en Java
1. Introduction83
2. Les types primitifs84
3. Les types référence86
4. Pour nous aider88
5. La superclasse java.lang.Object92
5.1 equals92
5.2 hashCode96
5.3 toString97
5.4 finalize99
5.5 getClass, .class et l'opérateur instanceof100
5.6 clone102
5.7 notify, notifyAll et wait106
6. La classe java.lang.String107
7. Exercice110
7.1 Énoncé110
7.2 Corrigé111
Chapitre 5
Création de classes
1. Introduction115
2. Package115
3. Déclaration d'une classe122
3.1 Accessibilité des membres124
3.2 Attributs125
3.3 Accesseurs128
3.4 Constructeurs134
3.4.1 Étapes de la construction d'un objet134
3.4.2 Surcharge de constructeurs136
3.4.3 Chaînage de constructeurs136
3.4.4 L'initialiseur static139
3.4.5 L'initialiseur dynamique140
3.4.6 Les constructeurs de type private142
3.4.7 Le « builder pattern »145
3.5 Destructeurs147
3.6 Le mot-clé this152
3.7 Méthodes155
3.7.1 Déclaration155
3.7.2 Passages de paramètres par valeur159
3.8 Surcharge des méthodes164
3.9 Mécanisme des exceptions166
3.9.1 Présentation166
3.9.2 Principe de fonctionnement des exceptions168
3.9.3 Prise en charge de plusieurs exceptions177
3.10 Exercice178
3.10.1 Énoncé178
3.10.2 Conseils179
3.10.3 Corrigé180
4. Les interfaces183
4.1 Introduction183
4.2 Le contrat183
4.3 Déclaration d'une interface184
4.4 Implémentation186
4.5 IntelliJ IDEA et les interfaces188
4.6 Représentation UML d'une interface190
4.7 Interfaces et polymorphisme190
4.8 Exercice191
4.8.1 Énoncé191
4.8.2 Conseils192
4.8.3 Corrigé195
4.9 Les interfaces de la machine virtuelle Java199
5. Associations, compositions et agrégations202
5.1 Les tableaux210
5.2 Les collections217
5.2.1 ArrayList <E> et LinkedList <E>221
5.2.2 Queue <T> et Stack <T>225
5.2.3 HashMap <K, V>225
5.2.4 Les itérateurs226
5.3 Exercice227
5.3.1 Énoncé227
5.3.2 Corrigé229
6. Les classes imbriquées231
7. Quelques différences avec le C#235
Chapitre 6
Héritage et polymorphisme
1. Comprendre l'héritage237
2. Codage de la superclasse (classe de base) et de sa sous-classe (classe héritière)238
2.1 Interdire l'héritage238
2.2 Définir les membres héritables239
2.3 Syntaxe de l'héritage239
2.4 Exploitation d'une classe héritée240
3. Communication entre classe de base et classe héritière242
3.1 Les constructeurs242
3.2 Accès aux membres de la classe de base depuis l'héritier246
3.3 Méthodes virtuelles248
3.4 Méthodes de type « final »253
4. Exercice255
4.1 Énoncé255
4.2 Corrigé256
5. Les classes abstraites262
6. Le polymorphisme263
6.1 Comprendre le polymorphisme263
6.2 Exploitation du polymorphisme264
6.3 Les opérateurs instanceof et ()265
Chapitre 7
Communication entre objets
1. L'événementiel : être à l'écoute267
2. Le pattern Observateur268
2.1 Généralités268
2.2 Implémentation en langage Java269
2.3 Les listeners275
2.4 Utilisation d'un listener dans une application graphique276
3. Exercices283
3.1 Exercice 1283
3.1.1 Énoncé283
3.1.2 Corrigé284
3.2 Exercice 2287
3.2.1 Énoncé287
3.2.2 Corrigé287
4. Appels synchrones, appels asynchrones290
Chapitre 8
Le multithreading
1. Introduction293
2. Comprendre le multithreading293
3. Multithreading et Java296
4. Implémentation des threads en Java297
4.1 Étendre la classe Thread297
4.2 Implémenter l'interface Runnable300
4.3 S'endormir et S'attendre302
4.4 Abandon depuis le thread primaire306
4.5 Threads et classes anonymes309
4.5.1 Avec l'interface Runnable309
4.5.2 Avec la classe Thread310
4.5.3 Accès aux variables et aux données membres simplifié311
5. Synchronisation entre threads315
5.1 Nécessité de la synchronisation315
5.2 Les méthodes « synchronized »317
5.3 Les traitements « synchronized »319
5.4 La classe Semaphore321
6. Communication interthreads325
6.1 La méthode join325
6.2 Les objets de synchronisation327
7. Exercice336
7.1 Énoncé336
7.2 Corrigé338
Chapitre 9
Les tests
1. Introduction345
2. Environnement d'exécution des tests unitaires347
3. Le projet avec tests unitaires348
4. La classe de tests350
5. Contenu d'une méthode de test353
6. Traitements de préparation et de nettoyage356
7. Les tests avec paramètres externes359
8. Les suites de tests364
9. Exercice365
9.1 Énoncé365
9.2 Corrigé365
Chapitre 10
La réflexion
1. Introduction367
2. Mais pour quoi faire ?367
3. Introspection d'une classe Java369
4. Chargement dynamique et utilisation d'une classe découverte372
5. Exercice380
6. Privé, mais pas tant380
7. Décompilation et obfuscation381
Chapitre 11
Anonymat et lambda
1. Introduction395
2. Les classes anonymes396
2.1 D'une pierre deux coups396
2.2 Syntaxe particulière396
2.3 Exemple d'extension d'une superclasse397
2.4 Exemple d'implémentation d'une interface399
2.5 Échange d'informations401
2.6 Exercice403
2.6.1 Énoncé403
2.6.2 Corrigé403
3. Les expressions lambda405
3.1 Le concept405
3.2 Les interfaces « fonctionnelles » comme modèles406
3.3 Les syntaxes lambda408
3.4 Échange d'informations409
3.5 Exercice409
3.5.1 Énoncé409
3.5.2 Correction409
3.6 Paramètre type Lambda412
3.7 java.util.function, un package « vivier »414
3.8 Application sur des collections415
3.9 Conclusion416
Index
417