Laurent HUBERT 7 år sedan
förälder
incheckning
8fba95eaff
96 ändrade filer med 9029 tillägg och 1 borttagningar
  1. 43 0
      00-Webographie.html
  2. 253 0
      01-install-env-dev-java.html
  3. 773 0
      02-DecouvrirJava.html
  4. 778 0
      03-ReglesDeCodage.html
  5. 885 0
      04-StructuresDeControles.html
  6. 668 0
      05-Exceptions.html
  7. 505 0
      06-InteractionEntreObjets.html
  8. 724 0
      07-Collections.html
  9. 971 0
      08-DelegationAgregationCompositionAssociation.html
  10. 382 0
      09-Swing-introduction.html
  11. 36 0
      10-LesEntreesSorties.html
  12. 28 0
      11-ExtensionsEtReutilisationDeCode.html
  13. 49 0
      12-JavaFX.html
  14. 462 0
      13-BaseDeDonnees.html
  15. 137 0
      14-ThreadEtExecutionSimultanee.html
  16. 11 1
      A-annexe-RecuperationDeDonneesDansLaConsole.html
  17. 137 0
      B-ThreadEtExecutionSimultanee.html
  18. 226 0
      B-annexe-configuration-ssh.html
  19. 226 0
      C-annexe-configuration-ssh.html
  20. 31 0
      Exercices-a-faire.html
  21. 263 0
      F-annexe-ANT.html
  22. 451 0
      buttondown.css
  23. BIN
      data/Threads.zip
  24. BIN
      data/ch2-Calculs.zip
  25. BIN
      data/ch3-Calculs.zip
  26. BIN
      data/ch4-Controles-test.zip
  27. 1 0
      data/ws
  28. BIN
      images/AWT-Container.png
  29. BIN
      images/AWT-classes+swing.png
  30. BIN
      images/AWT-classes.png
  31. BIN
      images/Access-Modifiers-calcul.png
  32. BIN
      images/Access-Modifiers-reference.png
  33. BIN
      images/Aggregation-classe.png
  34. BIN
      images/Aggregation-exemple.png
  35. BIN
      images/Autoradio.png
  36. BIN
      images/Calculs-delegation-classe.png
  37. BIN
      images/Calculs-delegation-hybride-classe.png
  38. BIN
      images/Calculs-delegation-hybride-sequence.png
  39. BIN
      images/Calculs-delegation-sequence-exercice.png
  40. BIN
      images/Calculs-delegation-sequence.png
  41. BIN
      images/CarnetAdresse-Map.png
  42. BIN
      images/Champs.png
  43. BIN
      images/Classes-Calcul.png
  44. BIN
      images/ClassesException.png
  45. BIN
      images/Collection-Map.png
  46. BIN
      images/Composition-classe.png
  47. BIN
      images/Composition-exemple.png
  48. BIN
      images/Constantes.png
  49. BIN
      images/Date-conception.png
  50. BIN
      images/ExceptionsPileAppel.png
  51. BIN
      images/ExceptionsPileAppelReseau.png
  52. BIN
      images/ExceptionsPileAppelReseauErreurs.png
  53. BIN
      images/Fleur-heritage-toString.png
  54. BIN
      images/Fleur.png
  55. BIN
      images/Heritage-Calcul-Abstract.png
  56. BIN
      images/Heritage-Calcul-Addition.png
  57. BIN
      images/Heritage-Calcul.png
  58. BIN
      images/HeritageMultInterface.png
  59. BIN
      images/HeritageMultInterfaceEtUtilise.png
  60. BIN
      images/HeritageMultiple.png
  61. BIN
      images/MVC-utilisateur.png
  62. BIN
      images/MVC.png
  63. BIN
      images/Multiplication.png
  64. BIN
      images/Observateur.png
  65. BIN
      images/PoeteEtStylo.png
  66. BIN
      images/Point.png
  67. BIN
      images/Programmation-objet.png
  68. BIN
      images/RendezVous.png
  69. BIN
      images/Stylo-diagramme_de_classe.png
  70. BIN
      images/Swing-architecture.png
  71. BIN
      images/Swing-classes-basiques.png
  72. BIN
      images/Swing-classes-boutons.png
  73. BIN
      images/Swing-classes-texte.png
  74. BIN
      images/Swing-classes.png
  75. BIN
      images/UML-association-attribut.png
  76. BIN
      images/UML-association-bidirectionnelle.png
  77. BIN
      images/UML-association-cardinalite-array.png
  78. BIN
      images/UML-association-cardinalite-famille.png
  79. BIN
      images/UML-association-cardinalite-list.png
  80. BIN
      images/UML-association-cardinalite-sequence.png
  81. BIN
      images/UML-association-cardinalite-set.png
  82. BIN
      images/UML-association-qualifie-multiple.png
  83. BIN
      images/UML-association-qualifie-simple.png
  84. BIN
      images/UML-association-role.png
  85. BIN
      images/UML-association.png
  86. BIN
      images/UML-dependance-creation.png
  87. BIN
      images/UML-dependance-instanciation.png
  88. BIN
      images/UML-dependance.png
  89. 50 0
      images/attention.svg
  90. 67 0
      images/important.svg
  91. 64 0
      images/information.svg
  92. 215 0
      images/practice.svg
  93. BIN
      images/sequence-Calcul-Soustraction.png
  94. 79 0
      images/sommaire.svg
  95. 37 0
      index.html
  96. 477 0
      pandoc.css

+ 43 - 0
00-Webographie.html

@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Webographie</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Webographie</div>
+<nav id="TOC">
+<ul>
+<li><a href="#webographie">Webographie</a><ul>
+<li><a href="#java">Java</a></li>
+<li><a href="#junit">JUnit</a></li>
+<li><a href="#build-tools">Build tools</a><ul>
+<li><a href="#gradle">Gradle</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="webographie">Webographie</h1>
+<h2 id="java">Java</h2>
+<h2 id="junit">JUnit</h2>
+<p><a href="https://stackoverflow.com/questions/20707017/how-to-run-junit-tests-with-gradle">How to run JUnit tests with Gradle?</a></p>
+<h2 id="build-tools">Build tools</h2>
+<h3 id="gradle">Gradle</h3>
+<p><a href="https://gradle.org/guides/">Guides</a></p>
+<p><a href="https://gradle.org/install/#install">Installation</a></p>
+<p><a href="https://guides.gradle.org/building-java-applications/">Building Java applications</a></p>
+<p><a href="https://guides.gradle.org/creating-new-gradle-builds/">Création d’un projet</a></p>
+</body>
+</html>

+ 253 - 0
01-install-env-dev-java.html

@@ -0,0 +1,253 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Environnement de développement Java</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Environnement de développement Java</div>
+<nav id="TOC">
+<ul>
+<li><a href="#mise-en-place-dun-environnement-de-développement-java">Mise en place d’un environnement de développement Java</a><ul>
+<li><a href="#introduction">Introduction</a><ul>
+<li><a href="#déroulement-de-la-session">Déroulement de la session</a></li>
+<li><a href="#choix-des-technologies">Choix des technologies</a></li>
+</ul></li>
+<li><a href="#installation">Installation</a><ul>
+<li><a href="#eclipse">Eclipse</a></li>
+</ul></li>
+<li><a href="#première-application-java">Première Application Java</a><ul>
+<li><a href="#création-du-projet">Création du projet</a></li>
+<li><a href="#lancement-depuis-la-ligne-de-commande">Lancement depuis la ligne de commande</a></li>
+<li><a href="#création-dune-archive-jar">Création d’une archive JAR</a></li>
+<li><a href="#le-chargement-des-classes">Le chargement des classes</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="mise-en-place-dun-environnement-de-développement-java">Mise en place d’un environnement de développement Java</h1>
+<h2 id="introduction">Introduction</h2>
+<p>L’objectif de cette session est de mettre en place un environnement de développement Java qui permette la création d’applications et leur déploiement.</p>
+<h3 id="déroulement-de-la-session">Déroulement de la session</h3>
+<p>A partir des choix proposés, vous allez installer par vous même les différents outils et les configurer.</p>
+<p>L’objectif, pour chacun des outils, est d’être capable de tester son utilisation (par exemple en réussissant le lancement d’un programme Hello World).</p>
+<p>L’objectif est également que vous soyez curieux: posez des questions, émettez des hypothèses.</p>
+<h3 id="choix-des-technologies">Choix des technologies</h3>
+<p>Les technologies proposées ici sont couramment utilisées dans le monde du développement Java. Cependant, le choix qui a été fait ici ne fait pas office de recommandation absolue: il a été fait pour simplifier l’enseignement du langage Java.</p>
+<p><strong>Plus tard</strong> vous pourrez choisir vos propres outils. A vous d’être critique et d’adapter votre outil de travail en fonction de vos habitudes et de vos préférences.</p>
+<p>L’IDE choisie est <strong>Eclipse</strong>.</p>
+<h2 id="installation">Installation</h2>
+<h3 id="eclipse">Eclipse</h3>
+<p>Installer Eclipse pour développeur Java sur votre machine.</p>
+<ul>
+<li>Aller sur <a href="https://www.eclipse.org/downloads/eclipse-packages/">cette page</a></li>
+<li>Choisir “Eclipse IDE for Java Developers”</li>
+</ul>
+<h2 id="première-application-java">Première Application Java</h2>
+<h3 id="création-du-projet">Création du projet</h3>
+<p>Créer un projet pour une application Java (<code>Java Project</code>). Le nommer nommé <code>HelloWorld</code></p>
+<p>Créer une nouvelle classe <code>HelloWorld</code> dans le paquet <code>com.example.hello</code>:</p>
+<ul>
+<li>Cliquer bouton droit sur <code>src</code>
+<ul>
+<li><code>New &gt; Class</code></li>
+</ul></li>
+<li>Dans la fenêtre <code>New Java Class</code>, entrer les valeurs suivantes:
+<ul>
+<li>Package: <code>com.example.hello</code></li>
+<li>Name: <code>HelloWorld</code></li>
+<li>Cocher la case <code>public static void main(String[] args)</code></li>
+<li>Cliquer sur <code>Finish</code></li>
+</ul></li>
+</ul>
+<p>Entrer le code suivant dans le corps de la méthode <code>main</code>:</p>
+<ul>
+<li><code>System.out.println(&quot;Hello World&quot;);</code></li>
+</ul>
+<p>Sauver et lancer le programme (menu <code>Run &gt; Run</code> ou l’icône correspondante).</p>
+<h3 id="lancement-depuis-la-ligne-de-commande">Lancement depuis la ligne de commande</h3>
+<p>Ouvrez une ligne de commande et placez vous dans le répertoire du projet <code>HelloWorld</code>.</p>
+<p><em>Astuce</em></p>
+<ul>
+<li>dans Eclipse, cliquez bouton droit sur le répertoire <code>src</code>
+<ul>
+<li>Sélectionner <code>Show In &gt; System Explorer</code></li>
+<li>Une fois dans votre explorateur de fichier, allez dans le répertoire parent de <code>src</code>.</li>
+<li>Vous êtes maintenant dans le répertoire du projet et vous pouvez en récupérer le chemin absolu.</li>
+</ul></li>
+</ul>
+<h4 id="vérification-de-la-version-de-java">Vérification de la version de Java</h4>
+<p>Dans la ligne de commande (et une fois dans le bon répertoire), tapez la commande suivante:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb1-1" data-line-number="1">$ <span class="ex">java</span> -version</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ex">java</span> version <span class="st">&quot;1.8.0_162&quot;</span></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="ex">Java</span>(TM) <span class="ex">SE</span> Runtime Environment (build 1.8.0_162-b12)</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="ex">Java</span> HotSpot(TM) <span class="ex">64-Bit</span> Server VM (build 25.162-b12, mixed mode)</a></code></pre></div>
+<p>Si une erreur se produit, c’est que vous n’avez pas de JDK (Java Development Kit) ou de JRE (Java Runtime Environment) installé; l’installer, rendez-vous <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html">ici</a> et sélectionner la <strong>dernière update</strong> pour votre système.</p>
+<h4 id="lancement-de-hello-world">Lancement de Hello World</h4>
+<p>Pour exécuter ce programme, placez vous dans le répertoire dans lequel il a été créé.</p>
+<p>Pour cela, depuis le terminal, taper la commande cd suivie du chemin du dossier. Exemple sous Windows:</p>
+<pre class="dos"><code>c:\Users\utilisateur&gt;cd H:\chemin\du\projet\HelloWorld
+c:\Users\utilisateur&gt;</code></pre>
+<p>Puis, la lettre du lecteur est différente, taper celle qui commence le chemin destination:</p>
+<pre class="dos"><code>c:\Users\utilisateur&gt;H:
+H:\chemin\du\projet\HelloWorld&gt;</code></pre>
+<p>Ensuite, lancer la commande suivante:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="ex">java</span> -cp bin com.example.hello.HelloWorld</a></code></pre></div>
+<p>À quoi correspond la valeur <code>com.example.hello.HelloWorld</code> ?</p>
+<h3 id="création-dune-archive-jar">Création d’une archive JAR</h3>
+<h4 id="exportation-du-projet">Exportation du projet</h4>
+<p>Retournez dans Eclipse.</p>
+<p>Exporter un JAR exécutable pour ce programme:</p>
+<ul>
+<li>Cliquer bouton droit sur votre projet;</li>
+<li>Cliquer sur <code>Export...</code></li>
+<li>Sélectionner <code>Java &gt; JAR file</code></li>
+<li>Cliquer sur <code>Next &gt;</code></li>
+<li>Dans le champs <code>JAR file:</code> cliquer sur <code>Browse</code> et sélectionner l’emplacement du fichier à l’intérieur du projet.</li>
+<li>Nommer le fichier <code>Hello.jar</code></li>
+<li>Cliquer sur <code>Next&gt;</code></li>
+<li>Cliquer sur <code>Next&gt;</code> une seconde fois</li>
+<li>Dans le champs <code>Main class:</code>
+<ul>
+<li>cliquer sur le bouton <code>Browse</code></li>
+<li>sélectionner la classe <code>HelloWorld</code></li>
+<li>cliquer sur <code>OK</code></li>
+</ul></li>
+<li>Cliquer sur <code>Finish</code></li>
+</ul>
+<h4 id="exécution-en-ligne-de-commande">Exécution en ligne de commande</h4>
+<p>Pour exécuter ce JAR, placez vous dans le répertoire dans lequel il a été créé.</p>
+<p>Lancer la commande suivante:</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="ex">java</span> -jar Hello.jar</a></code></pre></div>
+<h3 id="le-chargement-des-classes">Le chargement des classes</h3>
+<h4 id="les-classes">Les classes</h4>
+<p>Allez dans le répertoire <code>bin</code> de votre projet et trouvez le fichier <code>HelloWorld.class</code></p>
+<p>Ouvrez le fichier <code>.jar</code> et trouvez le fichier <code>HelloWorld.class</code></p>
+<p>Ce sont ces fichiers <em>classes</em> qui sont exécutées, soit via la ligne de commande, soit depuis Eclipse.</p>
+<h4 id="analogie-avec-la-variable-path">Analogie avec la variable PATH</h4>
+<p>La variable d’environnement <code>CLASSPATH</code> a un mode de fonctionnement analogue à la variable <code>PATH</code></p>
+<ul>
+<li><code>PATH</code>
+<ul>
+<li>permet de trouver un programme parmi une liste d’emplacements
+<ul>
+<li><code>PATH</code> référence des répertoires</li>
+</ul></li>
+</ul></li>
+<li><code>CLASSPATH</code>
+<ul>
+<li>permet de trouver une classe parmi une liste d’emplacements</li>
+<li><code>CLASSPATH</code> référence :
+<ul>
+<li>des répertoires</li>
+<li>et/ou des fichiers archives JAR</li>
+</ul></li>
+</ul></li>
+</ul>
+<h4 id="initialisation">Initialisation</h4>
+<p>La variable d’environnement <code>CLASSPATH</code>:</p>
+<ul>
+<li>peut être fixée pour tout le système</li>
+<li>peut être fixée pour le shell courant
+<ul>
+<li>y compris en utilisant un fichier <code>.bashrc</code> ou <code>.bash_profile</code></li>
+</ul></li>
+<li>peut être fixée pour un programme donné</li>
+</ul>
+<h5 id="exercice">Exercice</h5>
+<p>Lancer le programme après avoir fixé la variable <code>CLASSPATH</code> pour les deux cas suivants:</p>
+<ul>
+<li>utilisation du répertoire <code>bin</code></li>
+<li>utilisation d’une archive JAR</li>
+</ul>
+<p>La commande <code>export CLASSPATH</code> est nécessaire sur les systèmes <code>*nix</code>.</p>
+<h5 id="commutateurs-de-la-commande-java">Commutateurs de la commande java</h5>
+<p>Ces commutateurs permettent de fixer le <code>CLASSPATH</code> uniquement pour la commande utilisée:</p>
+<ul>
+<li><code>-cp</code> : fixe le <code>CLASSPATH</code> à la valeur qui suit le commutateur</li>
+<li><code>-jar</code> : ajoute le JAR donné au <code>CLASSPATH</code> et utilise la classe principale (<code>Main class</code>) définie lors de sa génération.</li>
+</ul>
+<h5 id="concernant-lexécution-des-fichiers-jar">Concernant l’exécution des fichiers JAR</h5>
+<p>Les informations sur la classe principale sont stockées dans un fichier nommé <code>manifest.mf</code>. Ce fichier est un fichier texte stocké dans le JAR dans le dossier <code>META-INF</code></p>
+<p>Ce sont les méta-informations concernant le JAR qui sont définies dans ce dossier. Eclipse les a généré pour nous.</p>
+<p><strong>Ouvrez et observez le contenu du fichier <code>manifest.mf</code></strong></p>
+<p>Il vous donne les informations minimales que doit contenir un fichier <em>Manifest</em> pour que le JAR associé soit exécutable.</p>
+</body>
+</html>

+ 773 - 0
02-DecouvrirJava.html

@@ -0,0 +1,773 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Découvrir Java</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Découvrir Java</div>
+<nav id="TOC">
+<ul>
+<li><a href="#découvrir-java">Découvrir Java</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#premiers-pas">Premiers pas</a><ul>
+<li><a href="#bases-du-langage">Bases du langage</a></li>
+<li><a href="#objets-et-classes">Objets et classes</a></li>
+<li><a href="#lhéritage">L’héritage</a></li>
+</ul></li>
+<li><a href="#représentation-textuelle-dune-personne">Représentation textuelle d’une Personne</a><ul>
+<li><a href="#représentation-textuelle-dun-calcul">Représentation textuelle d’un calcul</a></li>
+</ul></li>
+<li><a href="#manipulation-de-chaînes-de-caractères">Manipulation de chaînes de caractères</a><ul>
+<li><a href="#quelques-expériences-étonnantes">Quelques expériences étonnantes</a></li>
+<li><a href="#quelques-méthodes-pour-utiliser-les-string">Quelques méthodes pour utiliser les String</a></li>
+<li><a href="#parcours-dune-chaîne-et-boucles">Parcours d’une chaîne et boucles</a></li>
+</ul></li>
+<li><a href="#créer-des-objets">Créer des objets</a><ul>
+<li><a href="#création-dune-nouvelle-classe">Création d’une nouvelle classe</a></li>
+<li><a href="#constructeur-avec-paramètres">Constructeur avec paramètres</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="découvrir-java">Découvrir Java</h1>
+<h2 id="introduction">Introduction</h2>
+<p>Dans cette première partie, nous allons découvrir Java sous la forme de petits programmes. Nous n’allons pas tout de suite chercher à faire de programmes complexes, mais nous allons utiliser des mécanismes de la Programmation Orienté Objet et observer leurs effets.</p>
+<p>L’idée va être de se familiariser avec différents concepts: classes, instances, interfaces, héritage et même modèles de conception.</p>
+<p>Nous allons faire collaborer des objets entre eux afin d’observer des comportements selon la manière dont ils sont assemblés.</p>
+<h2 id="premiers-pas">Premiers pas</h2>
+<h3 id="bases-du-langage">Bases du langage</h3>
+<p>Dans cette partie, des exemples sont donnés pour chaque élément de base du langage.</p>
+<p>La documentation Java fournie par Oracle est disponible <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html">ici</a>. Elle reprend l’ensemble des concepts abordés;</p>
+<h4 id="types-primitifs">Types primitifs</h4>
+<p>Dupliquer la classe <code>HelloWorld</code> en une classe <code>TypesPrimitifs</code> (essayez un copier-coller).</p>
+<p>Y insérer le code suivant:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="dt">int</span> entier = <span class="dv">3</span>;</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;entier: &quot;</span>);</a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entier);</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="dt">boolean</span> test = <span class="kw">false</span>;</a>
+<a class="sourceLine" id="cb1-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;booléen: &quot;</span>);</a>
+<a class="sourceLine" id="cb1-7" data-line-number="7"><span class="co">// Afficher cette valeur avec un System.out.println()</span></a>
+<a class="sourceLine" id="cb1-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb1-9" data-line-number="9"><span class="dt">float</span> flottant = <span class="fl">2.8f</span>;</a>
+<a class="sourceLine" id="cb1-10" data-line-number="10"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;flottant: &quot;</span>);</a>
+<a class="sourceLine" id="cb1-11" data-line-number="11"><span class="co">// Afficher cette valeur avec un System.out.println()</span></a>
+<a class="sourceLine" id="cb1-12" data-line-number="12"></a>
+<a class="sourceLine" id="cb1-13" data-line-number="13"><span class="co">//Voir le tableau ci-dessous</span></a></code></pre></div>
+<p>Déterminez pourquoi des erreurs de compilation apparaissent avec les types et certaines valeurs ci-dessous :</p>
+<table>
+<thead>
+<tr class="header">
+<th>Type</th>
+<th>Valeurs à tester</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td><code>byte</code></td>
+<td><code>8</code> puis <code>127</code> puis <code>128</code> puis <code>-128</code> puis <code>-129</code></td>
+</tr>
+<tr class="even">
+<td><code>short</code></td>
+<td><code>-32768</code> puis <code>-32769</code></td>
+</tr>
+<tr class="odd">
+<td><code>int</code></td>
+<td>déterminez les valeurs possibles à utiliser</td>
+</tr>
+<tr class="even">
+<td><code>long</code></td>
+<td><code>2L</code> puis déterminez les valeurs possibles à utiliser</td>
+</tr>
+<tr class="odd">
+<td><code>float</code></td>
+<td><code>1.5f</code> puis <code>1.5</code> puis déterminez les valeurs possibles à utiliser</td>
+</tr>
+<tr class="even">
+<td><code>double</code></td>
+<td><code>3.8</code> puis <code>9.7d</code></td>
+</tr>
+<tr class="odd">
+<td><code>char</code></td>
+<td><code>'\u0061'</code> puis <code>'b'</code> puis <code>'cd'</code></td>
+</tr>
+<tr class="even">
+<td><code>String</code></td>
+<td><code>&quot;&quot;</code> puis <code>&quot;cd&quot;</code></td>
+</tr>
+<tr class="odd">
+<td><code>boolean</code></td>
+<td><code>false</code> puis <code>true</code></td>
+</tr>
+</tbody>
+</table>
+<p>Pour chacun des types, trouvez quelle est la valeur par défaut.</p>
+<p>Si besoin, vous pouvez trouver plus d’information sur les types primitifs <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html">ici</a></p>
+<h4 id="tableaux">Tableaux</h4>
+<p>En Java, les types tableaux (<code>array</code>) sont indexés à partir de 0.</p>
+<p>Ils sont déclarés grâce à des crochets: <code>[]</code></p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="dt">int</span>[] tableauEntiers;</a></code></pre></div>
+<p>Il est possible de créer des tableaux pour tous les types primitifs, mais aussi pour des objets (par exemple le type <code>String</code>).</p>
+<p>Pour créer un nouveau tableau, plusieurs possibilités.</p>
+<p><em>Créez une classe</em> <code>Tableaux</code> <em>dans laquelle vous testerez les codes donnés ci-dessous.</em></p>
+<p>La première, en initialisant le tableau puis chacun de ses éléments:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1">tableauEntiers = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">3</span>];</a>
+<a class="sourceLine" id="cb3-2" data-line-number="2">tableauEntiers[<span class="dv">0</span>] = <span class="dv">1</span> ; <span class="co">//premier élément</span></a>
+<a class="sourceLine" id="cb3-3" data-line-number="3">tableauEntiers[<span class="dv">1</span>] = <span class="dv">2</span> ; <span class="co">//second élément</span></a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">tableauEntiers[<span class="dv">2</span>] = <span class="dv">3</span> ; <span class="co">//troisième élément</span></a>
+<a class="sourceLine" id="cb3-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb3-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;premier élément:&quot;</span>);</a>
+<a class="sourceLine" id="cb3-7" data-line-number="7"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(tableauEntiers[<span class="dv">0</span>]);</a>
+<a class="sourceLine" id="cb3-8" data-line-number="8"><span class="co">//...</span></a></code></pre></div>
+<p>La seconde, en initialisant le tableau puis en lui attribuant un ensemble de valeur:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="dt">int</span>[] tableauEntiers = {<span class="dv">1</span>_<span class="dv">000</span>, <span class="dv">2</span>_<span class="dv">345</span>_<span class="dv">678</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">500000</span>,</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2">    <span class="dv">600</span>_<span class="dv">000</span>_<span class="dv">000</span>, <span class="dv">7</span>_<span class="dv">000</span>_<span class="dv">000</span>};</a>
+<a class="sourceLine" id="cb4-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;premier élément:&quot;</span>);</a>
+<a class="sourceLine" id="cb4-4" data-line-number="4"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(tableauEntiers[<span class="dv">0</span>]);</a>
+<a class="sourceLine" id="cb4-5" data-line-number="5"><span class="co">//...</span></a></code></pre></div>
+<h5 id="longueur-dun-tableau">Longueur d’un tableau</h5>
+<p>Pour connaître le nombre d’éléments dans un tableau, on utilise sa propriété <code>length</code> :</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="st">&quot;Nombre d&#39;éléments:&quot;</span>);</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(tableauEntiers.<span class="fu">length</span>);</a></code></pre></div>
+<p>Plus d’informations sur les tableaux sont <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html">disponibles ici</a></p>
+<h5 id="exercice">Exercice</h5>
+<p>Définir un tableau à deux dimensions contenant quatre <code>String</code>.</p>
+<ul>
+<li>En première ligne: <code>&quot;Nom&quot;</code> et <code>&quot;Prénom&quot;</code></li>
+<li>En seconde ligne : <code>&quot;Myriam&quot;</code> et <code>&quot;Makeba&quot;</code></li>
+</ul>
+<p>Afficher chacune de ces valeurs séparément.</p>
+<h4 id="opérateurs">Opérateurs</h4>
+<p>Nous allons expérimentez quelques éléments sur les opérateurs dans une nouvelle classe <code>Operateurs</code> (toujours dans le paquet <code>com.example.hello</code>).</p>
+<p>Pour une référence plus complète, vous pouvez trouver des informations <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html">ici</a></p>
+<h5 id="assignation">Assignation</h5>
+<p>L’assignation de valeur se fait grâce au signe <code>=</code> :</p>
+<ul>
+<li><code>int entier = 4;</code></li>
+<li><code>String chaine = &quot;characters&quot;;</code></li>
+</ul>
+<h5 id="opérations-arithmétiques">Opérations arithmétiques</h5>
+<p>Les opérations arithmétiques simples sont résumées ici:</p>
+<table>
+<thead>
+<tr class="header">
+<th>Opérateur</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td><code>+</code></td>
+<td>Addition (ou pour le type <code>String</code> : concaténation)</td>
+</tr>
+<tr class="even">
+<td><code>-</code></td>
+<td>Soustraction</td>
+</tr>
+<tr class="odd">
+<td><code>*</code></td>
+<td>Multiplication</td>
+</tr>
+<tr class="even">
+<td><code>/</code></td>
+<td>Division</td>
+</tr>
+<tr class="odd">
+<td><code>%</code></td>
+<td>Modulo (reste de la division euclidienne)</td>
+</tr>
+</tbody>
+</table>
+<p><strong>Exercice</strong></p>
+<p>Testez les codes suivants et vérifiez leur validité (<em>est-ce que le résultat produit est bien le résultat attendu ?</em>)</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Hello&quot;</span> + <span class="st">&quot; &quot;</span> + <span class="st">&quot;World&quot;</span>);</a>
+<a class="sourceLine" id="cb6-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(  <span class="dv">1</span> + <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb6-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;1&quot;</span> + <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="fl">1.0</span> + <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb6-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb6-6" data-line-number="6"><span class="dt">int</span> dividende = <span class="dv">24</span>;</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7"><span class="dt">int</span> diviseur = <span class="dv">5</span>;</a>
+<a class="sourceLine" id="cb6-8" data-line-number="8"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de &quot;</span> +</a>
+<a class="sourceLine" id="cb6-9" data-line-number="9">    dividende +<span class="st">&quot; % &quot;</span> + diviseur + <span class="st">&quot; est &quot;</span> + dividende % diviseur);</a>
+<a class="sourceLine" id="cb6-10" data-line-number="10"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de &quot;</span> +</a>
+<a class="sourceLine" id="cb6-11" data-line-number="11">    dividende +<span class="st">&quot; / &quot;</span> + diviseur + <span class="st">&quot; est &quot;</span> + dividende / diviseur);</a>
+<a class="sourceLine" id="cb6-12" data-line-number="12"></a>
+<a class="sourceLine" id="cb6-13" data-line-number="13"><span class="dt">double</span> dividendeFlottant = <span class="fl">24.0</span>;</a>
+<a class="sourceLine" id="cb6-14" data-line-number="14"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de &quot;</span> +</a>
+<a class="sourceLine" id="cb6-15" data-line-number="15">    dividendeFlottant +<span class="st">&quot; % &quot;</span> + diviseur + <span class="st">&quot; est &quot;</span> + dividendeFlottant % diviseur);</a>
+<a class="sourceLine" id="cb6-16" data-line-number="16"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de &quot;</span> +</a>
+<a class="sourceLine" id="cb6-17" data-line-number="17">    dividendeFlottant +<span class="st">&quot; / &quot;</span> + diviseur + <span class="st">&quot; est &quot;</span> + dividendeFlottant / diviseur);</a></code></pre></div>
+<h5 id="comparaisons-et-opérations-booléennes">Comparaisons et opérations booléennes</h5>
+<p>Les opérateurs de comparaisons sont les suivants:</p>
+<table>
+<thead>
+<tr class="header">
+<th>Opérateur</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td><code>==</code></td>
+<td>égal</td>
+</tr>
+<tr class="even">
+<td><code>!=</code></td>
+<td>non égal (différent de)</td>
+</tr>
+<tr class="odd">
+<td><code>&gt;</code></td>
+<td>supérieur</td>
+</tr>
+<tr class="even">
+<td><code>&gt;=</code></td>
+<td>supérieur ou égal</td>
+</tr>
+<tr class="odd">
+<td><code>&lt;</code></td>
+<td>inférieur</td>
+</tr>
+<tr class="even">
+<td><code>&lt;=</code></td>
+<td>inférieur ou égal</td>
+</tr>
+</tbody>
+</table>
+<p>Ils renvoient <strong>toujours</strong> une valeur booléenne (<code>boolean</code>).</p>
+<h6 id="exercice-1">Exercice</h6>
+<p>Testez les codes suivants et vérifiez leur validité (<em>est-ce que le résultat produit est bien le résultat attendu ?</em>)</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="dt">int</span> un = <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;1 == 2 : &quot;</span>     + (<span class="dv">1</span> == <span class="dv">2</span>));</a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;2 == 1 + 1 : &quot;</span> + (<span class="dv">2</span> == <span class="dv">1</span> + un));</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;1 != 2 : &quot;</span>     + (<span class="dv">1</span> != <span class="dv">2</span>));</a>
+<a class="sourceLine" id="cb7-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;3 &gt; 3 : &quot;</span>     + (<span class="dv">3</span> &gt; <span class="dv">3</span>));</a>
+<a class="sourceLine" id="cb7-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;3 &gt;= 3 : &quot;</span>     + (<span class="dv">3</span> &gt;= <span class="dv">3</span>));</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;4 &lt; 4 : &quot;</span>     + (<span class="dv">4</span> &lt; <span class="dv">4</span>));</a>
+<a class="sourceLine" id="cb7-8" data-line-number="8"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;4 &lt;= 4 : &quot;</span>     + (<span class="dv">4</span> &lt;= <span class="dv">4</span>));</a></code></pre></div>
+<h5 id="opérations-booléennes">Opérations booléennes</h5>
+<p>Les opérations <code>ET</code>, <code>OU</code> et <code>NON</code> se font sur des valeurs booléennes:</p>
+<table>
+<thead>
+<tr class="header">
+<th>Opérateur</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td><code>||</code></td>
+<td>OU</td>
+</tr>
+<tr class="even">
+<td><code>&amp;&amp;</code></td>
+<td>ET</td>
+</tr>
+<tr class="odd">
+<td><code>!</code></td>
+<td>NON</td>
+</tr>
+</tbody>
+</table>
+<h6 id="exercice-2">Exercice</h6>
+<p>Testez les codes suivants et vérifiez leur validité (<em>est-ce que le résultat produit est bien le résultat attendu ?</em>)</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="dt">int</span> un = <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;false || false : &quot;</span>     + (<span class="kw">false</span> || <span class="kw">false</span>));</a>
+<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;false || true : &quot;</span>      + (<span class="kw">false</span> || <span class="kw">true</span>));</a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;true  || true : &quot;</span>      + (<span class="kw">true</span> || <span class="kw">true</span>));</a>
+<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;false &amp;&amp; true : &quot;</span>      + (<span class="kw">false</span> &amp;&amp; <span class="kw">true</span>));</a>
+<a class="sourceLine" id="cb8-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;true  &amp;&amp; true : &quot;</span>      + (<span class="kw">true</span>  &amp;&amp; <span class="kw">true</span>));</a>
+<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;2 == 1 + un &amp;&amp; true : &quot;</span>+ (<span class="dv">2</span> == <span class="dv">1</span> + un  || <span class="kw">true</span>));</a>
+<a class="sourceLine" id="cb8-8" data-line-number="8"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;NON (2 == 1 + un &amp;&amp; true) : &quot;</span>+ !(<span class="dv">2</span> == <span class="dv">1</span> + un  || <span class="kw">true</span>));</a></code></pre></div>
+<h4 id="découverte-du-débogueur-eclipse">Découverte du débogueur Eclipse</h4>
+<p>Reprenez chacun des codes précédents et lancez-le en utilisant le déboggueur Eclipse (Menu <code>Run &gt; Debug</code> ou le bouton de la barre d’outils ayant l’icône correspondante)</p>
+<p>Acceptez le passage dans la <code>Perspective</code> correspondante au mode <code>Debug</code></p>
+<p>Ajoutez un point d’arrêt sur la première ligne de votre méthode <code>main</code> et relancez le débogueur.</p>
+<p>Visualisez les boutons <code>Step into</code>, <code>Step over</code>.</p>
+<ul>
+<li>Observez leurs effets</li>
+<li>À quoi servent-ils ?</li>
+</ul>
+<h3 id="objets-et-classes">Objets et classes</h3>
+<h4 id="programmation-orientée-objet">Programmation Orientée Objet</h4>
+<p>Java est un langage <em>Orienté Objet</em> (OO). Cela signifie que programmer consiste à définir des entités qui vont contenir des données et des comportements. Le programme indique comment ces entités vont interagir entre elles.</p>
+<p>Ces entités sont des <strong>objets</strong>.</p>
+<p><em>Note: On parle de Programmation Orientée Objet (POO). En anglais: OOP (Object Oriented Programing)</em></p>
+<h4 id="un-peu-de-vocabulaire">Un peu de vocabulaire</h4>
+<p>Pour créer un <strong>objet</strong>, il faut un modèle (un patron, un moule).</p>
+<p>Le modèle d’un <strong>objet</strong> est une <strong>classe</strong>.</p>
+<p>À partir de ce modèle, on en créera un exemplaire : un <strong>objet</strong> est une <strong>instance</strong> d’une <strong>classe</strong>.</p>
+<p>Parfois, on utilise le mot <strong>type</strong> pour désigner une <strong>classe</strong>. Par exemple, un objet de type <code>Integer</code> désigne une instance de la classe <code>Integer</code>.</p>
+<p>Chaque objet possède des <strong>membres</strong> :</p>
+<ul>
+<li>des informations : ses <strong>attributs</strong></li>
+<li>des comportements : ses <strong>méthodes</strong></li>
+</ul>
+<p>Une <strong>classe</strong> permet de définir ces <strong>membres</strong> (attributs et méthodes) pour tous les <strong>objets</strong> qui seront <strong>instanciés</strong> sur son modèle.</p>
+<p>Une méthode est l’équivalent d’une <strong>fonction</strong> en programmation procédurale; sauf que cette <em>fonction</em> permet de manipuler les attributs de l’objet, indépendamment de ceux d’un autre objet.</p>
+<h4 id="premières-classes">Premières classes</h4>
+<p>Dans un premier temps, il vous est proposé de créer une fonction mathématique permettant de multiplier deux nombres entiers.</p>
+<p>Le résultat de cette fonction sera stocké dans l’attribut <code>resultat</code> de l’objet</p>
+<h5 id="classe-multiplication">Classe Multiplication</h5>
+<p>Implémenter une méthode (que l’on nommera <code>calculer</code>) dans une classe nommée <code>Multiplication</code></p>
+<p>Voici un exemple à compléter:</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java;</span></a>
+<a class="sourceLine" id="cb9-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Multiplication {</a>
+<a class="sourceLine" id="cb9-4" data-line-number="4">  <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b){</a>
+<a class="sourceLine" id="cb9-6" data-line-number="6">    resultat = a * b;</a>
+<a class="sourceLine" id="cb9-7" data-line-number="7">  }</a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">}</a></code></pre></div>
+<p><strong>Un peu d’UML :</strong> ci-dessous la représentation UML de cette classe</p>
+<figure>
+<img src="images/Multiplication.png" alt="Multiplication" /><figcaption>Multiplication</figcaption>
+</figure>
+<hr />
+<h5 id="classe-principale">Classe principale</h5>
+<p>Pour tester cette classe, nous allons créer une nouvelle classe <em>principale</em> (qui contient une méthode <code>main</code>) dans laquelle on fera appel à la classe <code>Multiplication</code>.</p>
+<p>Cette nouvelle classe se nommera <code>Calculer</code>:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java ;</span></a>
+<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Calculer {</a>
+<a class="sourceLine" id="cb10-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb10-5" data-line-number="5">        <span class="co">//Créer une instance de la nouvelle classe avec le mot clé `new`</span></a>
+<a class="sourceLine" id="cb10-6" data-line-number="6">        Multiplication premierCalcul = <span class="kw">new</span> <span class="fu">Multiplication</span>();</a>
+<a class="sourceLine" id="cb10-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb10-8" data-line-number="8">        <span class="co">// Créer une variable nommée resultat</span></a>
+<a class="sourceLine" id="cb10-9" data-line-number="9">        premierCalcul.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>); <span class="co">// appel de méthode</span></a>
+<a class="sourceLine" id="cb10-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb10-11" data-line-number="11">        <span class="co">// Ecrire le résultat du calcul dans la sortie standard</span></a>
+<a class="sourceLine" id="cb10-12" data-line-number="12">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de 3 multiplié par 5:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-13" data-line-number="13">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">resultat</span>);</a>
+<a class="sourceLine" id="cb10-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb10-15" data-line-number="15">}</a></code></pre></div>
+<h5 id="instantiation">Instantiation</h5>
+<p>Dans ce programme, nous avons utilisé le mot clef <code>new</code> qui permet d’<strong>instancier</strong> un objet à partir d’une classe:</p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1">Multiplication premierCalcul = <span class="kw">new</span> <span class="fu">Multiplication</span>();</a></code></pre></div>
+<p>Ce mot clef <code>new</code> permet de faire appel au <strong>constructeur</strong> de la classe. Si aucun <strong>constructeur</strong> n’est explicitement déclaré dans une classe, le compilateur Java crée un constructeur par défaut, c’est-à-dire sans aucun paramètre.</p>
+<p>La ligne ci-dessus stocke un <strong>pointeur</strong> vers l’instance créée dans la variable <code>premierCalcul</code>.</p>
+<p>Cette variable est déclaré avec un type (la classe) <code>Multiplication</code>.</p>
+<h5 id="appel-de-méthode">Appel de méthode</h5>
+<p>L’appel d’une méthode est similaire à l’appel d’une fonction dans un autre langage, à la différence près que la méthode est rattachée à un objet.</p>
+<p>La ligne suivante permet donc d’appeler la méthode <code>calculer</code> qui est rattachée à l’instance <strong>pointée</strong> par la variable <code>premierCalcul</code>.</p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1">premierCalcul.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>);</a></code></pre></div>
+<h5 id="test-du-programme">Test du programme</h5>
+<p>Exécuter votre programme depuis Eclipse</p>
+<p>Que constatez-vous ?</p>
+<h5 id="classe-addition">Classe Addition</h5>
+<p>Implémentez l’opération mathématique <em>Addition</em>. Elle permet d’additionner deux nombres entiers dans une classe nommée <code>Addition</code>, sur le même modèle que la classe <code>Multiplication</code>.</p>
+<p>Testez-les avec un code qui devrait ressembler à ceci (toujours dans la classe principale <code>Calculer</code>:</p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1">Addition secondCalcul = <span class="kw">new</span> <span class="fu">Addition</span>(); <span class="co">//Instanciation</span></a>
+<a class="sourceLine" id="cb13-2" data-line-number="2">secondCalcul.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>); <span class="co">//appel de la</span></a>
+<a class="sourceLine" id="cb13-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de 3 ajouté à 5:&quot;</span>);</a>
+<a class="sourceLine" id="cb13-4" data-line-number="4"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(secondCalcul.<span class="fu">resultat</span>);</a></code></pre></div>
+<p>Essayez d’appeler plusieurs fois la méthode additionner sur une même instance et observer l’effet sur l’attribut <code>resultat</code>.</p>
+<p>Faites de même sur plusieurs instances différentes (stockées dans des variables <code>troisiemeCalcul</code>, <code>quatriemeCalcul</code>, ou <code>calcul3</code>, <code>calcul4</code>, <code>calcul5</code>, etc).</p>
+<p>Que constatez-vous ? Qu’en déduisez-vous ?</p>
+<p>Une piste: est-ce que les attributs <code>resultat</code> des différentes instances ont la même valeur ? Quel est l’intérêt de ceci ?</p>
+<h4 id="utilisation-du-débogueur-eclipse">Utilisation du débogueur Eclipse</h4>
+<p>Reprenez chacun des codes précédents et lancez-le en utilisant le déboggueur Eclipse</p>
+<p>Ajoutez un point d’arrêt sur la première ligne de votre méthode <code>calculer</code> et relancez le débogueur.</p>
+<p>Visualisez les boutons <code>Step into</code>, <code>Step over</code> et <code>Step return</code>.</p>
+<ul>
+<li>À quoi peuvent-ils servir ?</li>
+<li>Expérimentez et observez</li>
+</ul>
+<p>Visualisez la zone <code>Variables</code> (en haut à droite)</p>
+<ul>
+<li>Observez ce qui y est affiché</li>
+<li>Dépliez l’arborescence qui y est affichée</li>
+</ul>
+<h3 id="lhéritage">L’héritage</h3>
+<p>Une des particularité de la POO est qu’une classe peut hériter d’une autre classe. Cela a plusieurs avantages, notamment celui de permettre la réutilisation de code déjà écrit.</p>
+<p>Ainsi, une classe peut hériter des comportements (méthodes) et données (attributs) d’une classe parente.</p>
+<h4 id="création-dune-classe-parente">Création d’une classe parente</h4>
+<p>Nous allons observer cela en modifiant le programme réalisé précédemment. Pour cela, nous allons créer une classe <code>Calcul</code> qui contiendra un attribut <code>resultat</code>. Cet attribut ne sera pas déclaré une seconde fois dans les classes qui en héritent.</p>
+<p>Fichier <code>Calcul.java</code> :</p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java;</span></a>
+<a class="sourceLine" id="cb14-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb14-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Calcul {</a>
+<a class="sourceLine" id="cb14-4" data-line-number="4">    <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb14-5" data-line-number="5">}</a></code></pre></div>
+<h4 id="création-dune-classe-fille">Création d’une classe fille</h4>
+<p>Fichier <code>Multiplication.java</code> :</p>
+<div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java;</span></a>
+<a class="sourceLine" id="cb15-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb15-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Multiplication <span class="kw">extends</span> Calcul {</a>
+<a class="sourceLine" id="cb15-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b){</a>
+<a class="sourceLine" id="cb15-5" data-line-number="5">        resultat = a * b;</a>
+<a class="sourceLine" id="cb15-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb15-7" data-line-number="7">}</a></code></pre></div>
+<p>En relançant le programme précédent, cela devrait continuer à fonctionner.</p>
+<h4 id="le-mot-clé-extends">Le mot clé extends</h4>
+<p>Nous observons l’utilisation du mot clé <code>extends</code> qui signifie que la classe <code>Multiplication</code> hérite de la classe <code>Calcul</code>.</p>
+<p>On peut dire ceci:</p>
+<ul>
+<li><code>Calcul</code> est la classe parente de la classe <code>Multiplication</code></li>
+<li><code>Multiplication</code> est une classe fille de la classe <code>Calcul</code></li>
+</ul>
+<p><strong>Un peu d’UML :</strong> voici un diagramme de classe qui représente cet héritage</p>
+<figure>
+<img src="images/Heritage-Calcul.png" alt="Héritage Calcul" /><figcaption>Héritage Calcul</figcaption>
+</figure>
+<p>On remarque ici que la classe <code>Calcul</code> hérite de la classe <code>Object</code>. La raison est simple: toute classe en Java hérite <strong>toujours</strong> de la classe <code>Object</code>. C’est logique, puisque tout est <em>objet</em> en Java.</p>
+<hr />
+<h4 id="addition-est-un-calcul">Addition est un Calcul</h4>
+<p>Adapter la classe <code>Addition</code> pour correspondre au diagramme suivant:</p>
+<figure>
+<img src="images/Heritage-Calcul-Addition.png" alt="Héritage Calcul Addition" /><figcaption>Héritage Calcul Addition</figcaption>
+</figure>
+<h4 id="appel-dune-méthode-de-la-classe-parente">Appel d’une méthode de la classe parente</h4>
+<p>Nous allons maintenant écrire une classe <code>Soustraction</code> qui va hériter de la classe <code>Addition</code> contenant la méthode suivante :</p>
+<ul>
+<li><code>calculer</code> permettant de soustraire deux nombres entiers .</li>
+</ul>
+<p>Il serait logique ici de dire que cette classe hérite d’<code>Addition</code> puisqu’une soustraction consiste à additionner au premier opérande l’opposé du second opérande : <code>resultat = a + (-b)</code></p>
+<p>Il est possible d’appeler une méthode de la classe parente (la classe de niveau <strong>supér</strong>ieur) grâce au mot clé <code>super</code>:</p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">super</span>.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">-7</span>); <span class="co">//appel de la fonction de la classe parente</span></a></code></pre></div>
+<ol type="1">
+<li><strong>Ecrivez cette classe <code>Soustraction</code> et exécuter votre programme.</strong></li>
+<li><strong>Dessinez le diagramme UML correspondant.</strong></li>
+</ol>
+<h4 id="un-peu-dabstraction">Un peu d’abstraction</h4>
+<p>D’une manière générale, on peut considérer que <code>Multiplication</code>, <code>Addition</code> et <code>Soustraction</code> sont des calculs arithmétiques.</p>
+<p>Ces classes ont toutes en commun une méthode nommée <code>calculer</code>. D’ailleurs, lors des appels de ces méthodes on avait toujours quelque chose de cette forme:</p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1">uneInstanceDeCalcul.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>);</a></code></pre></div>
+<p>Nous pouvons déclarer cette méthode directement dans la classe <code>Calcul</code> et nous allons la déclarer comme étant abstraite. <code>Calcul</code> sera une <strong>abstraction</strong> des autres opérations.</p>
+<p>Pour cela, nous allons d’abord modifier la classe <code>Calcul</code>:</p>
+<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> Calcul {</a>
+<a class="sourceLine" id="cb18-2" data-line-number="2">    <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb18-3" data-line-number="3">    <span class="kw">public</span> <span class="kw">abstract</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b);</a>
+<a class="sourceLine" id="cb18-4" data-line-number="4">}</a></code></pre></div>
+<p>Puis nous allons remplacer les types des variables par le type <code>Calcul</code> dans la classe <code>Calculer</code>:</p>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Calculer {</a>
+<a class="sourceLine" id="cb19-2" data-line-number="2">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb19-3" data-line-number="3">        Calcul premierCalcul = <span class="kw">new</span> <span class="fu">Multiplication</span>();</a>
+<a class="sourceLine" id="cb19-4" data-line-number="4">    premierCalcul.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>); <span class="co">// appel de méthode</span></a>
+<a class="sourceLine" id="cb19-5" data-line-number="5">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le résultat de 3 multiplié par 5:&quot;</span>);</a>
+<a class="sourceLine" id="cb19-6" data-line-number="6">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">resultat</span>);</a>
+<a class="sourceLine" id="cb19-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb19-8" data-line-number="8">    <span class="co">//...</span></a>
+<a class="sourceLine" id="cb19-9" data-line-number="9">    }</a>
+<a class="sourceLine" id="cb19-10" data-line-number="10">}</a></code></pre></div>
+<p>On constate ici que la compilation passe et que le programme se comporte exactement de la même manière.</p>
+<p>Alors quel est l’intérêt de procéder ainsi ? <em>Essayez de remplacer l’un des constructeurs des sous-classes de <code>Calcul</code> par l’un des autres et ré-exécutez le programme pour observer les effets.</em></p>
+<p>Le diagramme de classes ci-dessous représente cette classe abstraite, ajoutez-y la classe <code>Soustraction</code>:</p>
+<figure>
+<img src="images/Heritage-Calcul-Abstract.png" alt="Calcul abstrait" /><figcaption>Calcul abstrait</figcaption>
+</figure>
+<h5 id="généralisation-héritage">Généralisation, héritage</h5>
+<p>Dans l’exemple précédent, on fait une généralisation: <code>Calcul</code> généralise les classes <code>Multiplication</code>, <code>Addition</code> et <code>Soustraction</code>.</p>
+<p>A l’inverse, les classes <code>Multiplication</code>, <code>Addition</code> et <code>Soustraction</code> héritent de la classe <code>Calcul</code>: on dit aussi que ces classe spécialisent la classe <code>Calcul</code>. Elles sont spécialisées pour une opération donnée.</p>
+<hr />
+<p>Nous allons maintenant observer l’héritage dans la documentation de Java.</p>
+<h4 id="découverte-de-la-documentation-javadoc">Découverte de la documentation Javadoc</h4>
+<p>Ouvrez la documentation JAVA 8 qui se trouve ici : <a href="https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html" class="uri">https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html</a></p>
+<p>Les chaînes de caractères en Java sont gérées par la classe <code>String</code>.</p>
+<p>Essayez de trouver la classe <code>String</code> dans cette documentation.</p>
+<p>Faites un diagramme UML représentant cette classe (avec au moins sa classe parente).</p>
+<p>Toute classe Java hérite toujours de la classe Object. Cette classe contient deux méthodes intéressantes: <code>getClass()</code> et <code>toString()</code></p>
+<p>Nous allons expérimenter cela dans ce qui suit.</p>
+<h5 id="la-méthode-tostring">La méthode toString()</h5>
+<p>Nous allons partir de notre programme <code>Hello World</code> pour lui ajouter quelques fonctionnalités.</p>
+<p>Pour cela, nous allons dupliquer cette classe <strong>avec notre explorateur de fichier</strong> (sans utiliser les fonctions d’Eclipse) et en renommant le fichier <code>Exemple.java</code> (toujours dans le même répertoire).</p>
+<p>Une fois cela fait, essayez de compiler et de lancer le programme. Que constatez-vous ?</p>
+<p>Vous allez modifier le <code>main(String[])</code> en remplaçant le <code>system.out.println</code> comme suit:</p>
+<div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb20-2" data-line-number="2">    <span class="bu">Object</span> instance = <span class="kw">new</span> <span class="fu">Exemple</span>();</a>
+<a class="sourceLine" id="cb20-3" data-line-number="3">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(instance); <span class="co">// Affiche</span></a>
+<a class="sourceLine" id="cb20-4" data-line-number="4">}</a></code></pre></div>
+<p>Lancez le programme (en sélectionnant la classe <code>Exemple</code> comme classe à exécuter). Que constatez-vous ?</p>
+<p>Maintenant, vous allez modifier la classe en ajoutant une méthode nommée <code>toString()</code> :</p>
+<div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>(){</a>
+<a class="sourceLine" id="cb21-2" data-line-number="2">    <span class="kw">return</span> <span class="st">&quot;Je suis Exemple:&quot;</span> + <span class="kw">super</span>.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb21-3" data-line-number="3">  }</a></code></pre></div>
+<p>Dans cet exemple, nous venons de concaténer deux chaînes de caractères. C’est l’opérateur <code>+</code> qui permet cela : l’instruction <code>&quot;ab&quot; + &quot;cd&quot;</code> renvoie la valeur <code>&quot;abcd&quot;</code>.</p>
+<p>Relancez le programme. Que constatez-vous ?</p>
+<p>À nouveau, vous allez modifier la classe en modifiant la méthode <code>toString()</code> :</p>
+<div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>(){</a>
+<a class="sourceLine" id="cb22-2" data-line-number="2">    <span class="kw">return</span> <span class="st">&quot;Je suis Exemple (&quot;</span> + <span class="fu">getClass</span>() +<span class="st">&quot;  ):&quot;</span>+ <span class="kw">super</span>.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb22-3" data-line-number="3">  }</a></code></pre></div>
+<p>Relancez le programme. Que constatez-vous ?</p>
+<p>Avez-vous des questions ? A quoi sert la méthode <code>toString()</code> ?</p>
+<h5 id="un-peu-duml">Un peu d’UML</h5>
+<p>Faites un diagramme UML représentant cette classe <code>Exemple</code> ainsi que la classe <code>Object</code>. Représentez également la classe <code>String</code> sur ce diagramme</p>
+<hr />
+<h2 id="représentation-textuelle-dune-personne">Représentation textuelle d’une Personne</h2>
+<p>Nous allons définir une classe personne comme suit:</p>
+<div class="sourceCode" id="cb23"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Personne {</a>
+<a class="sourceLine" id="cb23-2" data-line-number="2">    <span class="bu">String</span> nom;</a>
+<a class="sourceLine" id="cb23-3" data-line-number="3">    <span class="bu">String</span> prenom;</a>
+<a class="sourceLine" id="cb23-4" data-line-number="4">    <span class="bu">String</span> dateNaissance;</a>
+<a class="sourceLine" id="cb23-5" data-line-number="5">    <span class="bu">String</span> adresseMail;</a>
+<a class="sourceLine" id="cb23-6" data-line-number="6">    <span class="bu">String</span> telephone;</a>
+<a class="sourceLine" id="cb23-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb23-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb23-9" data-line-number="9">        Personne utilisateur = <span class="kw">new</span> <span class="fu">Personne</span>();</a>
+<a class="sourceLine" id="cb23-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb23-11" data-line-number="11">        utilisateur.<span class="fu">nom</span>           = <span class="st">&quot;McEnroe&quot;</span>;</a>
+<a class="sourceLine" id="cb23-12" data-line-number="12">        utilisateur.<span class="fu">prenom</span>        = <span class="st">&quot;John&quot;</span>;</a>
+<a class="sourceLine" id="cb23-13" data-line-number="13">        utilisateur.<span class="fu">dateNaissance</span> = <span class="st">&quot;10/10/1960&quot;</span>;</a>
+<a class="sourceLine" id="cb23-14" data-line-number="14">        utilisateur.<span class="fu">adresseMail</span>   = <span class="st">&quot;johnmcenroe@usa.tennis.com&quot;</span>;</a>
+<a class="sourceLine" id="cb23-15" data-line-number="15">        utilisateur.<span class="fu">telephone</span>     = <span class="st">&quot;+001 203 204 205&quot;</span>;</a>
+<a class="sourceLine" id="cb23-16" data-line-number="16"></a>
+<a class="sourceLine" id="cb23-17" data-line-number="17">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">nom</span>);</a>
+<a class="sourceLine" id="cb23-18" data-line-number="18">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">prenom</span>);</a>
+<a class="sourceLine" id="cb23-19" data-line-number="19">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur);</a>
+<a class="sourceLine" id="cb23-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb23-21" data-line-number="21">}</a></code></pre></div>
+<p>Exécutez ce programme. Que constatez-vous ?</p>
+<p>Les attributs de cette classe sont:</p>
+<ul>
+<li>nom</li>
+<li>prenom</li>
+<li>dateNaissance</li>
+<li>adresseMail</li>
+<li>telephone</li>
+</ul>
+<p>Aux attributs de cette classe, on va pouvoir rajouter des méthodes:</p>
+<div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Personne {</a>
+<a class="sourceLine" id="cb24-2" data-line-number="2">    <span class="bu">String</span> nom;</a>
+<a class="sourceLine" id="cb24-3" data-line-number="3">    <span class="bu">String</span> prenom;</a>
+<a class="sourceLine" id="cb24-4" data-line-number="4">    <span class="bu">String</span> dateNaissance;</a>
+<a class="sourceLine" id="cb24-5" data-line-number="5">    <span class="bu">String</span> adresseMail;</a>
+<a class="sourceLine" id="cb24-6" data-line-number="6">    <span class="bu">String</span> telephone;</a>
+<a class="sourceLine" id="cb24-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb24-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb24-9" data-line-number="9">        Personne utilisateur = <span class="kw">new</span> <span class="fu">Personne</span>();</a>
+<a class="sourceLine" id="cb24-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb24-11" data-line-number="11">        utilisateur.<span class="fu">nom</span>           = <span class="st">&quot;McEnroe&quot;</span>;</a>
+<a class="sourceLine" id="cb24-12" data-line-number="12">        utilisateur.<span class="fu">prenom</span>        = <span class="st">&quot;John&quot;</span>;</a>
+<a class="sourceLine" id="cb24-13" data-line-number="13">        utilisateur.<span class="fu">dateNaissance</span> = <span class="st">&quot;10/10/1960&quot;</span>;</a>
+<a class="sourceLine" id="cb24-14" data-line-number="14">        utilisateur.<span class="fu">adresseMail</span>   = <span class="st">&quot;johnmcenroe@usa.tennis.com&quot;</span>;</a>
+<a class="sourceLine" id="cb24-15" data-line-number="15">        utilisateur.<span class="fu">telephone</span>     = <span class="st">&quot;+001 203 204 205&quot;</span>;</a>
+<a class="sourceLine" id="cb24-16" data-line-number="16"></a>
+<a class="sourceLine" id="cb24-17" data-line-number="17">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">nom</span>);</a>
+<a class="sourceLine" id="cb24-18" data-line-number="18">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">prenom</span>);</a>
+<a class="sourceLine" id="cb24-19" data-line-number="19">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur);</a>
+<a class="sourceLine" id="cb24-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb24-21" data-line-number="21">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getNomPrenom</span>(){</a>
+<a class="sourceLine" id="cb24-22" data-line-number="22">    <span class="kw">return</span> nom+<span class="st">&quot; &quot;</span>+prenom; <span class="co">//Concaténation des chaines nom, &quot; &quot; et prenom</span></a>
+<a class="sourceLine" id="cb24-23" data-line-number="23">  }</a>
+<a class="sourceLine" id="cb24-24" data-line-number="24"></a>
+<a class="sourceLine" id="cb24-25" data-line-number="25">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getPrenomNom</span>(){</a>
+<a class="sourceLine" id="cb24-26" data-line-number="26">    <span class="kw">return</span> prenom+<span class="st">&quot; &quot;</span>+nom;</a>
+<a class="sourceLine" id="cb24-27" data-line-number="27">  }</a>
+<a class="sourceLine" id="cb24-28" data-line-number="28">}</a></code></pre></div>
+<p>Ces méthodes sont des méthodes d’instance: elles sont liées à un exemplaire de la classe Personne. On peut les utiliser en ajoutant à la fin de la méthode <code>main(String[])</code> les lignes suivantes:</p>
+<div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">getNomPrenom</span>());</a>
+<a class="sourceLine" id="cb25-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur.<span class="fu">getPrenomNom</span>());</a></code></pre></div>
+<p>Que constatez-vous ?</p>
+<p>Nous allons maintenant modifier l’affichage obtenu avec la ligne suivante du <code>main(String[])</code>:</p>
+<div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(utilisateur); <span class="co">// Dépend de la méthode toString()</span></a></code></pre></div>
+<p>Pour cela, nous surchargeons la méthode toString qui était déjà définie dans la classe Object:</p>
+<div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>(){</a>
+<a class="sourceLine" id="cb27-2" data-line-number="2">  <span class="kw">return</span> nom+<span class="st">&quot; &quot;</span>+prenom+<span class="st">&quot; &quot;</span>+dateNaissance+<span class="st">&quot; &quot;</span></a>
+<a class="sourceLine" id="cb27-3" data-line-number="3">      +adresseMail+<span class="st">&quot; &quot;</span>+telephone;</a>
+<a class="sourceLine" id="cb27-4" data-line-number="4">}</a></code></pre></div>
+<p>Que constatez-vous ?</p>
+<h3 id="représentation-textuelle-dun-calcul">Représentation textuelle d’un calcul</h3>
+<p>Vous allez maintenant reprendre les classes <code>Calcul</code> et ses sous-classes. Modifiez la méthode toString() de cette classe pour que le code suivant:</p>
+<div class="sourceCode" id="cb28"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb28-1" data-line-number="1">Calcul calcul = <span class="kw">new</span> <span class="fu">Multiplication</span>();</a>
+<a class="sourceLine" id="cb28-2" data-line-number="2">calcul.<span class="fu">calculer</span>(<span class="dv">4</span>,<span class="dv">8</span>);</a>
+<a class="sourceLine" id="cb28-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul);</a></code></pre></div>
+<p>Produise <strong>exactement</strong> la sortie suivante une fois exécutée:</p>
+<pre><code>Le résultat de l&#39;opération Multiplication de 4 et 8 donne 32.</code></pre>
+<p>Vous avez la possibilité de rajouter de nouveaux attributs à vos classes afin de stocker (par exemple) les opérandes ou toute information utile.</p>
+<h2 id="manipulation-de-chaînes-de-caractères">Manipulation de chaînes de caractères</h2>
+<p>Dans la classe <code>Personne</code>, nous avons utilisé des chaînes de caractères avec l’opérateur <code>+</code> : nous avons concaténé des chaînes de caractères entre elles.</p>
+<p>Nous allons utiliser ici la classe <code>String</code> afin d’en découvrir quelques aspects importants.</p>
+<h3 id="quelques-expériences-étonnantes">Quelques expériences étonnantes</h3>
+<p>Exécuter le programme suivant:</p>
+<div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb30-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> ExerciceChaine {</a>
+<a class="sourceLine" id="cb30-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb30-4" data-line-number="4">        <span class="bu">String</span> uneChaine = <span class="st">&quot;Bonjour&quot;</span> ;</a>
+<a class="sourceLine" id="cb30-5" data-line-number="5">        <span class="bu">String</span> autreChaine = <span class="st">&quot;Bonjour&quot;</span> ;</a>
+<a class="sourceLine" id="cb30-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb30-7" data-line-number="7">        ExerciceChaine ec = <span class="kw">new</span> <span class="fu">ExerciceChaine</span>();</a>
+<a class="sourceLine" id="cb30-8" data-line-number="8">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Deux chaines identiques&quot;</span>);</a>
+<a class="sourceLine" id="cb30-9" data-line-number="9">        ec.<span class="fu">testChaines</span>(uneChaine, autreChaine);</a>
+<a class="sourceLine" id="cb30-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb30-11" data-line-number="11">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Une nouvelle instance&quot;</span>);</a>
+<a class="sourceLine" id="cb30-12" data-line-number="12">        autreChaine = <span class="kw">new</span> <span class="bu">String</span>(<span class="st">&quot;Bonjour&quot;</span>);</a>
+<a class="sourceLine" id="cb30-13" data-line-number="13">        ec.<span class="fu">testChaines</span>(uneChaine, autreChaine);</a>
+<a class="sourceLine" id="cb30-14" data-line-number="14"></a>
+<a class="sourceLine" id="cb30-15" data-line-number="15">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Une concaténation simple&quot;</span>);</a>
+<a class="sourceLine" id="cb30-16" data-line-number="16">        autreChaine = <span class="st">&quot;Bon&quot;</span> + <span class="st">&quot;jour&quot;</span> ;</a>
+<a class="sourceLine" id="cb30-17" data-line-number="17">        ec.<span class="fu">testChaines</span>(uneChaine, autreChaine);</a>
+<a class="sourceLine" id="cb30-18" data-line-number="18"></a>
+<a class="sourceLine" id="cb30-19" data-line-number="19">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Une concaténation avec des variables différentes&quot;</span>);</a>
+<a class="sourceLine" id="cb30-20" data-line-number="20">        autreChaine = <span class="st">&quot;Bon&quot;</span> ;</a>
+<a class="sourceLine" id="cb30-21" data-line-number="21">        <span class="bu">String</span> troisiemeChaine = <span class="st">&quot;jour&quot;</span>;</a>
+<a class="sourceLine" id="cb30-22" data-line-number="22">        autreChaine = autreChaine + troisiemeChaine;</a>
+<a class="sourceLine" id="cb30-23" data-line-number="23">        ec.<span class="fu">testChaines</span>(uneChaine, autreChaine);</a>
+<a class="sourceLine" id="cb30-24" data-line-number="24">    }</a>
+<a class="sourceLine" id="cb30-25" data-line-number="25">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testChaines</span>(<span class="bu">String</span> a, <span class="bu">String</span> b){</a>
+<a class="sourceLine" id="cb30-26" data-line-number="26">        <span class="kw">if</span>(a == b){</a>
+<a class="sourceLine" id="cb30-27" data-line-number="27">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont les mêmes&quot;);</span></a>
+<a class="sourceLine" id="cb30-28" data-line-number="28">        }</a>
+<a class="sourceLine" id="cb30-29" data-line-number="29">        <span class="kw">else</span>{</a>
+<a class="sourceLine" id="cb30-30" data-line-number="30">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont différentes&quot;</span>);</a>
+<a class="sourceLine" id="cb30-31" data-line-number="31">        }</a>
+<a class="sourceLine" id="cb30-32" data-line-number="32">    }</a>
+<a class="sourceLine" id="cb30-33" data-line-number="33">}</a></code></pre></div>
+<p>Remplacez la méthode <code>testChaines(String, String)</code> par la suivante:</p>
+<div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testChaines</span>(<span class="bu">String</span> a, <span class="bu">String</span> b){</a>
+<a class="sourceLine" id="cb31-2" data-line-number="2">  <span class="kw">if</span>(a.<span class="fu">equals</span>(b)){</a>
+<a class="sourceLine" id="cb31-3" data-line-number="3">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont les mêmes&quot;);</span></a>
+<a class="sourceLine" id="cb31-4" data-line-number="4">  }</a>
+<a class="sourceLine" id="cb31-5" data-line-number="5">  <span class="kw">else</span>{</a>
+<a class="sourceLine" id="cb31-6" data-line-number="6">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont différentes&quot;</span>);</a>
+<a class="sourceLine" id="cb31-7" data-line-number="7">  }</a>
+<a class="sourceLine" id="cb31-8" data-line-number="8">}</a></code></pre></div>
+<p>Que constatez-vous ?</p>
+<p>Allez voir dans la Javadoc à quoi correspond la méthode <code>equals(Object)</code>.</p>
+<p>Pourquoi est-elle utile ?</p>
+<h3 id="quelques-méthodes-pour-utiliser-les-string">Quelques méthodes pour utiliser les String</h3>
+<p>Exécutez le programme suivant:</p>
+<div class="sourceCode" id="cb32"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb32-1" data-line-number="1"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb32-2" data-line-number="2">  <span class="bu">String</span> chaine = <span class="st">&quot;Quelques caractères&quot;</span>;</a>
+<a class="sourceLine" id="cb32-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb32-4" data-line-number="4">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb32-5" data-line-number="5">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">substring</span>(<span class="dv">2</span>));</a>
+<a class="sourceLine" id="cb32-6" data-line-number="6">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">substring</span>(<span class="dv">5</span>,<span class="dv">10</span>));</a>
+<a class="sourceLine" id="cb32-7" data-line-number="7">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">startsWith</span>(<span class="st">&quot;Que&quot;</span>));</a>
+<a class="sourceLine" id="cb32-8" data-line-number="8">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">startsWith</span>(<span class="st">&quot;que&quot;</span>));</a>
+<a class="sourceLine" id="cb32-9" data-line-number="9">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">endsWith</span>(<span class="st">&quot;res&quot;</span>));</a>
+<a class="sourceLine" id="cb32-10" data-line-number="10">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">endsWith</span>(<span class="st">&quot;re&quot;</span>));</a>
+<a class="sourceLine" id="cb32-11" data-line-number="11">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">indexOf</span>(<span class="st">&quot;ra&quot;</span>));</a>
+<a class="sourceLine" id="cb32-12" data-line-number="12">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">toLowerCase</span>());</a>
+<a class="sourceLine" id="cb32-13" data-line-number="13">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">toUpperCase</span>());</a>
+<a class="sourceLine" id="cb32-14" data-line-number="14">}</a></code></pre></div>
+<p>Aidez-vous de la Javadoc pour comprendre ce que font chacune de ces méthodes.</p>
+<p>En utilisant la chaîne &quot; Je suis une chaîne moi aussi &quot; (attention aux espaces en début et fin de chaîne), testez les effets des méthodes suivantes:</p>
+<ul>
+<li><code>lastIndexOf(String)</code></li>
+<li><code>trim()</code></li>
+<li><code>toString()</code></li>
+</ul>
+<p>Que constatez-vous ? Est-ce logique ?</p>
+<h3 id="parcours-dune-chaîne-et-boucles">Parcours d’une chaîne et boucles</h3>
+<p>Nous allons utiliser une boucle simple pour récupérer chaque caractère d’une chaîne.</p>
+<div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span> ; i &lt; chaine.<span class="fu">length</span>(); i++) {</a>
+<a class="sourceLine" id="cb33-2" data-line-number="2">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(chaine.<span class="fu">charAt</span>(i));</a>
+<a class="sourceLine" id="cb33-3" data-line-number="3">}</a></code></pre></div>
+<p>Analysez le code ci-dessus et posez des questions si vous ne le comprenez-pas.</p>
+<h4 id="exercice-palindrome">Exercice: palindrome</h4>
+<p>Ecrivez un programme qui détermine si une chaîne entrée au clavier est un palindrome (un mot qui se lit dans les deux sens).</p>
+<p><strong>Pour récupérer des chaînes de caractères entrés par un utilisateur voir l’annexe <code>RecuperationDeDonneesDansLaConsole</code></strong></p>
+<h2 id="créer-des-objets">Créer des objets</h2>
+<p>La création d’objet en Java se fait avec le mot clef <code>new</code>.</p>
+<p>L’opération effectuée avec <code>new</code> est appelée une instantiation: on crée une instance (c’est-à-dire un “exemplaire”) d’une classe.</p>
+<p>Cette instance est un exemplaire indépendant des autres objets de cette classe.</p>
+<h3 id="création-dune-nouvelle-classe">Création d’une nouvelle classe</h3>
+<p>Vous allez implémenter une classe nommée <code>Fleur</code> dans le paquet <code>com.example.java.nature</code></p>
+<p>Cette classe se fera sur le modèle suivant:</p>
+<figure>
+<img src="images/Fleur.png" alt="Diagramme de classe: Fleur" /><figcaption>Diagramme de classe: Fleur</figcaption>
+</figure>
+<p>Implémentez cette classe de sorte que <code>toString()</code> renvoie une valeur ressemblant à <code>nomDeLaFleur(3)</code> (avec <code>nom = &quot;nomDeLaFleur&quot;</code> et <code>identifiant = 3</code></p>
+<p>Instanciez cette classe à partir de la méthode <code>main(String[])</code> de <code>Exemple</code> et affichez cette instance avec un <code>System.out.println(String)</code>.</p>
+<p>Que constatez-vous ?</p>
+<p>Est-on limité par quelque chose ici ?</p>
+<h3 id="constructeur-avec-paramètres">Constructeur avec paramètres</h3>
+<p>Pour pouvoir créer la classe <code>Fleur</code>, il existe un constructeur par défaut. Son défaut est qu’il ne permet pas de modifier les valeurs des attributs.</p>
+<p>Créer un nouveau constructeur sur le modèle suivant:</p>
+<div class="sourceCode" id="cb34"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="kw">public</span> <span class="fu">Fleur</span>(<span class="bu">String</span> nom, <span class="dt">int</span> identifiant){</a>
+<a class="sourceLine" id="cb34-2" data-line-number="2">  <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
+<a class="sourceLine" id="cb34-3" data-line-number="3">  <span class="kw">this</span>.<span class="fu">identifiant</span> = identifiant;</a>
+<a class="sourceLine" id="cb34-4" data-line-number="4">}</a></code></pre></div>
+<p>Essayez d’utiliser ce constructeur et d’afficher l’instance depuis la méthode <code>main(String[])</code></p>
+<p>Créez ainsi plusieurs instances de <code>Fleur</code> et affichez-les.</p>
+<h4 id="utilité-du-constructeur">Utilité du constructeur</h4>
+<p>Un constructeur permet d’instancier un objet.</p>
+<p>S’il est doté de paramètres, il permet de définir les valeurs des attributs (par exemple) au moment de l’instantiation.</p>
+<ul>
+<li>il sert donc à définir l’état <strong>initial</strong> de l’instance créée</li>
+<li>il permet de créer des objets:
+<ul>
+<li>d’une même classe</li>
+<li>ayant des états différents</li>
+</ul></li>
+</ul>
+</body>
+</html>

+ 778 - 0
03-ReglesDeCodage.html

@@ -0,0 +1,778 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Règles de codage</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Règles de codage</div>
+<nav id="TOC">
+<ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#paquetages-package">Paquetages (package)</a><ul>
+<li><a href="#nommage-des-packages">Nommage des packages</a></li>
+<li><a href="#exercice">Exercice</a></li>
+</ul></li>
+<li><a href="#classes">Classes</a><ul>
+<li><a href="#définition-dune-classe">Définition d’une classe</a></li>
+<li><a href="#instantiation">Instantiation</a></li>
+<li><a href="#identification-dune-classe">Identification d’une classe</a></li>
+</ul></li>
+<li><a href="#attributs">Attributs</a><ul>
+<li><a href="#attributs-dinstance">Attributs d’instance</a></li>
+<li><a href="#attributs-de-classe">Attributs de classe</a></li>
+</ul></li>
+<li><a href="#méthodes">Méthodes</a><ul>
+<li><a href="#exercice-1">Exercice</a></li>
+</ul></li>
+<li><a href="#représentation-uml-des-membres">Représentation UML des membres</a></li>
+<li><a href="#import-statique">Import statique</a></li>
+<li><a href="#constantes-et-le-mot-clé-final">Constantes et le mot clé ‘final’</a><ul>
+<li><a href="#représentation-uml">Représentation UML</a></li>
+</ul></li>
+<li><a href="#conventions-de-codage">Conventions de codage</a><ul>
+<li><a href="#définition">Définition</a><ul>
+<li><a href="#référence-1">Référence (1)</a></li>
+<li><a href="#référence-2">Référence (2)</a></li>
+</ul></li>
+<li><a href="#règles-de-nommage">Règles de nommage</a><ul>
+<li><a href="#les-mots-réservés">Les mots réservés</a></li>
+<li><a href="#nommer-les-éléments-du-code">Nommer les éléments du code</a></li>
+<li><a href="#pour-les-constantes">Pour les constantes</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#contrôle-des-accès">Contrôle des accès</a><ul>
+<li><a href="#les-access-modifiers">Les access modifiers</a></li>
+<li><a href="#représentation-uml-1">Représentation UML</a></li>
+<li><a href="#application-1">Application 1</a></li>
+<li><a href="#le-mot-clé-this">Le mot clé this</a><ul>
+<li><a href="#application-2">Application 2</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#transtypage">Transtypage</a><ul>
+<li><a href="#un-entier-nest-pas-un-double">Un entier n’est pas un double</a></li>
+<li><a href="#un-entier-peut-devenir-un-double">Un entier peut devenir un double</a></li>
+<li><a href="#dune-classe-à-une-autre">D’une classe à une autre</a></li>
+<li><a href="#code-source-pour-les-calculs">Code source pour les calculs</a></li>
+</ul></li>
+<li><a href="#encapsulation">Encapsulation</a><ul>
+<li><a href="#encapsulation-des-calculs">Encapsulation des calculs</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#point">Point</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="introduction">Introduction</h1>
+<p>Dans cette partie, après avoir fait quelques programmes, nous allons voir ou revoir les règles <strong>essentielles</strong> du développement Java.</p>
+<ul>
+<li>organisation des classes en <code>package</code></li>
+<li>définition d’une classe</li>
+</ul>
+<h1 id="paquetages-package">Paquetages (package)</h1>
+<p>Un package permet de regrouper des classes qui partagent un même domaine dans une application ou une librairie.</p>
+<p>Par exemple, les classes du package <code>java.net</code> regroupent des outils d’accès au réseau. Les classes du package <code>java.io</code> regroupent les classes de gestion de flux d’entrées/sorties.</p>
+<p>Les packages:</p>
+<ul>
+<li>permettent d’organiser les classes dans une arborescence</li>
+<li>réduisent les problèmes de conflits de nom et sont sensés garantir une unicité dans l’identification d’une classe</li>
+<li>permettent de protéger l’utilisation de certains attributs / méthodes à l’intérieur d’un package donné.</li>
+</ul>
+<h3 id="nommage-des-packages">Nommage des packages</h3>
+<p>Les noms des paquetages sont <strong>TOUJOURS</strong> en minuscules (aucune majuscule).</p>
+<h3 id="exercice">Exercice</h3>
+<p>Vérifiez à quelles packages appartiennent les classes <code>String</code>, <code>Object</code> et <code>Date</code>.</p>
+<p>Concernant la classe <code>Date</code>, déterminez si elle est unique (dans l’ensemble des classes de l’API Java SE).</p>
+<h1 id="classes">Classes</h1>
+<p>Une classe est un modèle. Elle permet de déterminer le comportement d’un ensemble d’objets similaires et leurs caractéristiques et comportements.</p>
+<p>La classe va servir de prototype pour créer une instance. L’instance (ou exemplaire) d’une classe se comportera comme définit dans ce modèle.</p>
+<h3 id="définition-dune-classe">Définition d’une classe</h3>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2">    <span class="bu">String</span> nom; <span class="co">//attribut nom</span></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3">}</a></code></pre></div>
+<h3 id="instantiation">Instantiation</h3>
+<p>L’instantiation se fait avec le mot clef <code>new</code></p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1">RendezVous rendezVous = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a></code></pre></div>
+<h3 id="identification-dune-classe">Identification d’une classe</h3>
+<p>L’identification d’une classe se fait à partir de son nom et de son paquetage.</p>
+<p>Ainsi, le nom complet de la classe <code>String</code> est <code>java.lang.String</code>.</p>
+<p>Le nom complet de la classe <code>Date</code> est <code>java.util.Date</code> ou <code>java.sql.Date</code>. En effet il y a plusieurs classes <code>Date</code>.</p>
+<h4 id="import">Import</h4>
+<p>Si on veut les différencier il faut utiliser le nom complet. Ce qui serait peu lisible en pratique. Comme dans une classe on n’utilise en général qu’une de ces deux classes, on va utiliser un <code>import</code>.</p>
+<p>Ainsi, au lieu de devoir écrire:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
+<a class="sourceLine" id="cb3-2" data-line-number="2">  java.<span class="fu">util</span>.<span class="fu">Date</span> dateRDV;</a>
+<a class="sourceLine" id="cb3-3" data-line-number="3">}</a></code></pre></div>
+<p>On va écrire:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.Date;</span></a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">class</span> RendezVous {</a>
+<a class="sourceLine" id="cb4-3" data-line-number="3">  <span class="bu">Date</span> dateRDV;</a>
+<a class="sourceLine" id="cb4-4" data-line-number="4">}</a></code></pre></div>
+<ul>
+<li>Les imports se font systèmatiquements au début du fichier, après la déclaration du package.</li>
+<li>Une fois un <code>import</code> fait dans un fichier, il est valide pour tout le fichier.</li>
+</ul>
+<h4 id="import-de-toutes-les-classes-dun-paquet">Import de toutes les classes d’un paquet</h4>
+<p>Il est possible aussi d’importer toutes les classes d’un même paquet en une seule fois avec le joker <code>*</code>.</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.*;</span></a>
+<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="kw">class</span> RendezVous {</a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">  <span class="bu">Date</span> dateRDV;</a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">}</a></code></pre></div>
+<h1 id="attributs">Attributs</h1>
+<p>Les attributs d’une classe sont les éléments contenus par une classe.</p>
+<p>Dans l’exemple précédent, l’attribut <code>nom</code> permet de stocker le nom du <code>RendezVous</code> sous forme d’une chaîne de caractère.</p>
+<h3 id="attributs-dinstance">Attributs d’instance</h3>
+<p>La valeur d’un attribut est propre à une instance de classe. Chaque exemplaire d’une classe conservera une valeur spécifique pour cet attribut.</p>
+<p>Testez le code suivant (à mettre dans une méthode <code>main</code>):</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1">RendezVous rendezVousA = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
+<a class="sourceLine" id="cb6-2" data-line-number="2">rendezVousA.<span class="fu">nom</span> = <span class="st">&quot;Premier rendez-vous&quot;</span>;</a>
+<a class="sourceLine" id="cb6-3" data-line-number="3">RendezVous rendezVousB = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4">rendezVousB.<span class="fu">nom</span> = <span class="st">&quot;Second rendez-vous&quot;</span>;</a>
+<a class="sourceLine" id="cb6-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousA); <span class="co">//RendezVous A</span></a>
+<a class="sourceLine" id="cb6-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousB); <span class="co">//RendezVous B</span></a></code></pre></div>
+<h3 id="attributs-de-classe">Attributs de classe</h3>
+<p>Il est possible de définir des attributs communs à toutes les instances d’une classe. Ce sont les attributs de classe.</p>
+<p>Ils sont définis en utilisant le mot clé <code>static</code>.</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">class</span> RendezVous{</a>
+<a class="sourceLine" id="cb7-2" data-line-number="2">  <span class="bu">String</span> nom;</a>
+<a class="sourceLine" id="cb7-3" data-line-number="3">  <span class="dt">static</span> <span class="dt">int</span> compteur;</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">}</a></code></pre></div>
+<p>Utilisation:</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2">RendezVous rendezVousA = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
+<a class="sourceLine" id="cb8-3" data-line-number="3">rendezVousA.<span class="fu">compteur</span> = <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb8-4" data-line-number="4">RendezVous rendezVousB = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
+<a class="sourceLine" id="cb8-5" data-line-number="5">rendezVousB.<span class="fu">compteur</span> += <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb8-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(RendezVous.<span class="fu">compteur</span>); <span class="co">//2</span></a>
+<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(RendezVous.<span class="fu">compteur</span>); <span class="co">//2</span></a></code></pre></div>
+<p><strong>Remarques importantes</strong></p>
+<ul>
+<li>Une règle de codage veut que l’on n’accède aux attributs de classes que par le nom de la classe</li>
+<li>On n’utilisera donc pas le nom des instances pour y accéder</li>
+</ul>
+<p>Au lieu d’écrire:</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1">rendezVousA.<span class="fu">compteur</span> = <span class="dv">1</span>;</a></code></pre></div>
+<p>Ecrire:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1">RendezVous.<span class="fu">compteur</span> = <span class="dv">1</span>;</a></code></pre></div>
+<h1 id="méthodes">Méthodes</h1>
+<p>Une méthode permet de définir un comportement, d’implémenter un algorithme.</p>
+<p>Elles sont de deux types:</p>
+<ul>
+<li>les méthodes d’instances, qui s’applique à une instance donnée</li>
+</ul>
+<p><em>Déclaration</em></p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
+<a class="sourceLine" id="cb11-2" data-line-number="2">  <span class="dt">int</span> dureeEnHeure = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb11-3" data-line-number="3">  <span class="dt">void</span> <span class="fu">incrementerDuree</span>(){</a>
+<a class="sourceLine" id="cb11-4" data-line-number="4">  dureeEnHeure ++ ;</a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">}</a></code></pre></div>
+<p><em>Utilisation</em></p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1">RendezVous rdv = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
+<a class="sourceLine" id="cb12-2" data-line-number="2">rdv.<span class="fu">incrementerDuree</span>();</a></code></pre></div>
+<ul>
+<li>les méthodes de classe : elles sont accessibles directement à partir du nom de la classe.</li>
+</ul>
+<p><em>Déclaration</em></p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">class</span> RendezVous{</a>
+<a class="sourceLine" id="cb13-2" data-line-number="2">  <span class="dt">static</span> <span class="dt">int</span> compteur = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb13-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb13-4" data-line-number="4">  <span class="fu">RendezVous</span>(){</a>
+<a class="sourceLine" id="cb13-5" data-line-number="5">    compteur++;</a>
+<a class="sourceLine" id="cb13-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb13-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">  <span class="dt">static</span> <span class="dt">int</span> <span class="fu">getNombreDInstances</span>(){</a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">    <span class="kw">return</span> compteur;</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">  }</a>
+<a class="sourceLine" id="cb13-11" data-line-number="11">}</a></code></pre></div>
+<p><em>Utilisation</em></p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="dt">int</span> valeur = RendezVous.<span class="fu">getNombreDInstances</span>();</a></code></pre></div>
+<h3 id="exercice-1">Exercice</h3>
+<p>Nous allons tester les attributs de classe.</p>
+<div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.exercices;</span></a>
+<a class="sourceLine" id="cb15-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb15-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Forme {</a>
+<a class="sourceLine" id="cb15-4" data-line-number="4">    <span class="kw">private</span> <span class="bu">String</span> type ;</a>
+<a class="sourceLine" id="cb15-5" data-line-number="5">    <span class="kw">private</span> <span class="bu">String</span> nom ;</a>
+<a class="sourceLine" id="cb15-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb15-7" data-line-number="7">    <span class="kw">public</span> <span class="fu">Forme</span>(<span class="bu">String</span> type, <span class="bu">String</span> nom){</a>
+<a class="sourceLine" id="cb15-8" data-line-number="8">      <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
+<a class="sourceLine" id="cb15-9" data-line-number="9">      <span class="kw">this</span>.<span class="fu">type</span> = type;</a>
+<a class="sourceLine" id="cb15-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb15-11" data-line-number="11">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>(){</a>
+<a class="sourceLine" id="cb15-12" data-line-number="12">      <span class="kw">return</span> <span class="kw">this</span>.<span class="fu">type</span>;</a>
+<a class="sourceLine" id="cb15-13" data-line-number="13">    }</a>
+<a class="sourceLine" id="cb15-14" data-line-number="14"></a>
+<a class="sourceLine" id="cb15-15" data-line-number="15">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getNom</span>(){</a>
+<a class="sourceLine" id="cb15-16" data-line-number="16">      <span class="kw">return</span> <span class="kw">this</span>.<span class="fu">nom</span>;</a>
+<a class="sourceLine" id="cb15-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb15-18" data-line-number="18"></a>
+<a class="sourceLine" id="cb15-19" data-line-number="19">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb15-20" data-line-number="20">     <span class="co">*</span> Renvoie la concaténation du type et du nom<span class="co">.</span></a>
+<a class="sourceLine" id="cb15-21" data-line-number="21">     <span class="co">*</span> Ex<span class="co">:</span> triangle<span class="co">/</span>bermudes</a>
+<a class="sourceLine" id="cb15-22" data-line-number="22">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb15-23" data-line-number="23">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getRepresentation</span>(){</a>
+<a class="sourceLine" id="cb15-24" data-line-number="24">      <span class="kw">return</span> <span class="kw">this</span>.<span class="fu">type</span> + <span class="st">&quot;/&quot;</span> + <span class="kw">this</span>.<span class="fu">nom</span> ;</a>
+<a class="sourceLine" id="cb15-25" data-line-number="25">    }</a>
+<a class="sourceLine" id="cb15-26" data-line-number="26">}</a></code></pre></div>
+<p>Pour cela, implémentez la classe <code>Forme</code> ci-dessus.</p>
+<p>Ajoutez une méthode dont la signature est la suivante:</p>
+<ul>
+<li><code>public static String getInformationNombreFormes()</code></li>
+</ul>
+<p>Cette méthode renvoie une chaîne de caractères de la forme suivante:</p>
+<p><code>&quot;Le nombre de formes instanciées est 3&quot;</code></p>
+<p>Où 3 est à remplacer par le compteur de formes.</p>
+<p>Ensuite, créer une classe principale <code>GenereForme</code> qui contiendra le code suivant:</p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1">Forme f ;</a>
+<a class="sourceLine" id="cb16-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb16-3" data-line-number="3">f = <span class="kw">new</span> <span class="fu">Forme</span>(<span class="st">&quot;Triangle&quot;</span>, <span class="st">&quot;Bermudes&quot;</span>);</a>
+<a class="sourceLine" id="cb16-4" data-line-number="4">f = <span class="kw">new</span> <span class="fu">Forme</span>(<span class="st">&quot;Carré&quot;</span>, <span class="st">&quot;Magique&quot;</span>);</a>
+<a class="sourceLine" id="cb16-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(f.<span class="fu">getInformationNombreFormes</span>());</a>
+<a class="sourceLine" id="cb16-6" data-line-number="6">f = <span class="kw">new</span> <span class="fu">Forme</span>(<span class="st">&quot;Rectangle&quot;</span>, <span class="st">&quot;Vert&quot;</span>);</a>
+<a class="sourceLine" id="cb16-7" data-line-number="7">f = <span class="kw">new</span> <span class="fu">Forme</span>(<span class="st">&quot;Cercle&quot;</span>, <span class="st">&quot;Bleu&quot;</span>);</a>
+<a class="sourceLine" id="cb16-8" data-line-number="8"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(f.<span class="fu">getInformationNombreFormes</span>());</a></code></pre></div>
+<p>Que dire de la variable <code>f</code> qui est ici utilisée ?</p>
+<ul>
+<li>Quelles sont ses valeurs successives ?</li>
+<li>Que deviennent les valeurs précédentes ?</li>
+</ul>
+<p>En lançant ce programme, que constatez-vous ?</p>
+<h1 id="représentation-uml-des-membres">Représentation UML des membres</h1>
+<p>Diagramme de classe</p>
+<figure>
+<img src="images/RendezVous.png" alt="Diagramme de classe: RendezVous.png" /><figcaption>Diagramme de classe: RendezVous.png</figcaption>
+</figure>
+<h1 id="import-statique">Import statique</h1>
+<p>Normalement pour utiliser un membre d’une classe, il faut l’écrire explicitement:</p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="dt">double</span> rayon = <span class="bu">Math</span>.<span class="fu">cos</span>(beta * <span class="bu">Math</span>.<span class="fu">PI</span>);</a></code></pre></div>
+<p>Les <em>static import</em> permettent d’utiliser directement depuis une autre classe des membres statiques d’une classe particulière.</p>
+<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">import static</span><span class="im"> java.lang.Math.PI;</span></a>
+<a class="sourceLine" id="cb18-2" data-line-number="2"><span class="kw">import static</span><span class="im"> java.lang.Math.cos;</span></a>
+<a class="sourceLine" id="cb18-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb18-4" data-line-number="4">...</a>
+<a class="sourceLine" id="cb18-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb18-6" data-line-number="6"><span class="dt">double</span> rayon = <span class="fu">cos</span>(beta * PI);</a></code></pre></div>
+<p><strong>ATTENTION</strong></p>
+<p>Ceci est à utiliser avec précaution et parcimonie !</p>
+<p>Il est facile de se retrouver avec des membres avec le même nom que ceux importés d’une autre classe.</p>
+<h1 id="constantes-et-le-mot-clé-final">Constantes et le mot clé ‘final’</h1>
+<p>Les constantes sont des attributs qui ne peuvent plus changer de valeur.</p>
+<p>Pour les définir on utilise le mot clé <code>final</code></p>
+<p>En fait, tout membre d’une classe ayant un attribut <code>final</code> ne pourra plus être modifié ou surchargé.</p>
+<p>Ainsi une méthode déclarée <code>final</code> ne pourra pas être surchargée par une classe qui hériterait de la classe courante.</p>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="kw">class</span> Polygone{</a>
+<a class="sourceLine" id="cb19-2" data-line-number="2">  <span class="bu">String</span> nom ;</a>
+<a class="sourceLine" id="cb19-3" data-line-number="3">  <span class="dt">final</span> <span class="dt">int</span> JE_NE_PEUX_PAS_CHANGER = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb19-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb19-5" data-line-number="5">  <span class="dt">final</span> <span class="bu">String</span> <span class="fu">getNom</span>(){</a>
+<a class="sourceLine" id="cb19-6" data-line-number="6">    <span class="kw">return</span> nom;</a>
+<a class="sourceLine" id="cb19-7" data-line-number="7">  }</a>
+<a class="sourceLine" id="cb19-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb19-9" data-line-number="9">  <span class="dt">void</span> <span class="fu">changer</span>(){</a>
+<a class="sourceLine" id="cb19-10" data-line-number="10">    JE_NE_PEUX_PAS_CHANGER = <span class="dv">1</span> ; <span class="co">//ERREUR DE COMPILATION</span></a>
+<a class="sourceLine" id="cb19-11" data-line-number="11">  }</a>
+<a class="sourceLine" id="cb19-12" data-line-number="12">}</a>
+<a class="sourceLine" id="cb19-13" data-line-number="13"><span class="kw">class</span> Triangle <span class="kw">extends</span> Polygone{</a>
+<a class="sourceLine" id="cb19-14" data-line-number="14">  <span class="bu">String</span> <span class="fu">getNom</span>(){ <span class="co">// ERREUR de COMPILATION</span></a>
+<a class="sourceLine" id="cb19-15" data-line-number="15">      <span class="kw">return</span> <span class="st">&quot;Triangle.&quot;</span>+nom;</a>
+<a class="sourceLine" id="cb19-16" data-line-number="16">  }</a>
+<a class="sourceLine" id="cb19-17" data-line-number="17">}</a></code></pre></div>
+<h3 id="représentation-uml">Représentation UML</h3>
+<figure>
+<img src="images/Constantes.png" alt="Diagramme de classe: Constantes.png" /><figcaption>Diagramme de classe: Constantes.png</figcaption>
+</figure>
+<h1 id="conventions-de-codage">Conventions de codage</h1>
+<h2 id="définition">Définition</h2>
+<p>C’est un ensemble de règles qui permettent d’écrire un code dans une manière lisible et compréhensible par un maximum de développeurs.</p>
+<p>Ces règles évoluent d’un langage à l’autre. En Java, elles sont essentielles car elles permettent, d’un seul coup d’oeil, de déterminer si on a affaire à une classe/un type, une variable/attribut/paramètre ou une constante.</p>
+<p>Elles sont là pour améliorer la compréhension des éléments du code et faire en sorte qu’il soit “auto-commenté” le plus possible. C’est à dire que l’on va utiliser des noms qui soient parlant, que ce soit pour les méthodes, attributs, variables ou classes.</p>
+<h3 id="référence-1">Référence (1)</h3>
+<p>Un lien vers les conventions de codage telles que définies aux origines du langage Java.</p>
+<p><a href="http://www.oracle.com/technetwork/java/codeconventions-150003.pdf" class="uri">http://www.oracle.com/technetwork/java/codeconventions-150003.pdf</a></p>
+<h3 id="référence-2">Référence (2)</h3>
+<p>Autre lien avec quelques exemples:</p>
+<p><a href="https://en.wikibooks.org/wiki/Java_Programming/Coding_conventions" class="uri">https://en.wikibooks.org/wiki/Java_Programming/Coding_conventions</a> pour compléter vos connaissances.</p>
+<h2 id="règles-de-nommage">Règles de nommage</h2>
+<h3 id="les-mots-réservés">Les mots réservés</h3>
+<p>Les mots qu’il est interdit d’utiliser pour nommer une attribut, une méthode, une variable, un paramètre, une classe, etc, sont donnés sur la page suivante:</p>
+<p><a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html">Java Keywords</a></p>
+<h3 id="nommer-les-éléments-du-code">Nommer les éléments du code</h3>
+<h4 id="désigner-pour-utiliser">Désigner pour utiliser</h4>
+<p>Tous les composants d’un programme Java doivent être nommés.</p>
+<h4 id="les-éléments">Les éléments</h4>
+<p>Ces noms sont donnés:</p>
+<ul>
+<li>aux classes,</li>
+<li>aux variables,</li>
+<li>aux paramètres,</li>
+<li>aux méthodes.</li>
+</ul>
+<div class="incremental">
+<p>Ces noms sont appelés des <strong>identifiants</strong>.</p>
+</div>
+<h4 id="sensibilité-à-la-casse">Sensibilité à la casse</h4>
+<p>Leur nom est sensible à la casse (différence majuscule/minuscule).</p>
+<h4 id="définir-un-identifiant">Définir un identifiant</h4>
+<p>Les règles pour définir un <strong>identifiant</strong> sont les suivantes:</p>
+<ul>
+<li>Chaque <strong>identifiant</strong> doit commencer par un premier caractère qui est:
+<ul>
+<li>soit une lettre (<code>a</code> à <code>z</code> ou <code>A</code> à <code>Z</code>),</li>
+<li>soit un <code>$</code>,</li>
+<li>soit un <em>underscore</em> <code>_</code>;</li>
+</ul></li>
+<li>Après le premier caractère, les identifiants peuvent contenir une combinaison de plusieurs autres caractères (incluant des chiffres);</li>
+<li>un mot clé (ou mot réservé) ne peut pas être utilisé comme identifiant;</li>
+</ul>
+<h5 id="identifiants-autorisés">Identifiants autorisés</h5>
+<p>Exemples d’identifiants <strong>autorisés</strong>:</p>
+<ul>
+<li><code>age</code></li>
+<li><code>$distance</code></li>
+<li><code>_valeur</code></li>
+<li><code>__1_data</code></li>
+</ul>
+<p>Exemples d’identifiants <strong>incorrects</strong>:</p>
+<ul>
+<li><code>12singes</code></li>
+<li><code>-salaire</code></li>
+</ul>
+<h5 id="notation-camelcase">Notation CamelCase</h5>
+<p>En Java on utilise la notation <em>CamelCase</em> (casse en dos de chameau).</p>
+<pre><code>notationEnDosDeChameau</code></pre>
+<p>Pour nommer un attribut, une méthode ou une classe, on l’écrit sous la forme de mots accolés, avec la première lettre du mot qui commence par une majuscule.</p>
+<p>La première lettre du premier mot est:</p>
+<ul>
+<li>minuscule pour les méthodes, attributs, variables et paramètres.</li>
+<li>majuscule pour les classes.</li>
+</ul>
+<p>Exemple:</p>
+<div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1"><span class="kw">class</span> FormeSpeciale {</a>
+<a class="sourceLine" id="cb21-2" data-line-number="2">  <span class="bu">String</span> leNomDeCetteForme ;</a>
+<a class="sourceLine" id="cb21-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb21-4" data-line-number="4">  <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> CODE_FORME = <span class="dv">3</span>;</a>
+<a class="sourceLine" id="cb21-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb21-6" data-line-number="6">  <span class="bu">String</span> <span class="fu">getLeNomDeCetteForme</span>(){</a>
+<a class="sourceLine" id="cb21-7" data-line-number="7">    <span class="kw">return</span> leNomDeCetteForme;</a>
+<a class="sourceLine" id="cb21-8" data-line-number="8">  }</a>
+<a class="sourceLine" id="cb21-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb21-10" data-line-number="10">  <span class="dt">void</span> <span class="fu">setLeNomDeCetteForme</span>(<span class="bu">String</span> nouveauNom){</a>
+<a class="sourceLine" id="cb21-11" data-line-number="11">    leNomDeCetteForme = nouveauNom;</a>
+<a class="sourceLine" id="cb21-12" data-line-number="12">  }</a>
+<a class="sourceLine" id="cb21-13" data-line-number="13">}</a></code></pre></div>
+<h3 id="pour-les-constantes">Pour les constantes</h3>
+<p>Pour les constantes on utilise une règle différente: majuscules avec des mots séparés par des tirets-bas (underscore).</p>
+<div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="dt">final</span> <span class="bu">String</span> MA_CONSTANTE = <span class="st">&quot;Je ne changerai jamais !&quot;</span> ;</a></code></pre></div>
+<h1 id="contrôle-des-accès">Contrôle des accès</h1>
+<p>Les classes, attributs ou méthodes peuvent être accessibles (on dit aussi visibles) ou non à l’intérieur d’autres classes, qu’elles soient du même package ou pas.</p>
+<p>Pour indiquer les degrés d’accessibilités on utilise des modificateurs d’accessibilité (<em>access modifiers</em>).</p>
+<h2 id="les-access-modifiers">Les access modifiers</h2>
+<p>On utilise pour cela ces trois mots clés:</p>
+<ul>
+<li><code>private</code></li>
+<li><code>protected</code></li>
+<li><code>public</code></li>
+</ul>
+<table>
+<colgroup>
+<col style="width: 33%" />
+<col style="width: 33%" />
+<col style="width: 33%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Modificateur</th>
+<th>Applicable à</th>
+<th>Signification</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td><code>public</code></td>
+<td>classe</td>
+<td>est visible partout</td>
+</tr>
+<tr class="even">
+<td><code>public</code></td>
+<td>membre (méthode ou attribut)</td>
+<td>visible partout où sa classe est visible</td>
+</tr>
+<tr class="odd">
+<td><em>par défaut (sans modificateur)</em></td>
+<td>classe ou membre</td>
+<td>seulement à l’intérieur de son package</td>
+</tr>
+<tr class="even">
+<td><code>protected</code></td>
+<td>méthode ou attribut</td>
+<td>à l’intérieur du package ou par les classes dérivées</td>
+</tr>
+<tr class="odd">
+<td><code>private</code></td>
+<td>classe</td>
+<td>uniquement à l’intérieur de la classe où elle est déclarée</td>
+</tr>
+<tr class="even">
+<td><code>private</code></td>
+<td>méthode ou attribut</td>
+<td>uniquement à l’intérieur de la classe</td>
+</tr>
+</tbody>
+</table>
+<h2 id="représentation-uml-1">Représentation UML</h2>
+<figure>
+<img src="images/Access-Modifiers-reference.png" alt="Diagramme de classe: Modificateurs d’accès" /><figcaption>Diagramme de classe: Modificateurs d’accès</figcaption>
+</figure>
+<h2 id="application-1">Application 1</h2>
+<p>Nous allons créer les classes suivantes dans le paquet <code>com.example.java.voyage</code>.</p>
+<p>Des erreurs vont apparaître dans le code.</p>
+<p>Commentez en indiquant pour chaque ligne:</p>
+<ul>
+<li>Si le membre est accessible</li>
+<li>Si une erreur de compilation se produit</li>
+</ul>
+<p>Corrigez l’erreur en :</p>
+<ul>
+<li>commentant la ligne si le membre ne peut pas être accédé (ajouter le pourquoi en commentaire)</li>
+<li>remplaçant le membre par un accesseur si celui-ci est disponible</li>
+</ul>
+<p>Note:</p>
+<p>Un accesseur est une méthode permettant d’accéder ou de modifier la valeur d’un attribut</p>
+<p>Vous pouvez expérimenter dans votre IDE.</p>
+<p>Le code source des fichiers ci-dessous est <a href="data/Application1-ModificateursAcces.zip">téléchargeable ici</a>.</p>
+<p>Dans le fichier <code>Trousse.java</code>:</p>
+<div class="sourceCode" id="cb23"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span></a>
+<a class="sourceLine" id="cb23-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb23-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Trousse {   <span class="co">/* La classe est visible partout */</span></a>
+<a class="sourceLine" id="cb23-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb23-5" data-line-number="5">    <span class="kw">public</span> <span class="bu">String</span> publique ; <span class="co">/* Est visible partout où sa classe est visible*/</span></a>
+<a class="sourceLine" id="cb23-6" data-line-number="6">    <span class="kw">protected</span> <span class="dt">int</span> protege ;</a>
+<a class="sourceLine" id="cb23-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb23-8" data-line-number="8">    <span class="dt">int</span> defaut;</a>
+<a class="sourceLine" id="cb23-9" data-line-number="9">    <span class="kw">private</span> <span class="dt">int</span> prive;</a>
+<a class="sourceLine" id="cb23-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb23-11" data-line-number="11">    <span class="fu">Trousse</span>(<span class="bu">String</span> valPub, <span class="dt">int</span> valProt, <span class="dt">int</span> valDef, <span class="dt">int</span> valPriv){</a>
+<a class="sourceLine" id="cb23-12" data-line-number="12">        publique = valPub;</a>
+<a class="sourceLine" id="cb23-13" data-line-number="13">        protege = valProt;</a>
+<a class="sourceLine" id="cb23-14" data-line-number="14">        defaut = valDef;</a>
+<a class="sourceLine" id="cb23-15" data-line-number="15">        prive = valPriv;</a>
+<a class="sourceLine" id="cb23-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb23-17" data-line-number="17">    <span class="fu">Trousse</span>(){</a>
+<a class="sourceLine" id="cb23-18" data-line-number="18">        <span class="co">/* ... */</span></a>
+<a class="sourceLine" id="cb23-19" data-line-number="19">    }</a>
+<a class="sourceLine" id="cb23-20" data-line-number="20"></a>
+<a class="sourceLine" id="cb23-21" data-line-number="21">    <span class="co">/**</span> Accesseur public <span class="co">*/</span></a>
+<a class="sourceLine" id="cb23-22" data-line-number="22">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getProtege</span>(){</a>
+<a class="sourceLine" id="cb23-23" data-line-number="23">        <span class="kw">return</span> protege;</a>
+<a class="sourceLine" id="cb23-24" data-line-number="24">    }</a>
+<a class="sourceLine" id="cb23-25" data-line-number="25">    <span class="co">/**</span> Accesseur public <span class="co">*/</span></a>
+<a class="sourceLine" id="cb23-26" data-line-number="26">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getPrive</span>(){</a>
+<a class="sourceLine" id="cb23-27" data-line-number="27">        <span class="kw">return</span> prive;</a>
+<a class="sourceLine" id="cb23-28" data-line-number="28">    }</a>
+<a class="sourceLine" id="cb23-29" data-line-number="29">}</a></code></pre></div>
+<p>Dans le fichier <code>SacDeVoyage.java</code> :</p>
+<div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span> <span class="co">//Meme paquet que Trousse</span></a>
+<a class="sourceLine" id="cb24-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb24-3" data-line-number="3"><span class="kw">class</span> SacDeVoyage {</a>
+<a class="sourceLine" id="cb24-4" data-line-number="4">    Trousse trousse = <span class="kw">new</span> <span class="fu">Trousse</span>();</a>
+<a class="sourceLine" id="cb24-5" data-line-number="5">    <span class="dt">int</span> entier;</a>
+<a class="sourceLine" id="cb24-6" data-line-number="6">    <span class="bu">String</span> chaine;</a>
+<a class="sourceLine" id="cb24-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb24-8" data-line-number="8">    <span class="fu">SacDeVoyage</span>(){</a>
+<a class="sourceLine" id="cb24-9" data-line-number="9">        chaine = trousse.<span class="fu">publique</span>;</a>
+<a class="sourceLine" id="cb24-10" data-line-number="10">        entier = trousse.<span class="fu">protege</span>;</a>
+<a class="sourceLine" id="cb24-11" data-line-number="11">        entier = trousse.<span class="fu">getProtege</span>();</a>
+<a class="sourceLine" id="cb24-12" data-line-number="12">        entier = trousse.<span class="fu">defaut</span>;</a>
+<a class="sourceLine" id="cb24-13" data-line-number="13">        entier = trousse.<span class="fu">prive</span> ;</a>
+<a class="sourceLine" id="cb24-14" data-line-number="14">        entier = trousse.<span class="fu">getPrive</span>();</a>
+<a class="sourceLine" id="cb24-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb24-16" data-line-number="16">}</a></code></pre></div>
+<p>Dans le fichier <code>TrousseDeToilette.java</code> :</p>
+<div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span></a>
+<a class="sourceLine" id="cb25-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb25-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> TrousseDeToilette <span class="kw">extends</span> Trousse {</a>
+<a class="sourceLine" id="cb25-4" data-line-number="4">    <span class="dt">int</span> autreEntier ;</a>
+<a class="sourceLine" id="cb25-5" data-line-number="5">    <span class="bu">String</span> autreChaine ;</a>
+<a class="sourceLine" id="cb25-6" data-line-number="6">    <span class="kw">public</span> <span class="fu">TrousseDeToilette</span>() {</a>
+<a class="sourceLine" id="cb25-7" data-line-number="7">        autreChaine = publique;</a>
+<a class="sourceLine" id="cb25-8" data-line-number="8">        autreEntier = protege ;</a>
+<a class="sourceLine" id="cb25-9" data-line-number="9">        autreEntier = defaut;</a>
+<a class="sourceLine" id="cb25-10" data-line-number="10">        autreEntier = prive ;</a>
+<a class="sourceLine" id="cb25-11" data-line-number="11">        autreEntier = <span class="fu">getPrive</span>();</a>
+<a class="sourceLine" id="cb25-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb25-13" data-line-number="13">}</a></code></pre></div>
+<p>Nous allons créer la classe suivante dans le paquet <code>com.example.java.transport</code>.</p>
+<div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.transport;</span> <span class="co">//Un autre paquet</span></a>
+<a class="sourceLine" id="cb26-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb26-3" data-line-number="3"><span class="kw">import</span><span class="im"> com.example.java.voyage.Trousse;</span> <span class="co">//import de Trousse</span></a>
+<a class="sourceLine" id="cb26-4" data-line-number="4"><span class="kw">class</span> Voiture {</a>
+<a class="sourceLine" id="cb26-5" data-line-number="5">    Trousse trousse = <span class="kw">new</span> <span class="fu">Trousse</span>();</a>
+<a class="sourceLine" id="cb26-6" data-line-number="6">    <span class="dt">int</span> entier;</a>
+<a class="sourceLine" id="cb26-7" data-line-number="7">    <span class="bu">String</span> chaine;</a>
+<a class="sourceLine" id="cb26-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb26-9" data-line-number="9">    <span class="fu">Voiture</span>(){</a>
+<a class="sourceLine" id="cb26-10" data-line-number="10">        chaine = trousse.<span class="fu">publique</span>;</a>
+<a class="sourceLine" id="cb26-11" data-line-number="11">        entier = trousse.<span class="fu">protege</span>;</a>
+<a class="sourceLine" id="cb26-12" data-line-number="12">        entier = trousse.<span class="fu">getProtege</span>();</a>
+<a class="sourceLine" id="cb26-13" data-line-number="13">        entier = trousse.<span class="fu">defaut</span>;</a>
+<a class="sourceLine" id="cb26-14" data-line-number="14">        entier = trousse.<span class="fu">prive</span> ;</a>
+<a class="sourceLine" id="cb26-15" data-line-number="15">        entier = trousse.<span class="fu">getPrive</span>();</a>
+<a class="sourceLine" id="cb26-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb26-17" data-line-number="17">}</a></code></pre></div>
+<p>Puis la classe <code>TroussePremierSecours</code> :</p>
+<div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.transport;</span></a>
+<a class="sourceLine" id="cb27-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb27-3" data-line-number="3"><span class="kw">import</span><span class="im"> com.example.java.voyage.Trousse;</span></a>
+<a class="sourceLine" id="cb27-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb27-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> TroussePremierSecours <span class="kw">extends</span> Trousse {</a>
+<a class="sourceLine" id="cb27-6" data-line-number="6">    <span class="fu">TroussePremierSecours</span>(){</a>
+<a class="sourceLine" id="cb27-7" data-line-number="7">        <span class="bu">String</span> chaine = publique;</a>
+<a class="sourceLine" id="cb27-8" data-line-number="8">        <span class="dt">int</span> entier = protege;</a>
+<a class="sourceLine" id="cb27-9" data-line-number="9">        entier = <span class="fu">getProtege</span>();</a>
+<a class="sourceLine" id="cb27-10" data-line-number="10">        entier = defaut;</a>
+<a class="sourceLine" id="cb27-11" data-line-number="11">        entier = prive ;</a>
+<a class="sourceLine" id="cb27-12" data-line-number="12">        entier = <span class="fu">getPrive</span>();</a>
+<a class="sourceLine" id="cb27-13" data-line-number="13">    }</a>
+<a class="sourceLine" id="cb27-14" data-line-number="14">}</a></code></pre></div>
+<p>Corrigez toutes les erreurs (et expliquez en commentaire ce <strong>que vous avez fait</strong> et <strong>pourquoi</strong>) :</p>
+<ul>
+<li>en ajoutant des accesseurs</li>
+<li>ou en commentant les lignes contenant une erreur impossible à corriger.</li>
+</ul>
+<p>Dessinez la représentation UML des classes ainsi corrigées</p>
+<h2 id="le-mot-clé-this">Le mot clé this</h2>
+<p>Ce mot clé est très utile dans le cadre des <code>setters</code>.</p>
+<p>En effet, dans la méthode <code>setData(String data)</code> suivante, comment accéder à l’attribut de l’objet <code>data</code> sachant que celui-ci est <em>masqué</em> par l’identifiant du paramètre <code>data</code> ?</p>
+<div class="sourceCode" id="cb28"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb28-1" data-line-number="1"><span class="kw">class</span> Information{</a>
+<a class="sourceLine" id="cb28-2" data-line-number="2">  <span class="kw">private</span> <span class="bu">String</span> data ; <span class="co">//attribut</span></a>
+<a class="sourceLine" id="cb28-3" data-line-number="3">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setData</span>(<span class="bu">String</span> data){ <span class="co">//data est un paramètre</span></a>
+<a class="sourceLine" id="cb28-4" data-line-number="4">    data = data ; <span class="co">// !!!</span></a>
+<a class="sourceLine" id="cb28-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb28-6" data-line-number="6">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">getData</span>(){</a>
+<a class="sourceLine" id="cb28-7" data-line-number="7">    <span class="kw">return</span> data ; <span class="co">// on renvoie la valeur de l attribut data</span></a>
+<a class="sourceLine" id="cb28-8" data-line-number="8">  }</a>
+<a class="sourceLine" id="cb28-9" data-line-number="9">}</a></code></pre></div>
+<p>L’appel à <code>data</code> correspond ici uniquement au paramètre nommé <code>data</code>.</p>
+<p>Pour accéder à l’attribut, on le fait précéder du mot clé <code>this</code>.</p>
+<div class="sourceCode" id="cb29"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb29-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">setData</span>(<span class="bu">String</span> data){ <span class="co">//data est un paramètre</span></a>
+<a class="sourceLine" id="cb29-2" data-line-number="2">  <span class="kw">this</span>.<span class="fu">data</span> = data ; <span class="co">// !!!</span></a>
+<a class="sourceLine" id="cb29-3" data-line-number="3">}</a></code></pre></div>
+<p><code>this</code> pointe vers l’instance de l’objet sur lequel s’applique la méthode.</p>
+<p>Même si <code>data</code> est privé, on a le droit d’y accéder ici, puisqu’on le fait depuis l’intérieur de la classe.</p>
+<h3 id="application-2">Application 2</h3>
+<p>Reprendre la classe <code>Personne</code> et rendre tous ses attributs inaccessibles depuis l’extérieur.</p>
+<p>Créer une classe principale qui instancie une <code>Personne</code></p>
+<p>Mettre des <em>getters</em> pour tous les attributs de <code>Personne</code>.</p>
+<p>Mettre des <em>setters</em> pour tous les attributs sauf <code>nom</code>, <code>prenom</code> et <code>dateNaissance</code>.</p>
+<p>Ces trois attributs devront être positionnés/modifiés via un autre moyen que les accesseurs. Lequel ?</p>
+<p>Est-ce logique de faire ainsi ?</p>
+<h1 id="transtypage">Transtypage</h1>
+<h2 id="un-entier-nest-pas-un-double">Un entier n’est pas un double</h2>
+<p>Il est parfois nécessaire de convertir un type en un autre. Par exemple, on peut souhaiter transformer un entier en double.</p>
+<div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"><span class="dt">int</span> entier = <span class="dv">4</span> ;</a>
+<a class="sourceLine" id="cb30-2" data-line-number="2"><span class="dt">double</span> doublePrecision = <span class="fl">0.0</span>;</a>
+<a class="sourceLine" id="cb30-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb30-4" data-line-number="4">doublePrecision = entier ; <span class="co">//Erreur de compilation</span></a></code></pre></div>
+<h2 id="un-entier-peut-devenir-un-double">Un entier peut devenir un double</h2>
+<p>Le compilateur ne laisse pas passer ce genre d’erreur. Pour remédier à cela, on utilise le <code>transtypage</code> (on utilise aussi le mot <code>cast</code>):</p>
+<div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="dt">int</span> entier = <span class="dv">4</span> ;</a>
+<a class="sourceLine" id="cb31-2" data-line-number="2"><span class="dt">double</span> doublePrecision = <span class="fl">0.0</span>;</a>
+<a class="sourceLine" id="cb31-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb31-4" data-line-number="4">doublePrecision = (<span class="dt">double</span>) entier ;</a></code></pre></div>
+<h2 id="dune-classe-à-une-autre">D’une classe à une autre</h2>
+<p>Il est possible de faire cela avec des objets:</p>
+<div class="sourceCode" id="cb32"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb32-1" data-line-number="1">Calcul calcul = <span class="kw">new</span> <span class="fu">Addition</span>();</a>
+<a class="sourceLine" id="cb32-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb32-3" data-line-number="3">Addition addition = (Addition) calcul;</a>
+<a class="sourceLine" id="cb32-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb32-5" data-line-number="5">addition.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">4</span>);</a></code></pre></div>
+<h2 id="code-source-pour-les-calculs">Code source pour les calculs</h2>
+<p>Pour vérifier, vous pouvez utiliser <a href="data/ch2-Calculs.zip">ce code source</a> (une solution possible du chapitre 2).</p>
+<h1 id="encapsulation">Encapsulation</h1>
+<p>L’intérêt des modificateurs d’accès est de permettre de contrôler l’accès aux membres de la classe depuis d’autres classes (ou leurs instances, les objets).</p>
+<p>En effet, lorsqu’on exécute un programme, il n’est pas souhaitable que des objets viennent modifier le comportement interne d’un autre objet. Cela pourrait engendrer des comportements indésirables.</p>
+<p>On souhaite donc isoler certains membres d’un objet de l’extérieur afin qu’il soit inaccessibles.</p>
+<p>On appelle ceci l’<strong>encapsulation</strong>. C’est un des concepts <strong>fondamentaux</strong> de la POO.</p>
+<h2 id="encapsulation-des-calculs">Encapsulation des calculs</h2>
+<p>Reprenons les classes développées pour les calculs arithmétiques.</p>
+<p>La classe <code>Calcul</code> contient un résultat. Comment isoler ce résultat de l’extérieur pour qu’il ne soit pas modifiable ?</p>
+<p>Comment le rendre accessible pour que l’on puisse en connaître la valeur ?</p>
+<p>Une solution : on encapsule l’attribut <code>resultat</code> et on lui ajoute des <strong>accesseurs</strong>.</p>
+<p>Les accesseurs sont aussi appelés:</p>
+<ul>
+<li><code>getter</code>
+<ul>
+<li>commence en général par la chaîne <code>get</code></li>
+<li>permet de récupérer la valeur de l’attribut</li>
+</ul></li>
+<li><code>setter</code>
+<ul>
+<li>commence en général par la chaîne <code>set</code></li>
+<li>permet d’affecter/modifier une valeur</li>
+</ul></li>
+</ul>
+<p>Utilisez le code suivant et essayez de compiler votre programme:</p>
+<div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> Calcul {</a>
+<a class="sourceLine" id="cb33-2" data-line-number="2">    <span class="kw">private</span> <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb33-3" data-line-number="3">    <span class="kw">public</span> <span class="kw">abstract</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b);</a>
+<a class="sourceLine" id="cb33-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb33-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getResultat</span>() {</a>
+<a class="sourceLine" id="cb33-6" data-line-number="6">        <span class="kw">return</span> resultat;</a>
+<a class="sourceLine" id="cb33-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb33-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setResultat</span>(<span class="dt">int</span> r) {</a>
+<a class="sourceLine" id="cb33-9" data-line-number="9">        resultat = r;</a>
+<a class="sourceLine" id="cb33-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb33-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb33-12" data-line-number="12">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>() {</a>
+<a class="sourceLine" id="cb33-13" data-line-number="13">        <span class="kw">return</span> <span class="st">&quot;Le résultat de l&#39;opération &quot;</span>+<span class="fu">getClass</span>().<span class="fu">getSimpleName</span>()+<span class="st">&quot;&quot;</span>;</a>
+<a class="sourceLine" id="cb33-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb33-15" data-line-number="15">}</a></code></pre></div>
+<p>On constate que certaines classes contiennent des erreurs de compilation.</p>
+<h4 id="setter">Setter</h4>
+<p>Ainsi, la ligne suivante pose problème :</p>
+<div class="sourceCode" id="cb34"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb34-1" data-line-number="1">resultat = a * b;</a></code></pre></div>
+<p>Utilisons l’accesseur commençant par <code>set</code> (on l’appelle aussi <strong>setter</strong>) :</p>
+<div class="sourceCode" id="cb35"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb35-1" data-line-number="1"><span class="fu">setResultat</span>(a * b);</a></code></pre></div>
+<h4 id="getter">Getter</h4>
+<p>Idem pour la ligne suivante:</p>
+<div class="sourceCode" id="cb36"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb36-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">resultat</span>);</a></code></pre></div>
+<p>Utilisons l’accesseur commençant par <code>get</code> (on l’appelle aussi <strong>getter</strong>) :</p>
+<div class="sourceCode" id="cb37"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb37-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">getResultat</span>());</a></code></pre></div>
+<h4 id="attribut-privé-attribut-protégé">Attribut privé, attribut protégé ?</h4>
+<p>L’attribut <code>resultat</code> est désormais inaccessible depuis toute classe qui n’est pas <code>Calcul</code>.</p>
+<p>Il est donc protégé de toute modification extérieure. La classe contrôle ce qui peut être définit sur cet attribut.</p>
+<p>Pourtant, si on observe attentivement, on constate que n’importe quelle classe peut appeler la méthode <code>setResultat()</code>.</p>
+<p>Est-ce souhaitable ?</p>
+<p>Quel modificateur d’accès utiliser pour remédier à cela parmi ceux vus précédemments ?</p>
+<p>Sur quel membre le placer ?</p>
+<h4 id="suppression-du-setter">Suppression du setter</h4>
+<p>On souhaite se débarrasser du <em>setter</em> : en effet, il n’est pas souhaitable que le résultat soit modifiable de l’extérieur.</p>
+<p>Ainsi dans la classe <code>Addition</code> (par exemple), on veut que le code suivant fonctionne:</p>
+<div class="sourceCode" id="cb38"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb38-1" data-line-number="1">resultat = a + b;</a></code></pre></div>
+<p>Pour cela, on va modifier la classe <code>Calcul</code> comme suit:</p>
+<div class="sourceCode" id="cb39"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb39-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb39-2" data-line-number="2">  valeurA = a;</a>
+<a class="sourceLine" id="cb39-3" data-line-number="3">  valeurB = b;</a>
+<a class="sourceLine" id="cb39-4" data-line-number="4">  resultat = <span class="fu">effectuerCalcul</span>();</a>
+<a class="sourceLine" id="cb39-5" data-line-number="5">}</a></code></pre></div>
+<p>Une nouvelle méthode <code>effectuerCalcul()</code> est ici utilisée.</p>
+<p>C’est elle qui va concrètement effectuer le calcul.</p>
+<ol type="1">
+<li>Comment déclarer cette méthode dans la classe <code>Calcul</code> ?</li>
+<li>Comment la déclarer dans ses sous-classes ?</li>
+</ol>
+<h4 id="code-source-solution-possible">Code source (solution possible)</h4>
+<p><a href="data/Encapsulation-Calculs.zip">Code source</a></p>
+<h4 id="uml">UML</h4>
+<p>Dessinez la représentation UML de <code>Calcul</code> et de ses sous-classes.</p>
+<h1 id="exercices">Exercices</h1>
+<h2 id="point">Point</h2>
+<p>Voici un diagramme de classe :</p>
+<figure>
+<img src="images/Point.png" alt="Diagramme de classe: Point.png" /><figcaption>Diagramme de classe: Point.png</figcaption>
+</figure>
+<h4 id="exercice-1-définition-de-la-classe-point">Exercice 1: définition de la classe Point</h4>
+<p>Dans ce qui suit, pour réaliser des calculs de distance, vous pouvez utiliser la classe <code>Math</code> (en utilisant éventuellement les <code>static import</code>).</p>
+<ol type="1">
+<li>Ecrire la classe <code>Point</code> qui décrit un point dans un repère en 2 dimensions avec des coordonnées entières (abscisse et ordonnée) et un nom (non modifiable).</li>
+</ol>
+<p>Les informations du point doivent être encapsulées et en lecture seule (<code>getter</code> uniquement). On autorise ainsi la modification des coordonnées du point uniquement par le biais de la méthode <code>translater</code>.</p>
+<ol start="2" type="1">
+<li>Ajouter un constructeur complet qui prend en paramètres le nom et les coordonnées du point.</li>
+<li>Vérifier que vous ne pouvez pas modifier l’attribut <code>nom</code> en dehors du constructeur. Pour pouvoir le modifier, rajouter un <code>setter</code> sur cet attribut et compiler la classe <code>Point</code>.</li>
+<li>Implémenter le code des deux méthodes de la classe <code>Point</code>:</li>
+</ol>
+<ul>
+<li><code>distance(...)</code> : renvoie la distance de l’instance courante à celle d’un autre point passé en paramètre,</li>
+<li><code>translater(...)</code> : translate l’instance courante d’un vecteur de déplacement passé en paramètre.</li>
+</ul>
+<ol start="5" type="1">
+<li>Ajouter une méthode <code>String toString()</code> permettant de représenter l’instance de <code>Point</code> par une chaîne de caractères de la forme <code>nom(abscisse, ordonnee)</code>.</li>
+</ol>
+<h4 id="exercice-2-utilisation-de-la-classe-point">Exercice 2: utilisation de la classe Point</h4>
+<ol type="1">
+<li>Créer une classe <code>ApplicationPoint</code> pour tester votre classe <code>Point</code> : le programme crée un point A de coordonnées (3, 5) et l’affiche sur la console.</li>
+<li>Translater le point A d’un vecteur (4, -3) et l’afficher à nouveau.</li>
+<li>Créer un deuxième point B de coordonnées (3, 5), calculer sa distance avec le point A et l’afficher.</li>
+</ol>
+<p>Prenez le soin de vérifier les valeurs données par le programme.</p>
+</body>
+</html>

+ 885 - 0
04-StructuresDeControles.html

@@ -0,0 +1,885 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Structures de contrôles</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Structures de contrôles</div>
+<nav id="TOC">
+<ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#environnement-détude">Environnement d’étude</a><ul>
+<li><a href="#création-et-configuration-du-projet">Création et configuration du projet</a></li>
+<li><a href="#création-du-paquet">Création du paquet</a></li>
+<li><a href="#remarque-importante">Remarque importante</a></li>
+<li><a href="#organisation-des-tests-unitaires">Organisation des tests unitaires</a></li>
+<li><a href="#classe-abstraite-controle">Classe abstraite Controle</a><ul>
+<li><a href="#sous-classe-de-contrôle">Sous-classe de contrôle</a></li>
+<li><a href="#comparaison-valeur-renvoyée-attendue">Comparaison valeur renvoyée / attendue</a></li>
+<li><a href="#assertion">Assertion</a></li>
+<li><a href="#initialisation-du-test">Initialisation du test</a></li>
+</ul></li>
+<li><a href="#code-source-des-tests">Code source des tests</a></li>
+</ul></li>
+<li><a href="#structures-de-contrôles">Structures de contrôles</a><ul>
+<li><a href="#branchement">Branchement</a><ul>
+<li><a href="#if">if</a></li>
+<li><a href="#if-else">if-else</a></li>
+<li><a href="#switch-case">switch-case</a></li>
+<li><a href="#opérateur-ternaire">Opérateur ternaire</a></li>
+</ul></li>
+<li><a href="#boucles">Boucles</a><ul>
+<li><a href="#for">for</a></li>
+<li><a href="#while-do-while">while / do-while</a></li>
+</ul></li>
+<li><a href="#contrôle-des-boucles">Contrôle des boucles</a><ul>
+<li><a href="#break">break</a></li>
+<li><a href="#continue">continue</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#enum">Enum</a><ul>
+<li><a href="#pourquoi-les-enum">Pourquoi les Enum</a><ul>
+<li><a href="#les-constantes-avant-les-enum">Les constantes (avant les Enum)</a></li>
+<li><a href="#définition-des-enum">Définition des Enum</a></li>
+<li><a href="#enum-exemple-de-déclaration">Enum: exemple de déclaration</a></li>
+<li><a href="#méthodes-statiques-dans-les-enum">Méthodes statiques dans les Enum</a></li>
+</ul></li>
+<li><a href="#enum-comme-des-instances">Enum comme des instances</a></li>
+<li><a href="#application-nombre-de-jours-dans-le-mois">Application : nombre de jours dans le mois</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#gestion-dune-liste-dentiers">Gestion d’une liste d’entiers</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="introduction">Introduction</h1>
+<p>Cette section vous propose de réaliser différents programmes pour aborder les structures de contrôles.</p>
+<p>Les concepts abordés ici sont:</p>
+<ul>
+<li><code>if/else</code></li>
+<li><code>switch/case</code></li>
+<li>boucles</li>
+<li>Enum</li>
+</ul>
+<p>Nous allons également utiliser les tests unitaires pour tester nos programmes en utilisant la librairie <strong>JUnit4</strong>.</p>
+<h1 id="environnement-détude">Environnement d’étude</h1>
+<p>Pour étudier les structures de contrôles, nous allons utiliser un framework de tests unitaires : JUnit version 4</p>
+<div class="information">
+<p>Le fonctionnement de ce framework n’est pas expliqué ici. Vous devrez suivre les modèles donnés et les adapter aux demandes faites dans ce document.</p>
+</div>
+<h2 id="création-et-configuration-du-projet">Création et configuration du projet</h2>
+<p>Créez un projet nommé <code>Controle</code>.</p>
+<p>Allez dans les propriétés du projet.</p>
+<p>Allez dans <code>Java Build Path &gt; Libraries &gt; Add Library...</code></p>
+<p>Dans la fenêtre <code>Add library</code> sélectionnez <code>JUnit</code> puis cliquez sur <code>Next</code></p>
+<p>Choisissez la version de la librairie <code>JUnit 4</code>.</p>
+<p>Cliquez sur <code>Finish</code> puis <code>OK</code></p>
+<p>Cliquez bouton droit sur le projet et sélectionnez <code>New &gt; Source Folder</code> :</p>
+<ul>
+<li>Entrez la valeur <code>test</code> dans le champ <code>Folder name</code></li>
+<li>Cliquez sur <code>Finish</code></li>
+</ul>
+<h2 id="création-du-paquet">Création du paquet</h2>
+<p>Dans chacun des répertoires sources (<code>src</code> et <code>test</code>) ajoutez un package nommé <code>com.example.controles</code></p>
+<h2 id="remarque-importante">Remarque importante</h2>
+<p>Pour <strong>tout</strong> le code qui suit, le paquet à utiliser sera <code>com.example.controles</code>.</p>
+<div class="incremental">
+<p>Deux répertoires contiendront les sources:</p>
+<ul>
+<li><code>src</code> (pour le code à tester)</li>
+<li><code>test</code> (pour les tests)</li>
+</ul>
+<div class="information">
+<p>L’<strong>indication sur le répertoire</strong> (<code>src</code> ou <code>test</code>) indique que la classe sera créée dans le paquet <code>com.example.controles</code> du répertoire correspondant.</p>
+</div>
+</div>
+<h2 id="organisation-des-tests-unitaires">Organisation des tests unitaires</h2>
+<p>Pour une classe à tester, on crée la classe de test correspondante:</p>
+<ul>
+<li><code>ControleIf</code> sera testé dans <code>TestControleIf</code></li>
+<li><code>ControleIfElse</code> sera testé dans <code>TestControleIfElse</code></li>
+</ul>
+<div class="warning">
+<p>Emplacement des fichiers</p>
+<ul>
+<li>Dans le répertoire <code>src</code>
+<ul>
+<li><code>ControleIf</code></li>
+<li><code>ControleIfElse</code></li>
+<li>Toutes les classes dont le nom commence par <code>Controle</code></li>
+</ul></li>
+<li>Dans le répertoire <code>test</code>
+<ul>
+<li><code>TestControleIf</code></li>
+<li><code>TestControleIfElse</code></li>
+<li>Toutes les classes dont le nom commence par <code>TestControle</code></li>
+</ul></li>
+</ul>
+</div>
+<h2 id="classe-abstraite-controle">Classe abstraite Controle</h2>
+<p>Nous allons nous doter d’une classe abstraite qui sera facilement réutilisable pour tester notre code.</p>
+<p>Créez la classe abstraite <code>Controle</code> dans le répertoire <code>src</code> en utilisant le code source suivant:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> Controle {</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4">    <span class="kw">public</span> <span class="kw">abstract</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args);</a>
+<a class="sourceLine" id="cb1-5" data-line-number="5">}</a></code></pre></div>
+<h3 id="sous-classe-de-contrôle">Sous-classe de contrôle</h3>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ControleIf <span class="kw">extends</span> Controle {</a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">    <span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb2-5" data-line-number="5">        <span class="bu">Object</span> returnedValue = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb2-6" data-line-number="6">        <span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb2-7" data-line-number="7">            returnedValue = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb2-8" data-line-number="8">        <span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">1</span>)</a>
+<a class="sourceLine" id="cb2-9" data-line-number="9">            returnedValue = args[<span class="dv">0</span>];</a>
+<a class="sourceLine" id="cb2-10" data-line-number="10">        <span class="kw">if</span>(args.<span class="fu">length</span> == <span class="dv">2</span>)</a>
+<a class="sourceLine" id="cb2-11" data-line-number="11">            returnedValue = args[<span class="dv">1</span>];</a>
+<a class="sourceLine" id="cb2-12" data-line-number="12">        <span class="kw">if</span>(args.<span class="fu">length</span> &gt;= <span class="dv">3</span>)</a>
+<a class="sourceLine" id="cb2-13" data-line-number="13">            returnedValue = args[<span class="dv">2</span>];</a>
+<a class="sourceLine" id="cb2-14" data-line-number="14">        <span class="kw">return</span> returnedValue;</a>
+<a class="sourceLine" id="cb2-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb2-16" data-line-number="16">}</a></code></pre></div>
+<h3 id="comparaison-valeur-renvoyée-attendue">Comparaison valeur renvoyée / attendue</h3>
+<p>Pour tester, on utilise une assertion. La méthode <code>assertEquals</code> permet de tester l’égalité de deux valeurs :</p>
+<ul>
+<li>une valeur de référence (la valeur que l’on s’attend à obtenir);</li>
+<li>une valeur renvoyée par une méthode (la valeur que l’on teste).</li>
+</ul>
+<p>On n’écrit en général qu’une seule assertion par test (même s’il est possible d’en écrire plusieurs):</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="at">@Test</span></a>
+<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleIfUneChaine</span>(){</a>
+<a class="sourceLine" id="cb3-3" data-line-number="3">  <span class="fu">assertEquals</span>(<span class="st">&quot;Test une seule chaîne&quot;</span>,</a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">      <span class="st">&quot;Un&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>}));</a>
+<a class="sourceLine" id="cb3-5" data-line-number="5">}</a></code></pre></div>
+<div class="incremental">
+<p>Toujours mettre <code>@Test</code> avant la méthode de test</p>
+</div>
+<div class="incremental">
+<p>Utilisation d’assertion</p>
+</div>
+<h3 id="assertion">Assertion</h3>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="fu">assertEquals</span>(<span class="st">&quot;Désignation du test&quot;</span>,</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2">    <span class="st">&quot;Valeur attendue (String)&quot;</span>, instance.<span class="fu">renvoieValeurString</span>());</a></code></pre></div>
+<div class="incremental">
+<p>Pour nos travaux, uniquement une méthode qui renvoie un <code>String</code></p>
+</div>
+<h3 id="initialisation-du-test">Initialisation du test</h3>
+<p>Création de l’objet <code>controle</code></p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> TestControleIf {</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2">  <span class="kw">protected</span> Controle controle ;</a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">  <span class="at">@Before</span></a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">initControles</span>(){</a>
+<a class="sourceLine" id="cb5-5" data-line-number="5">    controle = <span class="kw">new</span> <span class="fu">ControleIf</span>();</a>
+<a class="sourceLine" id="cb5-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb5-7" data-line-number="7">  <span class="co">//...</span></a>
+<a class="sourceLine" id="cb5-8" data-line-number="8">}</a></code></pre></div>
+<div class="incremental">
+<p><code>@Before</code> désigne la méthode pour initialiser</p>
+</div>
+<div class="incremental">
+<p>Méthode appelée avant chaque méthode de test (marquée par <code>@Test</code>)</p>
+<p>Ceci permet de trouver plus facilement quelle assertion n’a pas été respectée.</p>
+<p>Il existe d’autres méthodes que <code>assertEquals</code>. Voir la Javadoc de JUnit 4 qui est disponible <a href="http://junit.org/junit4/javadoc/latest/index.html">sur cette page</a>.</p>
+</div>
+<h2 id="code-source-des-tests">Code source des tests</h2>
+<p>Le code source des tests est déjà écrit et est disponible <a href="data/ch4-Controles-test.zip">ici</a></p>
+<h1 id="structures-de-contrôles">Structures de contrôles</h1>
+<p>Dans cette partie, il vous est demandé de tester et vérifier si le fonctionnement des différents codes proposés est bien celui attendu.</p>
+<p>Plus d’information sur les structures de contrôles est donné <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html">ici</a>.</p>
+<h2 id="branchement">Branchement</h2>
+<h3 id="if">if</h3>
+<p>Créez une classe <code>ControleIf</code> dans le répertoire <code>src</code> :</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb6-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb6-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ControleIf <span class="kw">extends</span> Controle {</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb6-5" data-line-number="5">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb6-6" data-line-number="6">    <span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7">    <span class="bu">Object</span> returnedValue = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb6-8" data-line-number="8">        <span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb6-9" data-line-number="9">            returnedValue = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb6-10" data-line-number="10">        <span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">1</span>)</a>
+<a class="sourceLine" id="cb6-11" data-line-number="11">            returnedValue = args[<span class="dv">0</span>];</a>
+<a class="sourceLine" id="cb6-12" data-line-number="12">        <span class="kw">if</span>(args.<span class="fu">length</span> == <span class="dv">2</span>)</a>
+<a class="sourceLine" id="cb6-13" data-line-number="13">            returnedValue = args[<span class="dv">1</span>];</a>
+<a class="sourceLine" id="cb6-14" data-line-number="14">        <span class="kw">if</span>(args.<span class="fu">length</span> &gt;= <span class="dv">3</span>)</a>
+<a class="sourceLine" id="cb6-15" data-line-number="15">            returnedValue = args[<span class="dv">2</span>];</a>
+<a class="sourceLine" id="cb6-16" data-line-number="16">        <span class="kw">return</span> returnedValue;</a>
+<a class="sourceLine" id="cb6-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb6-18" data-line-number="18">}</a></code></pre></div>
+<h4 id="tester-manuellement">Tester manuellement</h4>
+<p>Dans le répertoire <code>src</code>:</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> VerifierIf {</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">    <span class="kw">private</span> Controle controle ;</a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">        Controle controle = <span class="kw">new</span> <span class="fu">ControleIf</span>();</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{}));</a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>}));</a>
+<a class="sourceLine" id="cb7-9" data-line-number="9">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>, <span class="st">&quot;Deux&quot;</span>}));</a>
+<a class="sourceLine" id="cb7-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>, <span class="st">&quot;Deux&quot;</span>, <span class="st">&quot;Trois&quot;</span>}));</a>
+<a class="sourceLine" id="cb7-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb7-12" data-line-number="12">}</a></code></pre></div>
+<h4 id="tester-avec-des-junit">Tester avec des JUnit</h4>
+<h5 id="création-dune-classe-de-test">Création d’une classe de test</h5>
+<p>Créez la classe de test <code>TestControleIf</code> dans le répertoire <code>test</code> en utilisant le code source suivant:</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> org.junit.Before;</span></a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> TestControleIf {</a>
+<a class="sourceLine" id="cb8-6" data-line-number="6">  <span class="kw">protected</span> Controle controle ;</a>
+<a class="sourceLine" id="cb8-7" data-line-number="7">    <span class="at">@Before</span></a>
+<a class="sourceLine" id="cb8-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">initControle</span>(){</a>
+<a class="sourceLine" id="cb8-9" data-line-number="9">        controle = <span class="kw">new</span> <span class="fu">ControleIf</span>();</a>
+<a class="sourceLine" id="cb8-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb8-11" data-line-number="11">}</a></code></pre></div>
+<p>Ajoutez les méthodes permettant de tester dans le corps de la classe <code>TestControleIf</code> (voir ci-dessous).</p>
+<p>Les imports suivants seront nécessaires:</p>
+<ul>
+<li><code>import org.junit.Test</code></li>
+<li><code>import static org.junit.Assert.assertEquals</code></li>
+</ul>
+<p>Une <strong>bonne pratique</strong> consiste à ne mettre qu’une seule assertion par méthode de test.</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="at">@Test</span></a>
+<a class="sourceLine" id="cb9-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleIfUneChaine</span>(){</a>
+<a class="sourceLine" id="cb9-3" data-line-number="3">  <span class="fu">assertEquals</span>(<span class="st">&quot;Test une seule chaîne&quot;</span>,</a>
+<a class="sourceLine" id="cb9-4" data-line-number="4">      <span class="st">&quot;Un&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>}));</a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">}</a>
+<a class="sourceLine" id="cb9-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb9-7" data-line-number="7"><span class="at">@Test</span></a>
+<a class="sourceLine" id="cb9-8" data-line-number="8"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleIfDeuxChaine</span>(){</a>
+<a class="sourceLine" id="cb9-9" data-line-number="9">  <span class="fu">assertEquals</span>(<span class="st">&quot;Test deux chaînes&quot;</span>,</a>
+<a class="sourceLine" id="cb9-10" data-line-number="10">      <span class="st">&quot;Deux&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>, <span class="st">&quot;Deux&quot;</span>}));</a>
+<a class="sourceLine" id="cb9-11" data-line-number="11">}</a></code></pre></div>
+<h5 id="exécution-des-tests">Exécution des tests</h5>
+<p>Lancez les tests en allant dans le menu <code>Run &gt; Run As &gt; JUnit Test</code></p>
+<p>Ajoutez les cas pour les tableaux de chaînes suivants:</p>
+<ul>
+<li><code>{&quot;Un&quot;, &quot;Deux&quot;}</code></li>
+<li><code>{&quot;Un&quot;, &quot;Deux&quot;, &quot;Trois&quot;}</code></li>
+<li><code>{&quot;Un&quot;, &quot;Deux&quot;, &quot;Trois&quot;, &quot;Quatre&quot;}</code></li>
+</ul>
+<h4 id="modification-du-programme">Modification du programme</h4>
+<p>Ajoutez la ligne suivante juste après le troisième <code>if</code>:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1">  <span class="kw">if</span>(args.<span class="fu">length</span> &gt;= <span class="dv">3</span>)</a>
+<a class="sourceLine" id="cb10-2" data-line-number="2">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Bonjour&quot;</span>);</a>
+<a class="sourceLine" id="cb10-3" data-line-number="3">    returnedValue = args[<span class="dv">2</span>];</a></code></pre></div>
+<p>Relancez les tests. Que se passe-t-il ? Est-ce normal ?</p>
+<h4 id="recommandation-utilisation-des-blocs-dinstruction">Recommandation: utilisation des blocs d’instruction</h4>
+<p>Un bloc de code est une série d’instructions entre deux accolades <code>{...}</code>.</p>
+<p>Bien qu’il soit parfaitement possible de n’utiliser qu’une seule instruction dans un <code>if</code> comme montré ci-dessus, il est plutôt <strong>recommandé</strong> d’utiliser des blocs de code <strong>systématiquement</strong>.</p>
+<p>Il est parfaitement possible de ne mettre qu’une seule instruction dans un bloc, et c’est même <strong>recommandé</strong> dans les structures de contrôles:</p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">0</span>)    {</a>
+<a class="sourceLine" id="cb11-2" data-line-number="2">  returnedValue = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb11-3" data-line-number="3">}</a>
+<a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">if</span>(args.<span class="fu">length</span> &lt;= <span class="dv">1</span>){</a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">  returnedValue = args[<span class="dv">0</span>];</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">}</a>
+<a class="sourceLine" id="cb11-7" data-line-number="7"><span class="kw">if</span>(args.<span class="fu">length</span> == <span class="dv">2</span>){</a>
+<a class="sourceLine" id="cb11-8" data-line-number="8">  returnedValue = args[<span class="dv">1</span>];</a>
+<a class="sourceLine" id="cb11-9" data-line-number="9">}</a>
+<a class="sourceLine" id="cb11-10" data-line-number="10"><span class="kw">if</span>(args.<span class="fu">length</span> &gt;= <span class="dv">3</span>){</a>
+<a class="sourceLine" id="cb11-11" data-line-number="11">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Bonjour&quot;</span>);</a>
+<a class="sourceLine" id="cb11-12" data-line-number="12">  returnedValue = args[<span class="dv">2</span>];</a>
+<a class="sourceLine" id="cb11-13" data-line-number="13">}</a>
+<a class="sourceLine" id="cb11-14" data-line-number="14"><span class="kw">return</span> returnedValue;</a></code></pre></div>
+<p>Entre le code ci-dessus et la précédente version de la classe <code>ControleIf</code> le fonctionnement est exactement le même. La <strong>seule différence</strong> est que si on ajoute une ligne en oubliant d’ajouter des accolades (ce qui arrive fréquemment), le code continue à fonctionner correctement.</p>
+<div class="incremental">
+<p>Outre l’aération et la lisibilité du code, cela le rend donc plus robuste en cas de modification.</p>
+</div>
+<h3 id="if-else">if-else</h3>
+<p>L’instruction <code>else</code> s’utilise comme suit:</p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb12-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb12-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ControleIfElse <span class="kw">extends</span> Controle {</a>
+<a class="sourceLine" id="cb12-4" data-line-number="4">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb12-5" data-line-number="5">    <span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb12-6" data-line-number="6">        <span class="bu">Object</span> returnedValue ;</a>
+<a class="sourceLine" id="cb12-7" data-line-number="7">        <span class="kw">if</span> (args.<span class="fu">length</span> &gt; <span class="dv">0</span> &amp;&amp; args[<span class="dv">0</span>] != <span class="st">&quot;&quot;</span>){</a>
+<a class="sourceLine" id="cb12-8" data-line-number="8">            returnedValue = args[<span class="dv">0</span>];</a>
+<a class="sourceLine" id="cb12-9" data-line-number="9">        }</a>
+<a class="sourceLine" id="cb12-10" data-line-number="10">        <span class="kw">else</span> {</a>
+<a class="sourceLine" id="cb12-11" data-line-number="11">            returnedValue = <span class="st">&quot;N/A&quot;</span>;</a>
+<a class="sourceLine" id="cb12-12" data-line-number="12">        }</a>
+<a class="sourceLine" id="cb12-13" data-line-number="13">        <span class="kw">return</span> returnedValue;</a>
+<a class="sourceLine" id="cb12-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb12-15" data-line-number="15">}</a></code></pre></div>
+<h4 id="tester-manuellement-1">Tester manuellement</h4>
+<p>Dans le répertoire <code>src</code>:</p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb13-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb13-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> VerifierIfElse {</a>
+<a class="sourceLine" id="cb13-4" data-line-number="4">    <span class="kw">private</span> Controle controle ;</a>
+<a class="sourceLine" id="cb13-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb13-6" data-line-number="6">        Controle controle = <span class="kw">new</span> <span class="fu">ControleIfElse</span>();</a>
+<a class="sourceLine" id="cb13-7" data-line-number="7">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{}));</a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>}));</a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>, <span class="st">&quot;Deux&quot;</span>}));</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>, <span class="st">&quot;Deux&quot;</span>, <span class="st">&quot;Trois&quot;</span>}));</a>
+<a class="sourceLine" id="cb13-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb13-12" data-line-number="12">}</a></code></pre></div>
+<h4 id="tester-avec-junit">Tester avec JUnit</h4>
+<p>Créez la classe <code>ControleIfElse</code> et testez-la dans une méthode comme suit:</p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="at">@Before</span></a>
+<a class="sourceLine" id="cb14-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">initControle</span>(){</a>
+<a class="sourceLine" id="cb14-3" data-line-number="3">  controle = <span class="kw">new</span> <span class="fu">ControleIfElse</span>();</a>
+<a class="sourceLine" id="cb14-4" data-line-number="4">}</a>
+<a class="sourceLine" id="cb14-5" data-line-number="5"><span class="at">@Test</span></a>
+<a class="sourceLine" id="cb14-6" data-line-number="6"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleIfElse</span>(){</a>
+<a class="sourceLine" id="cb14-7" data-line-number="7">  <span class="fu">assertEquals</span>(<span class="st">&quot;Test une seule chaîne&quot;</span>,</a>
+<a class="sourceLine" id="cb14-8" data-line-number="8">      <span class="st">&quot;Un&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;Un&quot;</span>}));</a>
+<a class="sourceLine" id="cb14-9" data-line-number="9">}</a></code></pre></div>
+<p>Ajoutez une instruction <code>assertEquals</code> permettant de vérifier l’exécution du bloc <code>else</code> (la valeur à tester doit être <code>&quot;N/A&quot;</code>).</p>
+<p>Testez au moins deux autres cas.</p>
+<h3 id="switch-case">switch-case</h3>
+<h4 id="les-cascades-de-if-else">Les cascades de if-else</h4>
+<p>On peut critiquer le code suivant du point de vue de :</p>
+<ul>
+<li>sa maintenabilité</li>
+<li>sa lisibilité</li>
+</ul>
+<div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb15-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb15-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ControleCascadeIfElse <span class="kw">extends</span> Controle {</a>
+<a class="sourceLine" id="cb15-4" data-line-number="4">  <span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb15-5" data-line-number="5">    <span class="bu">String</span> returnedValue;</a>
+<a class="sourceLine" id="cb15-6" data-line-number="6">    <span class="dt">int</span> valeurChoix = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(args[<span class="dv">0</span>]);</a>
+<a class="sourceLine" id="cb15-7" data-line-number="7">        <span class="kw">if</span>(valeurChoix == <span class="dv">1</span>){</a>
+<a class="sourceLine" id="cb15-8" data-line-number="8">            returnedValue = <span class="st">&quot;Menu Préférences&quot;</span>;</a>
+<a class="sourceLine" id="cb15-9" data-line-number="9">        }</a>
+<a class="sourceLine" id="cb15-10" data-line-number="10">        <span class="kw">else</span> <span class="kw">if</span> (valeurChoix == <span class="dv">2</span>){</a>
+<a class="sourceLine" id="cb15-11" data-line-number="11">            returnedValue = <span class="st">&quot;Menu Edition&quot;</span>;</a>
+<a class="sourceLine" id="cb15-12" data-line-number="12">        }</a>
+<a class="sourceLine" id="cb15-13" data-line-number="13">        <span class="kw">else</span> <span class="kw">if</span> (valeurChoix == <span class="dv">3</span>){</a>
+<a class="sourceLine" id="cb15-14" data-line-number="14">            returnedValue = <span class="st">&quot;Bonjour&quot;</span>;</a>
+<a class="sourceLine" id="cb15-15" data-line-number="15">        }</a>
+<a class="sourceLine" id="cb15-16" data-line-number="16">        <span class="kw">else</span> <span class="kw">if</span> (valeurChoix == <span class="dv">4</span>){</a>
+<a class="sourceLine" id="cb15-17" data-line-number="17">            returnedValue = <span class="st">&quot;Au revoir&quot;</span>;</a>
+<a class="sourceLine" id="cb15-18" data-line-number="18">        }</a>
+<a class="sourceLine" id="cb15-19" data-line-number="19">        <span class="kw">else</span> <span class="kw">if</span> (valeurChoix == <span class="dv">5</span>){</a>
+<a class="sourceLine" id="cb15-20" data-line-number="20">            returnedValue = <span class="st">&quot;Sortir&quot;</span>;</a>
+<a class="sourceLine" id="cb15-21" data-line-number="21">        }</a>
+<a class="sourceLine" id="cb15-22" data-line-number="22">        <span class="kw">else</span> {</a>
+<a class="sourceLine" id="cb15-23" data-line-number="23">            returnedValue = <span class="st">&quot;Saisir votre choix (1,2,3,4 ou 5) : &quot;</span>;</a>
+<a class="sourceLine" id="cb15-24" data-line-number="24">        }</a>
+<a class="sourceLine" id="cb15-25" data-line-number="25">        <span class="kw">return</span> returnedValue;</a>
+<a class="sourceLine" id="cb15-26" data-line-number="26">  }</a>
+<a class="sourceLine" id="cb15-27" data-line-number="27">}</a></code></pre></div>
+<h5 id="tester-manuellement-2">Tester manuellement</h5>
+<p>Dans le répertoire <code>src</code>, créer les deux classes suivantes:</p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb16-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb16-3" data-line-number="3"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> VerifierDifferentsCas {</a>
+<a class="sourceLine" id="cb16-4" data-line-number="4">    <span class="kw">protected</span> Controle controle ;</a>
+<a class="sourceLine" id="cb16-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb16-6" data-line-number="6">    <span class="kw">public</span> <span class="kw">abstract</span> <span class="dt">void</span> <span class="fu">initControle</span>();</a>
+<a class="sourceLine" id="cb16-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb16-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">verifier</span>(){</a>
+<a class="sourceLine" id="cb16-9" data-line-number="9">        <span class="fu">initControle</span>();</a>
+<a class="sourceLine" id="cb16-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;1&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-11" data-line-number="11">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;2&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-12" data-line-number="12">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;3&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-13" data-line-number="13">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;4&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-14" data-line-number="14">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;5&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-15" data-line-number="15">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;0&quot;</span>}));</a>
+<a class="sourceLine" id="cb16-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb16-17" data-line-number="17">}</a></code></pre></div>
+<p>Classe de vérification:</p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb17-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb17-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> VerifierCascadeIfElse <span class="kw">extends</span> VerifierDifferentsCas {</a>
+<a class="sourceLine" id="cb17-4" data-line-number="4">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb17-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">initControle</span>() {</a>
+<a class="sourceLine" id="cb17-6" data-line-number="6">        controle = <span class="kw">new</span> <span class="fu">ControleCascadeIfElse</span>();</a>
+<a class="sourceLine" id="cb17-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb17-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb17-9" data-line-number="9">        VerifierDifferentsCas verificateur = <span class="kw">new</span> <span class="fu">VerifierCascadeIfElse</span>();</a>
+<a class="sourceLine" id="cb17-10" data-line-number="10">        verificateur.<span class="fu">verifier</span>();</a>
+<a class="sourceLine" id="cb17-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb17-12" data-line-number="12">}</a></code></pre></div>
+<h5 id="test-avec-junit">Test avec JUnit</h5>
+<p>Ce code fonctionne et peut être testé avec les tests unitaires suivants:</p>
+<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb18-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb18-3" data-line-number="3"><span class="kw">import</span><span class="im"> org.junit.Test;</span></a>
+<a class="sourceLine" id="cb18-4" data-line-number="4"><span class="kw">import</span><span class="im"> org.junit.Before;</span></a>
+<a class="sourceLine" id="cb18-5" data-line-number="5"><span class="kw">import static</span><span class="im"> org.junit.Assert.assertEquals ;</span></a>
+<a class="sourceLine" id="cb18-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb18-7" data-line-number="7"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> TestControleDifferentsCas {</a>
+<a class="sourceLine" id="cb18-8" data-line-number="8">    <span class="kw">protected</span> Controle controle ;</a>
+<a class="sourceLine" id="cb18-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb18-10" data-line-number="10">    <span class="at">@Before</span></a>
+<a class="sourceLine" id="cb18-11" data-line-number="11">    <span class="kw">public</span> <span class="kw">abstract</span> <span class="dt">void</span> <span class="fu">initControle</span>();</a>
+<a class="sourceLine" id="cb18-12" data-line-number="12"></a>
+<a class="sourceLine" id="cb18-13" data-line-number="13">    <span class="at">@Test</span></a>
+<a class="sourceLine" id="cb18-14" data-line-number="14">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleMenuPreferences</span>(){</a>
+<a class="sourceLine" id="cb18-15" data-line-number="15">        <span class="fu">assertEquals</span>(<span class="st">&quot;Test 1&quot;</span>,</a>
+<a class="sourceLine" id="cb18-16" data-line-number="16">                <span class="st">&quot;Menu Préférences&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;1&quot;</span>}));</a>
+<a class="sourceLine" id="cb18-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb18-18" data-line-number="18">    <span class="at">@Test</span></a>
+<a class="sourceLine" id="cb18-19" data-line-number="19">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testControleMenuEdition</span>(){</a>
+<a class="sourceLine" id="cb18-20" data-line-number="20">        <span class="fu">assertEquals</span>(<span class="st">&quot;Test 2&quot;</span>,</a>
+<a class="sourceLine" id="cb18-21" data-line-number="21">                <span class="st">&quot;Menu Edition&quot;</span>, controle.<span class="fu">lancer</span>(<span class="kw">new</span> <span class="bu">String</span>[]{<span class="st">&quot;2&quot;</span>}));</a>
+<a class="sourceLine" id="cb18-22" data-line-number="22">    }</a>
+<a class="sourceLine" id="cb18-23" data-line-number="23">  <span class="co">/*</span></a>
+<a class="sourceLine" id="cb18-24" data-line-number="24"><span class="co">   * COMPLETEZ LES TESTS</span></a>
+<a class="sourceLine" id="cb18-25" data-line-number="25"><span class="co">   */</span></a>
+<a class="sourceLine" id="cb18-26" data-line-number="26">}</a></code></pre></div>
+<p>Créez une classe <code>TestControleCascadeIfElse</code> qui dérive de <code>TestControleDifferentsCas</code> et ajoutez y la méthode suivante :</p>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="at">@Override</span></a>
+<a class="sourceLine" id="cb19-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">initControle</span>() {</a>
+<a class="sourceLine" id="cb19-3" data-line-number="3">    controle = <span class="kw">new</span> <span class="fu">ControleCascadeIfElse</span>();</a>
+<a class="sourceLine" id="cb19-4" data-line-number="4">}</a></code></pre></div>
+<p>Complétez les cas de test manquant dans le code précédent.</p>
+<h4 id="la-structure-de-branchement-switch-case">La structure de branchement switch-case</h4>
+<p>Voici un code équivalent avec une structure <code>switch-case</code>.</p>
+<div class="incremental">
+<p>L’instruction <code>break</code> permet de stopper l’exécution du <code>switch</code> et d’en sortir immédiatement (vous pouvez essayer de la supprimer pour observer l’effet sur le déroulement du code).</p>
+<div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.controles;</span></a>
+<a class="sourceLine" id="cb20-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb20-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ControleSwitchCase <span class="kw">extends</span> Controle {</a>
+<a class="sourceLine" id="cb20-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb20-5" data-line-number="5">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb20-6" data-line-number="6">    <span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb20-7" data-line-number="7">        <span class="bu">String</span> returnedValue;</a>
+<a class="sourceLine" id="cb20-8" data-line-number="8">        <span class="dt">int</span> valeurChoix = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(args[<span class="dv">0</span>]);</a>
+<a class="sourceLine" id="cb20-9" data-line-number="9">        <span class="kw">switch</span>(valeurChoix){</a>
+<a class="sourceLine" id="cb20-10" data-line-number="10">        <span class="kw">case</span> <span class="dv">1</span>:</a>
+<a class="sourceLine" id="cb20-11" data-line-number="11">            returnedValue = <span class="st">&quot;Menu Préférences&quot;</span>;</a>
+<a class="sourceLine" id="cb20-12" data-line-number="12">            <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb20-13" data-line-number="13">        <span class="kw">case</span> <span class="dv">2</span>:</a>
+<a class="sourceLine" id="cb20-14" data-line-number="14">            returnedValue = <span class="st">&quot;Menu Edition&quot;</span>;</a>
+<a class="sourceLine" id="cb20-15" data-line-number="15">            <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb20-16" data-line-number="16">        <span class="kw">case</span> <span class="dv">3</span>:</a>
+<a class="sourceLine" id="cb20-17" data-line-number="17">            returnedValue = <span class="st">&quot;Bonjour&quot;</span>;</a>
+<a class="sourceLine" id="cb20-18" data-line-number="18">            <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb20-19" data-line-number="19">        <span class="kw">case</span> <span class="dv">4</span>:</a>
+<a class="sourceLine" id="cb20-20" data-line-number="20">            returnedValue = <span class="st">&quot;Au revoir&quot;</span>;</a>
+<a class="sourceLine" id="cb20-21" data-line-number="21">            <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb20-22" data-line-number="22">        <span class="kw">case</span> <span class="dv">5</span>:</a>
+<a class="sourceLine" id="cb20-23" data-line-number="23">            returnedValue = <span class="st">&quot;Sortir&quot;</span>;</a>
+<a class="sourceLine" id="cb20-24" data-line-number="24">    <span class="kw">default</span>:</a>
+<a class="sourceLine" id="cb20-25" data-line-number="25">            returnedValue = <span class="st">&quot;Saisir votre choix (1,2,3,4 ou 5) : &quot;</span>;</a>
+<a class="sourceLine" id="cb20-26" data-line-number="26">    }</a>
+<a class="sourceLine" id="cb20-27" data-line-number="27">    <span class="kw">return</span> returnedValue;</a>
+<a class="sourceLine" id="cb20-28" data-line-number="28">    }</a>
+<a class="sourceLine" id="cb20-29" data-line-number="29">}</a></code></pre></div>
+<h5 id="tester-manuellement-3">Tester manuellement</h5>
+<p>Retestez ce code avec les tests précédents (en créant une nouvelle classe <code>VerifierSwitchCase</code> dérivant de <code>VerifierDifferentsCas</code> et en y instanciant <code>ControleSwitchCase</code>) et vérifiez que son fonctionnement est correct.</p>
+<p>Ce code fonctionne-t-il ? Que manque-t-il ?</p>
+<h5 id="test-avec-junit-1">Test avec JUnit</h5>
+<p>Retestez ce code avec les tests précédents (en dérivant de <code>TestControleDifferentsCas</code> et en y instanciant <code>ControleSwitchCase</code>) et vérifiez que son fonctionnement est correct.</p>
+<p>Ce code fonctionne-t-il ? Que manque-t-il ?</p>
+</div>
+<h4 id="string-et-switch-case">String et switch-case</h4>
+<p>Il est possible de faire des switch-case sur des String depuis la version 7 de Java. Vous serez peut-être amenés à maintenir du code avec une version plus ancienne.</p>
+<p>Vous ne pourrez donc pas utiliser la syntaxe suivante avec ces versions :</p>
+<div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1">    <span class="kw">switch</span>(choix){</a>
+<a class="sourceLine" id="cb21-2" data-line-number="2">    <span class="kw">case</span> <span class="st">&quot;1&quot;</span>: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Préférences&quot;</span>);</a>
+<a class="sourceLine" id="cb21-3" data-line-number="3">      <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb21-4" data-line-number="4">    <span class="kw">case</span> <span class="st">&quot;2&quot;</span>: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Edition&quot;</span>);</a>
+<a class="sourceLine" id="cb21-5" data-line-number="5">      <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb21-6" data-line-number="6">    <span class="kw">default</span>: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Recommencez !&quot;</span>);</a>
+<a class="sourceLine" id="cb21-7" data-line-number="7">    }</a></code></pre></div>
+<hr />
+<h3 id="opérateur-ternaire">Opérateur ternaire</h3>
+<p>Etudiez maintenant le fonctionnement de cette méthode :</p>
+<div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">testChaines</span>(<span class="bu">String</span> a, <span class="bu">String</span> b){</a>
+<a class="sourceLine" id="cb22-2" data-line-number="2">    <span class="kw">if</span>( a == <span class="kw">null</span> ? b == <span class="kw">null</span> : a.<span class="fu">equals</span>(b) ){</a>
+<a class="sourceLine" id="cb22-3" data-line-number="3">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont les mêmes&quot;);</span></a>
+<a class="sourceLine" id="cb22-4" data-line-number="4">    }</a>
+<a class="sourceLine" id="cb22-5" data-line-number="5">    <span class="kw">else</span>{</a>
+<a class="sourceLine" id="cb22-6" data-line-number="6">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Les chaînes &#39;&quot;</span>+ a + <span class="st">&quot;&#39; et &#39;&quot;</span>+b+ <span class="st">&quot;&#39; sont différentes&quot;</span>);</a>
+<a class="sourceLine" id="cb22-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb22-8" data-line-number="8">}</a></code></pre></div>
+<p>L’opérateur ternaire <code>? :</code> qui est utilisé ici fonctionne comme suit.</p>
+<p>Le code :</p>
+<div class="sourceCode" id="cb23"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb23-1" data-line-number="1">x = <span class="dv">1</span> ;</a>
+<a class="sourceLine" id="cb23-2" data-line-number="2">a = (x == <span class="dv">1</span> ? <span class="dv">2</span> : <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb23-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(a);</a></code></pre></div>
+<p>Conduit à l’affichage suivant: <code>2</code></p>
+<p>Le code :</p>
+<div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1">x = <span class="dv">4</span> ;</a>
+<a class="sourceLine" id="cb24-2" data-line-number="2">a = (x == <span class="dv">1</span> ? <span class="dv">2</span> : <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb24-3" data-line-number="3"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(a);</a></code></pre></div>
+<p>Conduit à l’affichage suivant: <code>3</code></p>
+<p>Le code équivalent à <code>(x == 1 ? 2 : 3)</code> est :</p>
+<div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="dt">int</span> <span class="fu">f</span>(<span class="dt">int</span> x){</a>
+<a class="sourceLine" id="cb25-2" data-line-number="2">  <span class="kw">if</span>(x == <span class="dv">1</span>){</a>
+<a class="sourceLine" id="cb25-3" data-line-number="3">    <span class="kw">return</span> <span class="dv">2</span>;</a>
+<a class="sourceLine" id="cb25-4" data-line-number="4">  }<span class="kw">else</span>{</a>
+<a class="sourceLine" id="cb25-5" data-line-number="5">    <span class="kw">return</span> <span class="dv">3</span>;</a>
+<a class="sourceLine" id="cb25-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb25-7" data-line-number="7">}</a></code></pre></div>
+<p>Les deux codes suivants sont donc équivalents:</p>
+<div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="co">//Première version</span></a>
+<a class="sourceLine" id="cb26-2" data-line-number="2">a = (x == <span class="dv">1</span> ? <span class="dv">2</span> : <span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb26-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb26-4" data-line-number="4"><span class="co">//Seconde version</span></a>
+<a class="sourceLine" id="cb26-5" data-line-number="5">a = <span class="fu">f</span>(x);</a></code></pre></div>
+<p>Quel est l’intérêt de cette notation ?</p>
+<p>Quel peut être son inconvénient ?</p>
+<h5 id="exercice">Exercice</h5>
+<p>Créez les tests unitaires permettant de vérifier le fonctionnement de la méthode <code>testChaines(String, String)</code></p>
+<p>Réécrivez cette méthode en n’utilisant que des <code>if-else</code> et vérifiez son fonctionnement.</p>
+<h2 id="boucles">Boucles</h2>
+<h3 id="for">for</h3>
+<p>Le premier mode d’utilisation de la boucle <code>for</code> se fait comme en langage <code>C</code>:</p>
+<div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">for</span> ( initialisation; condition; mise à jour ) {</a>
+<a class="sourceLine" id="cb27-2" data-line-number="2">   instructions;</a>
+<a class="sourceLine" id="cb27-3" data-line-number="3">}</a></code></pre></div>
+<p>Ainsi le parcours d’un tableau se fait ainsi:</p>
+<div class="sourceCode" id="cb28"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb28-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb28-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb28-3" data-line-number="3">  <span class="kw">for</span>(<span class="dt">int</span> i = <span class="dv">0</span> ; i &lt; args.<span class="fu">length</span>; i++){</a>
+<a class="sourceLine" id="cb28-4" data-line-number="4">    sb.<span class="fu">append</span>(args[i]);</a>
+<a class="sourceLine" id="cb28-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb28-6" data-line-number="6">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb28-7" data-line-number="7">}</a></code></pre></div>
+<p>Une utilisation pour le parcours de listes (vues au prochain chapitre) est la suivante:</p>
+<div class="sourceCode" id="cb29"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb29-1" data-line-number="1"><span class="kw">for</span> (&lt;<span class="bu">Type</span>&gt; membreListe : liste){</a>
+<a class="sourceLine" id="cb29-2" data-line-number="2">  instructions;</a>
+<a class="sourceLine" id="cb29-3" data-line-number="3">}</a></code></pre></div>
+<p>Exemple avec un <code>StringBuffer</code>:</p>
+<div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb30-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb30-3" data-line-number="3">  <span class="kw">for</span>(<span class="bu">String</span> str : args){</a>
+<a class="sourceLine" id="cb30-4" data-line-number="4">    sb.<span class="fu">append</span>(str);</a>
+<a class="sourceLine" id="cb30-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb30-6" data-line-number="6">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb30-7" data-line-number="7">}</a></code></pre></div>
+<h3 id="while-do-while">while / do-while</h3>
+<p>La structure <code>while</code> permet de réaliser une boucle <code>tant-que</code> :</p>
+<div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb31-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb31-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb31-4" data-line-number="4">  <span class="dt">int</span> i = args.<span class="fu">length</span> - <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb31-5" data-line-number="5">  <span class="kw">while</span>(i &gt;= <span class="dv">0</span>){</a>
+<a class="sourceLine" id="cb31-6" data-line-number="6">    sb.<span class="fu">insert</span>(<span class="dv">0</span>, args[i]);</a>
+<a class="sourceLine" id="cb31-7" data-line-number="7">    i --;</a>
+<a class="sourceLine" id="cb31-8" data-line-number="8">  }</a>
+<a class="sourceLine" id="cb31-9" data-line-number="9">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb31-10" data-line-number="10">}</a></code></pre></div>
+<p>La boucle <code>répéter-tant-que</code> est réalisable en utilisant la structure <code>do-while</code>:</p>
+<div class="sourceCode" id="cb32"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb32-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb32-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb32-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb32-4" data-line-number="4">  <span class="dt">int</span> i = args.<span class="fu">length</span> - <span class="dv">1</span>;</a>
+<a class="sourceLine" id="cb32-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb32-6" data-line-number="6">  <span class="kw">do</span></a>
+<a class="sourceLine" id="cb32-7" data-line-number="7">  {</a>
+<a class="sourceLine" id="cb32-8" data-line-number="8">    sb.<span class="fu">insert</span>(<span class="dv">0</span>, args[i]);</a>
+<a class="sourceLine" id="cb32-9" data-line-number="9">    i --;</a>
+<a class="sourceLine" id="cb32-10" data-line-number="10">  } <span class="kw">while</span>(i &gt;= <span class="dv">0</span>);</a>
+<a class="sourceLine" id="cb32-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb32-12" data-line-number="12">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb32-13" data-line-number="13">}</a></code></pre></div>
+<p>Testez cette boucle avec le tableau suivant:</p>
+<ul>
+<li><code>new String[]{}</code></li>
+</ul>
+<p>Corrigez le code si nécessaire.</p>
+<h2 id="contrôle-des-boucles">Contrôle des boucles</h2>
+<h3 id="break">break</h3>
+<p>Cette instruction (déjà vue avec <code>switch</code>), permet de stopper l’exécution en cours d’une boucle.</p>
+<p>Exemple d’utilisation de <code>break</code>:</p>
+<div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb33-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb33-3" data-line-number="3">  <span class="kw">for</span>(<span class="dt">int</span> i = <span class="dv">0</span> ; i &lt; args.<span class="fu">length</span>; i++){</a>
+<a class="sourceLine" id="cb33-4" data-line-number="4">    <span class="kw">if</span>(i == <span class="dv">2</span>){</a>
+<a class="sourceLine" id="cb33-5" data-line-number="5">      <span class="kw">break</span> ;</a>
+<a class="sourceLine" id="cb33-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb33-7" data-line-number="7">    sb.<span class="fu">append</span>(args[i]);</a>
+<a class="sourceLine" id="cb33-8" data-line-number="8">  }</a>
+<a class="sourceLine" id="cb33-9" data-line-number="9">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb33-10" data-line-number="10">}</a></code></pre></div>
+<p>L’exécution du code précédent :</p>
+<ul>
+<li>appelé avec le tableau <code>new String[]{&quot;Un&quot;, &quot;Deux&quot;, &quot;Trois&quot;, &quot;Quatre&quot;}</code></li>
+<li>renverra la chaîne <code>UnDeux</code></li>
+</ul>
+<h3 id="continue">continue</h3>
+<p>Cette instruction (déjà vue avec <code>switch</code>), permet de ne pas exécuter la suite du bloc d’instruction pour l’itération courante.</p>
+<p>Exemple d’utilisation de <code>continue</code>:</p>
+<div class="sourceCode" id="cb34"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="kw">public</span> <span class="bu">Object</span> <span class="fu">lancer</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb34-2" data-line-number="2">  <span class="bu">StringBuffer</span> sb = <span class="kw">new</span> <span class="bu">StringBuffer</span>();</a>
+<a class="sourceLine" id="cb34-3" data-line-number="3">  <span class="kw">for</span>(<span class="dt">int</span> i = <span class="dv">0</span> ; i &lt; args.<span class="fu">length</span>; i++){</a>
+<a class="sourceLine" id="cb34-4" data-line-number="4">    <span class="kw">if</span>(i == <span class="dv">2</span>){</a>
+<a class="sourceLine" id="cb34-5" data-line-number="5">      <span class="kw">continue</span> ;</a>
+<a class="sourceLine" id="cb34-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb34-7" data-line-number="7">    sb.<span class="fu">append</span>(args[i]);</a>
+<a class="sourceLine" id="cb34-8" data-line-number="8">  }</a>
+<a class="sourceLine" id="cb34-9" data-line-number="9">  <span class="kw">return</span> sb.<span class="fu">toString</span>();</a>
+<a class="sourceLine" id="cb34-10" data-line-number="10">}</a></code></pre></div>
+<p>L’exécution du code précédent :</p>
+<ul>
+<li>appelé avec le tableau <code>new String[]{&quot;Un&quot;, &quot;Deux&quot;, &quot;Trois&quot;, &quot;Quatre&quot;}</code></li>
+<li>renverra la chaîne <code>UnDeuxQuatre</code></li>
+</ul>
+<h1 id="enum">Enum</h1>
+<p>Dans cette partie, nous allons étudier une fonctionnalité importante du langage Java:</p>
+<ul>
+<li>les <code>Enum</code></li>
+</ul>
+<p>Les <code>Enum</code> sont notamment associés à la structure de contrôle <code>switch</code>.</p>
+<h2 id="pourquoi-les-enum">Pourquoi les Enum</h2>
+<h3 id="les-constantes-avant-les-enum">Les constantes (avant les Enum)</h3>
+<p>Nous pouvons remplacer les éléments pour chaque <code>case</code> d’un <code>switch</code> par des constantes:</p>
+<div class="sourceCode" id="cb35"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb35-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> AvantLesEnums {</a>
+<a class="sourceLine" id="cb35-2" data-line-number="2">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="bu">String</span> CHOIX_MENU_PREFERENCES = <span class="st">&quot;1&quot;</span>;</a>
+<a class="sourceLine" id="cb35-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="bu">String</span> CHOIX_MENU_EDITION     = <span class="st">&quot;2&quot;</span>;</a>
+<a class="sourceLine" id="cb35-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="bu">String</span> CHOIX_SORTIR           = <span class="st">&quot;2&quot;</span>;</a>
+<a class="sourceLine" id="cb35-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb35-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">appliquerChoix</span>(<span class="bu">String</span> choix){</a>
+<a class="sourceLine" id="cb35-7" data-line-number="7">        <span class="kw">if</span>(choix == CHOIX_SORTIR){</a>
+<a class="sourceLine" id="cb35-8" data-line-number="8">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Sortie du programme&quot;</span>);</a>
+<a class="sourceLine" id="cb35-9" data-line-number="9">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">0</span>);</a>
+<a class="sourceLine" id="cb35-10" data-line-number="10">        }</a>
+<a class="sourceLine" id="cb35-11" data-line-number="11">        <span class="kw">switch</span>(choix){</a>
+<a class="sourceLine" id="cb35-12" data-line-number="12">        <span class="kw">case</span> CHOIX_MENU_PREFERENCES: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Préférences&quot;</span>);</a>
+<a class="sourceLine" id="cb35-13" data-line-number="13">        <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb35-14" data-line-number="14">        <span class="kw">case</span> CHOIX_MENU_EDITION: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Edition&quot;</span>);</a>
+<a class="sourceLine" id="cb35-15" data-line-number="15">        <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb35-16" data-line-number="16">        <span class="kw">default</span>: <span class="fu">appliquerAutreCommande</span>(choix);</a>
+<a class="sourceLine" id="cb35-17" data-line-number="17">        }</a>
+<a class="sourceLine" id="cb35-18" data-line-number="18">    }</a>
+<a class="sourceLine" id="cb35-19" data-line-number="19">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">appliquerAutreCommande</span>(<span class="bu">String</span> choix){}</a>
+<a class="sourceLine" id="cb35-20" data-line-number="20"></a>
+<a class="sourceLine" id="cb35-21" data-line-number="21">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb35-22" data-line-number="22">        AvantLesEnums avantLesEnums = <span class="kw">new</span> <span class="fu">AvantLesEnums</span>();</a>
+<a class="sourceLine" id="cb35-23" data-line-number="23"></a>
+<a class="sourceLine" id="cb35-24" data-line-number="24">        avantLesEnums.<span class="fu">appliquerChoix</span>(<span class="st">&quot;2&quot;</span>);</a>
+<a class="sourceLine" id="cb35-25" data-line-number="25">    }</a>
+<a class="sourceLine" id="cb35-26" data-line-number="26">}</a></code></pre></div>
+<p>Ceci rend le code plus lisible. Cependant, il exite un risque pour que deux constantes soient de même valeur (ici <code>CHOIX_SORTIR</code> est identique à <code>CHOIX_MENU_EDITION</code>)</p>
+<div class="incremental">
+<p>Dans ce cas, le risque de dysfonctionement du programme est important, sans qu’il soit nécessairement détecté par le compilateur.</p>
+<p>Pour palier à cela, nous pouvons utiliser les <code>Enum</code>.</p>
+</div>
+<h3 id="définition-des-enum">Définition des Enum</h3>
+<p>Les <code>Enum</code> permettent de définir un ensemble de valeurs pour lesquels il est certain que chacune d’elles seront distinctes, tout en étant <em>typée</em>.</p>
+<div class="incremental">
+<p>De plus, elle peuvent être utilisées dans une structure <code>switch...case</code> comme n’importe quelle valeur constante, à la différence qu’on est assuré qu’aucune valeur ne peut être confondue avec une autre.</p>
+<p>Utilisation particulièrement utile dans un <code>switch...case</code></p>
+</div>
+<h3 id="enum-exemple-de-déclaration">Enum: exemple de déclaration</h3>
+<p>On définit un Enum à la manière d’une classe, mais avec le mot clé <code>enum</code>:</p>
+<div class="sourceCode" id="cb36"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb36-1" data-line-number="1"><span class="kw">public</span> <span class="kw">enum</span> ItemMenuPrincipal {</a>
+<a class="sourceLine" id="cb36-2" data-line-number="2">    MENU_PREFERENCES, MENU_EDITION, MENU_SORTIR;</a>
+<a class="sourceLine" id="cb36-3" data-line-number="3">}</a></code></pre></div>
+<div class="incremental">
+<p><strong>Intérêt</strong> :</p>
+<ul>
+<li>plus besoin de mettre de valeurs</li>
+<li>les valeurs sont toutes différentes</li>
+</ul>
+<div class="sourceCode" id="cb37"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb37-1" data-line-number="1"><span class="kw">import static</span><span class="im"> com.example.enumeration.ItemMenuPrincipal.*;</span></a>
+<a class="sourceLine" id="cb37-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb37-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> AvecLesEnums {</a>
+<a class="sourceLine" id="cb37-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">appliquerChoix</span>(ItemMenuPrincipal choix){</a>
+<a class="sourceLine" id="cb37-5" data-line-number="5">        <span class="kw">if</span>(choix == MENU_SORTIR){</a>
+<a class="sourceLine" id="cb37-6" data-line-number="6">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Sortie du programme&quot;</span>);</a>
+<a class="sourceLine" id="cb37-7" data-line-number="7">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">0</span>);</a>
+<a class="sourceLine" id="cb37-8" data-line-number="8">        }</a>
+<a class="sourceLine" id="cb37-9" data-line-number="9">        <span class="kw">switch</span>(choix){</a>
+<a class="sourceLine" id="cb37-10" data-line-number="10">        <span class="kw">case</span> MENU_PREFERENCES: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Préférences&quot;</span>);</a>
+<a class="sourceLine" id="cb37-11" data-line-number="11">        <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb37-12" data-line-number="12">        <span class="kw">case</span> MENU_EDITION: <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Menu Edition&quot;</span>);</a>
+<a class="sourceLine" id="cb37-13" data-line-number="13">        <span class="kw">break</span>;</a>
+<a class="sourceLine" id="cb37-14" data-line-number="14">        <span class="kw">default</span>: <span class="fu">appliquerAutreCommande</span>(choix);</a>
+<a class="sourceLine" id="cb37-15" data-line-number="15">        }</a>
+<a class="sourceLine" id="cb37-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb37-17" data-line-number="17">}</a></code></pre></div>
+</div>
+<h3 id="méthodes-statiques-dans-les-enum">Méthodes statiques dans les Enum</h3>
+<p>On peut ajouter des méthodes de classe à un <code>enum</code></p>
+<div class="sourceCode" id="cb38"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb38-1" data-line-number="1"><span class="kw">public</span> <span class="kw">enum</span> ItemMenuPrincipal {</a>
+<a class="sourceLine" id="cb38-2" data-line-number="2">    MENU_PREFERENCES, MENU_EDITION, DIRE_BONJOUR, DIRE_AU_REVOIR, MENU_SORTIR;</a>
+<a class="sourceLine" id="cb38-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb38-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">static</span> ItemMenuPrincipal <span class="fu">getItem</span>(<span class="bu">String</span> identifiant){</a>
+<a class="sourceLine" id="cb38-5" data-line-number="5">        <span class="kw">switch</span> (identifiant) {</a>
+<a class="sourceLine" id="cb38-6" data-line-number="6">        <span class="kw">case</span> <span class="st">&quot;1&quot;</span>:</a>
+<a class="sourceLine" id="cb38-7" data-line-number="7">            <span class="kw">return</span> MENU_PREFERENCES;</a>
+<a class="sourceLine" id="cb38-8" data-line-number="8">        <span class="kw">case</span> <span class="st">&quot;2&quot;</span>:</a>
+<a class="sourceLine" id="cb38-9" data-line-number="9">            <span class="kw">return</span> MENU_EDITION;</a>
+<a class="sourceLine" id="cb38-10" data-line-number="10">        <span class="kw">case</span> <span class="st">&quot;3&quot;</span>:</a>
+<a class="sourceLine" id="cb38-11" data-line-number="11">            <span class="kw">return</span> MENU_SORTIR;</a>
+<a class="sourceLine" id="cb38-12" data-line-number="12">        }</a>
+<a class="sourceLine" id="cb38-13" data-line-number="13">        <span class="kw">return</span> <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb38-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb38-15" data-line-number="15">}</a></code></pre></div>
+<p>Ajoutez un <code>main</code> dans la classe <code>AvecLesEnums</code> sur le modèle du <code>main</code> de la classe <code>AvantLesEnums</code> et vérifiez ce programme.</p>
+<h2 id="enum-comme-des-instances">Enum comme des instances</h2>
+<p>On peut gérer les <code>enum</code> comme des objets, et leur ajouter des méthodes, des constructeurs:</p>
+<div class="sourceCode" id="cb39"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb39-1" data-line-number="1"><span class="kw">public</span> <span class="kw">enum</span> ItemMenuPrincipal {</a>
+<a class="sourceLine" id="cb39-2" data-line-number="2">    <span class="fu">MENU_PREFERENCES</span>(<span class="st">&quot;Menu Préférences&quot;</span>),</a>
+<a class="sourceLine" id="cb39-3" data-line-number="3">    <span class="fu">MENU_EDITION</span>(<span class="st">&quot;Menu Edition&quot;</span>),</a>
+<a class="sourceLine" id="cb39-4" data-line-number="4">    <span class="fu">MENU_SORTIR</span>(<span class="st">&quot;Sortie du programme&quot;</span>);</a>
+<a class="sourceLine" id="cb39-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb39-6" data-line-number="6">    <span class="kw">private</span> <span class="bu">String</span> representation;</a>
+<a class="sourceLine" id="cb39-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb39-8" data-line-number="8">    <span class="kw">private</span> <span class="fu">ItemMenuPrincipal</span>(<span class="bu">String</span> representation){</a>
+<a class="sourceLine" id="cb39-9" data-line-number="9">        <span class="kw">this</span>.<span class="fu">representation</span> = representation;</a>
+<a class="sourceLine" id="cb39-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb39-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb39-12" data-line-number="12">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>(){</a>
+<a class="sourceLine" id="cb39-13" data-line-number="13">        <span class="kw">return</span> representation;</a>
+<a class="sourceLine" id="cb39-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb39-15" data-line-number="15"></a>
+<a class="sourceLine" id="cb39-16" data-line-number="16">    <span class="kw">public</span> <span class="dt">static</span> ItemMenuPrincipal <span class="fu">getItem</span>(<span class="bu">String</span> identifiant){</a>
+<a class="sourceLine" id="cb39-17" data-line-number="17">        <span class="kw">switch</span> (identifiant) {</a>
+<a class="sourceLine" id="cb39-18" data-line-number="18">        <span class="kw">case</span> <span class="st">&quot;1&quot;</span>:</a>
+<a class="sourceLine" id="cb39-19" data-line-number="19">            <span class="kw">return</span> MENU_PREFERENCES;</a>
+<a class="sourceLine" id="cb39-20" data-line-number="20">        <span class="kw">case</span> <span class="st">&quot;2&quot;</span>:</a>
+<a class="sourceLine" id="cb39-21" data-line-number="21">            <span class="kw">return</span> MENU_EDITION;</a>
+<a class="sourceLine" id="cb39-22" data-line-number="22">        <span class="kw">case</span> <span class="st">&quot;3&quot;</span>:</a>
+<a class="sourceLine" id="cb39-23" data-line-number="23">            <span class="kw">return</span> MENU_SORTIR;</a>
+<a class="sourceLine" id="cb39-24" data-line-number="24">        }</a>
+<a class="sourceLine" id="cb39-25" data-line-number="25">        <span class="kw">return</span> <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb39-26" data-line-number="26">    }</a>
+<a class="sourceLine" id="cb39-27" data-line-number="27">}</a></code></pre></div>
+<p>Modifiez la méthode <code>appliquerChoix</code> de la classe <code>AvecLesEnums</code> en supprimant les chaînes écrites <em>en dur</em>.</p>
+<p>On peut même ajouter des comportements (nous reprenons ici les classes <code>Calcul</code> et dérivées :</p>
+<div class="sourceCode" id="cb40"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb40-1" data-line-number="1"><span class="kw">public</span> <span class="kw">enum</span> <span class="bu">Operation</span> {</a>
+<a class="sourceLine" id="cb40-2" data-line-number="2">    <span class="fu">ADDITION</span>(<span class="st">&quot;+&quot;</span>, <span class="kw">new</span> <span class="fu">Addition</span>()),</a>
+<a class="sourceLine" id="cb40-3" data-line-number="3">    <span class="fu">SOUSTRACTION</span>(<span class="st">&quot;-&quot;</span>, <span class="kw">new</span> <span class="fu">Soustraction</span>()),</a>
+<a class="sourceLine" id="cb40-4" data-line-number="4">    <span class="fu">MULTIPLICATION</span>(<span class="st">&quot;x&quot;</span>, <span class="kw">new</span> <span class="fu">Multiplication</span>());</a>
+<a class="sourceLine" id="cb40-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb40-6" data-line-number="6">    <span class="kw">private</span> <span class="bu">String</span> representation;</a>
+<a class="sourceLine" id="cb40-7" data-line-number="7">    <span class="kw">private</span> Calcul calcul ;</a>
+<a class="sourceLine" id="cb40-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb40-9" data-line-number="9">    <span class="kw">private</span> <span class="bu">Operation</span>(<span class="bu">String</span> representation, Calcul calcul){</a>
+<a class="sourceLine" id="cb40-10" data-line-number="10">        <span class="kw">this</span>.<span class="fu">representation</span> = representation;</a>
+<a class="sourceLine" id="cb40-11" data-line-number="11">        <span class="kw">this</span>.<span class="fu">calcul</span> = calcul;</a>
+<a class="sourceLine" id="cb40-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb40-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb40-14" data-line-number="14">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">execute</span>(<span class="dt">int</span> operandeA, <span class="dt">int</span> operandeB){</a>
+<a class="sourceLine" id="cb40-15" data-line-number="15">        calcul.<span class="fu">calculer</span>(operandeA, operandeB);</a>
+<a class="sourceLine" id="cb40-16" data-line-number="16">        <span class="kw">return</span> calcul.<span class="fu">getResultat</span>();</a>
+<a class="sourceLine" id="cb40-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb40-18" data-line-number="18">}</a></code></pre></div>
+<p>Ce qui permet notamment de simplifier le code par ailleurs :</p>
+<div class="sourceCode" id="cb41"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb41-1" data-line-number="1"><span class="bu">Operation</span> op = ADDITION;</a>
+<a class="sourceLine" id="cb41-2" data-line-number="2">op.<span class="fu">execute</span>(<span class="dv">10</span>, <span class="dv">23</span>);</a></code></pre></div>
+<div class="important">
+<p><strong>Attention</strong>: pour que ce code compile, il faut ajouter un <code>import static</code> en début de fichier.</p>
+</div>
+<div class="sourceCode" id="cb42"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb42-1" data-line-number="1"><span class="kw">import static</span><span class="im"> com.example.calculatrice.Operation.*;</span></a></code></pre></div>
+<h2 id="application-nombre-de-jours-dans-le-mois">Application : nombre de jours dans le mois</h2>
+<p>Écrire un <code>enum</code> <code>Mois</code> permettant de récupérer :</p>
+<ul>
+<li>le nom du mois</li>
+<li>le numéro du mois</li>
+<li>le nombre de jour dans le mois (en fonction d’un paramètre: l’année)</li>
+</ul>
+<p>On rappelle que :</p>
+<ul>
+<li>le mois de février compte 28 jours sauf si l’année est bissextile (29 jours dans ce cas)</li>
+<li>une année est bissextile si elle est divisible par 4</li>
+<li>une année <strong>n’est pas</strong> bissextile si elle est divisible par 100 (exception faite des années divisibles par 400, qui sont elles bissextiles).</li>
+</ul>
+<p>Vous écrirez les tests unitaires permettant de tester cet <code>enum</code>.</p>
+<h1 id="exercices">Exercices</h1>
+<h2 id="gestion-dune-liste-dentiers">Gestion d’une liste d’entiers</h2>
+<p>Nous allons définir une classe <code>TableauEntier</code> permettant de stocker des entiers dans une structure dynamique.</p>
+<p>Cette classe doit empêcher tout modification non contrôlée de ses attributs (encapsulation).</p>
+<p>Pour cela, vous allez utiliser un tableau d’entiers (<code>int[]</code>) dans lequel vous devrez gérer les opérations d’ajout, de suppression et d’insertion des valeurs.</p>
+<p>La taille initiale de ce tableau sera <code>5</code> et sera incrémentée de 5 en 5, quand le nombre d’éléments dépassera la taille disponible.</p>
+<p>Pour cela nous allons définir les méthodes suivantes:</p>
+<ul>
+<li><code>void inserer(int index, int valeur)</code> : insère un entier dans le tableau en à l’index donné. Si l’index dépasse la taille du tableau, l’ajout se fait en dernière position (après avoir augmenté la taille du tableau).</li>
+<li><code>void supprimer(int index)</code> : supprime l’entier situé à l’index donné en paramètre du tableau. Les autres valeurs sont alors décalées pour éviter les espaces vides.</li>
+<li><code>int taille()</code> : donne la taille du tableau</li>
+<li><code>public String toString()</code> : récupère une représentation sous forme de chaîne de caractères du tableau.
+<ul>
+<li>Chaque entier est séparé par une virgule</li>
+<li>l’ensemble est encadré par des <code>[]</code></li>
+<li>Exemple : <code>&quot;[1,3,45]&quot;</code></li>
+</ul></li>
+</ul>
+<p>Si le tableau <code>int[]</code> devient trop petit, vous devrez en définir un nouveau plus grand et recopier son contenu.</p>
+<p>La classe <code>EssaiTableauEntier</code> comportera une méthode <code>main(String[] args)</code> et permettra de tester votre classe, par exemple en demandant à l’utilisateur de saisir des informations.</p>
+</body>
+</html>

+ 668 - 0
05-Exceptions.html

@@ -0,0 +1,668 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Les exceptions</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Les exceptions</div>
+<nav id="TOC">
+<ul>
+<li><a href="#les-exceptions">Les Exceptions</a><ul>
+<li><a href="#déroulement-dun-programme">Déroulement d’un programme</a></li>
+<li><a href="#traitement-des-événements-exceptionnels-en-java">Traitement des événements exceptionnels en Java</a></li>
+<li><a href="#exemples-de-code">Exemples de code</a><ul>
+<li><a href="#traitement-facultatif">Traitement facultatif</a></li>
+<li><a href="#traitement-imposé-à-la-compilation">Traitement imposé à la compilation</a></li>
+<li><a href="#exemple-readshort">Exemple : readShort</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#gestion-des-exceptions">Gestion des exceptions</a><ul>
+<li><a href="#traitement-dans-la-méthode-où-lexception-se-produit">Traitement dans la méthode où l’exception se produit</a></li>
+<li><a href="#traitement-dans-la-méthode-appelante">Traitement dans la méthode appelante</a></li>
+</ul></li>
+<li><a href="#types-dexceptions">Types d’exceptions</a><ul>
+<li><a href="#le-type-throwable">Le type Throwable</a></li>
+<li><a href="#exceptions-non-vérifiées">Exceptions non vérifiées</a><ul>
+<li><a href="#runtime-exception">Runtime Exception</a></li>
+<li><a href="#error">Error</a></li>
+</ul></li>
+<li><a href="#exceptions-vérifiées">Exceptions vérifiées</a><ul>
+<li><a href="#exceptions-à-traiter-obligatoirement">Exceptions à traiter obligatoirement</a></li>
+<li><a href="#exemples-dévénements-anormaux">Exemples d’événements anormaux</a></li>
+</ul></li>
+<li><a href="#hiérarchie-de-classes">Hiérarchie de classes</a></li>
+</ul></li>
+<li><a href="#exemple-concret">Exemple concret</a></li>
+<li><a href="#création-et-levée-de-vos-propres-exceptions">Création et levée de vos propres exceptions</a><ul>
+<li><a href="#création-dexception">Création d’exception</a><ul>
+<li><a href="#création-dexception-1">Création d’exception</a></li>
+</ul></li>
+<li><a href="#levée-dexception">Levée d’exception</a><ul>
+<li><a href="#programme">Programme</a></li>
+<li><a href="#explications">Explications</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#calcul">Calcul</a></li>
+<li><a href="#le-nom-de-lexception">Le nom de l’exception</a></li>
+<li><a href="#factorielle">Factorielle</a></li>
+<li><a href="#gestion-de-mot-de-passe">Gestion de mot de passe</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="les-exceptions">Les Exceptions</h1>
+<h2 id="déroulement-dun-programme">Déroulement d’un programme</h2>
+<p>Lors de l’exécution d’un programme, on a une chaîne d’appel.</p>
+<div class="incremental">
+<p>Chaque élément de la chaîne est sollicité par un appelant (<code>caller</code>).</p>
+</div>
+<div class="incremental">
+<p>L’élément sollicité est nommé <em>appelé</em> (<code>callee</code>).</p>
+<p>L’exemple qui suit montre la lecture de données sur un support de stockage.</p>
+<figure>
+<img src="images/ExceptionsPileAppelReseau.png" alt="Déroulement normal d’un programme" /><figcaption>Déroulement normal d’un programme</figcaption>
+</figure>
+<p>A chaque niveau d’appel, un problème peut survenir.</p>
+<figure>
+<img src="images/ExceptionsPileAppelReseauErreurs.png" alt="Erreurs possibles" /><figcaption>Erreurs possibles</figcaption>
+</figure>
+<p>Quelle décision doit prendre un élément <em>appelé</em> quant au traitement du problème ?</p>
+<ul>
+<li>Peut-il continuer l’exécution du programme comme si rien ne s’était passé ?
+<ul>
+<li>dans ce cas il risque de compromettre le bon fonctionnement de son appelant</li>
+</ul></li>
+<li>Comment prévenir l’appelant que son exécution ne s’est pas déroulée correctement ? quel mécanisme utiliser pour renvoyer ?
+<ul>
+<li>une valeur indiquant une erreur</li>
+<li>un événement inattendu ?</li>
+</ul></li>
+</ul>
+<p>Et de tous les appelants de la chaîne, quel est celui qui doit traiter l’événement exceptionnel ?</p>
+<p>Java propose un mécanisme puissant permettant de gérer tous ces cas de figure</p>
+</div>
+<h2 id="traitement-des-événements-exceptionnels-en-java">Traitement des événements exceptionnels en Java</h2>
+<p>Les exceptions sont des anomalies susceptibles de se produire dans un programme Java, écartant celui—ci du comportement normal ou souhaité.</p>
+<p>On dit alors qu’une exception est <strong>levée</strong>.</p>
+<p>Les origines des exceptions sont diverses :</p>
+<ul>
+<li>manque de mémoire,</li>
+<li>division par zéro,</li>
+<li>tentative d’ouverture d’un fichier inexistant,</li>
+<li>etc.</li>
+</ul>
+<p>Le comportement à adopter sera différent suivant la nature des exceptions.</p>
+<p>Le compilateur Java impose la gestion des exceptions lorsque vous tentez d’utiliser des méthodes prévoyants des exceptions.</p>
+<p><strong>Par exemple</strong>, la méthode <a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html"><code>readShort</code> de la classe <code>DataInputStream</code></a> qui lit depuis un fichier peut éventuellement lever des exceptions <code>IOException</code>; elle est donc définie avec un modificateur spécial <code>throws</code> qui signale ces erreurs potentielles.</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="kw">public</span> <span class="dt">final</span> <span class="dt">short</span> <span class="fu">readShort</span>() <span class="kw">throws</span> <span class="bu">IOException</span></a></code></pre></div>
+<h2 id="exemples-de-code">Exemples de code</h2>
+<h3 id="traitement-facultatif">Traitement facultatif</h3>
+<p>Un exemple d’exception dont le traitement n’est pas imposé :</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> ExceptionDemo {</a>
+<a class="sourceLine" id="cb2-2" data-line-number="2">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testTableau</span>(){</a>
+<a class="sourceLine" id="cb2-3" data-line-number="3">        <span class="dt">int</span>[] tableauEntier = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">5</span>];</a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">        tableauEntier[<span class="dv">6</span>] = <span class="dv">12</span>; <span class="co">//On est en dehors des limites du tableau</span></a>
+<a class="sourceLine" id="cb2-5" data-line-number="5">    }</a>
+<a class="sourceLine" id="cb2-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb2-7" data-line-number="7">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb2-8" data-line-number="8">        <span class="kw">new</span> <span class="fu">ExceptionDemo</span>().<span class="fu">testTableau</span>(); <span class="co">//ArrayIndexOutOfBoundsException</span></a>
+<a class="sourceLine" id="cb2-9" data-line-number="9">    }</a>
+<a class="sourceLine" id="cb2-10" data-line-number="10">}</a></code></pre></div>
+<h3 id="traitement-imposé-à-la-compilation">Traitement imposé à la compilation</h3>
+<p>Un exemple d’exception dont le traitement est imposé par le compilateur:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.io.File;</span></a>
+<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.io.FileInputStream;</span></a>
+<a class="sourceLine" id="cb3-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ExceptionDemo {</a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testFichier</span>(){</a>
+<a class="sourceLine" id="cb3-5" data-line-number="5">    <span class="bu">File</span> file = <span class="kw">new</span> <span class="bu">File</span>(<span class="st">&quot;NExistePas.txt&quot;</span>);</a>
+<a class="sourceLine" id="cb3-6" data-line-number="6">    <span class="co">//Ci-dessous: ERREUR de COMPILATION</span></a>
+<a class="sourceLine" id="cb3-7" data-line-number="7">    <span class="co">//Unhandled exception type FileNotFoundException    ExceptionDemo.java</span></a>
+<a class="sourceLine" id="cb3-8" data-line-number="8">    <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(file);</a>
+<a class="sourceLine" id="cb3-9" data-line-number="9">    }</a>
+<a class="sourceLine" id="cb3-10" data-line-number="10">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb3-11" data-line-number="11">    <span class="kw">new</span> <span class="fu">ExceptionDemo</span>().<span class="fu">testFichier</span>();</a>
+<a class="sourceLine" id="cb3-12" data-line-number="12">  }</a>
+<a class="sourceLine" id="cb3-13" data-line-number="13">}</a></code></pre></div>
+<h3 id="exemple-readshort">Exemple : readShort</h3>
+<p>Cet exemple montre la méthode <code>readShort</code> lève une exception:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb4-3" data-line-number="3">FileInputstream fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb4-4" data-line-number="4"><span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb4-5" data-line-number="5"><span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb4-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb4-7" data-line-number="7"><span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>(); <span class="co">//Levée d&#39;IOException</span></a></code></pre></div>
+<p>La méthode <code>readshort</code> est définie comme suit :</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="dt">final</span> <span class="dt">short</span> <span class="fu">readShort</span>() <span class="kw">throws</span> <span class="bu">IOException</span></a></code></pre></div>
+<p>En Java on est obligé de traiter les exceptions dans le code, sinon il ne peut être compilé et le message suivant est affiché :</p>
+<pre><code>Exception java.lang.InterruptedException
+must be caught or it must be declared in the throws clause of this method.</code></pre>
+<p>La méthode <code>readShort</code> levant une exception, le code de l’exemple précédent ne passe pas à la compilation.</p>
+<h1 id="gestion-des-exceptions">Gestion des exceptions</h1>
+<p>Lorsqu’une exception est levée, le déroulement du code est interrompu et le traitement des exceptions consiste alors à rechercher quelles dispositions prendre.</p>
+<p>Au niveau de la programmation, il est possible de prévoir deux modes de codage :</p>
+<ol type="1">
+<li>Soit la méthode dont le code a été interrompu dispose des informations suffisantes</li>
+</ol>
+<p>pour corriger certaines anomalies observées</p>
+<pre><code>(ou bien pour émettre des messages d’erreur explicites).</code></pre>
+<p>Dans ce cas, la méthode décide de traiter elle-même certaines exceptions dans des <em>blocs <code>catch</code></em> associés à un <em>bloc <code>try</code></em>.</p>
+<ol start="2" type="1">
+<li>Soit la méthode concernée ne dispose pas elle-même des informations suffisantes</li>
+</ol>
+<p>pour traiter certains types d’exceptions,</p>
+<pre><code>mais les méthodes appelantes peuvent disposer de ces informations.</code></pre>
+<p>Dans ce cas les exceptions sont déclarées dans la <em>clause <code>throws</code></em> de la signature de la méthode afin que les méthodes appelantes soient informées des types d’exccptions susceptibles d’être levées par une méthode.</p>
+<h2 id="traitement-dans-la-méthode-où-lexception-se-produit">Traitement dans la méthode où l’exception se produit</h2>
+<p>Reprenons l’exemple précédent :</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
+<a class="sourceLine" id="cb9-2" data-line-number="2">  <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb9-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb9-4" data-line-number="4">  FileInputstream fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">  BufferedInputstream bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb9-6" data-line-number="6">  DataInputstream dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb9-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">  <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
+<a class="sourceLine" id="cb9-9" data-line-number="9">  <span class="co">//...</span></a>
+<a class="sourceLine" id="cb9-10" data-line-number="10">}</a></code></pre></div>
+<p>La première étape consiste à inclure le code susceptible de lever des exceptions dans un <em>bloc <code>try { ... }</code></em></p>
+<p>A un <em>bloc <code>try</code></em> doivent être associées une ou plusieurs <em>clauses <code>catch</code></em> et éventuellement un <em>bloc <code>finally</code></em>.</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
+<a class="sourceLine" id="cb10-2" data-line-number="2">    <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-3" data-line-number="3">      <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb10-4" data-line-number="4">      <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb10-5" data-line-number="5">      <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb10-6" data-line-number="6">      <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb10-7" data-line-number="7">      <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
+<a class="sourceLine" id="cb10-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb10-9" data-line-number="9">    <span class="kw">catch</span> ( <span class="bu">Exception</span> e ) {</a>
+<a class="sourceLine" id="cb10-10" data-line-number="10">      <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot; exception: &quot;</span> + e.<span class="fu">getMessage</span>());</a>
+<a class="sourceLine" id="cb10-11" data-line-number="11">      e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb10-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb10-13" data-line-number="13">}</a></code></pre></div>
+<p>Ou plus finement (il est <strong>toujours préférable</strong> de gérer les exceptions selon leur type) :</p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.io.BufferedInputStream;</span></a>
+<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.io.DataInputStream;</span></a>
+<a class="sourceLine" id="cb11-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.io.File;</span></a>
+<a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.io.FileInputStream;</span></a>
+<a class="sourceLine" id="cb11-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.io.FileNotFoundException;</span></a>
+<a class="sourceLine" id="cb11-6" data-line-number="6"><span class="kw">import</span><span class="im"> java.io.IOException;</span></a>
+<a class="sourceLine" id="cb11-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> GestionExceptionProgramme {</a>
+<a class="sourceLine" id="cb11-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
+<a class="sourceLine" id="cb11-9" data-line-number="9">        <span class="bu">DataInputStream</span> dis = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb11-10" data-line-number="10">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb11-11" data-line-number="11">            <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb11-12" data-line-number="12">            <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb11-13" data-line-number="13">            <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb11-14" data-line-number="14">            dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb11-15" data-line-number="15">            <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span> () ;</a>
+<a class="sourceLine" id="cb11-16" data-line-number="16">        }</a>
+<a class="sourceLine" id="cb11-17" data-line-number="17">        <span class="kw">catch</span> ( <span class="bu">FileNotFoundException</span> f ) { <span class="co">// sous—classe de IOException</span></a>
+<a class="sourceLine" id="cb11-18" data-line-number="18">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;exception: &quot;</span> + f.<span class="fu">getMessage</span>());</a>
+<a class="sourceLine" id="cb11-19" data-line-number="19">            f.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb11-20" data-line-number="20">        }</a>
+<a class="sourceLine" id="cb11-21" data-line-number="21">        <span class="kw">catch</span> ( <span class="bu">IOException</span> e ) { <span class="co">// sous—classe de Exception</span></a>
+<a class="sourceLine" id="cb11-22" data-line-number="22">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;exception: &quot;</span> + e.<span class="fu">getMessage</span>());</a>
+<a class="sourceLine" id="cb11-23" data-line-number="23">            e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb11-24" data-line-number="24">        }</a>
+<a class="sourceLine" id="cb11-25" data-line-number="25">        <span class="kw">finally</span> { <span class="co">//Ferme proprement le fichier</span></a>
+<a class="sourceLine" id="cb11-26" data-line-number="26">            <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb11-27" data-line-number="27">                <span class="kw">if</span> (dis != <span class="kw">null</span>){ dis.<span class="fu">close</span>(); }</a>
+<a class="sourceLine" id="cb11-28" data-line-number="28">            } <span class="kw">catch</span> (<span class="bu">IOException</span> e) {</a>
+<a class="sourceLine" id="cb11-29" data-line-number="29">                e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb11-30" data-line-number="30">            }</a>
+<a class="sourceLine" id="cb11-31" data-line-number="31">        }</a>
+<a class="sourceLine" id="cb11-32" data-line-number="32">    }</a>
+<a class="sourceLine" id="cb11-33" data-line-number="33">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb11-34" data-line-number="34">        <span class="kw">new</span> <span class="fu">GestionExceptionProgramme</span>()</a>
+<a class="sourceLine" id="cb11-35" data-line-number="35">          .<span class="fu">lireImageRGB</span>(<span class="st">&quot;UnFichierInexistant.jpg&quot;</span>);</a>
+<a class="sourceLine" id="cb11-36" data-line-number="36">    }</a>
+<a class="sourceLine" id="cb11-37" data-line-number="37">}</a></code></pre></div>
+<p>Le <em>bloc <code>try</code></em> commence avant la ligne <code>File f = new File(filename);</code> car le constructeur de la classe <code>File</code> peut lui aussi lever une exception de type <code>NullPointerException</code>, dans le cas où le nom de fichier passé en paramètre est égal à <code>null</code>.</p>
+<p>Si une exception se produit dans un <em>bloc <code>try</code></em>, l’exécution de code est interrompue et les <em>clauses <code>catch</code></em> qui lui sont associées sont examinées dans l’ordre pour chercher si l’unc d’elles a prévu un traitement de l’exception produite. Les <em>clauses <code>catch</code></em> sont comme des méthodes recevant un seul argument.</p>
+<p>Si une <em>clause <code>catch</code></em> correspond à l’exception, elle prend le contrôle de l’exécution.</p>
+<p>Le code d’un bloc associé à une <em>clause <code>finally</code></em> est exécuté dans tous les cas, soit après une exécution normale du <em>bloc <code>try</code></em> soit après traitement d’une exception</p>
+<h2 id="traitement-dans-la-méthode-appelante">Traitement dans la méthode appelante</h2>
+<p>Pour indiquer que l’<code>Exception</code> n’est pas gérée dans la méthode <code>lireImageRGB()</code> et que par conséquent, elle le sera dans la méthode appelante, on utilise la <em>clause <code>throws</code></em>.</p>
+<p>Reprenons l’exemple précédent :</p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) <span class="kw">throws</span> <span class="bu">Exception</span> {</a>
+<a class="sourceLine" id="cb12-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb12-3" data-line-number="3">  <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb12-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb12-5" data-line-number="5">  <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb12-6" data-line-number="6">  <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis, (<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb12-7" data-line-number="7">  <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb12-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb12-9" data-line-number="9">  <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
+<a class="sourceLine" id="cb12-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb12-11" data-line-number="11">}</a></code></pre></div>
+<p>ou plus finement</p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename )</a>
+<a class="sourceLine" id="cb13-2" data-line-number="2">    <span class="kw">throws</span>  <span class="bu">FileNotFoundException</span>,</a>
+<a class="sourceLine" id="cb13-3" data-line-number="3">            <span class="bu">IOException</span>  {</a>
+<a class="sourceLine" id="cb13-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb13-5" data-line-number="5">  <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
+<a class="sourceLine" id="cb13-6" data-line-number="6">  <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
+<a class="sourceLine" id="cb13-7" data-line-number="7">  <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis, (<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">  <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">  <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">}</a></code></pre></div>
+<h1 id="types-dexceptions">Types d’exceptions</h1>
+<h2 id="le-type-throwable">Le type Throwable</h2>
+<p>Une exception est un objet (instance d’une classe qui hérite de la classe <code>Throwable</code>) qui possède des données et des méthodes membres.</p>
+<figure>
+<img src="images/ClassesException.png" alt="La classe Exception" /><figcaption>La classe <code>Exception</code></figcaption>
+</figure>
+<p><code>Throwable</code> a deux sous-classes : <code>Error</code> et <code>Exception</code>.</p>
+<p>Les instances d’<code>Error</code> sont des erreurs internes de l’environnement d’exécution Java (la machine virtuelle). Ces erreurs sont rares, et habituellement fatales; ces exceptions ne doivent pas être levées, ni capturées dans un programme.</p>
+<p>Les sous-classes d’<code>Exception</code> sont réparties entre deux catégories :</p>
+<h2 id="exceptions-non-vérifiées">Exceptions non vérifiées</h2>
+<h3 id="runtime-exception">Runtime Exception</h3>
+<p>Un bloc <code>try/catch</code> n’est pas imposé pour traiter ces exceptions</p>
+<ul>
+<li>Les exceptions d’exécution (<em>runtime exceptions</em>), sous-classes de la classe <code>RuntimeException</code> telles que:
+<ul>
+<li>ArrayIndexOutOfBoundsException</li>
+<li>SecurityException,</li>
+<li>ou NullPointerException.</li>
+</ul>
+<p>Ces exceptions sont généralement liées à un défaut de robustesse du code.</p>
+<p>Mettre des <code>try/catch</code> pour ces exceptions rendrait le code illisible.</p></li>
+</ul>
+<h3 id="error">Error</h3>
+<p>Les erreurs font parties des objets Throwables non vérifiés:</p>
+<ul>
+<li>il n’est pas imposé d’écrire un bloc <code>try...catch</code> pour les gérer</li>
+</ul>
+<h2 id="exceptions-vérifiées">Exceptions vérifiées</h2>
+<h3 id="exceptions-à-traiter-obligatoirement">Exceptions à traiter obligatoirement</h3>
+<p>Bloc <code>try/catch</code> obligatoire</p>
+<ul>
+<li>Exceptions qui correspondent à des évènements <em>anormaux</em>, échappant au contrôle du programme</li>
+</ul>
+<h3 id="exemples-dévénements-anormaux">Exemples d’événements anormaux</h3>
+<ul>
+<li><code>EOFException</code>
+<ul>
+<li>se produit lorsque vous lisez dans un fichier</li>
+<li>et que celui-ci se termine prématurément.</li>
+</ul></li>
+</ul>
+<h2 id="hiérarchie-de-classes">Hiérarchie de classes</h2>
+<p>La hiérarchie des exceptions est comme celle des autres classes, les super-classes correspondant à des erreurs plus générales, et les sous-classes à des erreurs plus spécifiques.</p>
+<p>La plupart des exceptions font partie du package <code>java.lang</code> (qui inclut <code>Throwable</code>, <code>Exception</code> et <code>RuntimeException</code>). Mais un grand nombre d’autres packages définissent d’autres exceptions, et ces exceptions sont utilisées dans toute la bibliothèque de classes.</p>
+<p><strong>Par exemple</strong></p>
+<p>Le package <code>java.io</code> définit une classe générale d’exceptions appelée <code>IOException</code>, qui est sous-classée non seulement dans le package <code>java.io</code> pour les exceptions (d’entrée et de sortie (<code>EOFException</code>, <code>FileNotFoundException</code>), mais aussi dans les classes du package <code>java.net</code> pour les exceptions de réseau telles que <code>MalFormedURLException</code>.</p>
+<p>Ci dessous, est représentée une partie de la hiérarchie des exceptions.</p>
+<div class="nonincremental">
+<ul>
+<li><p><code>java.lang.Exception</code></p>
+<ul>
+<li><code>java.lang.ClassNotFoundException</code></li>
+<li><code>java.lang.CloneNotSupportedException</code></li>
+<li><code>java.lang.IllegalAccessException</code></li>
+<li><code>java.lang.InstantiationException</code></li>
+<li><code>java.lang.InterruptedException</code></li>
+<li><code>java.lang.NoSuchFieldException</code></li>
+<li><code>java.lang.NoSuchMethodException</code></li>
+<li><p><code>java.lang.RuntimeException</code></p>
+<ul>
+<li><code>java.lang.ArithmeticException</code></li>
+<li><code>java.lang.ArrayStoreException</code></li>
+<li><code>java.lang.ClassCastException</code></li>
+<li><code>java.lang.IllegalArgumentException</code>
+<ul>
+<li><code>java.lang.NumberFormatException</code></li>
+</ul></li>
+<li><code>java.lang.IllegalMonitorStateException</code></li>
+<li><code>java.lang.IllegalStateException</code></li>
+<li><code>java.lang.IndexOutOfBoundsException</code>
+<ul>
+<li><code>java.lang.ArrayIndexOutOfBoundsException</code></li>
+<li><code>java.lang.StringIndexOutOfBoundsException</code></li>
+</ul></li>
+<li><code>java.lang.NegativeArraySizeException</code></li>
+<li><code>java.lang.NullPointerException</code></li>
+<li><code>java.lang.SecurityException</code></li>
+<li><code>java.lang.UnsupportedOperationException</code></li>
+</ul></li>
+<li><p><code>java.io.IOException</code></p>
+<ul>
+<li><code>java.io.CharConversionException</code></li>
+<li><code>java.io.FileNotFoundException</code></li>
+<li><code>java.io.InterruptedIOException</code></li>
+<li><code>java.io.ObjectStreamException</code></li>
+</ul></li>
+</ul></li>
+</ul>
+</div>
+<h1 id="exemple-concret">Exemple concret</h1>
+<p>Prenons l’exemple suivant :</p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb14-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> ExceptionCatch {</a>
+<a class="sourceLine" id="cb14-3" data-line-number="3">    <span class="dt">int</span> <span class="fu">moyenne</span>(<span class="bu">String</span>[] liste) {</a>
+<a class="sourceLine" id="cb14-4" data-line-number="4">        <span class="dt">int</span> somme = <span class="dv">0</span>, entier, nbNotes = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb14-5" data-line-number="5">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; liste.<span class="fu">length</span>;i++) {</a>
+<a class="sourceLine" id="cb14-6" data-line-number="6">            <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb14-7" data-line-number="7">                entier = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(liste[i]);</a>
+<a class="sourceLine" id="cb14-8" data-line-number="8">                somme += entier;</a>
+<a class="sourceLine" id="cb14-9" data-line-number="9">                nbNotes++;</a>
+<a class="sourceLine" id="cb14-10" data-line-number="10">            }</a>
+<a class="sourceLine" id="cb14-11" data-line-number="11">            <span class="kw">catch</span> (<span class="bu">NumberFormatException</span> e) {</a>
+<a class="sourceLine" id="cb14-12" data-line-number="12">                <span class="kw">if</span> ( i == <span class="dv">0</span> ) {</a>
+<a class="sourceLine" id="cb14-13" data-line-number="13">                    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La 1ere note n&#39;est pas entiere&quot;</span>);</a>
+<a class="sourceLine" id="cb14-14" data-line-number="14">                }</a>
+<a class="sourceLine" id="cb14-15" data-line-number="15">                <span class="kw">else</span> {</a>
+<a class="sourceLine" id="cb14-16" data-line-number="16">                    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La &quot;</span>+(i+<span class="dv">1</span>)+<span class="st">&quot;eme note n&#39;est pas entiere&quot;</span>);</a>
+<a class="sourceLine" id="cb14-17" data-line-number="17">                }</a>
+<a class="sourceLine" id="cb14-18" data-line-number="18">            }</a>
+<a class="sourceLine" id="cb14-19" data-line-number="19">        }</a>
+<a class="sourceLine" id="cb14-20" data-line-number="20">        <span class="kw">return</span> somme/nbNotes;</a>
+<a class="sourceLine" id="cb14-21" data-line-number="21">    }</a>
+<a class="sourceLine" id="cb14-22" data-line-number="22">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] argv) {</a>
+<a class="sourceLine" id="cb14-23" data-line-number="23">        <span class="bu">String</span>[] liste = {<span class="st">&quot;1&quot;</span>, <span class="st">&quot;5&quot;</span>, <span class="st">&quot;toto&quot;</span>};</a>
+<a class="sourceLine" id="cb14-24" data-line-number="24"></a>
+<a class="sourceLine" id="cb14-25" data-line-number="25">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(</a>
+<a class="sourceLine" id="cb14-26" data-line-number="26">                <span class="st">&quot;La moyenne est &quot;</span> + <span class="kw">new</span> <span class="fu">ExceptionCatch</span>().<span class="fu">moyenne</span>(liste));</a>
+<a class="sourceLine" id="cb14-27" data-line-number="27">    }</a>
+<a class="sourceLine" id="cb14-28" data-line-number="28">}</a></code></pre></div>
+<p>On obtient en sortie:</p>
+<pre><code>La 3eme note n&#39;est pas entiere
+La moyenne est 3</code></pre>
+<p>Si on remplace la ligne</p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="bu">String</span>[] liste = {<span class="st">&quot;1&quot;</span>, <span class="st">&quot;5&quot;</span>, <span class="st">&quot;toto&quot;</span>};</a></code></pre></div>
+<p>Par</p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="bu">String</span>[] liste = {<span class="st">&quot;toto&quot;</span>, <span class="st">&quot;15.5&quot;</span>};</a></code></pre></div>
+<p>On obtient:</p>
+<pre><code>La 1ere note n&#39;est pas entiere
+La 2eme note n&#39;est pas entiere
+Exception in thread &quot;main&quot; java.lang.ArithmeticException: / by zero
+    at ExceptionCatch.moyenne(ExceptionCatch.java:20)
+    at ExceptionCatch.main(ExceptionCatch.java:26)</code></pre>
+<p>Dans cet exemple deux types d’exceptions peuvent être levées :</p>
+<ul>
+<li><code>java.lang.NumberFormatException</code> : lancée par la méthode parseInt: de la classe Integer si la chaine de caractères <code>liste[i]</code> ne correspond pas à un entier. Les instructions suivantes ne sont alors pas effectuées. Ici donc, si <code>liste[i]</code> ne décrit pas un entier, les deux instructions qui suivent :</li>
+</ul>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1">  somme+=entier;</a>
+<a class="sourceLine" id="cb19-2" data-line-number="2">  nbNotes++;</a></code></pre></div>
+<p>ne sont pas effectuées, et on passe à l’instruction <code>println</code> intérieure au “<em>bloc <code>catch</code></em>”, puis on remonte dans la “boucle for” qui reprend son déroulement.</p>
+<ul>
+<li><code>java.lang.ArithmeticException</code> : si <code>nbNotes</code> vaut 0, une exception, instance de <code>java.lang.ArithmeticException</code> est lancée.</li>
+</ul>
+<p>Celle—ci n’étant pas attrapée, elle se propage alors jusqu’à la fin du programme, comme on peut le constater sur le deuxième exemple d’exécution.</p>
+<p>Mais seule l’exception <code>java.lang.NumberFormatException</code> doit être obligatoirement traitée, soit localement (c’est le cas ici), soit dans la méthode appelante. En effet la méthode <code>parseInt</code> prévoyant cette exception, le compilateur oblige la gestion de l’exception dans le code.</p>
+<h1 id="création-et-levée-de-vos-propres-exceptions">Création et levée de vos propres exceptions</h1>
+<h2 id="création-dexception">Création d’exception</h2>
+<p>Il est possible pour le programmeur de créer ses propres classes d’exception en héritant soit de la classe <code>Exception</code> (sommet de la hiérarchie des classes explicites), soit en cherchant une exception plus proche de celle que l’on veut créer. Par exemple : une exception pour un mauvais format de fichier doit normalement être une <code>IOException</code>.</p>
+<p>Les classes d’exceptions ont typiquement deux constructeurs : le premier ne prend pas d’argument, et le second prend une seule chaîne comme argument. Dans le second, vous devez appeler <code>super()</code> dans le constructeur pour vous assurer que la chaine est utilisée au bon endroit dans l’exception.</p>
+<p>Les classes d’exceptions ont le même aspect que d’autres classes. Vous pouvez les placer dans leur propres fichiers source et les compiler comme n’importe quelles autres classes.</p>
+<h3 id="création-dexception-1">Création d’exception</h3>
+<div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> NotesNonValidesException <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
+<a class="sourceLine" id="cb20-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb20-3" data-line-number="3">    <span class="kw">public</span> <span class="fu">NotesNonValidesException</span>(<span class="bu">String</span> message) {</a>
+<a class="sourceLine" id="cb20-4" data-line-number="4">    <span class="co">// message sera utilisé</span></a>
+<a class="sourceLine" id="cb20-5" data-line-number="5">        <span class="kw">super</span>(message); <span class="co">// par la méthode getMessage()</span></a>
+<a class="sourceLine" id="cb20-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb20-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb20-8" data-line-number="8">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>() {</a>
+<a class="sourceLine" id="cb20-9" data-line-number="9">        <span class="co">// Rappel : cette méthode permet</span></a>
+<a class="sourceLine" id="cb20-10" data-line-number="10">        <span class="co">// de convertir l&#39;objet en une</span></a>
+<a class="sourceLine" id="cb20-11" data-line-number="11">        <span class="kw">return</span>(<span class="st">&quot;Aucune note n&#39;est valide&quot;</span>); <span class="co">// chaîne de caractères</span></a>
+<a class="sourceLine" id="cb20-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb20-13" data-line-number="13">}</a></code></pre></div>
+<h2 id="levée-dexception">Levée d’exception</h2>
+<p>L’exception est levée dans le code à l’aide de la <em>clause <code>throw</code></em>.</p>
+<p>Reprenons l’exemple précédent (<code>ExceptionCatch</code>). Imaginons que nous voulions éviter, l’exception <code>java.lang.ArithmeticException</code>.</p>
+<p>Une solution consiste à tester si <code>nbNotes == 0</code>, avant d’effectuer le calcul de la moyenne et à signaler le problème en levant l’exception créée précédemment (<code>NotesNonValidesException</code>).</p>
+<h3 id="programme">Programme</h3>
+<div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb21-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> TraiterNotes {</a>
+<a class="sourceLine" id="cb21-3" data-line-number="3">    <span class="dt">static</span> <span class="dt">int</span> <span class="fu">moyenne</span>(<span class="bu">String</span>[] liste) <span class="kw">throws</span> NotesNonValidesException {</a>
+<a class="sourceLine" id="cb21-4" data-line-number="4">        <span class="dt">int</span> somme = <span class="dv">0</span>,entier, nbNotes = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb21-5" data-line-number="5">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; liste.<span class="fu">length</span>;i++){</a>
+<a class="sourceLine" id="cb21-6" data-line-number="6">            <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb21-7" data-line-number="7">                entier = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(liste[i]);</a>
+<a class="sourceLine" id="cb21-8" data-line-number="8">                somme += entier;</a>
+<a class="sourceLine" id="cb21-9" data-line-number="9">                nbNotes++;</a>
+<a class="sourceLine" id="cb21-10" data-line-number="10">            }</a>
+<a class="sourceLine" id="cb21-11" data-line-number="11">            <span class="kw">catch</span> (<span class="bu">NumberFormatException</span> e) {</a>
+<a class="sourceLine" id="cb21-12" data-line-number="12">        <span class="bu">String</span> msg = <span class="st">&quot;n&#39;est pas entiere&quot;</span>;</a>
+<a class="sourceLine" id="cb21-13" data-line-number="13">                <span class="kw">if</span> (i == <span class="dv">0</span>) {</a>
+<a class="sourceLine" id="cb21-14" data-line-number="14">              msg = <span class="st">&quot;La 1ere note &quot;</span> + msg ;}</a>
+<a class="sourceLine" id="cb21-15" data-line-number="15">                <span class="kw">else</span>{ msg = <span class="st">&quot;La &quot;</span>+(i+<span class="dv">1</span>)+<span class="st">&quot; note &quot;</span> + msg ;}</a>
+<a class="sourceLine" id="cb21-16" data-line-number="16">            }</a>
+<a class="sourceLine" id="cb21-17" data-line-number="17">        }</a>
+<a class="sourceLine" id="cb21-18" data-line-number="18">        <span class="kw">if</span> (nbNotes == <span class="dv">0</span>){ <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">NotesNonValidesException</span>(<span class="st">&quot;Dommage&quot;</span>); }</a>
+<a class="sourceLine" id="cb21-19" data-line-number="19"></a>
+<a class="sourceLine" id="cb21-20" data-line-number="20">        <span class="kw">return</span> somme/nbNotes;</a>
+<a class="sourceLine" id="cb21-21" data-line-number="21">    }</a>
+<a class="sourceLine" id="cb21-22" data-line-number="22"></a>
+<a class="sourceLine" id="cb21-23" data-line-number="23">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] argv) {</a>
+<a class="sourceLine" id="cb21-24" data-line-number="24">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb21-25" data-line-number="25">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La moyenne est &quot;</span>+<span class="fu">moyenne</span>(argv));</a>
+<a class="sourceLine" id="cb21-26" data-line-number="26">        }</a>
+<a class="sourceLine" id="cb21-27" data-line-number="27">        <span class="kw">catch</span> (NotesNonValidesException e) {</a>
+<a class="sourceLine" id="cb21-28" data-line-number="28">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(e);</a>
+<a class="sourceLine" id="cb21-29" data-line-number="29">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(e.<span class="fu">getMessage</span>());</a>
+<a class="sourceLine" id="cb21-30" data-line-number="30">        }</a>
+<a class="sourceLine" id="cb21-31" data-line-number="31">    }</a>
+<a class="sourceLine" id="cb21-32" data-line-number="32">}</a></code></pre></div>
+<p>Pour :</p>
+<pre><code>java TraiterNotes ha 15.5</code></pre>
+<p>On obtient :</p>
+<pre><code>La 1ere note n&#39;est: pas entière
+La 2eme note n&#39;est pas entiere
+Aucune note n&#39;est valide
+Dommage</code></pre>
+<h3 id="explications">Explications</h3>
+<h5 id="throws-notesnonvalidesexception">throws NotesNonvalidesException</h5>
+<p>La méthode <code>moyenne</code> indique ainsi qu’il est possible qu’une de ses instructions envoie une exception de type <code>NotesNonValidesException</code> sans que celle-ci soit attrapée par un mécanisme <code>try</code>-<code>catch</code>.</p>
+<p>Il est obligatoire d’indiquer ainsi un éventuel lancement d’exception non attrapée, sauf pour les exceptions les plus courantes de l‘API (<code>RuntimeException</code>). Si vous oubliez de signaler par la <em>clause <code>throws</code></em> l’éventualité d’un tel lancement d’exception, le compilateur vous le rappelera.</p>
+<h5 id="throw-new-notesnonvalidesexception">throw new NotesNonvalidesException()</h5>
+<p>On demande ainsi le lancement d’une instance de <code>NotesNonvalidesException</code>. Une fois lancée, l’exception se propagera comme expliqué dans l’exemple précédent.</p>
+<p>Ici, il y aura sortie de la méthode <code>moyenne</code>, on se retrouve alors à l’appel de la la méthode <code>moyenne</code> dans le main, appel qui se trouve dans un <em>bloc <code>try</code></em> suivi d’un <em>bloc <code>catch</code></em> qui attrape les <code>NotesNonValidesException</code> :</p>
+<ul>
+<li>l’instruction de ce <em>bloc <code>catch</code></em> est effectuée.</li>
+<li>Le programme reprend alors son cours normal (pour se terminer).</li>
+</ul>
+<h1 id="exercices">Exercices</h1>
+<h2 id="calcul">Calcul</h2>
+<p>Reprendre le programme gérant les opérations mathématique (les sources sont disponibles <a href="data/ch3-Calculs.zip">ici</a>.</p>
+<p>Ajoutez l’opération de <code>Division</code></p>
+<p>Celle-ci devra lever une exception de division par zéro (nouvelle classe <code>DivisionParZeroException</code>). Bien choisir sa classe parente afin d’avoir un minimum de modifications à faire sur l’ensemble des classes (peut-être y a-t-il déjà une classe pouvant correspondre à ce type d’erreur dans l’API Java ?).</p>
+<p>Tester ce programme en rajoutant une clause <code>catch</code> permettant d’afficher un message concernant l’erreur à l’utilisateur.</p>
+<h2 id="le-nom-de-lexception">Le nom de l’exception</h2>
+<p>Prenez les codes suivants et analysez-les:</p>
+<ol type="1">
+<li>renommer les exceptions en leur donnant un nom plus explicite.</li>
+<li>déterminer comment lancer le programme sans qu’une erreur ne se produise depuis Eclipse (aller pour cela dans le menu <code>Run &gt; Run Configurations...</code> puis dans l’onglet <code>Arguments</code>)</li>
+<li>que pensez-vous de la déclaration de la méthode <code>main</code> ? En quoi est-il utile d’indiquer la clause <code>throws</code> ici ?</li>
+<li>modifier le code pour que la méthode <code>main</code> traite l’exception</li>
+</ol>
+<p>Classes E1:</p>
+<div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
+<a class="sourceLine" id="cb24-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb24-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> E1 <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
+<a class="sourceLine" id="cb24-4" data-line-number="4">    <span class="kw">public</span> <span class="fu">E1</span>(<span class="bu">String</span> mess) {</a>
+<a class="sourceLine" id="cb24-5" data-line-number="5">        <span class="kw">super</span>(mess);</a>
+<a class="sourceLine" id="cb24-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb24-7" data-line-number="7">}</a></code></pre></div>
+<p>Classe E2:</p>
+<div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
+<a class="sourceLine" id="cb25-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb25-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> E2 <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
+<a class="sourceLine" id="cb25-4" data-line-number="4">    <span class="kw">public</span> <span class="fu">E2</span>(<span class="bu">String</span> mess) {</a>
+<a class="sourceLine" id="cb25-5" data-line-number="5">        <span class="kw">super</span>(mess);</a>
+<a class="sourceLine" id="cb25-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb25-7" data-line-number="7">}</a></code></pre></div>
+<p>Classe <code>AutoDivision</code> :</p>
+<div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
+<a class="sourceLine" id="cb26-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb26-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> AutoDivision {</a>
+<a class="sourceLine" id="cb26-4" data-line-number="4">    <span class="kw">private</span> <span class="dt">double</span> x;</a>
+<a class="sourceLine" id="cb26-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb26-6" data-line-number="6">    <span class="kw">public</span> <span class="fu">AutoDivision</span>(<span class="dt">double</span> x) {</a>
+<a class="sourceLine" id="cb26-7" data-line-number="7">        <span class="kw">this</span>.<span class="fu">x</span> = x;</a>
+<a class="sourceLine" id="cb26-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb26-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb26-10" data-line-number="10">    <span class="kw">public</span> <span class="dt">double</span> <span class="fu">getX</span>() {</a>
+<a class="sourceLine" id="cb26-11" data-line-number="11">        <span class="kw">return</span> x;</a>
+<a class="sourceLine" id="cb26-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb26-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb26-14" data-line-number="14">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">double</span> y) <span class="kw">throws</span> E1,E2 {</a>
+<a class="sourceLine" id="cb26-15" data-line-number="15">        <span class="kw">if</span> (y == <span class="dv">0</span>){</a>
+<a class="sourceLine" id="cb26-16" data-line-number="16">            <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">E1</span>(<span class="st">&quot;Paramètre nul: le paramètre ne peut être égal à zéro&quot;</span>);</a>
+<a class="sourceLine" id="cb26-17" data-line-number="17">        }</a>
+<a class="sourceLine" id="cb26-18" data-line-number="18">        <span class="kw">if</span> (x * y &lt; <span class="dv">0</span>){</a>
+<a class="sourceLine" id="cb26-19" data-line-number="19">            <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">E2</span>(<span class="st">&quot;paramètre de signe opposé à x&quot;</span>);</a>
+<a class="sourceLine" id="cb26-20" data-line-number="20">        }</a>
+<a class="sourceLine" id="cb26-21" data-line-number="21">        x = x / y;</a>
+<a class="sourceLine" id="cb26-22" data-line-number="22">    }</a>
+<a class="sourceLine" id="cb26-23" data-line-number="23"></a>
+<a class="sourceLine" id="cb26-24" data-line-number="24">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">executer</span>(<span class="dt">double</span> y) <span class="kw">throws</span> E1 {</a>
+<a class="sourceLine" id="cb26-25" data-line-number="25">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb26-26" data-line-number="26">            <span class="fu">calculer</span>(y);</a>
+<a class="sourceLine" id="cb26-27" data-line-number="27">        }</a>
+<a class="sourceLine" id="cb26-28" data-line-number="28">        <span class="kw">catch</span> (E2 e) {</a>
+<a class="sourceLine" id="cb26-29" data-line-number="29">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(e.<span class="fu">getMessage</span>());</a>
+<a class="sourceLine" id="cb26-30" data-line-number="30">        }</a>
+<a class="sourceLine" id="cb26-31" data-line-number="31">    }</a>
+<a class="sourceLine" id="cb26-32" data-line-number="32"></a>
+<a class="sourceLine" id="cb26-33" data-line-number="33">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) <span class="kw">throws</span> E1 {</a>
+<a class="sourceLine" id="cb26-34" data-line-number="34">        AutoDivision ad = <span class="kw">new</span> <span class="fu">AutoDivision</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">0</span>]));</a>
+<a class="sourceLine" id="cb26-35" data-line-number="35">        ad.<span class="fu">executer</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">1</span>]));</a>
+<a class="sourceLine" id="cb26-36" data-line-number="36">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;x = &quot;</span> + ad.<span class="fu">getX</span>());</a>
+<a class="sourceLine" id="cb26-37" data-line-number="37">        ad.<span class="fu">executer</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">2</span>]));</a>
+<a class="sourceLine" id="cb26-38" data-line-number="38">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;x = &quot;</span> + ad.<span class="fu">getX</span>());</a>
+<a class="sourceLine" id="cb26-39" data-line-number="39">    }</a>
+<a class="sourceLine" id="cb26-40" data-line-number="40">}</a></code></pre></div>
+<h2 id="factorielle">Factorielle</h2>
+<p>Voici une classe de calcul de factorielle:</p>
+<div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.maths;</span></a>
+<a class="sourceLine" id="cb27-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb27-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Fonctions {</a>
+<a class="sourceLine" id="cb27-4" data-line-number="4">    <span class="kw">private</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielleT</span>(<span class="dt">long</span> n, <span class="dt">long</span> acc){</a>
+<a class="sourceLine" id="cb27-5" data-line-number="5">        <span class="kw">if</span>(n &lt;= <span class="dv">1</span>){</a>
+<a class="sourceLine" id="cb27-6" data-line-number="6">            <span class="kw">return</span> acc;</a>
+<a class="sourceLine" id="cb27-7" data-line-number="7">        }</a>
+<a class="sourceLine" id="cb27-8" data-line-number="8">        <span class="kw">else</span>{</a>
+<a class="sourceLine" id="cb27-9" data-line-number="9">            <span class="kw">return</span> <span class="fu">factorielleT</span>(n - <span class="dv">1</span>, n * acc);</a>
+<a class="sourceLine" id="cb27-10" data-line-number="10">        }</a>
+<a class="sourceLine" id="cb27-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb27-12" data-line-number="12">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielle</span>(<span class="dt">long</span> n){</a>
+<a class="sourceLine" id="cb27-13" data-line-number="13">        <span class="kw">return</span> <span class="fu">factorielleT</span>(n, <span class="dv">1</span>);</a>
+<a class="sourceLine" id="cb27-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb27-15" data-line-number="15">  <span class="kw">public</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielle</span>(<span class="dt">long</span> n){</a>
+<a class="sourceLine" id="cb27-16" data-line-number="16">        <span class="kw">return</span> <span class="fu">factorielleT</span>(n, <span class="dv">1</span>);</a>
+<a class="sourceLine" id="cb27-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb27-18" data-line-number="18">}</a></code></pre></div>
+<p>Créer les exceptions permettant de gérer deux cas d’erreur:</p>
+<ul>
+<li>Le nombre passé en paramètre est négatif : <code>NombreNegatifException</code></li>
+<li>Le nombre passé en paramètre est trop grand : <code>NombreTropGrandException</code></li>
+</ul>
+<p>Modifier les méthodes afin de prendre en compte ces exceptions.</p>
+<p>A vous de déterminer la valeur maximale pouvant être traitée par cette fonction (les constantes <code>Long.MAX_VALUE</code> et <code>Integer.MAX_VALUE</code> peuvent vous aider). Dans ce cas, il est possible aussi que le nombre retourné devienne négatif : comment faire alors ?</p>
+<h2 id="gestion-de-mot-de-passe">Gestion de mot de passe</h2>
+<p>Parmi les failles de sécurité réseau, on trouve notamment l’utilisation du dépassement.</p>
+<p>Par exemple, sur certaines programmes, un <em>login</em> ou un mot de passe de plus d’un mega-octet peut le faire <em>planter</em>. Ceci donne alors un accès <code>root</code> au système.</p>
+<p>Dans d’autre cas, il est possible de faire une injection SQL.</p>
+<p>Vous allez écrire un programme capable de gérer ces problèmes avec différents types d’exception.</p>
+<ol type="1">
+<li>Écrire un programme qui demande en boucle un nom d’utilisateur (<code>login</code>) et un mot de passe (<code>password</code>) jusqu’à recevoir une paire <code>login</code>/<code>password</code> correcte</li>
+</ol>
+<p>Vous stockerez les données de connexion suivantes en dur dans ce programme: <code>duke</code>/<code>Ellington</code> et <code>alexander</code>/<code>Abreu</code>.</p>
+<ol start="2" type="1">
+<li>Implémenter les exceptions suivantes:</li>
+</ol>
+<ul>
+<li><code>IncorrectLoginException</code> : levée lorsque l’utilisateur saisit un <code>login</code> inexistant</li>
+<li><code>IncorrectPasswordException</code> : levée lorsque le mot de passe est erroné</li>
+<li><code>IncorrectInputLengthException</code> : levée lorsque le login ou le mot de passe saisi dépasse 10 caractères</li>
+<li><code>SQLInjectionException</code> : levée lorsque le <code>login</code> ou le mot de passe saisi contient un caractère ‘;’ suivi du mot clef <code>SELECT</code> (avec ou sans espaces intermédiaires)</li>
+</ul>
+<ol start="3" type="1">
+<li>Implémenter de façon à utiliser ces exceptions de façon pertinente pour pouvoir tracer ces exceptions. Ainsi, la <code>SQLInjectionException</code> ne devra pas faire l’objet d’un affichage standard d’erreur (l’attaquant ne doit pas savoir que le système sait détecter les injections SQL)</li>
+<li>Déterminer les autres cas où l’on pourrait lever la <code>SQLInjectionException</code></li>
+</ol>
+</body>
+</html>

+ 505 - 0
06-InteractionEntreObjets.html

@@ -0,0 +1,505 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Interaction entre objets</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Interaction entre objets</div>
+<nav id="TOC">
+<ul>
+<li><a href="#interfaces">Interfaces</a><ul>
+<li><a href="#linterface-entre-deux-domaines">L’interface entre deux domaines</a></li>
+<li><a href="#utilisation-des-interfaces-en-java">Utilisation des interfaces en Java</a><ul>
+<li><a href="#déclaration">Déclaration</a></li>
+<li><a href="#implémentation">Implémentation</a></li>
+<li><a href="#exemple-dutilisation-dune-interface">Exemple d’utilisation d’une interface</a></li>
+<li><a href="#autres-exemples">Autres exemples</a></li>
+<li><a href="#contrat-dutilisation">Contrat d’utilisation</a></li>
+<li><a href="#application">Application</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#polymorphisme">Polymorphisme</a><ul>
+<li><a href="#un-objet-plusieurs-types">Un objet, plusieurs types</a></li>
+<li><a href="#une-variable-est-typée">Une variable est typée</a></li>
+<li><a href="#héritage-multiple">Héritage multiple ?</a></li>
+<li><a href="#code">Code</a></li>
+<li><a href="#délégation">Délégation</a></li>
+</ul></li>
+<li><a href="#utilisation-dobjets-par-dautres-objets">Utilisation d’objets par d’autres objets</a><ul>
+<li><a href="#utilisation-par-un-autre-objet">Utilisation par un autre objet</a></li>
+<li><a href="#exercice">Exercice</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#interface-hierarchisable">Interface Hierarchisable</a></li>
+<li><a href="#interface-salutation">interface Salutation</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="interfaces">Interfaces</h1>
+<h2 id="linterface-entre-deux-domaines">L’interface entre deux domaines</h2>
+<p>Dans le monde réel, une interface est la zone, la frontière commune entre deux domaines ou milieux. L’interface permet les échanges entre ces deux éléments aux propriétés différentes.</p>
+<p>Si on prend l’exemple d’un ordinateur, on pourra le brancher au secteur électrique quel que soit le pays où l’on se trouve. L’interface entre l’ordinateur et le réseau est multiple et se fait grâce à un adaptateur secteur.</p>
+<div class="incremental">
+<p>Ce même adaptateur possède plusieurs interfaces interchangeables permettant de le brancher à une prise électrique. Et cette prise de courant est une interface vers l’alimentation électrique présente dans le bâtiment.</p>
+</div>
+<div class="incremental">
+<p>L’interface ici est le câble. C’est le lien entre l’appareil électrique et le réseau électrique.</p>
+</div>
+<h2 id="utilisation-des-interfaces-en-java">Utilisation des interfaces en Java</h2>
+<h3 id="déclaration">Déclaration</h3>
+<p>En Java, une interface est une classe totalement abstraite.</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> InterfaceUSB {</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information);</a>
+<a class="sourceLine" id="cb1-5" data-line-number="5">}</a></code></pre></div>
+<ul>
+<li>Aucune de ses méthodes n’est implémentée</li>
+<li>Elle définit un contrat d’utilisation
+<ul>
+<li>c’est l’équivalent de la norme définissant les prises électriques</li>
+</ul></li>
+</ul>
+<h3 id="implémentation">Implémentation</h3>
+<p>Pour qu’une classe implémente une interface, on utilise le mot clé <code>implements</code>.</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Telephone <span class="kw">implements</span> InterfaceUSB{</a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">    <span class="kw">private</span> <span class="bu">String</span> nom ;</a>
+<a class="sourceLine" id="cb2-5" data-line-number="5">    <span class="kw">public</span> <span class="fu">Telephone</span>(<span class="bu">String</span> nom) {</a>
+<a class="sourceLine" id="cb2-6" data-line-number="6">        <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
+<a class="sourceLine" id="cb2-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb2-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb2-9" data-line-number="9">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb2-10" data-line-number="10">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
+<a class="sourceLine" id="cb2-11" data-line-number="11">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Données reçues par Telephone(&quot;</span>+nom+<span class="st">&quot;)&quot;</span>);</a>
+<a class="sourceLine" id="cb2-12" data-line-number="12">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="kw">new</span> <span class="bu">String</span>(information));</a>
+<a class="sourceLine" id="cb2-13" data-line-number="13">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Fin de la réception&quot;</span>);</a>
+<a class="sourceLine" id="cb2-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb2-15" data-line-number="15"></a>
+<a class="sourceLine" id="cb2-16" data-line-number="16">}</a></code></pre></div>
+<p>Contrairement au mot clé <code>extends</code>, <code>implements</code> peut être suivi de plusieurs valeurs, séparées par des virgules :</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb3-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb3-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Imprimante <span class="kw">implements</span> InterfaceUSB, InterfaceReseau{</a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">  <span class="co">//...</span></a>
+<a class="sourceLine" id="cb3-5" data-line-number="5">}</a></code></pre></div>
+<div class="incremental">
+<p>De cette manière on a une forme d’<em>héritage multiple</em>.</p>
+</div>
+<div class="incremental">
+<p>Le terme employé est <em>polymorphisme</em> (on le verra plus tard).</p>
+</div>
+<h3 id="exemple-dutilisation-dune-interface">Exemple d’utilisation d’une interface</h3>
+<p>La classe <code>Ordinateur</code> <em>utilise</em> l’interface <code>InterfaceUSB</code>.</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb4-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Ordinateur {</a>
+<a class="sourceLine" id="cb4-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb4-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">envoyerDonneesUSB</span>(InterfaceUSB ir, <span class="dt">byte</span>[] information) {</a>
+<a class="sourceLine" id="cb4-6" data-line-number="6">        ir.<span class="fu">communiquerParPortUSB</span>(information);</a>
+<a class="sourceLine" id="cb4-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb4-8" data-line-number="8">}</a></code></pre></div>
+<p>La méthode <code>envoyerDonneesUSB</code> utilise une variable du type <code>InterfaceUSB</code>.</p>
+<p>Cette variable référence une instance <em>qui implémente</em> cette interface pour envoyer des données.</p>
+<p>La classe <code>Communication</code> permet de brancher tout ces éléments entre eux:</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Communication {</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">        Ordinateur ordi = <span class="kw">new</span> <span class="fu">Ordinateur</span>();</a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">        <span class="dt">byte</span>[] donnees = <span class="st">&quot;Bonjour&quot;</span>.<span class="fu">getBytes</span>();</a>
+<a class="sourceLine" id="cb5-5" data-line-number="5">        ordi.<span class="fu">envoyerDonneesUSB</span>(<span class="kw">new</span> <span class="fu">Telephone</span>(<span class="st">&quot;rouge&quot;</span>), donnees);</a>
+<a class="sourceLine" id="cb5-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb5-7" data-line-number="7">        donnees = <span class="st">&quot;Page à imprimer&quot;</span>.<span class="fu">getBytes</span>();</a>
+<a class="sourceLine" id="cb5-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb5-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb5-10" data-line-number="10">        InterfaceUSB imprimanteAnonyme = <span class="kw">new</span> <span class="fu">InterfaceUSB</span>() {</a>
+<a class="sourceLine" id="cb5-11" data-line-number="11">            <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb5-12" data-line-number="12">            <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
+<a class="sourceLine" id="cb5-13" data-line-number="13">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;//Je suis une imprimante et j&#39;imprime une page:&quot;</span>);</a>
+<a class="sourceLine" id="cb5-14" data-line-number="14">                <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; information.<span class="fu">length</span>; i++) {</a>
+<a class="sourceLine" id="cb5-15" data-line-number="15">                    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="bu">String</span>.<span class="fu">valueOf</span>(information[i]));</a>
+<a class="sourceLine" id="cb5-16" data-line-number="16">                }</a>
+<a class="sourceLine" id="cb5-17" data-line-number="17">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;//Fin de l&#39;impression&quot;</span>);</a>
+<a class="sourceLine" id="cb5-18" data-line-number="18">            }</a>
+<a class="sourceLine" id="cb5-19" data-line-number="19">        };</a>
+<a class="sourceLine" id="cb5-20" data-line-number="20"></a>
+<a class="sourceLine" id="cb5-21" data-line-number="21">        ordi.<span class="fu">envoyerDonneesUSB</span>(imprimanteAnonyme, donnees);</a>
+<a class="sourceLine" id="cb5-22" data-line-number="22">    }</a>
+<a class="sourceLine" id="cb5-23" data-line-number="23">}</a></code></pre></div>
+<p>Qu’observez-vous dans ce code ?</p>
+<p>Pensez-vous logique que l’on appelle un constructeur sur l’interface <code>InterfaceUSB</code> alors que c’est une classe abstraite ?</p>
+<p><strong>Eléments de réponse:</strong></p>
+<p><em>Une interface est <strong>toujours</strong> implémentée par une classe.</em></p>
+<p><em>Cependant, certaines classes peuvent être anonymes</em>.</p>
+<p>C’est le cas ici de <code>imprimanteAnonyme</code>.</p>
+<p>On affecte à cet attribut une classe <strong>anonyme</strong>, c’est à dire :</p>
+<div class="incremental">
+<ul>
+<li>qu’on instancie un objet de type <code>InterfaceUSB</code> (qui pourtant est une <em>interface</em> et donc est <em>abstraite</em>)</li>
+<li>et en même temps qu’on implémente (à la volée) les méthodes de l’interface (pour la rendre <em>concrètement utilisable</em>)</li>
+</ul>
+</div>
+<h3 id="autres-exemples">Autres exemples</h3>
+<p>D’autres exemples sont disponibles dans le cours : <a href="https://en.wikibooks.org/wiki/Java_Programming/Interfaces" class="uri">https://en.wikibooks.org/wiki/Java_Programming/Interfaces</a></p>
+<h3 id="contrat-dutilisation">Contrat d’utilisation</h3>
+<p>L’interface représente un contrat d’utilisation entre les classes qui l’implémentent et les classes qui l’utilisent.</p>
+<div class="incremental">
+<p>On peut éventuellement ajouter des constantes à une interface, qui seront utilisables directement par les classes qui implémenteront l’interface.</p>
+</div>
+<div class="incremental">
+<p>On ajoute aussi des commentaires et on peut même indiquer des traitements d’exception.</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb6-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb6-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> InterfaceReseau {</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_1GB = <span class="dv">2</span>^<span class="dv">1000</span>;</a>
+<a class="sourceLine" id="cb6-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_100MB = <span class="dv">2</span>^<span class="dv">100</span>;</a>
+<a class="sourceLine" id="cb6-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_10MB = <span class="dv">2</span>^<span class="dv">10</span>;</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb6-8" data-line-number="8">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb6-9" data-line-number="9">     <span class="co">*</span> Permet de traiter les informations données en paramètre</a>
+<a class="sourceLine" id="cb6-10" data-line-number="10">     <span class="co">*</span> Cette méthode ne peut a priori être appelée qu<span class="co">&#39;</span>une fois</a>
+<a class="sourceLine" id="cb6-11" data-line-number="11">     <span class="co">*</span> que l<span class="co">&#39;</span>adresse réseau de l<span class="co">&#39;</span>imprimante a été affectée</a>
+<a class="sourceLine" id="cb6-12" data-line-number="12">     <span class="co">* </span><span class="kw">@param information </span>l<span class="co">&#39;</span>information à traiter</a>
+<a class="sourceLine" id="cb6-13" data-line-number="13">     <span class="co">*</span> <span class="kw">@throws IllegalAccessException </span>si l<span class="co">&#39;</span>adresse réseau n<span class="co">&#39;</span>est pas configurée pour cet équipement</a>
+<a class="sourceLine" id="cb6-14" data-line-number="14">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb6-15" data-line-number="15">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParReseauFilaire</span>(<span class="dt">byte</span>[] information) <span class="kw">throws</span> <span class="bu">IllegalStateException</span>;</a>
+<a class="sourceLine" id="cb6-16" data-line-number="16"></a>
+<a class="sourceLine" id="cb6-17" data-line-number="17">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb6-18" data-line-number="18">     <span class="co">*</span> Affecte l<span class="co">&#39;</span>adresse réseau à cet équipement<span class="co">.</span></a>
+<a class="sourceLine" id="cb6-19" data-line-number="19">     <span class="co">*</span></a>
+<a class="sourceLine" id="cb6-20" data-line-number="20">     <span class="co">*</span> Cette méthode modifie l<span class="co">&#39;</span>état interne de l<span class="co">&#39;</span>instance</a>
+<a class="sourceLine" id="cb6-21" data-line-number="21">     <span class="co">*</span> pour permettre l<span class="co">&#39;</span>appel des autres méthodes de la classe</a>
+<a class="sourceLine" id="cb6-22" data-line-number="22">     <span class="co">*</span> <span class="kw">@param adresse </span>l<span class="co">&#39;</span>adresse à affecter sous forme d<span class="co">&#39;</span>un</a>
+<a class="sourceLine" id="cb6-23" data-line-number="23">     <span class="co">*</span> tableau de byte <span class="co">(</span>pour prendre en charge IPv4 et IPv6<span class="co">)</span></a>
+<a class="sourceLine" id="cb6-24" data-line-number="24">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb6-25" data-line-number="25">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affecterAdresseReseau</span>(<span class="dt">byte</span>[] adresse);</a>
+<a class="sourceLine" id="cb6-26" data-line-number="26">}</a></code></pre></div>
+<p>Etudiez les commentaires Javadoc.</p>
+<p>Quelle est leur utilité ?</p>
+</div>
+<h3 id="application">Application</h3>
+<p>Faire un schéma UML des classes précédentes</p>
+<p>Implémentez-les et faites exécuter ce programme.</p>
+<p>Complétez la classe <code>Imprimante</code> pour qu’elle affiche des informations lorsqu’elle est <em>connectée</em> au réseau (c’est-à-dire qu’elle a une adresse réseau affectée):</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Imprimante <span class="kw">implements</span> InterfaceUSB, InterfaceReseau{</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">    <span class="co">// Ici on utilise une constante définie dans l&#39;interface</span></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">    <span class="dt">int</span> vitesse = VITESSE_RESEAU_100MB;</a>
+<a class="sourceLine" id="cb7-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParReseauFilaire</span>(<span class="dt">byte</span>[] information) <span class="kw">throws</span> <span class="bu">IllegalStateException</span> {</a>
+<a class="sourceLine" id="cb7-9" data-line-number="9">        <span class="co">//...</span></a>
+<a class="sourceLine" id="cb7-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb7-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb7-12" data-line-number="12">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb7-13" data-line-number="13">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
+<a class="sourceLine" id="cb7-14" data-line-number="14">        <span class="co">//...</span></a>
+<a class="sourceLine" id="cb7-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb7-16" data-line-number="16"></a>
+<a class="sourceLine" id="cb7-17" data-line-number="17">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb7-18" data-line-number="18">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affecterAdresseReseau</span>(<span class="dt">byte</span>[] adresse) {</a>
+<a class="sourceLine" id="cb7-19" data-line-number="19">        <span class="co">// TODO Auto-generated method stub</span></a>
+<a class="sourceLine" id="cb7-20" data-line-number="20"></a>
+<a class="sourceLine" id="cb7-21" data-line-number="21">    }</a>
+<a class="sourceLine" id="cb7-22" data-line-number="22">}</a></code></pre></div>
+<p>Ajouter à la classe <code>Ordinateur</code> la méthode suivante qui utilisera l’interface <code>InterfaceReseau</code> pour envoyer des données:</p>
+<pre><code>public void envoyerDonneesReseau(InterfaceReseau ir, byte[] information) ;</code></pre>
+<p>Chaque communication sera affichée dans la console avec un préfixe: <code>USB</code> ou <code>Réseau</code> respectivement.</p>
+<p><strong>Testez votre implémentation en faisant envoyer des messages via les deux ports de communication de l’ordinateur à une instance d’<code>Imprimante</code></strong></p>
+<h1 id="polymorphisme">Polymorphisme</h1>
+<h2 id="un-objet-plusieurs-types">Un objet, plusieurs types</h2>
+<p>Les interfaces permettent aux objets d’être polymorphes. C’est-à-dire, pour une instance, d’être de plusieurs types.</p>
+<div class="incremental">
+<p>Une classe peut implémenter plusieurs interfaces.</p>
+</div>
+<h2 id="une-variable-est-typée">Une variable est typée</h2>
+<p>On donne un type à la variable qui référence l’instance.</p>
+<div class="incremental">
+<p>C’est le type de la variable qui détermine les méthodes appelables.</p>
+<p>Une même instance peut être référencée par des variables de types différents:</p>
+<ul>
+<li>elle est dite <em>polymorphe</em></li>
+</ul>
+</div>
+<h2 id="héritage-multiple">Héritage multiple ?</h2>
+<p>En Java, l’héritage multiple n’est pas possible. Vous ne trouverez jamais ce genre de chose:</p>
+<figure>
+<img src="images/HeritageMultiple.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
+</figure>
+<div class="incremental">
+<p>Et c’est tant mieux !</p>
+<p>Il existe bien d’autres moyens de partager des fonctionnalités entre des classes différentes.</p>
+<p>Les interfaces en Java permettent de définir une liste de fonctionnalités que fournira une classe.</p>
+<p>Ces interfaces sont, on l’a dit, des classes <em>totalement abstraites</em>.</p>
+<figure>
+<img src="images/HeritageMultInterface.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
+</figure>
+<p>Code de l’interface <code>VehiculeMotorise</code> :</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
+<a class="sourceLine" id="cb9-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> VehiculeMotorise {</a>
+<a class="sourceLine" id="cb9-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb9-6" data-line-number="6">     <span class="co">*</span> Augmente la vitesse du véhicule de <span class="co">1m/</span>s</a>
+<a class="sourceLine" id="cb9-7" data-line-number="7">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">accelerer</span>();</a>
+<a class="sourceLine" id="cb9-9" data-line-number="9">}</a></code></pre></div>
+<p>On remarque qu’ici, la Javadoc donne le <strong>contrat</strong> de fonctionnement de l’interface.</p>
+<p>En Java, une classe <em>implémente</em> une interface mais n’en hérite pas.</p>
+</div>
+<div class="incremental">
+<p>Donc, l’inconvénient est qu’il faut réimplémenter la méthode de l’interface dans la classe.</p>
+<p>Heureusement, on peut (par exemple) utiliser ce type de conception afin de réutiliser le code de la classe <code>Moteur</code>:</p>
+<figure>
+<img src="images/HeritageMultInterfaceEtUtilise.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
+</figure>
+</div>
+<h2 id="code">Code</h2>
+<p>Tester les classes en utilisant les codes ci-dessous.</p>
+<p>Code de la classe <code>Vehicule</code>:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
+<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Vehicule {</a>
+<a class="sourceLine" id="cb10-4" data-line-number="4">    <span class="kw">private</span> <span class="dt">int</span> vitesse;</a>
+<a class="sourceLine" id="cb10-5" data-line-number="5">    <span class="kw">private</span> <span class="dt">int</span> position;</a>
+<a class="sourceLine" id="cb10-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setVitesse</span>(<span class="dt">int</span> vitesse){</a>
+<a class="sourceLine" id="cb10-7" data-line-number="7">        <span class="kw">this</span>.<span class="fu">vitesse</span> = vitesse;</a>
+<a class="sourceLine" id="cb10-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb10-9" data-line-number="9">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getVitesse</span>(){</a>
+<a class="sourceLine" id="cb10-10" data-line-number="10">        <span class="kw">return</span> vitesse;</a>
+<a class="sourceLine" id="cb10-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb10-12" data-line-number="12">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getPosition</span>(){</a>
+<a class="sourceLine" id="cb10-13" data-line-number="13">        <span class="kw">return</span> position;</a>
+<a class="sourceLine" id="cb10-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb10-15" data-line-number="15">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">metAJourPosition</span>(){</a>
+<a class="sourceLine" id="cb10-16" data-line-number="16">        position += vitesse ;</a>
+<a class="sourceLine" id="cb10-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb10-18" data-line-number="18">}</a></code></pre></div>
+<p>Code de la classe <code>Moteur</code>:</p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
+<a class="sourceLine" id="cb11-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb11-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Moteur {</a>
+<a class="sourceLine" id="cb11-4" data-line-number="4">    <span class="kw">private</span> Vehicule vehicule;</a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setVehicule</span>(Vehicule v){</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">        vehicule = v;</a>
+<a class="sourceLine" id="cb11-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb11-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">propulse</span>(){</a>
+<a class="sourceLine" id="cb11-9" data-line-number="9">        vehicule.<span class="fu">setVitesse</span>(</a>
+<a class="sourceLine" id="cb11-10" data-line-number="10">                vehicule.<span class="fu">getVitesse</span>() + <span class="dv">1</span>);</a>
+<a class="sourceLine" id="cb11-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb11-12" data-line-number="12">}</a></code></pre></div>
+<p>Code de la classe <code>Automobile</code>:</p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
+<a class="sourceLine" id="cb12-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb12-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Automobile <span class="kw">extends</span> Vehicule <span class="kw">implements</span> VehiculeMotorise {</a>
+<a class="sourceLine" id="cb12-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb12-5" data-line-number="5">    <span class="kw">private</span> Moteur moteur = <span class="kw">new</span> <span class="fu">Moteur</span>();</a>
+<a class="sourceLine" id="cb12-6" data-line-number="6">    <span class="kw">public</span> <span class="fu">Automobile</span>(){</a>
+<a class="sourceLine" id="cb12-7" data-line-number="7">        moteur.<span class="fu">setVehicule</span>(<span class="kw">this</span>);</a>
+<a class="sourceLine" id="cb12-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb12-9" data-line-number="9">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">accelerer</span>(){</a>
+<a class="sourceLine" id="cb12-10" data-line-number="10">        moteur.<span class="fu">propulse</span>();</a>
+<a class="sourceLine" id="cb12-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb12-12" data-line-number="12">}</a></code></pre></div>
+<p>Code de la classe <code>FaireRoulerVoiture</code>:</p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
+<a class="sourceLine" id="cb13-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb13-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> FaireRoulerVoiture {</a>
+<a class="sourceLine" id="cb13-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb13-5" data-line-number="5">        Automobile auto = <span class="kw">new</span> <span class="fu">Automobile</span>();</a>
+<a class="sourceLine" id="cb13-6" data-line-number="6">        <span class="co">//On accélère</span></a>
+<a class="sourceLine" id="cb13-7" data-line-number="7">        auto.<span class="fu">accelerer</span>(); <span class="co">//v = 1</span></a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">        <span class="co">//On avance</span></a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">        auto.<span class="fu">metAJourPosition</span>();</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
+<a class="sourceLine" id="cb13-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb13-12" data-line-number="12">        auto.<span class="fu">accelerer</span>(); <span class="co">//v = 2</span></a>
+<a class="sourceLine" id="cb13-13" data-line-number="13">        auto.<span class="fu">metAJourPosition</span>();</a>
+<a class="sourceLine" id="cb13-14" data-line-number="14">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
+<a class="sourceLine" id="cb13-15" data-line-number="15">        auto.<span class="fu">metAJourPosition</span>();</a>
+<a class="sourceLine" id="cb13-16" data-line-number="16">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
+<a class="sourceLine" id="cb13-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb13-18" data-line-number="18">}</a></code></pre></div>
+<h2 id="délégation">Délégation</h2>
+<p>Ici, c’est bien le moteur qui modifie la vitesse du véhicule.</p>
+<p>Son code est réutilisable pour n’importe quel type de véhicule motorisé (Bateau, Avion, etc).</p>
+<p>Le véhicule motorisé délègue au moteur la tâche d’accélération.</p>
+<p>On parle donc ici d’une <em>délégation</em>. Le code est réutilisable, sans faire d’héritage.</p>
+<p>Posez la question à l’intervenant pour éclaircir ce point si nécessaire.</p>
+<h1 id="utilisation-dobjets-par-dautres-objets">Utilisation d’objets par d’autres objets</h1>
+<p>Vous allez maintenant mettre en application ce qui précède.</p>
+<p>Pour cela, créer trois classes selon le diagramme de classe suivant:</p>
+<figure>
+<img src="images/Stylo-diagramme_de_classe.png" alt="Diagramme de classe: Stylo" /><figcaption>Diagramme de classe: Stylo</figcaption>
+</figure>
+<p>La méthode <code>ecrire(String chaine)</code> de stylo produira l’écriture sur la sortie standard.</p>
+<p>La méthode <code>ecrire(String chaine)</code> de ses classes filles rajoutera <code>ECRIRE_EN_couleur{</code> au début de la chaîne avant de l’écrire puis y rajoutera <code>}</code> à la fin de la chaîne.</p>
+<p>Par exemple si on a dans la fonction <code>main(String[])</code>:</p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1">StyloRouge styloR = <span class="kw">new</span> <span class="fu">StyloRouge</span>();</a>
+<a class="sourceLine" id="cb14-2" data-line-number="2">styloR.<span class="fu">ecrire</span>(<span class="st">&quot;Bonjour&quot;</span>);</a>
+<a class="sourceLine" id="cb14-3" data-line-number="3"><span class="co">// affiche: &quot;ECRIRE_EN_ROUGE{Bonjour}&quot;</span></a></code></pre></div>
+<p>Petite difficulté supplémentaire: vous n’avez pas le droit d’utiliser de <code>System.out.println</code> dans les classes <code>StyloRouge</code> ni <code>StyloBleu</code></p>
+<h3 id="utilisation-par-un-autre-objet">Utilisation par un autre objet</h3>
+<p>Nous allons maintenant faire en sorte que notre stylo soit utilisé par un poète qui souhaite rédiger un poème. Il va simplement l’afficher à l’écran grâce au stylo.</p>
+<p>Voici un diagramme de classe représentant notre programme:</p>
+<figure>
+<img src="images/PoeteEtStylo.png" alt="Diagramme de classe: Stylo" /><figcaption>Diagramme de classe: Stylo</figcaption>
+</figure>
+<p>Et voici le programme correspondant:</p>
+<div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Poete {</a>
+<a class="sourceLine" id="cb15-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">String</span> monNouveauPoeme = <span class="st">&quot;&quot;</span>;</a>
+<a class="sourceLine" id="cb15-3" data-line-number="3">    <span class="kw">private</span> Stylo stylo ;</a>
+<a class="sourceLine" id="cb15-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb15-5" data-line-number="5">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">ajouterVersAuPoeme</span>(<span class="bu">String</span> vers){</a>
+<a class="sourceLine" id="cb15-6" data-line-number="6">        monNouveauPoeme = monNouveauPoeme + <span class="st">&quot;</span><span class="sc">\n</span><span class="st">&quot;</span> ;</a>
+<a class="sourceLine" id="cb15-7" data-line-number="7">        monNouveauPoeme += vers;</a>
+<a class="sourceLine" id="cb15-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb15-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb15-10" data-line-number="10">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setStylo</span>(Stylo stylo){</a>
+<a class="sourceLine" id="cb15-11" data-line-number="11">        <span class="kw">this</span>.<span class="fu">stylo</span> = stylo;</a>
+<a class="sourceLine" id="cb15-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb15-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb15-14" data-line-number="14">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">ecrirePoeme</span>(){</a>
+<a class="sourceLine" id="cb15-15" data-line-number="15">        stylo.<span class="fu">ecrire</span>(monNouveauPoeme);</a>
+<a class="sourceLine" id="cb15-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb15-17" data-line-number="17">}</a></code></pre></div>
+<p>La classe <code>main(String[])</code> ressemble à ceci:</p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Main {</a>
+<a class="sourceLine" id="cb16-2" data-line-number="2">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb16-3" data-line-number="3">        Poete poete = <span class="kw">new</span> <span class="fu">Poete</span>();</a>
+<a class="sourceLine" id="cb16-4" data-line-number="4">        poete.<span class="fu">ajouterVersAuPoeme</span>(<span class="st">&quot;Maître Corbeau, sur un arbre perché&quot;</span>);</a>
+<a class="sourceLine" id="cb16-5" data-line-number="5">        poete.<span class="fu">ajouterVersAuPoeme</span>(<span class="st">&quot;Tenait en son bec un fromage&quot;</span>);</a>
+<a class="sourceLine" id="cb16-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb16-7" data-line-number="7">        poete.<span class="fu">setStylo</span>(<span class="kw">new</span> <span class="fu">StyloRouge</span>());</a>
+<a class="sourceLine" id="cb16-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb16-9" data-line-number="9">        poete.<span class="fu">ecrirePoeme</span>();</a>
+<a class="sourceLine" id="cb16-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb16-11" data-line-number="11">}</a></code></pre></div>
+<p>Modifiez ce code en supprimant la ligne suivante du <code>main(String[])</code>:</p>
+<p><code>poete.setStylo(new StyloRouge());</code></p>
+<p>Que constate-t-on ?</p>
+<p>Cette erreur vient du fait que la variable <code>monStylo</code> n’est plus initialisée. Comment lui donner une valeur par défaut, de sorte que même si on n’appelle pas la méthode <code>setStylo(Stylo)</code> le programme ne plante pas ?</p>
+<h3 id="exercice">Exercice</h3>
+<p>Réfléchissez à un moyen de vous passer des classes <code>StyloRouge</code> et <code>StyloBleu</code> tout en gardant les fonctionnalités qu’ils offrent.</p>
+<p>Vous allez utiliser pour cela des attributs et modifier le comportement de la méthode <code>ecrire(String)</code>.</p>
+<p>Dessinez le diagramme de classe correspondant.</p>
+<h1 id="exercices">Exercices</h1>
+<h2 id="interface-hierarchisable">Interface Hierarchisable</h2>
+<p>On s’intéresse ici à l’interface <code>Hierarchisable</code> :</p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="kw">public</span> <span class="kw">interface</span> Hierarchisable {</a>
+<a class="sourceLine" id="cb17-2" data-line-number="2">  <span class="dt">boolean</span> <span class="fu">estPlusGrandQue</span>(<span class="bu">Object</span> O);</a>
+<a class="sourceLine" id="cb17-3" data-line-number="3">}</a></code></pre></div>
+<p>Les implémentations de cette interface doivent respecter le contrat suivant:</p>
+<p>la méthode <code>estPlusGrandQue</code> doit retourner <code>true</code> si l’objet courant (<code>this</code>) est considéré comme plus grand que l’objet reçu en paramètre. Sinon, elle renvoie <code>false</code>. Si l’objet reçu en paramètre n’est pas de la même classe que l’objet courant, la méthode retournera une exception de type <code>IllegalArgumentException</code>.</p>
+<p>On définit maintenant une classe nommée <code>Personne</code> qui implémente l’interface <code>Hierarchisable</code> et qui comporte au minimum :</p>
+<ul>
+<li>Deux attributs <code>nom</code> et <code>prenom</code> (type String), inaccessibles depuis l’extérieur de la classe</li>
+<li>Un constructeur pour initialiser les attributs <code>nom</code> et <code>prenom</code>.</li>
+</ul>
+<p>Vous pouvez si vous le souhaiter réutiliser la classe <code>Personne</code> déjà créée précédemment.</p>
+<p>La classe <code>String</code> implémente la méthode <code>Comparable.compareTo(...)</code>. Etudiez cette méthode et vérifier si elle peut vous servir ici.</p>
+<p>Créer un programme principal permettant de classer dans l’ordre alphabétique plusieurs personnes.</p>
+<h2 id="interface-salutation">interface Salutation</h2>
+<p>Voici l’interface <code>Salutation</code>:</p>
+<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">public</span> <span class="kw">interface</span> Salutation {</a>
+<a class="sourceLine" id="cb18-2" data-line-number="2">  <span class="co">/**</span></a>
+<a class="sourceLine" id="cb18-3" data-line-number="3">   <span class="co">*</span> Renvoie une chaîne de caractère représentant</a>
+<a class="sourceLine" id="cb18-4" data-line-number="4">   <span class="co">*</span> une forme de salutation selon la langue à employer</a>
+<a class="sourceLine" id="cb18-5" data-line-number="5">   <span class="co">*/</span></a>
+<a class="sourceLine" id="cb18-6" data-line-number="6">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">salut</span>() ;</a>
+<a class="sourceLine" id="cb18-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb18-8" data-line-number="8">}</a></code></pre></div>
+<p>Voici une méthonde principale utilisant cette interface:</p>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1">Salutation francais = <span class="kw">new</span> <span class="fu">Bonjour</span>();</a>
+<a class="sourceLine" id="cb19-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(francais.<span class="fu">salut</span>()); <span class="co">//Doit afficher Bonjour</span></a>
+<a class="sourceLine" id="cb19-3" data-line-number="3">Salutation [] salutations = <span class="kw">new</span> Salutation [] {</a>
+<a class="sourceLine" id="cb19-4" data-line-number="4">  <span class="kw">new</span> <span class="fu">Bonjour</span>() , <span class="co">//Français</span></a>
+<a class="sourceLine" id="cb19-5" data-line-number="5">  <span class="kw">new</span> <span class="fu">Hello</span>() , <span class="co">//Anglais</span></a>
+<a class="sourceLine" id="cb19-6" data-line-number="6">  <span class="kw">new</span> <span class="fu">BuenosDias</span>(),  <span class="co">//Espagnol</span></a>
+<a class="sourceLine" id="cb19-7" data-line-number="7">  <span class="kw">new</span> <span class="fu">GutenTag</span>() <span class="co">//Allemand</span></a>
+<a class="sourceLine" id="cb19-8" data-line-number="8">};</a>
+<a class="sourceLine" id="cb19-9" data-line-number="9"><span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; salutations.<span class="fu">length</span>; i++){</a>
+<a class="sourceLine" id="cb19-10" data-line-number="10">  <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(salutations[i].<span class="fu">salut</span>());</a>
+<a class="sourceLine" id="cb19-11" data-line-number="11">}</a></code></pre></div>
+<p>Implémenter les classes <code>Bonjour</code>, <code>Hello</code>, <code>BuenosDias</code> et <code>GutenTag</code>.</p>
+</body>
+</html>

+ 724 - 0
07-Collections.html

@@ -0,0 +1,724 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Collections</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Collections</div>
+<nav id="TOC">
+<ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#les-list">Les “List”</a><ul>
+<li><a href="#linterface-list">L’interface List</a></li>
+<li><a href="#propriétés">Propriétés</a><ul>
+<li><a href="#taille-de-la-liste">Taille de la liste</a></li>
+<li><a href="#ordre-des-éléments">Ordre des éléments</a></li>
+<li><a href="#doublons">Doublons</a></li>
+</ul></li>
+<li><a href="#méthodes-principales">Méthodes principales</a><ul>
+<li><a href="#taille-de-la-liste-1">Taille de la liste</a></li>
+<li><a href="#accès-aux-éléments">Accès aux éléments</a></li>
+<li><a href="#ajout-et-suppression-déléments">Ajout et suppression d’éléments</a></li>
+<li><a href="#typage-des-objets-contenu">Typage des objets contenu</a></li>
+<li><a href="#création">Création</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#typage-des-objets-et-généricité">Typage des objets et généricité</a><ul>
+<li><a href="#avant-les-generics">Avant les Generics</a><ul>
+<li><a href="#avant-java-5.0-tiger">Avant Java 5.0 (Tiger)</a></li>
+<li><a href="#transtypage-nécessaire">Transtypage nécessaire</a></li>
+</ul></li>
+<li><a href="#avec-les-generics">Avec les Generics</a><ul>
+<li><a href="#association-du-type-à-la-liste">Association du type à la liste</a></li>
+<li><a href="#diamond-operator">Diamond operator</a></li>
+<li><a href="#avant-java-7">Avant Java 7</a></li>
+<li><a href="#exemple-dutilisation">Exemple d’utilisation</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#autoboxing-unboxing">Autoboxing / unboxing</a><ul>
+<li><a href="#stockage-des-types-primitifs">Stockage des types primitifs</a><ul>
+<li><a href="#exemple">Exemple</a></li>
+<li><a href="#un-type-une-contenant">Un type = une contenant</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#boucles-for-et-for-each">Boucles for(;;) et for-each</a><ul>
+<li><a href="#deux-formes-ditérations">Deux formes d’itérations</a></li>
+<li><a href="#interface-list-et-classes-associées">Interface List et classes associées</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#parcours-de-liste">Parcours de liste</a></li>
+</ul></li>
+<li><a href="#vue-densemble-des-collections">Vue d’ensemble des Collections</a><ul>
+<li><a href="#les-classes-collection">Les classes Collection</a></li>
+<li><a href="#set">Set</a><ul>
+<li><a href="#définition">Définition</a></li>
+<li><a href="#exemple-1">Exemple</a></li>
+<li><a href="#sous-types">Sous-types</a></li>
+</ul></li>
+<li><a href="#queue">Queue</a><ul>
+<li><a href="#usage">Usage</a></li>
+<li><a href="#méthodes">Méthodes</a></li>
+<li><a href="#exemple-2">Exemple</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#linterface-map-et-ses-sous-classes">L’interface Map et ses sous-classes</a><ul>
+<li><a href="#association-clef-valeur">Association clef-valeur</a></li>
+<li><a href="#types-des-clefs-et-des-valeurs">Types des clefs et des valeurs</a></li>
+<li><a href="#exemple-3">Exemple</a></li>
+<li><a href="#classes-de-type-map">Classes de type Map</a></li>
+</ul></li>
+<li><a href="#parcours">Parcours</a><ul>
+<li><a href="#interface-iterator">Interface Iterator</a></li>
+<li><a href="#cas-particulier-map">Cas particulier: Map</a></li>
+<li><a href="#iterator">Iterator</a><ul>
+<li><a href="#exemple-de-parcours">Exemple de parcours</a></li>
+<li><a href="#parcours-avec-for-et-for-each">Parcours avec for et for-each</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#application">Application</a><ul>
+<li><a href="#list-création-de-listes-de-véhicules">List : création de listes de véhicules</a></li>
+<li><a href="#list-affichage-dune-liste-de-véhicules">List: affichage d’une liste de véhicules</a></li>
+<li><a href="#queue-et-set">(Queue et Set)</a></li>
+<li><a href="#map-référencement-de-véhicule">Map : référencement de véhicule</a></li>
+<li><a href="#iterator-application">Iterator: application</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="introduction">Introduction</h1>
+<p>Les collections en Java permettent de gérer des <strong>ensembles</strong> d’objets.</p>
+<p>Java propose par défaut une bibliothèque de classes permettant de couvrir l’essentiel des besoins d’un programmeur pour gérer des <strong>ensembles</strong>.</p>
+<p>Pour commencer, nous allons étudier la gestion de liste d’objets (<code>List</code>/<code>ArrayList</code>), mais nous verrons plus tard qu’il est possible d’utiliser d’autres types d’ensemble.</p>
+<p>Nous allons également découvrir l’utilité des Generics dans l’usage des collections, ainsi que l’Autoboxing/Unboxing.</p>
+<h1 id="les-list">Les “List”</h1>
+<h2 id="linterface-list">L’interface List</h2>
+<p>Un premier type de collection très utilisé est <code>List</code>.</p>
+<p>Il permet de traiter un ensemble d’objets sous la forme de liste.</p>
+<h2 id="propriétés">Propriétés</h2>
+<h3 id="taille-de-la-liste">Taille de la liste</h3>
+<ul>
+<li>C’est le nombre d’éléments qu’elle contient.</li>
+<li>Elle peut être vide</li>
+</ul>
+<h3 id="ordre-des-éléments">Ordre des éléments</h3>
+<p>Une liste est ordonnée.</p>
+<h3 id="doublons">Doublons</h3>
+<p>Le nombre d’objets distinct peut être différent du nombre d’enregistrement.</p>
+<ul>
+<li>Autrement dit, elle peut contenir des doublons.</li>
+</ul>
+<h2 id="méthodes-principales">Méthodes principales</h2>
+<p><code>java.util.List</code> est une interface qui propose les fonctions suivantes (non exhaustif).</p>
+<h3 id="taille-de-la-liste-1">Taille de la liste</h3>
+<ul>
+<li><code>public int size()</code> : détermine le nombre d’éléments dans la liste (et donc l’index maximal auquel on peut accéder)</li>
+</ul>
+<h3 id="accès-aux-éléments">Accès aux éléments</h3>
+<ul>
+<li><code>public E get(int index)</code> : récupère l’élément positionné à l’index donné en paramètre</li>
+<li><code>public boolean contains(Object o)</code>: indique si oui ou non l’objet passé en paramètre est contenu dans la liste.</li>
+<li><code>public int indexOf(Object o)</code> : indique l’index où se positionne l’objet passé en paramètre dans la liste.</li>
+</ul>
+<h3 id="ajout-et-suppression-déléments">Ajout et suppression d’éléments</h3>
+<ul>
+<li><code>public void add(E e)</code> : ajoute un élément de type <code>E</code> dans la liste</li>
+<li><code>public E remove(int index)</code> : supprime un élément de type <code>E</code> dans la liste et renvoie cet élément</li>
+<li><code>public boolean remove(Object o)</code> : supprime la première occurrence trouvé de l’élément passé en paramètre de la liste</li>
+</ul>
+<h3 id="typage-des-objets-contenu">Typage des objets contenu</h3>
+<p>Vous aurez remarqué le type de retour de <code>get(int)</code>. <code>E</code> est le type d’objet contenu par la liste. Nous allons voir à quoi cela correspond dans le paragraphe suivant.</p>
+<h3 id="création">Création</h3>
+<p>L’interface <code>List</code> ne peut être instanciée directement.</p>
+<p><code>java.util.ArrayList</code> est une classe (concrète) qui implémente cette interface et qui peut être instanciée.</p>
+<h1 id="typage-des-objets-et-généricité">Typage des objets et généricité</h1>
+<p>Une <code>List</code>, par essence, permet de stocker n’importe quel objet. Ce sont donc des instances d’<code>Object</code> qui sont stockés dans une liste.</p>
+<p>Il serait peu pratique de devoir spécifier à chaque appel des méthodes <code>get(int)</code>, <code>remove(int)</code> le type de l’objet retourné.</p>
+<h2 id="avant-les-generics">Avant les Generics</h2>
+<h3 id="avant-java-5.0-tiger">Avant Java 5.0 (Tiger)</h3>
+<p>Dans les version antérieures à la version 1.5 (ou 5.0) de Java, il était nécessaire d’écrire ceci:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> AvantLesGenerics{</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2">  <span class="bu">List</span> list = <span class="kw">new</span> <span class="bu">ArrayList</span>();</a>
+<a class="sourceLine" id="cb1-3" data-line-number="3">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4">    <span class="bu">Date</span> date = <span class="kw">new</span> <span class="bu">Date</span>(<span class="dv">11</span>, <span class="dv">12</span>, <span class="dv">2013</span>);</a>
+<a class="sourceLine" id="cb1-5" data-line-number="5">    list.<span class="fu">add</span>(date);</a>
+<a class="sourceLine" id="cb1-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb1-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb1-8" data-line-number="8">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testSiPremiereDateValide</span>(){</a>
+<a class="sourceLine" id="cb1-9" data-line-number="9">    <span class="bu">Date</span> d = (<span class="bu">Date</span>)list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Transtypage indispensable</span></a>
+<a class="sourceLine" id="cb1-10" data-line-number="10">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(d.<span class="fu">estValide</span>());</a>
+<a class="sourceLine" id="cb1-11" data-line-number="11">  }</a>
+<a class="sourceLine" id="cb1-12" data-line-number="12">}</a></code></pre></div>
+<h3 id="transtypage-nécessaire">Transtypage nécessaire</h3>
+<p>En l’absence de transtypage, le compilateur indiquait une erreur, car la classe par défaut de <code>List</code> est <code>Object</code> et non <code>Date</code>.</p>
+<p>Ce type de programmation était lourd. En effet, à la place de :</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="bu">Date</span> d = (<span class="bu">Date</span>)list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Transtypage indispensable</span></a></code></pre></div>
+<p>il serait plus simple d’écrire:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="bu">Date</span> d = list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Utilisation directe de la méthode</span></a></code></pre></div>
+<p>Ceci est possible depuis la version 1.5 de Java :</p>
+<ul>
+<li>grâce aux <code>Generics</code></li>
+</ul>
+<h2 id="avec-les-generics">Avec les Generics</h2>
+<h3 id="association-du-type-à-la-liste">Association du type à la liste</h3>
+<p>Juste après la déclaration du type (<code>List</code>), il est possible d’indiquer le type d’objet qu’elle contient.</p>
+<p>Pour cela, il suffit de noter le type entre chevrons <code>&lt;</code> et <code>&gt;</code> :</p>
+<p>Cette déclaration indique que la liste contiendra des objets de type <code>Date</code>.</p>
+<p><code>List &lt;Date&gt;</code>.</p>
+<h3 id="diamond-operator">Diamond operator</h3>
+<p>Une fois le type déclaré pour l’interface <code>List</code>, il n’est pas utile de le rappeler lors de l’instanciation.</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="bu">List</span>&lt;<span class="bu">Date</span>&gt; list = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a></code></pre></div>
+<p>Vous noterez que <code>ArrayList</code> est suivi d’un <em>diamant</em> (<em>diamond operator</em>): deux chevrons accolés <code>&lt;&gt;</code>.</p>
+<p>Ceci permet au compilateur de savoir que le type générique correspondra à celui de la variable telle que déclarée précédemment</p>
+<h3 id="avant-java-7">Avant Java 7</h3>
+<p>Il était obligatoire d’écrire explicitement le type lors de l’appel au constructeur avant la version Java SE 7:</p>
+<p>la version du code qui compilait dans ce cas était:</p>
+<p><code>List&lt;Date&gt; list = new ArrayList&lt;Date&gt;();</code></p>
+<p>Ce n’est plus nécessaire depuis la version 7.0.</p>
+<h3 id="exemple-dutilisation">Exemple d’utilisation</h3>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> AvecLesGenerics{</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2">  <span class="bu">List</span>&lt;<span class="bu">Date</span>&gt; list = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">    <span class="bu">Date</span> date = <span class="kw">new</span> <span class="bu">Date</span>(<span class="dv">11</span>,<span class="dv">12</span>,<span class="dv">2013</span>);</a>
+<a class="sourceLine" id="cb5-5" data-line-number="5">    list.<span class="fu">add</span>(date);</a>
+<a class="sourceLine" id="cb5-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb5-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb5-8" data-line-number="8">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testSiPremiereDateValide</span>(){</a>
+<a class="sourceLine" id="cb5-9" data-line-number="9">    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(list.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">estValide</span>());</a>
+<a class="sourceLine" id="cb5-10" data-line-number="10">  }</a>
+<a class="sourceLine" id="cb5-11" data-line-number="11">}</a></code></pre></div>
+<p>Nous disposons donc d’un outil puissant et versatile pour stocker des listes d’objets.</p>
+<p>Cette notion de <code>Generics</code> reste à approfondir mais ce que nous venons de voir va nous suffire dans un premier temps.</p>
+<h1 id="autoboxing-unboxing">Autoboxing / unboxing</h1>
+<h2 id="stockage-des-types-primitifs">Stockage des types primitifs</h2>
+<h3 id="exemple">Exemple</h3>
+<p>L’intérêt des collections est qu’elles permettent également de gérer des types primitifs.</p>
+<p>En effet, même si ces types ne sont pas des instances, ils vont pouvoir être encapsulés dans des objets.</p>
+<p>Ainsi, on aura la possibilité de stocker un <code>int</code> dans un objet de type <code>Integer</code>.</p>
+<p>Observez bien le code suivant:</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> IntBoxing {</a>
+<a class="sourceLine" id="cb6-2" data-line-number="2">    <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; listeInt = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb6-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4">        <span class="dt">int</span> monNombrePrimitif = <span class="dv">24</span>;</a>
+<a class="sourceLine" id="cb6-5" data-line-number="5">        listeInt.<span class="fu">add</span>(monNombrePrimitif);</a>
+<a class="sourceLine" id="cb6-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb6-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">faire</span>(){</a>
+<a class="sourceLine" id="cb6-9" data-line-number="9">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(listeInt.<span class="fu">get</span>(<span class="dv">0</span>) + <span class="dv">12</span>);</a>
+<a class="sourceLine" id="cb6-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb6-11" data-line-number="11">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb6-12" data-line-number="12">        IntBoxing ib = <span class="kw">new</span> <span class="fu">IntBoxing</span>();</a>
+<a class="sourceLine" id="cb6-13" data-line-number="13">        ib.<span class="fu">init</span>();</a>
+<a class="sourceLine" id="cb6-14" data-line-number="14">        ib.<span class="fu">faire</span>();</a>
+<a class="sourceLine" id="cb6-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb6-16" data-line-number="16">}</a></code></pre></div>
+<p>Il est parfaitement fonctionnel.</p>
+<h3 id="un-type-une-contenant">Un type = une contenant</h3>
+<p>Il vous est possible d’utiliser les collections pour stocker les types primitifs suivants en utilisant les <em>réceptacles</em> associés :</p>
+<table>
+<thead>
+<tr class="header">
+<th> Type primitif</th>
+<th>Classe réceptacle</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>boolean</td>
+<td>Boolean </td>
+</tr>
+<tr class="even">
+<td>byte</td>
+<td>Byte  </td>
+</tr>
+<tr class="odd">
+<td>char</td>
+<td>Character</td>
+</tr>
+<tr class="even">
+<td>float</td>
+<td>Float</td>
+</tr>
+<tr class="odd">
+<td>int</td>
+<td>Integer</td>
+</tr>
+<tr class="even">
+<td>long</td>
+<td>Long</td>
+</tr>
+<tr class="odd">
+<td>short</td>
+<td>Short</td>
+</tr>
+<tr class="even">
+<td>double</td>
+<td>Double</td>
+</tr>
+</tbody>
+</table>
+<p>Ces réceptacles sont des objets <em>boîtes</em> (box) dans lesquelles sont stockées les valeurs primitives afin qu’elles soient prises en charge par les collections comme des objets.</p>
+<h1 id="boucles-for-et-for-each">Boucles for(;;) et for-each</h1>
+<h2 id="deux-formes-ditérations">Deux formes d’itérations</h2>
+<p>Il est possible de parcourir une liste de deux manières avec une boucle <code>for</code>:</p>
+<ul>
+<li>la construction classique : <code>for(int i = 0 ; i &lt; l.size() ; i++)</code></li>
+<li>la construction <em>for-each</em> : <code>for (Date date : listeDate)</code></li>
+</ul>
+<h2 id="interface-list-et-classes-associées">Interface List et classes associées</h2>
+<p>Nous avons utilisé l’interface <code>List</code> avec la classe <code>ArrayList</code>. Mais il est possible de l’interchanger avec une autre classe sans effet sur le reste du code.</p>
+<p>Par exemple avec la classe <code>LinkedList</code>:</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> IntBoxing {</a>
+<a class="sourceLine" id="cb7-2" data-line-number="2">    <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; listeInt = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb7-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">        <span class="dt">int</span> monNombrePrimitif = <span class="dv">24</span>;</a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">        listeInt.<span class="fu">add</span>(monNombrePrimitif);</a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">  <span class="co">//... (le reste du code est identique à l&#39;exemple précédent</span></a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">}</a></code></pre></div>
+<p>La classe <code>LinkedList</code> est une liste chaînée. Selon le cas, son mode de fonctionnement sera plus performant que si on utilise une <code>ArrayList</code>.</p>
+<p>Vous pouvez tester cela avec le code suivant:</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.ArrayList;</span></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.util.LinkedList;</span></a>
+<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.List;</span></a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> PerformancesList {</a>
+<a class="sourceLine" id="cb8-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb8-7" data-line-number="7">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> MAX_VALUE = <span class="dv">100000</span>;</a>
+<a class="sourceLine" id="cb8-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb8-9" data-line-number="9">    <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; arrayList = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb8-10" data-line-number="10">    <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; linkedList = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb8-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb8-12" data-line-number="12">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">insert</span>(<span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; liste, <span class="dt">int</span> maxValue) {</a>
+<a class="sourceLine" id="cb8-13" data-line-number="13">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; maxValue; i++) {</a>
+<a class="sourceLine" id="cb8-14" data-line-number="14">            liste.<span class="fu">add</span>(<span class="dv">0</span>, i);</a>
+<a class="sourceLine" id="cb8-15" data-line-number="15">        }</a>
+<a class="sourceLine" id="cb8-16" data-line-number="16">    }</a>
+<a class="sourceLine" id="cb8-17" data-line-number="17"></a>
+<a class="sourceLine" id="cb8-18" data-line-number="18">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">parcours</span>(<span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; liste, <span class="dt">int</span> maxValue) {</a>
+<a class="sourceLine" id="cb8-19" data-line-number="19">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; maxValue; i++) {</a>
+<a class="sourceLine" id="cb8-20" data-line-number="20">            <span class="bu">Integer</span> integer = liste.<span class="fu">get</span>(i);</a>
+<a class="sourceLine" id="cb8-21" data-line-number="21">        }</a>
+<a class="sourceLine" id="cb8-22" data-line-number="22">    }</a>
+<a class="sourceLine" id="cb8-23" data-line-number="23"></a>
+<a class="sourceLine" id="cb8-24" data-line-number="24">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb8-25" data-line-number="25">        PerformancesList pl = <span class="kw">new</span> <span class="fu">PerformancesList</span>();</a>
+<a class="sourceLine" id="cb8-26" data-line-number="26">        pl.<span class="fu">insert</span>(pl.<span class="fu">arrayList</span>, <span class="dv">10</span>);</a>
+<a class="sourceLine" id="cb8-27" data-line-number="27">        pl.<span class="fu">insert</span>(pl.<span class="fu">linkedList</span>, <span class="dv">10</span>);</a>
+<a class="sourceLine" id="cb8-28" data-line-number="28"></a>
+<a class="sourceLine" id="cb8-29" data-line-number="29">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Insertion&quot;</span>);</a>
+<a class="sourceLine" id="cb8-30" data-line-number="30">        <span class="dt">long</span> debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-31" data-line-number="31">        pl.<span class="fu">insert</span>(pl.<span class="fu">linkedList</span>, MAX_VALUE);</a>
+<a class="sourceLine" id="cb8-32" data-line-number="32">        <span class="dt">long</span> finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-33" data-line-number="33">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Linked :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
+<a class="sourceLine" id="cb8-34" data-line-number="34"></a>
+<a class="sourceLine" id="cb8-35" data-line-number="35">        debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-36" data-line-number="36">        pl.<span class="fu">insert</span>(pl.<span class="fu">arrayList</span>, MAX_VALUE);</a>
+<a class="sourceLine" id="cb8-37" data-line-number="37">        finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-38" data-line-number="38">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Array :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
+<a class="sourceLine" id="cb8-39" data-line-number="39"></a>
+<a class="sourceLine" id="cb8-40" data-line-number="40">        pl.<span class="fu">parcours</span>(pl.<span class="fu">arrayList</span>, <span class="dv">10</span>);</a>
+<a class="sourceLine" id="cb8-41" data-line-number="41">        pl.<span class="fu">parcours</span>(pl.<span class="fu">linkedList</span>, <span class="dv">10</span>);</a>
+<a class="sourceLine" id="cb8-42" data-line-number="42"></a>
+<a class="sourceLine" id="cb8-43" data-line-number="43">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Parcours&quot;</span>);</a>
+<a class="sourceLine" id="cb8-44" data-line-number="44">        debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-45" data-line-number="45">        pl.<span class="fu">parcours</span>(pl.<span class="fu">linkedList</span>, MAX_VALUE);</a>
+<a class="sourceLine" id="cb8-46" data-line-number="46">        finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-47" data-line-number="47">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Linked :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
+<a class="sourceLine" id="cb8-48" data-line-number="48"></a>
+<a class="sourceLine" id="cb8-49" data-line-number="49">        debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-50" data-line-number="50">        pl.<span class="fu">parcours</span>(pl.<span class="fu">arrayList</span>, MAX_VALUE);</a>
+<a class="sourceLine" id="cb8-51" data-line-number="51">        finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
+<a class="sourceLine" id="cb8-52" data-line-number="52">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Array :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
+<a class="sourceLine" id="cb8-53" data-line-number="53"></a>
+<a class="sourceLine" id="cb8-54" data-line-number="54">    }</a>
+<a class="sourceLine" id="cb8-55" data-line-number="55">}</a></code></pre></div>
+<p>Que constatez-vous à l’exécution de ce code ?</p>
+<h1 id="exercices">Exercices</h1>
+<h2 id="parcours-de-liste">Parcours de liste</h2>
+<p>Remplissez une liste avec des entiers numérotés de 1 à 10.</p>
+<p>Utilisez les deux types de boucle <code>for</code> pour parcourir une <code>List</code> d’entiers (de 1 à 20).</p>
+<h1 id="vue-densemble-des-collections">Vue d’ensemble des Collections</h1>
+<h2 id="les-classes-collection">Les classes Collection</h2>
+<p>Le diagramme suivant donne une vision globale des Collections en Java</p>
+<figure>
+<img src="images/Collection-Map.png" alt="Collections" /><figcaption>Collections</figcaption>
+</figure>
+<p>On s’aperçoit que <code>List</code> est un sous-type de <code>Collection</code>, tout comme <code>Set</code> ou <code>Queue</code>.</p>
+<p>Nous allons ici nous intéresser sur certaines fonctionnalités de base de ces classes <code>Set</code> et <code>Queue</code>.</p>
+<p>Vous pouvez trouver une documentation plus complète sur les collections <a href="https://en.wikibooks.org/wiki/Java_Programming/Collection">ici</a></p>
+<h2 id="set">Set</h2>
+<h3 id="définition">Définition</h3>
+<p>L’interface <code>Set</code> permet de contenir un ensemble d’objets. Cet ensemble ne contient pas de doublon (un objet y est stocké une et une seule fois).</p>
+<ul>
+<li>Selon son contrat, toute classe qui implémente l’interface <code>Set</code> se base sur la méthode <code>equals</code> pour s’assurer qu’aucun doublon n’est inséré dans la collection.</li>
+<li>Ainsi, l’ajout d’un élément déjà présent dans le <code>Set</code> n’aura aucun effet.</li>
+<li>De même l’ajout d’un élément dont la méthode <code>equals</code> renvoie <code>true</code> pour un des éléments du <code>Set</code>, n’entraînera pas sa présence en doublon.</li>
+</ul>
+<h3 id="exemple-1">Exemple</h3>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
+<a class="sourceLine" id="cb9-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.Set;</span></a>
+<a class="sourceLine" id="cb9-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.TreeSet;</span></a>
+<a class="sourceLine" id="cb9-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb9-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> ExempleSet {</a>
+<a class="sourceLine" id="cb9-7" data-line-number="7">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">        <span class="bu">Set</span>&lt;<span class="bu">Integer</span>&gt; entiers = <span class="kw">new</span> <span class="bu">TreeSet</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb9-9" data-line-number="9">        entiers.<span class="fu">add</span>(<span class="dv">1</span>);</a>
+<a class="sourceLine" id="cb9-10" data-line-number="10">        entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
+<a class="sourceLine" id="cb9-11" data-line-number="11">        entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb9-12" data-line-number="12">        entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
+<a class="sourceLine" id="cb9-13" data-line-number="13">        entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb9-14" data-line-number="14">        entiers.<span class="fu">add</span>(<span class="dv">4</span>);</a>
+<a class="sourceLine" id="cb9-15" data-line-number="15">        entiers.<span class="fu">remove</span>(<span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb9-16" data-line-number="16">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entiers);</a>
+<a class="sourceLine" id="cb9-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb9-18" data-line-number="18">}</a></code></pre></div>
+<h3 id="sous-types">Sous-types</h3>
+<ul>
+<li><code>TreeSet</code>
+<ul>
+<li>Un <code>Set</code> dont les éléments sont ordonnés</li>
+<li><code>SortedSet</code></li>
+</ul></li>
+<li><code>HashSet</code>
+<ul>
+<li>Un <code>Set</code> dont les éléments ne sont pas ordonnés</li>
+</ul></li>
+</ul>
+<h2 id="queue">Queue</h2>
+<h3 id="usage">Usage</h3>
+<p>Les sous-classes de l’interface <code>Queue</code> permettent de gérer des files d’attentes (de type FIFO ou LIFO).</p>
+<h3 id="méthodes">Méthodes</h3>
+<p>Deux façons d’utiliser un objet de type <code>Queue</code></p>
+<table>
+<thead>
+<tr class="header">
+<th>Type d’opération</th>
+<th>Lance une exception</th>
+<th>Renvoie une valeur spéciale</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>Insert</td>
+<td>add(elem)</td>
+<td>offer(elem) </td>
+</tr>
+<tr class="even">
+<td>Remove</td>
+<td>remove()</td>
+<td>poll() </td>
+</tr>
+<tr class="odd">
+<td>Examine</td>
+<td>element()</td>
+<td>peek() </td>
+</tr>
+</tbody>
+</table>
+<h3 id="exemple-2">Exemple</h3>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
+<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.LinkedList;</span></a>
+<a class="sourceLine" id="cb10-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.Queue;</span></a>
+<a class="sourceLine" id="cb10-5" data-line-number="5"></a>
+<a class="sourceLine" id="cb10-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> ExempleQueue {</a>
+<a class="sourceLine" id="cb10-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb10-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb10-9" data-line-number="9">        <span class="dt">int</span> nombreClients = <span class="dv">0</span> ;</a>
+<a class="sourceLine" id="cb10-10" data-line-number="10">        <span class="bu">Queue</span>&lt;<span class="bu">String</span>&gt; queue = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb10-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb10-12" data-line-number="12">        <span class="kw">while</span> (nombreClients &lt; <span class="dv">10</span>){</a>
+<a class="sourceLine" id="cb10-13" data-line-number="13">            queue.<span class="fu">add</span>(<span class="st">&quot;Client(&quot;</span>+nombreClients+<span class="st">&quot;)&quot;</span>);</a>
+<a class="sourceLine" id="cb10-14" data-line-number="14">            nombreClients++;</a>
+<a class="sourceLine" id="cb10-15" data-line-number="15">        }</a>
+<a class="sourceLine" id="cb10-16" data-line-number="16"></a>
+<a class="sourceLine" id="cb10-17" data-line-number="17">        <span class="kw">while</span> (!queue.<span class="fu">isEmpty</span>()) {</a>
+<a class="sourceLine" id="cb10-18" data-line-number="18">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(queue.<span class="fu">remove</span>());</a>
+<a class="sourceLine" id="cb10-19" data-line-number="19">        }</a>
+<a class="sourceLine" id="cb10-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb10-21" data-line-number="21">}</a></code></pre></div>
+<h1 id="linterface-map-et-ses-sous-classes">L’interface Map et ses sous-classes</h1>
+<h2 id="association-clef-valeur">Association clef-valeur</h2>
+<p>Une <code>Map</code> permet de stocker des éléments en les référençant via une clef d’accès.</p>
+<p>C’est l’équivalent d’un dictionnaire. Pour trouver la définition d’un mot, on cherche le mot en question. Une fois trouvé, il est possible d’en lire la définition.</p>
+<p>L’utilisation des <code>Map</code> permet de stocker et récupérer facilement une information, un pointeur ou un objet associé à un autre objet.</p>
+<h2 id="types-des-clefs-et-des-valeurs">Types des clefs et des valeurs</h2>
+<p>Une <code>Map</code> va associer</p>
+<ul>
+<li>une clef
+<ul>
+<li>instance d’un objet ayant un certain type (par exemple <code>Date</code>)</li>
+</ul></li>
+<li>avec une valeur
+<ul>
+<li>instance d’un objet d’un autre type : par exemple <code>Personne</code></li>
+</ul></li>
+<li>Utilisation des Generics
+<ul>
+<li><code>Map &lt;Date, Personne&gt; personneParAnniversaire</code></li>
+</ul></li>
+<li>On peut ainsi retrouver une personne à partir de sa date d’anniversaire.</li>
+</ul>
+<h2 id="exemple-3">Exemple</h2>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.Map;</span></a>
+<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.util.HashMap;</span></a>
+<a class="sourceLine" id="cb11-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">public</span> <span class="kw">class</span> Anniversaire {</a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">    <span class="kw">private</span> <span class="bu">Map</span>&lt;<span class="bu">String</span>, Personne&gt; anniv = <span class="kw">new</span> <span class="bu">HashMap</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb11-7" data-line-number="7">        anniv.<span class="fu">put</span>(<span class="st">&quot;19/05/1955&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Gosling&quot;</span>, <span class="st">&quot;James&quot;</span>));</a>
+<a class="sourceLine" id="cb11-8" data-line-number="8">        anniv.<span class="fu">put</span>(<span class="st">&quot;09/09/1941&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Ritchie&quot;</span>, <span class="st">&quot;Dennis&quot;</span>));</a>
+<a class="sourceLine" id="cb11-9" data-line-number="9">        anniv.<span class="fu">put</span>(<span class="st">&quot;04/02/1943&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Thompson&quot;</span>, <span class="st">&quot;Ken&quot;</span>));</a>
+<a class="sourceLine" id="cb11-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb11-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb11-12" data-line-number="12">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affichePrenom</span>(<span class="bu">String</span> date){</a>
+<a class="sourceLine" id="cb11-13" data-line-number="13">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(anniv.<span class="fu">get</span>(date).<span class="fu">prenom</span>);</a>
+<a class="sourceLine" id="cb11-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb11-15" data-line-number="15"></a>
+<a class="sourceLine" id="cb11-16" data-line-number="16">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb11-17" data-line-number="17">        Anniversaire a = <span class="kw">new</span> <span class="fu">Anniversaire</span>();</a>
+<a class="sourceLine" id="cb11-18" data-line-number="18">        a.<span class="fu">init</span>();</a>
+<a class="sourceLine" id="cb11-19" data-line-number="19">        a.<span class="fu">affichePrenom</span>(<span class="st">&quot;04/02/1943&quot;</span>);</a>
+<a class="sourceLine" id="cb11-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb11-21" data-line-number="21">}</a>
+<a class="sourceLine" id="cb11-22" data-line-number="22"></a>
+<a class="sourceLine" id="cb11-23" data-line-number="23"><span class="kw">class</span> Personne{</a>
+<a class="sourceLine" id="cb11-24" data-line-number="24">    <span class="bu">String</span> nom;</a>
+<a class="sourceLine" id="cb11-25" data-line-number="25">    <span class="bu">String</span> prenom;</a>
+<a class="sourceLine" id="cb11-26" data-line-number="26">    <span class="fu">Personne</span>(<span class="bu">String</span> nom, <span class="bu">String</span> prenom){</a>
+<a class="sourceLine" id="cb11-27" data-line-number="27">        <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
+<a class="sourceLine" id="cb11-28" data-line-number="28">        <span class="kw">this</span>.<span class="fu">prenom</span> = prenom;</a>
+<a class="sourceLine" id="cb11-29" data-line-number="29">    }</a>
+<a class="sourceLine" id="cb11-30" data-line-number="30">}</a></code></pre></div>
+<h2 id="classes-de-type-map">Classes de type Map</h2>
+<p>On peut utiliser à la place de <code>HashMap</code> un type <code>TreeMap</code> ou <code>EnumMap</code> ainsi que d’autres classes (voir la <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html">Javadoc correspondante</a>)</p>
+<p>Les différences d’implémentation entre ces différentes classes ne seront pas discutées ici.</p>
+<h1 id="parcours">Parcours</h1>
+<h2 id="interface-iterator">Interface Iterator</h2>
+<p>Parmi les fonctionnalités communes aux collections, il y a la possibilité de parcourir la liste des éléments d’une collection via l’interface <code>Iterator</code>.</p>
+<h2 id="cas-particulier-map">Cas particulier: Map</h2>
+<p><code>Map</code> est ici un peu à part. Elle est liée aux collections dans le fait qu’elle possède deux méthodes qui renvoient des instances de l’interface <code>Set</code>:</p>
+<ul>
+<li><code>Set&lt;K&gt;   keySet()</code>: ensemble des clefs</li>
+<li><code>Set&lt;Map.Entry&lt;K,V&gt;&gt;  entrySet()</code> : ensemble des entrées</li>
+</ul>
+<p>À partir de ces instances de <code>Set</code> il est possible de récupérer un <code>Iterator</code> pour en parcourir les éléments de la <code>Map</code>.</p>
+<h2 id="iterator">Iterator</h2>
+<h3 id="exemple-de-parcours">Exemple de parcours</h3>
+<p>Voici un exemple d’utilisation d’un <code>Iterator</code>. Ceci est applicable à toute sous-interface de <code>Collection</code>:</p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb12-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">parcourir</span>(<span class="bu">Collection</span> collection) {</a>
+<a class="sourceLine" id="cb12-3" data-line-number="3">   <span class="bu">Iterator</span> it = collection.<span class="fu">iterator</span>();</a>
+<a class="sourceLine" id="cb12-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb12-5" data-line-number="5">   <span class="kw">while</span>(it.<span class="fu">hasNext</span>()) {</a>
+<a class="sourceLine" id="cb12-6" data-line-number="6">      <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(it.<span class="fu">next</span>());</a>
+<a class="sourceLine" id="cb12-7" data-line-number="7">   }</a>
+<a class="sourceLine" id="cb12-8" data-line-number="8"> }</a></code></pre></div>
+<h3 id="parcours-avec-for-et-for-each">Parcours avec for et for-each</h3>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
+<a class="sourceLine" id="cb13-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb13-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.Iterator;</span></a>
+<a class="sourceLine" id="cb13-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.Set;</span></a>
+<a class="sourceLine" id="cb13-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.util.TreeSet;</span></a>
+<a class="sourceLine" id="cb13-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb13-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> ExempleIteration {</a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">        <span class="bu">Set</span>&lt;<span class="bu">Integer</span>&gt; entiers = <span class="kw">new</span> <span class="bu">TreeSet</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">        entiers.<span class="fu">add</span>(<span class="dv">1</span>);</a>
+<a class="sourceLine" id="cb13-11" data-line-number="11">        entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
+<a class="sourceLine" id="cb13-12" data-line-number="12">        entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb13-13" data-line-number="13">        entiers.<span class="fu">add</span>(<span class="dv">4</span>);</a>
+<a class="sourceLine" id="cb13-14" data-line-number="14">        entiers.<span class="fu">remove</span>(<span class="dv">3</span>);</a>
+<a class="sourceLine" id="cb13-15" data-line-number="15">        entiers.<span class="fu">add</span>(<span class="dv">16</span>);</a>
+<a class="sourceLine" id="cb13-16" data-line-number="16">        entiers.<span class="fu">add</span>(<span class="dv">8</span>);</a>
+<a class="sourceLine" id="cb13-17" data-line-number="17"></a>
+<a class="sourceLine" id="cb13-18" data-line-number="18">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;For sur Iterator&quot;</span>);</a>
+<a class="sourceLine" id="cb13-19" data-line-number="19">        <span class="kw">for</span> (<span class="bu">Iterator</span>&lt;<span class="bu">Integer</span>&gt; iterator = entiers.<span class="fu">iterator</span>(); iterator.<span class="fu">hasNext</span>();) {</a>
+<a class="sourceLine" id="cb13-20" data-line-number="20">            <span class="bu">Integer</span> entier = iterator.<span class="fu">next</span>();</a>
+<a class="sourceLine" id="cb13-21" data-line-number="21">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entier);</a>
+<a class="sourceLine" id="cb13-22" data-line-number="22">        }</a>
+<a class="sourceLine" id="cb13-23" data-line-number="23"></a>
+<a class="sourceLine" id="cb13-24" data-line-number="24">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;For-each&quot;</span>);</a>
+<a class="sourceLine" id="cb13-25" data-line-number="25">        <span class="kw">for</span> (<span class="bu">Integer</span> entier : entiers) {</a>
+<a class="sourceLine" id="cb13-26" data-line-number="26">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entier);</a>
+<a class="sourceLine" id="cb13-27" data-line-number="27">        }</a>
+<a class="sourceLine" id="cb13-28" data-line-number="28">    }</a>
+<a class="sourceLine" id="cb13-29" data-line-number="29">}</a></code></pre></div>
+<h1 id="application">Application</h1>
+<h2 id="list-création-de-listes-de-véhicules">List : création de listes de véhicules</h2>
+<p>Nous allons cette fois gérer des listes de <code>Vehicule</code> (en créant une nouvelle classe <code>Vehicule</code> dans le paquet <code>com.example.gestionflotte</code>).</p>
+<p>Cette classe comportera les attributs permettants de stocker les informations suivantes:</p>
+<ul>
+<li>marque</li>
+<li>modèle</li>
+<li>identifiant (un entier dont la valeur est distincte pour chaque instance de la classe véhicule)</li>
+</ul>
+<p>D’un point de vue administratif, une personne (physique ou morale) est propriétaire d’un ou plusieurs véhicules. Ces véhicules peuvent être des types suivants (le nombre de type est ici limité pour simplifier le programme) :</p>
+<ul>
+<li>Véhicule Léger (automobile)</li>
+<li>Véhicule de transport de personnes (plus de huit places assises)</li>
+</ul>
+<p>Une entreprise doit gérer une flotte de véhicule ayant ces différents types.</p>
+<p>Pour chacun des points demandés, tester le code à partir la méthode <code>main</code> de la classe <code>GestionFlotte</code> créée plus bas.</p>
+<div class="warning">
+<p><strong>Il n’est pas demandé de gérer l’ajout ou l’affichage par des commandes au clavier</strong>.</p>
+<p>Le test du programme se fera en ajoutant “en dur” différents véhicules et en examinant la sortie (console) qu’il fournit.</p>
+<p>Le programme doit s’exécuter entièrement automatiquement et afficher des messages sur chaque instruction en cours d’exécution.</p>
+</div>
+<p>Création des types de véhicules</p>
+<ol type="1">
+<li>Créer la classe <code>Vehicule</code> et faite en sorte qu’un identifiant unique soit associé à chaque nouvelle instance.</li>
+<li>Créer une classe pour chaque type (<code>VehiculeLeger</code>, <code>VehiculeLourd</code>, <code>VehiculeTransportPassagers</code>)</li>
+<li>Pour la classe <code>VehiculeTransportPassagers</code>, ajouter un attribut indiquant le nombre maximal de passagers nommé <code>nombreMaxPassagers</code></li>
+<li>Pour la classe <code>VehiculeLeger</code>, indiquer le type: entreprise (voiture à deux places), utilitaire ou particulier (véhicule à 5 places).</li>
+<li>Redéfinir la méthode <code>equals</code> qui permet de vérifier si deux véhicules sont identiques (même marque, même modèle). Ils peuvent avoir des identifiants différents.</li>
+<li>Implémenter la méthode <code>toString</code> de la classe véhicule pour afficher l’identifiant, la marque et le modèle sous cette forme: <code>&quot;[134,marque,modèle]&quot;</code></li>
+</ol>
+<p>On souhaite pouvoir gérer les listes suivantes:</p>
+<ul>
+<li>liste de tous les véhicules appartenant à l’entreprise: <code>listeGlobale</code></li>
+<li>liste de tous les véhicules de transports de passagers: <code>listeTransportPassagers</code></li>
+<li>liste de tous les véhicules légers: <code>listeVehiculesLegers</code></li>
+</ul>
+<p>La classe <code>GestionFlotte</code> va comporter une méthode <code>main</code>.</p>
+<ol start="7" type="1">
+<li>Cans la classe <code>GestionFlotte</code>, ajouter ces trois listes. Il ne doit pas être possible d’ajouter un type incorrect dans les différentes listes (pas de Véhicule Léger dans la liste des véhicules de transport de passagers).</li>
+<li>Ajouter une méthode permettant d’ajouter un véhicule quelconque dans la liste globale: <code>ajouterVehicule(Vehicule v)</code></li>
+<li>Ajouter une méthode permettant de supprimer un véhicule de la liste globale: <code>supprimerVehicule(Vehicule v)</code></li>
+<li>Ajouter une méthode indiquant le nombre de véhicules dans la liste globale : <code>getNombreVehicules()</code></li>
+<li>Tester le code en ajoutant puis supprimant plusieurs véhicules et en vérifiant si les valeur renvoyées sont cohérentes</li>
+</ol>
+<h2 id="list-affichage-dune-liste-de-véhicules">List: affichage d’une liste de véhicules</h2>
+<p>Dans cette partie, il s’agit d’afficher les listes de véhicules sous forme de chaînes de caractères.</p>
+<ol start="12" type="1">
+<li>Créer une méthode permettant de récupérer sous forme de chaîne de caractère l’ensemble des véhicules pour chaque type (trois méthodes à créer):</li>
+</ol>
+<pre><code>- `getListeInformationsTousVehicules()`
+- `getListeInformationsVehiculesLegers()`
+- `getListeInformationsVehiculesTransportsPassagers()`</code></pre>
+<ol start="13" type="1">
+<li>Ajouter une méthode permettant de remplir automatiquement les deux listes spécialisées à partir de la liste globale. Un élément déjà présent dans une liste ne doit pas être ajouté.</li>
+</ol>
+<pre><code>- `synchroniserListesSpecialisees()`</code></pre>
+<ol start="14" type="1">
+<li>Faire en sorte que tout ajout de véhicule dans la flotte complète automatiquement les listes spécialisées si elles sont concernées (à chaque appel de la méthode <code>ajouterVehicule(Vehicule v)</code>).</li>
+<li>Tester avec au moins deux instances pour chaque type de véhicule.</li>
+</ol>
+<h2 id="queue-et-set">(Queue et Set)</h2>
+<p>Reprendre les classes permettant la gestion d’une flotte de véhicules (<code>GestionFlotte</code>).</p>
+<ol start="16" type="1">
+<li>Ajouter à la classe <code>GestionFlotte</code> un attribut <code>marquesVehicules</code> de type <code>Set</code> donnant l’ensemble des marques de véhicules gérés par <code>GestionFlotte</code>.</li>
+</ol>
+<pre><code>```java
+
+Set&lt;String&gt; marquesVehicules = new HashSet&lt;&gt;();
+
+```</code></pre>
+<ol start="17" type="1">
+<li>Créer une méthode <code>void syncMarquesVehicules()</code> permettant de remplir cet ensemble à partir de la liste de tous les véhicules (<code>listeGlobale</code>).</li>
+<li>Créer une méthode <code>String getListeMarquesVehicules()</code> qui renvoie une chaîne de caractères représentant les données contenues dans <code>marquesVehicules</code> (exemple: <code>&quot;Mercedes,Toyota,Peugeot&quot;</code>)</li>
+<li>Ajouter à la classe <code>GestionFlotte</code> un attribut <code>modelesVehicule</code> de type <code>Set</code> qui permet de gérer l’ensemble des marques et modèles de véhicule (un modèle de véhicule pouvant être présent plusieurs fois dans <code>listeGlobale</code>).</li>
+<li>Créer une méthode <code>syncModelesVehicules</code> qui permet de remplir automatiquement <code>modelesVehicule</code> (lire la documentation de <code>Set.addAll(Collection)</code> et souvenez-vous de l’implémentation de la méthode <code>equals</code>)</li>
+<li>Créer une méthode <code>String getListeModelesVehicules()</code> qui renvoie une chaîne de caractères représentant les données contenues dans <code>modelesVehicule</code> (exemple: <code>&quot;[Mercedes/Classe A],[Toyota/Prius],[Toyota/Yaris],[Peugeot/Partner]&quot;</code>)</li>
+</ol>
+<h2 id="map-référencement-de-véhicule">Map : référencement de véhicule</h2>
+<p>Dans ce qui suit, vous traiterez les cas d’erreurs avec des exceptions (pour lesquelles vous créerez des classes).</p>
+<p>Dans cette partie, nous allons références les véhicules par leur identifiant.</p>
+<ol start="22" type="1">
+<li>Créer une <code>Map</code> permettant de stocker la liste des véhicules en les référençant par leur identifiant.</li>
+</ol>
+<ul>
+<li><p>quel est le type de l’identifiant ?</p>
+<ol start="23" type="1">
+<li>Créer une méthode permettant de récupérer un véhicule à partir de son identifiant: <code>getVehicule(int id)</code></li>
+<li>Créer une <code>Map</code> permettant de classer les véhicules par constructeur (marque).</li>
+</ol></li>
+<li><p>quel doit être le type de la clef ?</p>
+<ol start="25" type="1">
+<li>Créer une méthode permettant de récupérer une chaîne de caractères représentant la liste des véhicules pour un constructeur passé en paramètres: <code>getListeVehiculePourMarque(...)</code></li>
+<li>Faites en sorte de rendre cohérent le contenu de ses <code>Map</code> avec celui des listes de véhicules (à chaque ajout et/ou via une méthode de synchronisation)</li>
+</ol></li>
+<li><p>quelle manière semble la plus appropriée ?</p></li>
+</ul>
+<h2 id="iterator-application">Iterator: application</h2>
+<p>Utilisez un Iterator pour afficher l’ensemble des éléments de la liste des véhicules légers.</p>
+</body>
+</html>

+ 971 - 0
08-DelegationAgregationCompositionAssociation.html

@@ -0,0 +1,971 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Associations entre classes</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Associations entre classes</div>
+<nav id="TOC">
+<ul>
+<li><a href="#associations">Associations</a><ul>
+<li><a href="#association-simple">Association simple</a><ul>
+<li><a href="#code-java-équivalent">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#association-avec-rôle">Association avec rôle</a><ul>
+<li><a href="#code-java-équivalent-1">Code Java équivalent</a></li>
+<li><a href="#initialisation-possibilité-1">Initialisation (possibilité 1)</a></li>
+<li><a href="#initialisation-possibilité-2">Initialisation (possibilité 2)</a></li>
+<li><a href="#initialisation-possibilité-3">Initialisation (possibilité 3)</a></li>
+</ul></li>
+<li><a href="#association-bidirectionnelle">Association bidirectionnelle</a><ul>
+<li><a href="#code-java-équivalent-2">Code Java équivalent</a></li>
+<li><a href="#initialisation-impossible">Initialisation impossible !</a></li>
+<li><a href="#initialisation-possibilité-1-1">Initialisation (possibilité 1)</a></li>
+<li><a href="#initialisation-possibilité-2-1">Initialisation (possibilité 2)</a></li>
+<li><a href="#initialisation-possibilité-3-1">Initialisation (possibilité 3)</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#dépendance-utilisation">Dépendance, utilisation</a><ul>
+<li><a href="#relation-de-dépendance">Relation de dépendance</a></li>
+<li><a href="#relation-de-création">Relation de création</a></li>
+</ul></li>
+<li><a href="#agrégation">Agrégation</a><ul>
+<li><a href="#définition">Définition</a></li>
+<li><a href="#exemple">Exemple</a></li>
+<li><a href="#relations">Relations</a></li>
+<li><a href="#destruction">Destruction</a></li>
+<li><a href="#exemple-en-java">Exemple en Java</a><ul>
+<li><a href="#diagramme-de-classes">Diagramme de classes</a></li>
+<li><a href="#classe-livre">Classe Livre</a></li>
+<li><a href="#classe-tablechevet">Classe TableChevet</a></li>
+<li><a href="#classe-personne">Classe Personne</a></li>
+<li><a href="#classe-lirematinetsoir">Classe LireMatinEtSoir</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#composition">Composition</a><ul>
+<li><a href="#définition-1">Définition</a></li>
+<li><a href="#exemple-1">Exemple</a></li>
+<li><a href="#relations-1">Relations</a></li>
+<li><a href="#destruction-1">Destruction</a></li>
+<li><a href="#exemple-en-java-1">Exemple en Java</a><ul>
+<li><a href="#diagramme-de-classes-1">Diagramme de classes</a></li>
+<li><a href="#classe-livre-1">Classe Livre</a></li>
+<li><a href="#classe-page">Classe Page</a></li>
+<li><a href="#classe-personne-1">Classe Personne</a></li>
+<li><a href="#classe-brulerlivres">Classe BrulerLivres</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#délégation">Délégation</a><ul>
+<li><a href="#définition-2">Définition</a></li>
+<li><a href="#caractéristiques">Caractéristiques</a></li>
+<li><a href="#diagramme-de-séquence">Diagramme de séquence</a></li>
+<li><a href="#diagramme-de-classe">Diagramme de classe</a></li>
+<li><a href="#interface-operateur">Interface Operateur</a></li>
+<li><a href="#classe-calcul">Classe Calcul</a></li>
+<li><a href="#classe-operateuraddition">Classe OperateurAddition</a></li>
+<li><a href="#classe-lancercalculs">Classe LancerCalculs</a><ul>
+<li><a href="#exercice">Exercice</a></li>
+<li><a href="#classe-operateursoustraction">Classe OperateurSoustraction</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#délégation-hybride">Délégation hybride</a><ul>
+<li><a href="#caractéristiques-1">Caractéristiques</a></li>
+<li><a href="#diagramme-de-séquence-1">Diagramme de séquence</a></li>
+<li><a href="#diagramme-de-classe-1">Diagramme de classe</a></li>
+<li><a href="#interface-operateur-1">Interface Operateur</a></li>
+<li><a href="#classe-calcul-1">Classe Calcul</a></li>
+<li><a href="#classe-operateuraddition-1">Classe OperateurAddition</a></li>
+<li><a href="#classe-operateursoustraction-1">Classe OperateurSoustraction</a></li>
+<li><a href="#classe-lancercalculs-1">Classe LancerCalculs</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#lettre">Lettre</a></li>
+<li><a href="#chiffres">Chiffres</a></li>
+<li><a href="#mot-et-nombre">Mot et nombre</a></li>
+</ul></li>
+<li><a href="#associations-à-cardinalités-multiples">Associations à cardinalités multiples</a><ul>
+<li><a href="#ensemble-non-ordonné">Ensemble non ordonné</a><ul>
+<li><a href="#code-java-équivalent-3">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#ensemble-ordonné-cardinalité-fixée">Ensemble ordonné (cardinalité fixée)</a><ul>
+<li><a href="#code-java-équivalent-4">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#ensemble-ordonné">Ensemble ordonné</a><ul>
+<li><a href="#code-java-équivalent-5">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#sequence">Sequence</a><ul>
+<li><a href="#code-java-équivalent-6">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#initialisation-des-associations-1-n">Initialisation des associations 1-n</a><ul>
+<li><a href="#création">Création</a></li>
+<li><a href="#ajout">Ajout</a></li>
+<li><a href="#accès">Accès</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#exercices-1">Exercices</a><ul>
+<li><a href="#alphabet">Alphabet</a></li>
+<li><a href="#mot">Mot</a></li>
+</ul></li>
+<li><a href="#associations-qualifiées">Associations qualifiées</a><ul>
+<li><a href="#cardinalité-simple">Cardinalité simple</a><ul>
+<li><a href="#code-java-équivalent-7">Code Java équivalent</a></li>
+</ul></li>
+<li><a href="#cardinalité-multiple">Cardinalité multiple</a><ul>
+<li><a href="#code-java-équivalent-8">Code Java équivalent</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#exercices-2">Exercices</a><ul>
+<li><a href="#glossaire">Glossaire</a></li>
+<li><a href="#dictionnaire">Dictionnaire</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="associations">Associations</h1>
+<h2 id="association-simple">Association simple</h2>
+<p>Un objet B (Opérateur) est associé à un objet A (Calcul).</p>
+<figure>
+<img src="images/UML-association.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<h3 id="code-java-équivalent">Code Java équivalent</h3>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">class</span> Operateur{}</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">class</span> Calcul{</a>
+<a class="sourceLine" id="cb1-4" data-line-number="4">  <span class="kw">private</span> Operateur b;</a>
+<a class="sourceLine" id="cb1-5" data-line-number="5">}</a></code></pre></div>
+<h2 id="association-avec-rôle">Association avec rôle</h2>
+<p>Un objet B (Opérateur) est associé à un objet A (Calcul) et son rôle est identifié sur le diagramme.</p>
+<figure>
+<img src="images/UML-association-role.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<figure>
+<img src="images/UML-association-attribut.png" alt="Association (représentation alternative)" /><figcaption>Association (représentation alternative)</figcaption>
+</figure>
+<h3 id="code-java-équivalent-1">Code Java équivalent</h3>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">class</span> Operateur{}</a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="kw">class</span> Calcul{</a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">  <span class="kw">private</span> Operateur op;</a>
+<a class="sourceLine" id="cb2-5" data-line-number="5">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-1">Initialisation (possibilité 1)</h3>
+<p>Par un <em>setter</em> :</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">class</span> Calcul{</a>
+<a class="sourceLine" id="cb3-2" data-line-number="2">  <span class="kw">private</span> Operateur op;</a>
+<a class="sourceLine" id="cb3-3" data-line-number="3">  <span class="kw">public</span> <span class="fu">setOperateur</span>(Operateur op){</a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">    <span class="kw">this</span>.<span class="fu">op</span> = op;</a>
+<a class="sourceLine" id="cb3-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb3-6" data-line-number="6">  <span class="kw">public</span> <span class="fu">getOperateur</span>(){<span class="kw">return</span> op;}</a>
+<a class="sourceLine" id="cb3-7" data-line-number="7">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-2">Initialisation (possibilité 2)</h3>
+<p>Par le <em>constructeur</em> :</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">class</span> Calcul{</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2">  <span class="kw">private</span> Operateur op;</a>
+<a class="sourceLine" id="cb4-3" data-line-number="3">  <span class="kw">public</span> <span class="fu">Calcul</span>(Operateur op){</a>
+<a class="sourceLine" id="cb4-4" data-line-number="4">    <span class="kw">this</span>.<span class="fu">op</span> = op;</a>
+<a class="sourceLine" id="cb4-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb4-6" data-line-number="6">  <span class="kw">public</span> <span class="fu">getOperateur</span>(){<span class="kw">return</span> op;}</a>
+<a class="sourceLine" id="cb4-7" data-line-number="7">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-3">Initialisation (possibilité 3)</h3>
+<p>Au moment de l’instanciation :</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">class</span> Calcul{</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2">  <span class="kw">private</span> Operateur op;</a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">  <span class="kw">public</span> <span class="fu">Calcul</span>(){</a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">    op = <span class="kw">new</span> <span class="fu">Operateur</span>();</a>
+<a class="sourceLine" id="cb5-5" data-line-number="5">  }</a>
+<a class="sourceLine" id="cb5-6" data-line-number="6">  <span class="kw">public</span> <span class="fu">getOperateur</span>(){<span class="kw">return</span> op;}</a>
+<a class="sourceLine" id="cb5-7" data-line-number="7">}</a></code></pre></div>
+<h2 id="association-bidirectionnelle">Association bidirectionnelle</h2>
+<p>Deux objets sont liés l’un à l’autre:</p>
+<div class="incremental">
+<p>chaque instance possède une référence vers l’autre instance.</p>
+<figure>
+<img src="images/UML-association-bidirectionnelle.png" alt="Association bidirectionnelle" /><figcaption>Association bidirectionnelle</figcaption>
+</figure>
+<h3 id="code-java-équivalent-2">Code Java équivalent</h3>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">class</span> Moteur {</a>
+<a class="sourceLine" id="cb6-2" data-line-number="2">  <span class="kw">private</span> Vehicule vehicule;</a>
+<a class="sourceLine" id="cb6-3" data-line-number="3">}</a>
+<a class="sourceLine" id="cb6-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb6-5" data-line-number="5"><span class="kw">class</span> Vehicule {</a>
+<a class="sourceLine" id="cb6-6" data-line-number="6">  <span class="kw">private</span> Moteur moteur;</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7">}</a></code></pre></div>
+<h3 id="initialisation-impossible">Initialisation impossible !</h3>
+<div class="important">
+<p>Ce code <strong>ne fonctionne pas</strong> :</p>
+</div>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb7-2" data-line-number="2">  Moteur moteur ;</a>
+<a class="sourceLine" id="cb7-3" data-line-number="3">  Vehicule vehicule;</a>
+<a class="sourceLine" id="cb7-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">  <span class="co">//Vehicule n&#39;est pas instancié:</span></a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">  moteur = <span class="kw">new</span> <span class="fu">Moteur</span>(vehicule);</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">  vehicule = <span class="kw">new</span> <span class="fu">Vehicule</span>(moteur);</a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-1-1">Initialisation (possibilité 1)</h3>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb8-2" data-line-number="2">  Moteur moteur ;</a>
+<a class="sourceLine" id="cb8-3" data-line-number="3">  Vehicule vehicule;</a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5">  moteur = <span class="kw">new</span> <span class="fu">Moteur</span>();</a>
+<a class="sourceLine" id="cb8-6" data-line-number="6">  vehicule = <span class="kw">new</span> <span class="fu">Vehicule</span>(moteur);</a>
+<a class="sourceLine" id="cb8-7" data-line-number="7">  moteur.<span class="fu">setVehicule</span>(vehicule);</a>
+<a class="sourceLine" id="cb8-8" data-line-number="8">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-2-1">Initialisation (possibilité 2)</h3>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb9-2" data-line-number="2">  Moteur moteur ;</a>
+<a class="sourceLine" id="cb9-3" data-line-number="3">  Vehicule vehicule;</a>
+<a class="sourceLine" id="cb9-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">  moteur = <span class="kw">new</span> <span class="fu">Moteur</span>();</a>
+<a class="sourceLine" id="cb9-6" data-line-number="6">  vehicule = <span class="kw">new</span> <span class="fu">Vehicule</span>();</a>
+<a class="sourceLine" id="cb9-7" data-line-number="7">  moteur.<span class="fu">setVehicule</span>(vehicule);</a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">  vehicule.<span class="fu">setMoteur</span>(moteur);</a>
+<a class="sourceLine" id="cb9-9" data-line-number="9">}</a></code></pre></div>
+<h3 id="initialisation-possibilité-3-1">Initialisation (possibilité 3)</h3>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">class</span> Vehicule {</a>
+<a class="sourceLine" id="cb10-2" data-line-number="2">  <span class="kw">private</span> Moteur moteur;</a>
+<a class="sourceLine" id="cb10-3" data-line-number="3">  <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setMoteur</span>(Moteur moteur){</a>
+<a class="sourceLine" id="cb10-4" data-line-number="4">    <span class="kw">this</span>.<span class="fu">moteur</span> = moteur;</a>
+<a class="sourceLine" id="cb10-5" data-line-number="5">    moteur.<span class="fu">setVehicule</span>(moteur);</a>
+<a class="sourceLine" id="cb10-6" data-line-number="6">  }</a>
+<a class="sourceLine" id="cb10-7" data-line-number="7">}</a>
+<a class="sourceLine" id="cb10-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb10-9" data-line-number="9"><span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb10-10" data-line-number="10">  Moteur moteur ;</a>
+<a class="sourceLine" id="cb10-11" data-line-number="11">  Vehicule vehicule;</a>
+<a class="sourceLine" id="cb10-12" data-line-number="12"></a>
+<a class="sourceLine" id="cb10-13" data-line-number="13">  moteur = <span class="kw">new</span> <span class="fu">Moteur</span>();</a>
+<a class="sourceLine" id="cb10-14" data-line-number="14">  vehicule = <span class="kw">new</span> <span class="fu">Vehicule</span>();</a>
+<a class="sourceLine" id="cb10-15" data-line-number="15">  vehicule.<span class="fu">setMoteur</span>(moteur);</a>
+<a class="sourceLine" id="cb10-16" data-line-number="16">}</a></code></pre></div>
+</div>
+<h1 id="dépendance-utilisation">Dépendance, utilisation</h1>
+<p>Il est possible de représenter une relation de dépendance entre deux classes sans qu’il y ait une association telle que représentée précédemment.</p>
+<h2 id="relation-de-dépendance">Relation de dépendance</h2>
+<p>La classe principale <code>LancerCalculs</code> utilise la classe <code>Calcul</code></p>
+<figure>
+<img src="images/UML-dependance.png" alt="Dépendance d’utilisation" /><figcaption>Dépendance d’utilisation</figcaption>
+</figure>
+<h2 id="relation-de-création">Relation de création</h2>
+<p>La classe principale <code>LancerCalculs</code> crée au moins une instance de la classe <code>Addition</code></p>
+<figure>
+<img src="images/UML-dependance-creation.png" alt="Dépendance de création" /><figcaption>Dépendance de création</figcaption>
+</figure>
+<p>Peut aussi être noté:</p>
+<figure>
+<img src="images/UML-dependance-instanciation.png" alt="Dépendance d’instanciation" /><figcaption>Dépendance d’instanciation</figcaption>
+</figure>
+<h1 id="agrégation">Agrégation</h1>
+<h2 id="définition">Définition</h2>
+<p>Une agrégation consiste en un assemblage d’objets:</p>
+<ul>
+<li>chaque objet est une partie de l’agrégat</li>
+</ul>
+<div class="incremental">
+<p>Ces objets sont liés par une relation d’inclusion :</p>
+<ul>
+<li>une partie est inclus dans un ensemble</li>
+</ul>
+</div>
+<h2 id="exemple">Exemple</h2>
+<figure>
+<img src="images/Aggregation-exemple.png" alt="Agrégation" /><figcaption>Agrégation</figcaption>
+</figure>
+<h2 id="relations">Relations</h2>
+<figure>
+<img src="images/Aggregation-exemple.png" alt="Agrégation" /><figcaption>Agrégation</figcaption>
+</figure>
+<p>Les relations entre agrégat et parties peuvent être:</p>
+<ul>
+<li>structurelles</li>
+<li>comportementales</li>
+</ul>
+<h2 id="destruction">Destruction</h2>
+<figure>
+<img src="images/Aggregation-exemple.png" alt="Agrégation" /><figcaption>Agrégation</figcaption>
+</figure>
+<p>La destruction de l’agrégat n’implique pas la destruction des parties</p>
+<h2 id="exemple-en-java">Exemple en Java</h2>
+<h3 id="diagramme-de-classes">Diagramme de classes</h3>
+<figure>
+<img src="images/Aggregation-classe.png" alt="Agrégation" /><figcaption>Agrégation</figcaption>
+</figure>
+<h3 id="classe-livre">Classe Livre</h3>
+<p><a href="ws/Agregation/src/Livre.java">Classe Livre</a></p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Livre {</a>
+<a class="sourceLine" id="cb11-3" data-line-number="3">    <span class="bu">String</span> titre;</a>
+<a class="sourceLine" id="cb11-4" data-line-number="4">    <span class="fu">Livre</span>(<span class="bu">String</span> t){</a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">        titre = t;</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb11-7" data-line-number="7">}</a></code></pre></div>
+<h3 id="classe-tablechevet">Classe TableChevet</h3>
+<p><a href="ws/Agregation/src/TableChevet.java">Classe TableChevet</a></p>
+<div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb12-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> TableChevet {</a>
+<a class="sourceLine" id="cb12-3" data-line-number="3">    Livre livreMatin;</a>
+<a class="sourceLine" id="cb12-4" data-line-number="4">    Livre livreSoir ;</a>
+<a class="sourceLine" id="cb12-5" data-line-number="5">    </a>
+<a class="sourceLine" id="cb12-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">afficherTitres</span>() {</a>
+<a class="sourceLine" id="cb12-7" data-line-number="7">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Livre posé: &quot;</span>+livreMatin.<span class="fu">titre</span>);</a>
+<a class="sourceLine" id="cb12-8" data-line-number="8">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Livre posé: &quot;</span>+livreSoir.<span class="fu">titre</span>);</a>
+<a class="sourceLine" id="cb12-9" data-line-number="9">    }</a>
+<a class="sourceLine" id="cb12-10" data-line-number="10">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setLivreSoir</span>(Livre livreSoir) {</a>
+<a class="sourceLine" id="cb12-11" data-line-number="11">        <span class="kw">this</span>.<span class="fu">livreSoir</span> = livreSoir;</a>
+<a class="sourceLine" id="cb12-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb12-13" data-line-number="13">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setLivreMatin</span>(Livre livreMatin) {</a>
+<a class="sourceLine" id="cb12-14" data-line-number="14">        <span class="kw">this</span>.<span class="fu">livreMatin</span> = livreMatin;</a>
+<a class="sourceLine" id="cb12-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb12-16" data-line-number="16">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">finalize</span>() {</a>
+<a class="sourceLine" id="cb12-17" data-line-number="17">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La table de chevet est vendue&quot;</span>);</a>
+<a class="sourceLine" id="cb12-18" data-line-number="18">    }</a>
+<a class="sourceLine" id="cb12-19" data-line-number="19">}</a></code></pre></div>
+<h3 id="classe-personne">Classe Personne</h3>
+<p><a href="ws/Agregation/src/Personne.java">Classe Personne</a></p>
+<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb13-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Personne {</a>
+<a class="sourceLine" id="cb13-3" data-line-number="3">    TableChevet tableChevet ;</a>
+<a class="sourceLine" id="cb13-4" data-line-number="4">    </a>
+<a class="sourceLine" id="cb13-5" data-line-number="5">    Livre aube = <span class="kw">new</span> <span class="fu">Livre</span>(<span class="st">&quot;Aube&quot;</span>);</a>
+<a class="sourceLine" id="cb13-6" data-line-number="6">    Livre crepuscule = <span class="kw">new</span> <span class="fu">Livre</span>(<span class="st">&quot;Crepuscule&quot;</span>);</a>
+<a class="sourceLine" id="cb13-7" data-line-number="7">    </a>
+<a class="sourceLine" id="cb13-8" data-line-number="8">    <span class="fu">Personne</span>(){</a>
+<a class="sourceLine" id="cb13-9" data-line-number="9">        tableChevet = <span class="kw">new</span> <span class="fu">TableChevet</span>();</a>
+<a class="sourceLine" id="cb13-10" data-line-number="10">        tableChevet.<span class="fu">setLivreMatin</span>(aube);</a>
+<a class="sourceLine" id="cb13-11" data-line-number="11">        tableChevet.<span class="fu">setLivreSoir</span>(crepuscule);</a>
+<a class="sourceLine" id="cb13-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb13-13" data-line-number="13">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">vendreTableChevet</span>() {</a>
+<a class="sourceLine" id="cb13-14" data-line-number="14">        tableChevet = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb13-15" data-line-number="15">    }</a>
+<a class="sourceLine" id="cb13-16" data-line-number="16">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">citerLivres</span>() {</a>
+<a class="sourceLine" id="cb13-17" data-line-number="17">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Mon livre du matin: &quot;</span>+ aube.<span class="fu">titre</span>);</a>
+<a class="sourceLine" id="cb13-18" data-line-number="18">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Mon livre du soir: &quot;</span>+crepuscule.<span class="fu">titre</span>);</a>
+<a class="sourceLine" id="cb13-19" data-line-number="19">    }</a>
+<a class="sourceLine" id="cb13-20" data-line-number="20">}</a></code></pre></div>
+<h3 id="classe-lirematinetsoir">Classe LireMatinEtSoir</h3>
+<p><a href="ws/Agregation/src/LireMatinEtSoir.java">Classe LireMatinEtSoir</a></p>
+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb14-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> LireMatinEtSoir {</a>
+<a class="sourceLine" id="cb14-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb14-4" data-line-number="4">        Personne joey = <span class="kw">new</span> <span class="fu">Personne</span>();</a>
+<a class="sourceLine" id="cb14-5" data-line-number="5">        </a>
+<a class="sourceLine" id="cb14-6" data-line-number="6">        joey.<span class="fu">citerLivres</span>();</a>
+<a class="sourceLine" id="cb14-7" data-line-number="7">        joey.<span class="fu">tableChevet</span>.<span class="fu">afficherTitres</span>();</a>
+<a class="sourceLine" id="cb14-8" data-line-number="8">        joey.<span class="fu">vendreTableChevet</span>();</a>
+<a class="sourceLine" id="cb14-9" data-line-number="9">        <span class="fu">nettoyerObjets</span>();</a>
+<a class="sourceLine" id="cb14-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(joey.<span class="fu">tableChevet</span>);</a>
+<a class="sourceLine" id="cb14-11" data-line-number="11">        joey.<span class="fu">citerLivres</span>();</a>
+<a class="sourceLine" id="cb14-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb14-13" data-line-number="13">    </a>
+<a class="sourceLine" id="cb14-14" data-line-number="14">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">nettoyerObjets</span>() {</a>
+<a class="sourceLine" id="cb14-15" data-line-number="15">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Ramasse-miettes&quot;</span>);</a>
+<a class="sourceLine" id="cb14-16" data-line-number="16">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb14-17" data-line-number="17">            <span class="bu">System</span>.<span class="fu">gc</span>();</a>
+<a class="sourceLine" id="cb14-18" data-line-number="18">            <span class="bu">Thread</span>.<span class="fu">sleep</span>(<span class="dv">100</span>);</a>
+<a class="sourceLine" id="cb14-19" data-line-number="19">        } <span class="kw">catch</span> (<span class="bu">InterruptedException</span> e) {</a>
+<a class="sourceLine" id="cb14-20" data-line-number="20">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(e);</a>
+<a class="sourceLine" id="cb14-21" data-line-number="21">        }</a>
+<a class="sourceLine" id="cb14-22" data-line-number="22">    }</a>
+<a class="sourceLine" id="cb14-23" data-line-number="23">}</a></code></pre></div>
+<h1 id="composition">Composition</h1>
+<h2 id="définition-1">Définition</h2>
+<p>Une composition consiste en un assemblage d’objets:</p>
+<ul>
+<li>chaque objet est un composant de l’élément composite</li>
+</ul>
+<div class="incremental">
+<p>Ces objets sont liés par une relation dans laquelle :</p>
+<ul>
+<li>un composant est inclus dans un élément composite</li>
+<li>un composant ne peut être lié à plus d’un élément composite</li>
+</ul>
+</div>
+<h2 id="exemple-1">Exemple</h2>
+<figure>
+<img src="images/Composition-exemple.png" alt="Composition" /><figcaption>Composition</figcaption>
+</figure>
+<h2 id="relations-1">Relations</h2>
+<figure>
+<img src="images/Composition-exemple.png" alt="Composition" /><figcaption>Composition</figcaption>
+</figure>
+<p>Les relations entre composite et composants sont structurelles</p>
+<h2 id="destruction-1">Destruction</h2>
+<figure>
+<img src="images/Composition-exemple.png" alt="Agrégation" /><figcaption>Agrégation</figcaption>
+</figure>
+<p>La destruction de la composition implique la destruction des composants</p>
+<h2 id="exemple-en-java-1">Exemple en Java</h2>
+<h3 id="diagramme-de-classes-1">Diagramme de classes</h3>
+<figure>
+<img src="images/Composition-classe.png" alt="Composition" /><figcaption>Composition</figcaption>
+</figure>
+<h3 id="classe-livre-1">Classe Livre</h3>
+<p><a href="ws/Composition/src/Livre.java">Classe Livre</a></p>
+<div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.ArrayList;</span></a>
+<a class="sourceLine" id="cb15-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.util.List;</span></a>
+<a class="sourceLine" id="cb15-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb15-4" data-line-number="4"><span class="kw">public</span> <span class="kw">class</span> Livre {</a>
+<a class="sourceLine" id="cb15-5" data-line-number="5">    <span class="bu">String</span> titre;</a>
+<a class="sourceLine" id="cb15-6" data-line-number="6">    <span class="bu">List</span>&lt;Page&gt; pages = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb15-7" data-line-number="7">    </a>
+<a class="sourceLine" id="cb15-8" data-line-number="8">    <span class="fu">Livre</span>(<span class="bu">String</span> t){</a>
+<a class="sourceLine" id="cb15-9" data-line-number="9">        titre = t;</a>
+<a class="sourceLine" id="cb15-10" data-line-number="10">        pages.<span class="fu">add</span>(<span class="kw">new</span> <span class="fu">Page</span>(<span class="dv">1</span>, <span class="kw">this</span>));</a>
+<a class="sourceLine" id="cb15-11" data-line-number="11">        pages.<span class="fu">add</span>(<span class="kw">new</span> <span class="fu">Page</span>(<span class="dv">2</span>, <span class="kw">this</span>));</a>
+<a class="sourceLine" id="cb15-12" data-line-number="12">        pages.<span class="fu">add</span>(<span class="kw">new</span> <span class="fu">Page</span>(<span class="dv">3</span>, <span class="kw">this</span>));</a>
+<a class="sourceLine" id="cb15-13" data-line-number="13">    }</a>
+<a class="sourceLine" id="cb15-14" data-line-number="14">    </a>
+<a class="sourceLine" id="cb15-15" data-line-number="15">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">finalize</span>() {</a>
+<a class="sourceLine" id="cb15-16" data-line-number="16">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Le livre &quot;</span>+titre+<span class="st">&quot; est brûlé.&quot;</span>);</a>
+<a class="sourceLine" id="cb15-17" data-line-number="17">    }</a>
+<a class="sourceLine" id="cb15-18" data-line-number="18">}</a></code></pre></div>
+<h3 id="classe-page">Classe Page</h3>
+<p><a href="ws/Composition/src/Page.java">Classe Page</a></p>
+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb16-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Page {</a>
+<a class="sourceLine" id="cb16-3" data-line-number="3">    <span class="dt">int</span> numero;</a>
+<a class="sourceLine" id="cb16-4" data-line-number="4">    Livre livre ;</a>
+<a class="sourceLine" id="cb16-5" data-line-number="5">    <span class="fu">Page</span>(<span class="dt">int</span> num, Livre l){</a>
+<a class="sourceLine" id="cb16-6" data-line-number="6">        numero = num;</a>
+<a class="sourceLine" id="cb16-7" data-line-number="7">        livre = l;</a>
+<a class="sourceLine" id="cb16-8" data-line-number="8">    }</a>
+<a class="sourceLine" id="cb16-9" data-line-number="9">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">finalize</span>() {</a>
+<a class="sourceLine" id="cb16-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La page &quot;</span></a>
+<a class="sourceLine" id="cb16-11" data-line-number="11">                +numero+<span class="st">&quot; du livre &quot;</span></a>
+<a class="sourceLine" id="cb16-12" data-line-number="12">                +livre.<span class="fu">titre</span>+<span class="st">&quot; brûle.&quot;</span>);</a>
+<a class="sourceLine" id="cb16-13" data-line-number="13">    }</a>
+<a class="sourceLine" id="cb16-14" data-line-number="14">}</a></code></pre></div>
+<h3 id="classe-personne-1">Classe Personne</h3>
+<p><a href="ws/Composition/src/Personne.java">Classe Personne</a></p>
+<div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb17-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Personne {</a>
+<a class="sourceLine" id="cb17-3" data-line-number="3">    Livre aube = <span class="kw">new</span> <span class="fu">Livre</span>(<span class="st">&quot;Aube&quot;</span>);</a>
+<a class="sourceLine" id="cb17-4" data-line-number="4">    Livre crepuscule = <span class="kw">new</span> <span class="fu">Livre</span>(<span class="st">&quot;Crepuscule&quot;</span>);</a>
+<a class="sourceLine" id="cb17-5" data-line-number="5">    </a>
+<a class="sourceLine" id="cb17-6" data-line-number="6">    <span class="fu">Personne</span>(){</a>
+<a class="sourceLine" id="cb17-7" data-line-number="7">    }</a>
+<a class="sourceLine" id="cb17-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">brulerLivres</span>() {</a>
+<a class="sourceLine" id="cb17-9" data-line-number="9">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Je brûle mes livres&quot;</span>);</a>
+<a class="sourceLine" id="cb17-10" data-line-number="10">        aube = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb17-11" data-line-number="11">        crepuscule = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb17-12" data-line-number="12">    }</a>
+<a class="sourceLine" id="cb17-13" data-line-number="13">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">citerLivres</span>() {</a>
+<a class="sourceLine" id="cb17-14" data-line-number="14">        <span class="kw">if</span> (aube != <span class="kw">null</span>) {</a>
+<a class="sourceLine" id="cb17-15" data-line-number="15">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Mon livre du matin: &quot;</span>+ aube);</a>
+<a class="sourceLine" id="cb17-16" data-line-number="16">        }<span class="kw">else</span> {</a>
+<a class="sourceLine" id="cb17-17" data-line-number="17">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Pas de livre du matin&quot;</span>);</a>
+<a class="sourceLine" id="cb17-18" data-line-number="18">        }</a>
+<a class="sourceLine" id="cb17-19" data-line-number="19">        <span class="kw">if</span> (crepuscule != <span class="kw">null</span>) {</a>
+<a class="sourceLine" id="cb17-20" data-line-number="20">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Mon livre du soir: &quot;</span>+ crepuscule);</a>
+<a class="sourceLine" id="cb17-21" data-line-number="21">        }<span class="kw">else</span> {</a>
+<a class="sourceLine" id="cb17-22" data-line-number="22">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Pas de livre du soir&quot;</span>);</a>
+<a class="sourceLine" id="cb17-23" data-line-number="23">        }</a>
+<a class="sourceLine" id="cb17-24" data-line-number="24">    }</a>
+<a class="sourceLine" id="cb17-25" data-line-number="25">}</a></code></pre></div>
+<h3 id="classe-brulerlivres">Classe BrulerLivres</h3>
+<p><a href="ws/Composition/src/BrulerLivres.java">Classe BrulerLivres</a></p>
+<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb18-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> BrulerLivres {</a>
+<a class="sourceLine" id="cb18-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb18-4" data-line-number="4">        Personne joey = <span class="kw">new</span> <span class="fu">Personne</span>();</a>
+<a class="sourceLine" id="cb18-5" data-line-number="5">        </a>
+<a class="sourceLine" id="cb18-6" data-line-number="6">        joey.<span class="fu">brulerLivres</span>();</a>
+<a class="sourceLine" id="cb18-7" data-line-number="7">        <span class="fu">nettoyerObjets</span>();</a>
+<a class="sourceLine" id="cb18-8" data-line-number="8">        joey.<span class="fu">citerLivres</span>();</a>
+<a class="sourceLine" id="cb18-9" data-line-number="9">    }</a>
+<a class="sourceLine" id="cb18-10" data-line-number="10">    </a>
+<a class="sourceLine" id="cb18-11" data-line-number="11">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">nettoyerObjets</span>() {</a>
+<a class="sourceLine" id="cb18-12" data-line-number="12">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Ramasse-miettes&quot;</span>);</a>
+<a class="sourceLine" id="cb18-13" data-line-number="13">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb18-14" data-line-number="14">            <span class="bu">System</span>.<span class="fu">gc</span>();</a>
+<a class="sourceLine" id="cb18-15" data-line-number="15">            <span class="bu">Thread</span>.<span class="fu">sleep</span>(<span class="dv">100</span>);</a>
+<a class="sourceLine" id="cb18-16" data-line-number="16">        } <span class="kw">catch</span> (<span class="bu">InterruptedException</span> e) {</a>
+<a class="sourceLine" id="cb18-17" data-line-number="17">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(e);</a>
+<a class="sourceLine" id="cb18-18" data-line-number="18">        }</a>
+<a class="sourceLine" id="cb18-19" data-line-number="19">    }</a>
+<a class="sourceLine" id="cb18-20" data-line-number="20">}</a></code></pre></div>
+<h1 id="délégation">Délégation</h1>
+<h2 id="définition-2">Définition</h2>
+<p>Déléguer c’est faire réaliser le travail par un tiers (un délégué)</p>
+<h2 id="caractéristiques">Caractéristiques</h2>
+<p>La délégation :</p>
+<ul>
+<li>permet de faire réaliser une tâche par le délégué</li>
+<li>donne l’entière responsabilité de la réalisation au délégué</li>
+</ul>
+<h2 id="diagramme-de-séquence">Diagramme de séquence</h2>
+<figure>
+<img src="images/Calculs-delegation-sequence.png" alt="Délégation simple (séquence)" /><figcaption>Délégation simple (séquence)</figcaption>
+</figure>
+<h2 id="diagramme-de-classe">Diagramme de classe</h2>
+<figure>
+<img src="images/Calculs-delegation-classe.png" alt="Délégation simple (classe)" /><figcaption>Délégation simple (classe)</figcaption>
+</figure>
+<h2 id="interface-operateur">Interface Operateur</h2>
+<p><a href="ws/Calcul-delegation-simple/src/Operateur.java"><code>Operateur.java</code></a></p>
+<div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb19-2" data-line-number="2"><span class="kw">public</span> <span class="kw">interface</span> Operateur {</a>
+<a class="sourceLine" id="cb19-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b);</a>
+<a class="sourceLine" id="cb19-4" data-line-number="4">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>();</a>
+<a class="sourceLine" id="cb19-5" data-line-number="5">}</a></code></pre></div>
+<h2 id="classe-calcul">Classe Calcul</h2>
+<p><a href="ws/Calcul-delegation-simple/src/Calcul.java"><code>Calcul.java</code></a></p>
+<div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb20-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Calcul {</a>
+<a class="sourceLine" id="cb20-3" data-line-number="3">    <span class="kw">private</span> <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb20-4" data-line-number="4">    <span class="kw">private</span> <span class="dt">int</span> op1 ;</a>
+<a class="sourceLine" id="cb20-5" data-line-number="5">    <span class="kw">private</span> <span class="dt">int</span> op2;</a>
+<a class="sourceLine" id="cb20-6" data-line-number="6">    <span class="kw">private</span> Operateur operateur;</a>
+<a class="sourceLine" id="cb20-7" data-line-number="7">    </a>
+<a class="sourceLine" id="cb20-8" data-line-number="8">    <span class="fu">Calcul</span>(Operateur lOperateur){</a>
+<a class="sourceLine" id="cb20-9" data-line-number="9">            operateur = lOperateur;</a>
+<a class="sourceLine" id="cb20-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb20-11" data-line-number="11">    </a>
+<a class="sourceLine" id="cb20-12" data-line-number="12">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb20-13" data-line-number="13">     <span class="co">*</span> Accesseur<span class="co">:</span> donne accès à la valeur</a>
+<a class="sourceLine" id="cb20-14" data-line-number="14">     <span class="co">*</span> d<span class="co">&#39;</span>op<span class="co">1</span></a>
+<a class="sourceLine" id="cb20-15" data-line-number="15">     <span class="co">* </span><span class="kw">@return </span>op<span class="co">1</span></a>
+<a class="sourceLine" id="cb20-16" data-line-number="16">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb20-17" data-line-number="17">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getOp1</span>() {</a>
+<a class="sourceLine" id="cb20-18" data-line-number="18">            <span class="kw">return</span> op1;</a>
+<a class="sourceLine" id="cb20-19" data-line-number="19">    }</a>
+<a class="sourceLine" id="cb20-20" data-line-number="20">    </a>
+<a class="sourceLine" id="cb20-21" data-line-number="21">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setOp1</span>(<span class="dt">int</span> a) {</a>
+<a class="sourceLine" id="cb20-22" data-line-number="22">            <span class="fu">calculer</span>(a, op2);</a>
+<a class="sourceLine" id="cb20-23" data-line-number="23">    }</a>
+<a class="sourceLine" id="cb20-24" data-line-number="24">    </a>
+<a class="sourceLine" id="cb20-25" data-line-number="25">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setOp2</span>(<span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb20-26" data-line-number="26">        <span class="fu">calculer</span>(op1, b);</a>
+<a class="sourceLine" id="cb20-27" data-line-number="27">    }</a>
+<a class="sourceLine" id="cb20-28" data-line-number="28">    </a>
+<a class="sourceLine" id="cb20-29" data-line-number="29">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb20-30" data-line-number="30">        op1 = a;</a>
+<a class="sourceLine" id="cb20-31" data-line-number="31">        op2 = b;</a>
+<a class="sourceLine" id="cb20-32" data-line-number="32">        resultat = operateur.<span class="fu">appliquer</span>(op1, op2);</a>
+<a class="sourceLine" id="cb20-33" data-line-number="33">    }</a>
+<a class="sourceLine" id="cb20-34" data-line-number="34">    </a>
+<a class="sourceLine" id="cb20-35" data-line-number="35">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb20-36" data-line-number="36">     <span class="co">*</span> Accesseur<span class="co">:</span> donne accès à la valeur</a>
+<a class="sourceLine" id="cb20-37" data-line-number="37">     <span class="co">*</span> d<span class="co">&#39;</span>op<span class="co">2</span></a>
+<a class="sourceLine" id="cb20-38" data-line-number="38">     <span class="co">* </span><span class="kw">@return </span>op<span class="co">2</span></a>
+<a class="sourceLine" id="cb20-39" data-line-number="39">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb20-40" data-line-number="40">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getOp2</span>() {</a>
+<a class="sourceLine" id="cb20-41" data-line-number="41">        <span class="kw">return</span> op2;</a>
+<a class="sourceLine" id="cb20-42" data-line-number="42">    }</a>
+<a class="sourceLine" id="cb20-43" data-line-number="43">    </a>
+<a class="sourceLine" id="cb20-44" data-line-number="44">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getResultat</span>() {</a>
+<a class="sourceLine" id="cb20-45" data-line-number="45">            <span class="kw">return</span> resultat;</a>
+<a class="sourceLine" id="cb20-46" data-line-number="46">    }</a>
+<a class="sourceLine" id="cb20-47" data-line-number="47">    </a>
+<a class="sourceLine" id="cb20-48" data-line-number="48">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getInformation</span>() {</a>
+<a class="sourceLine" id="cb20-49" data-line-number="49">        <span class="kw">return</span> <span class="st">&quot;Le resultat de &quot;</span>+operateur.<span class="fu">getType</span>()</a>
+<a class="sourceLine" id="cb20-50" data-line-number="50">                + <span class="st">&quot; avec &quot;</span> + op1 + <span class="st">&quot; et &quot;</span> + op2 </a>
+<a class="sourceLine" id="cb20-51" data-line-number="51">                + <span class="st">&quot; est &quot;</span> + resultat;</a>
+<a class="sourceLine" id="cb20-52" data-line-number="52">    }</a>
+<a class="sourceLine" id="cb20-53" data-line-number="53">}</a></code></pre></div>
+<h2 id="classe-operateuraddition">Classe OperateurAddition</h2>
+<p><a href="ws/Calcul-delegation-simple/src/OperateurAddition.java"><code>OperateurAddition.java</code></a></p>
+<div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb21-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> OperateurAddition <span class="kw">implements</span> Operateur {</a>
+<a class="sourceLine" id="cb21-3" data-line-number="3">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb21-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb21-5" data-line-number="5">        <span class="kw">return</span> a + b;</a>
+<a class="sourceLine" id="cb21-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb21-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb21-8" data-line-number="8">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb21-9" data-line-number="9">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>() {</a>
+<a class="sourceLine" id="cb21-10" data-line-number="10">        <span class="kw">return</span> <span class="st">&quot;addition&quot;</span>;</a>
+<a class="sourceLine" id="cb21-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb21-12" data-line-number="12">}</a></code></pre></div>
+<h2 id="classe-lancercalculs">Classe LancerCalculs</h2>
+<p><a href="ws/Calcul-delegation-simple/src/LancerCalculs.java">Classe principale <code>LancerCalculs</code></a></p>
+<div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb22-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> LancerCalculs {</a>
+<a class="sourceLine" id="cb22-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb22-4" data-line-number="4">        Calcul calcul1 = <span class="kw">new</span> <span class="fu">Calcul</span>(<span class="kw">new</span> <span class="fu">OperateurAddition</span>());</a>
+<a class="sourceLine" id="cb22-5" data-line-number="5">        calcul1.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>);</a>
+<a class="sourceLine" id="cb22-6" data-line-number="6">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul1.<span class="fu">getInformation</span>());</a>
+<a class="sourceLine" id="cb22-7" data-line-number="7">        </a>
+<a class="sourceLine" id="cb22-8" data-line-number="8">        Calcul calcul2 = <span class="kw">new</span> <span class="fu">Calcul</span>(<span class="kw">new</span> <span class="fu">OperateurSoustraction</span>());</a>
+<a class="sourceLine" id="cb22-9" data-line-number="9">        calcul2.<span class="fu">calculer</span>(<span class="dv">4</span>, <span class="dv">5</span>);</a>
+<a class="sourceLine" id="cb22-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul2.<span class="fu">getInformation</span>());</a>
+<a class="sourceLine" id="cb22-11" data-line-number="11">        </a>
+<a class="sourceLine" id="cb22-12" data-line-number="12">        Calcul calcul3 = <span class="kw">new</span> <span class="fu">Calcul</span>(<span class="kw">new</span> <span class="fu">OperateurMultiplication</span>());</a>
+<a class="sourceLine" id="cb22-13" data-line-number="13">        calcul3.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">5</span>);</a>
+<a class="sourceLine" id="cb22-14" data-line-number="14">        </a>
+<a class="sourceLine" id="cb22-15" data-line-number="15">        calcul3.<span class="fu">setOp1</span>(<span class="dv">7</span>);</a>
+<a class="sourceLine" id="cb22-16" data-line-number="16">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul3.<span class="fu">getInformation</span>());</a>
+<a class="sourceLine" id="cb22-17" data-line-number="17">        calcul3.<span class="fu">setOp2</span>(<span class="dv">6</span>);</a>
+<a class="sourceLine" id="cb22-18" data-line-number="18">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul3.<span class="fu">getInformation</span>());</a>
+<a class="sourceLine" id="cb22-19" data-line-number="19">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(calcul3.<span class="fu">getResultat</span>());</a>
+<a class="sourceLine" id="cb22-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb22-21" data-line-number="21"></a>
+<a class="sourceLine" id="cb22-22" data-line-number="22">}</a></code></pre></div>
+<h3 id="exercice">Exercice</h3>
+<p>Compléter le diagramme suivant:</p>
+<figure>
+<img src="images/Calculs-delegation-sequence-exercice.png" alt="Délégation simple (séquence)" /><figcaption>Délégation simple (séquence)</figcaption>
+</figure>
+<h3 id="classe-operateursoustraction">Classe OperateurSoustraction</h3>
+<p><a href="ws/Calcul-delegation-simple/src/OperateurSoustraction.java">Classe <code>OperateurSoustraction</code></a></p>
+<div class="sourceCode" id="cb23"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb23-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb23-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> OperateurSoustraction <span class="kw">extends</span> OperateurAddition {</a>
+<a class="sourceLine" id="cb23-3" data-line-number="3">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb23-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb23-5" data-line-number="5">        <span class="kw">return</span> <span class="kw">super</span>.<span class="fu">appliquer</span>(a, -b);</a>
+<a class="sourceLine" id="cb23-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb23-7" data-line-number="7">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb23-8" data-line-number="8">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>() {</a>
+<a class="sourceLine" id="cb23-9" data-line-number="9">        <span class="kw">return</span> <span class="st">&quot;soustraction&quot;</span>;</a>
+<a class="sourceLine" id="cb23-10" data-line-number="10">    }   </a>
+<a class="sourceLine" id="cb23-11" data-line-number="11">}</a></code></pre></div>
+<h1 id="délégation-hybride">Délégation hybride</h1>
+<h2 id="caractéristiques-1">Caractéristiques</h2>
+<p>La délégation hybride :</p>
+<ul>
+<li>permet de faire réaliser une opération par un objet tiers</li>
+<li>permet au délégué de solliciter le délégateur pour l’aider dans la réalisation</li>
+</ul>
+<h2 id="diagramme-de-séquence-1">Diagramme de séquence</h2>
+<figure>
+<img src="images/Calculs-delegation-hybride-sequence.png" alt="Délégation hybride (séquence)" /><figcaption>Délégation hybride (séquence)</figcaption>
+</figure>
+<h2 id="diagramme-de-classe-1">Diagramme de classe</h2>
+<figure>
+<img src="images/Calculs-delegation-hybride-classe.png" alt="Délégation hybride (classe)" /><figcaption>Délégation hybride (classe)</figcaption>
+</figure>
+<h2 id="interface-operateur-1">Interface Operateur</h2>
+<p><a href="ws/Calcul-delegation-hybride/src/Operateur.java">Interface Operateur</a></p>
+<div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb24-2" data-line-number="2"><span class="kw">public</span> <span class="kw">interface</span> Operateur {</a>
+<a class="sourceLine" id="cb24-3" data-line-number="3">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(Calcul c);</a>
+<a class="sourceLine" id="cb24-4" data-line-number="4">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>();</a>
+<a class="sourceLine" id="cb24-5" data-line-number="5">}</a></code></pre></div>
+<h2 id="classe-calcul-1">Classe Calcul</h2>
+<p><a href="ws/Calcul-delegation-hybride/src/Calcul.java">Classe Calcul</a></p>
+<div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb25-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> Calcul {</a>
+<a class="sourceLine" id="cb25-3" data-line-number="3">    <span class="kw">private</span> <span class="dt">int</span> resultat ;</a>
+<a class="sourceLine" id="cb25-4" data-line-number="4">    <span class="kw">private</span> <span class="dt">int</span> op1 ;</a>
+<a class="sourceLine" id="cb25-5" data-line-number="5">    <span class="kw">private</span> <span class="dt">int</span> op2;</a>
+<a class="sourceLine" id="cb25-6" data-line-number="6">    <span class="kw">private</span> Operateur operateur;</a>
+<a class="sourceLine" id="cb25-7" data-line-number="7">    </a>
+<a class="sourceLine" id="cb25-8" data-line-number="8">    <span class="fu">Calcul</span>(Operateur lOperateur){</a>
+<a class="sourceLine" id="cb25-9" data-line-number="9">            operateur = lOperateur;</a>
+<a class="sourceLine" id="cb25-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb25-11" data-line-number="11">    </a>
+<a class="sourceLine" id="cb25-12" data-line-number="12">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb25-13" data-line-number="13">     <span class="co">*</span> Accesseur<span class="co">:</span> donne accès à la valeur</a>
+<a class="sourceLine" id="cb25-14" data-line-number="14">     <span class="co">*</span> d<span class="co">&#39;</span>op<span class="co">1</span></a>
+<a class="sourceLine" id="cb25-15" data-line-number="15">     <span class="co">* </span><span class="kw">@return </span>op<span class="co">1</span></a>
+<a class="sourceLine" id="cb25-16" data-line-number="16">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb25-17" data-line-number="17">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getOp1</span>() {</a>
+<a class="sourceLine" id="cb25-18" data-line-number="18">            <span class="kw">return</span> op1;</a>
+<a class="sourceLine" id="cb25-19" data-line-number="19">    }</a>
+<a class="sourceLine" id="cb25-20" data-line-number="20">    </a>
+<a class="sourceLine" id="cb25-21" data-line-number="21">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setOp1</span>(<span class="dt">int</span> a) {</a>
+<a class="sourceLine" id="cb25-22" data-line-number="22">            <span class="fu">calculer</span>(a, op2);</a>
+<a class="sourceLine" id="cb25-23" data-line-number="23">    }</a>
+<a class="sourceLine" id="cb25-24" data-line-number="24">    </a>
+<a class="sourceLine" id="cb25-25" data-line-number="25">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setOp2</span>(<span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb25-26" data-line-number="26">        <span class="fu">calculer</span>(op1, b);</a>
+<a class="sourceLine" id="cb25-27" data-line-number="27">    }</a>
+<a class="sourceLine" id="cb25-28" data-line-number="28">    </a>
+<a class="sourceLine" id="cb25-29" data-line-number="29">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b) {</a>
+<a class="sourceLine" id="cb25-30" data-line-number="30">        op1 = a;</a>
+<a class="sourceLine" id="cb25-31" data-line-number="31">        op2 = b;</a>
+<a class="sourceLine" id="cb25-32" data-line-number="32">        resultat = operateur.<span class="fu">appliquer</span>(<span class="kw">this</span>);</a>
+<a class="sourceLine" id="cb25-33" data-line-number="33">    }</a>
+<a class="sourceLine" id="cb25-34" data-line-number="34">    </a>
+<a class="sourceLine" id="cb25-35" data-line-number="35">    <span class="co">/**</span></a>
+<a class="sourceLine" id="cb25-36" data-line-number="36">     <span class="co">*</span> Accesseur<span class="co">:</span> donne accès à la valeur</a>
+<a class="sourceLine" id="cb25-37" data-line-number="37">     <span class="co">*</span> d<span class="co">&#39;</span>op<span class="co">2</span></a>
+<a class="sourceLine" id="cb25-38" data-line-number="38">     <span class="co">* </span><span class="kw">@return </span>op<span class="co">2</span></a>
+<a class="sourceLine" id="cb25-39" data-line-number="39">     <span class="co">*/</span></a>
+<a class="sourceLine" id="cb25-40" data-line-number="40">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getOp2</span>() {</a>
+<a class="sourceLine" id="cb25-41" data-line-number="41">        <span class="kw">return</span> op2;</a>
+<a class="sourceLine" id="cb25-42" data-line-number="42">    }</a>
+<a class="sourceLine" id="cb25-43" data-line-number="43">    </a>
+<a class="sourceLine" id="cb25-44" data-line-number="44">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getResultat</span>() {</a>
+<a class="sourceLine" id="cb25-45" data-line-number="45">            <span class="kw">return</span> resultat;</a>
+<a class="sourceLine" id="cb25-46" data-line-number="46">    }</a>
+<a class="sourceLine" id="cb25-47" data-line-number="47">    </a>
+<a class="sourceLine" id="cb25-48" data-line-number="48">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getInformation</span>() {</a>
+<a class="sourceLine" id="cb25-49" data-line-number="49">        <span class="kw">return</span> <span class="st">&quot;Le resultat de &quot;</span>+operateur.<span class="fu">getType</span>()</a>
+<a class="sourceLine" id="cb25-50" data-line-number="50">                + <span class="st">&quot; avec &quot;</span> + op1 + <span class="st">&quot; et &quot;</span> + op2 </a>
+<a class="sourceLine" id="cb25-51" data-line-number="51">                + <span class="st">&quot; est &quot;</span> + resultat;</a>
+<a class="sourceLine" id="cb25-52" data-line-number="52">    }</a>
+<a class="sourceLine" id="cb25-53" data-line-number="53">}</a></code></pre></div>
+<h2 id="classe-operateuraddition-1">Classe OperateurAddition</h2>
+<p><a href="ws/Calcul-delegation-hybride/src/OperateurAddition.java">Classe OperateurAddition</a></p>
+<div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb26-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> OperateurAddition <span class="kw">implements</span> Operateur {</a>
+<a class="sourceLine" id="cb26-3" data-line-number="3">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb26-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(Calcul c) {</a>
+<a class="sourceLine" id="cb26-5" data-line-number="5">        <span class="kw">return</span> c.<span class="fu">getOp1</span>() + c.<span class="fu">getOp2</span>();</a>
+<a class="sourceLine" id="cb26-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb26-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb26-8" data-line-number="8">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb26-9" data-line-number="9">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>() {</a>
+<a class="sourceLine" id="cb26-10" data-line-number="10">        <span class="kw">return</span> <span class="st">&quot;addition&quot;</span>;</a>
+<a class="sourceLine" id="cb26-11" data-line-number="11">    }</a>
+<a class="sourceLine" id="cb26-12" data-line-number="12">}</a></code></pre></div>
+<h2 id="classe-operateursoustraction-1">Classe OperateurSoustraction</h2>
+<p><a href="ws/Calcul-delegation-hybride/src/OperateurSoustraction.java">Classe OperateurSoustraction</a></p>
+<div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb27-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> OperateurSoustraction <span class="kw">implements</span> Operateur {</a>
+<a class="sourceLine" id="cb27-3" data-line-number="3">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb27-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">int</span> <span class="fu">appliquer</span>(Calcul c) {</a>
+<a class="sourceLine" id="cb27-5" data-line-number="5">        <span class="kw">return</span> c.<span class="fu">getOp1</span>() - c.<span class="fu">getOp2</span>();</a>
+<a class="sourceLine" id="cb27-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb27-7" data-line-number="7">    <span class="at">@Override</span></a>
+<a class="sourceLine" id="cb27-8" data-line-number="8">    <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getType</span>() {</a>
+<a class="sourceLine" id="cb27-9" data-line-number="9">        <span class="kw">return</span> <span class="st">&quot;soustraction&quot;</span>;</a>
+<a class="sourceLine" id="cb27-10" data-line-number="10">    }   </a>
+<a class="sourceLine" id="cb27-11" data-line-number="11">}</a></code></pre></div>
+<h2 id="classe-lancercalculs-1">Classe LancerCalculs</h2>
+<p>Elle reste idendique à la version précédente.</p>
+<h1 id="exercices">Exercices</h1>
+<h2 id="lettre">Lettre</h2>
+<p>La classe <code>Lettre</code> permet de représenter les lettres d’un alphabet. Chaque lettre possède un nom.</p>
+<p>A chaque instance est associée :</p>
+<ul>
+<li>une instance de la classe <code>Symbole</code> correspondant à sa représentation en <code>majuscule</code></li>
+<li>une autre à sa représentation en <code>minuscule</code></li>
+</ul>
+<ol type="1">
+<li>Donner le diagramme de classe UML correspondant</li>
+<li>Créer les classes correspondantes en Java.</li>
+<li>Créer une classe principale ‘LettresEtSymboles’ qui instancie les lettres: <code>A</code>, <code>B</code> et <code>C</code>.</li>
+<li>Afficher les noms et symboles pour ces trois instances de <code>Lettre</code></li>
+</ol>
+<h2 id="chiffres">Chiffres</h2>
+<p>La classe <code>Chiffre</code> permet de représenter les symboles de numération. Chaque chiffre est associé:</p>
+<ul>
+<li>à un nom</li>
+<li>à une valeur numérique (sous forme d’entier)</li>
+<li>à un symbole</li>
+</ul>
+<ol type="1">
+<li>Donner le diagramme de classe UML correspondant</li>
+<li>Créer les classes correspondantes en Java.</li>
+<li>Modifier la classe principale ‘LettresEtSymboles’ pour instancier les chiffres: <code>0</code>, <code>1</code> et <code>9</code>.</li>
+<li>Afficher les noms et symboles pour ces trois instances de <code>Chiffre</code></li>
+</ol>
+<h2 id="mot-et-nombre">Mot et nombre</h2>
+<p>La classe <code>Mot</code> représente un ensemble composée de lettres.</p>
+<p>La classe <code>Nombre</code> représente un ensemble composée de chiffres.</p>
+<ol type="1">
+<li>Représenter ces classes sous forme de diagramme UML et leurs associations avec les classes précédemment créées.</li>
+</ol>
+<h1 id="associations-à-cardinalités-multiples">Associations à cardinalités multiples</h1>
+<h2 id="ensemble-non-ordonné">Ensemble non ordonné</h2>
+<p>Un ensemble représente une collection d’objets non ordonnés.</p>
+<figure>
+<img src="images/UML-association-cardinalite-set.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<h3 id="code-java-équivalent-3">Code Java équivalent</h3>
+<div class="sourceCode" id="cb28"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb28-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> EntiersRelatifs {</a>
+<a class="sourceLine" id="cb28-2" data-line-number="2">    <span class="bu">Set</span>&lt;<span class="bu">String</span>&gt; mots = <span class="kw">new</span> <span class="bu">TreeSet</span>&lt;&gt;(); <span class="co">//ou une classe implémentant Set</span></a>
+<a class="sourceLine" id="cb28-3" data-line-number="3">}</a></code></pre></div>
+<h2 id="ensemble-ordonné-cardinalité-fixée">Ensemble ordonné (cardinalité fixée)</h2>
+<p>Objets ordonnés dont le nombre est fixé.</p>
+<figure>
+<img src="images/UML-association-cardinalite-array.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<h3 id="code-java-équivalent-4">Code Java équivalent</h3>
+<div class="sourceCode" id="cb29"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb29-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Wagon {</a>
+<a class="sourceLine" id="cb29-2" data-line-number="2">    <span class="kw">private</span> PlaceAssise[] placesAssises = <span class="kw">new</span> PlaceAssise[<span class="dv">36</span>] ;</a>
+<a class="sourceLine" id="cb29-3" data-line-number="3">}</a></code></pre></div>
+<h2 id="ensemble-ordonné">Ensemble ordonné</h2>
+<p>Objets ordonnés dont le nombre peut varier.</p>
+<figure>
+<img src="images/UML-association-cardinalite-list.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<h3 id="code-java-équivalent-5">Code Java équivalent</h3>
+<div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Classeur {</a>
+<a class="sourceLine" id="cb30-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">List</span>&lt;Feuille&gt; feuilles = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb30-3" data-line-number="3">                             <span class="co">// ou LinkedList ou classe implémentant List</span></a>
+<a class="sourceLine" id="cb30-4" data-line-number="4">}</a></code></pre></div>
+<h2 id="sequence">Sequence</h2>
+<p>Collection ordonnée pouvant contenir plusieurs fois la même occurence d’une même valeur.</p>
+<p>Au Clair De La Lune : <code>{Do, Do, Do, Ré, Mi, Ré, Do, Mi, Ré, Ré, Do}</code></p>
+<figure>
+<img src="images/UML-association-cardinalite-sequence.png" alt="Association" /><figcaption>Association</figcaption>
+</figure>
+<h3 id="code-java-équivalent-6">Code Java équivalent</h3>
+<div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Melodie {</a>
+<a class="sourceLine" id="cb31-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">List</span>&lt;Note&gt; notes = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb31-3" data-line-number="3">                             <span class="co">// ou LinkedList ou classe implémentant List</span></a>
+<a class="sourceLine" id="cb31-4" data-line-number="4">}</a></code></pre></div>
+<h2 id="initialisation-des-associations-1-n">Initialisation des associations 1-n</h2>
+<h3 id="création">Création</h3>
+<div class="sourceCode" id="cb32"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb32-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Classeur {</a>
+<a class="sourceLine" id="cb32-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">List</span>&lt;Feuille&gt; feuilles ;</a>
+<a class="sourceLine" id="cb32-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb32-4" data-line-number="4">    <span class="kw">public</span> <span class="fu">Classeur</span>() {</a>
+<a class="sourceLine" id="cb32-5" data-line-number="5">        feuilles = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
+<a class="sourceLine" id="cb32-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb32-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb32-8" data-line-number="8">    <span class="kw">public</span> <span class="fu">Classeur</span>(<span class="bu">List</span>&lt;Feuille&gt; feuilles) {</a>
+<a class="sourceLine" id="cb32-9" data-line-number="9">        <span class="kw">this</span>.<span class="fu">feuilles</span> = feuilles;</a>
+<a class="sourceLine" id="cb32-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb32-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb32-12" data-line-number="12">    <span class="kw">public</span> <span class="fu">Classeur</span>(Feuille<span class="kw">... </span>feuilles) {</a>
+<a class="sourceLine" id="cb32-13" data-line-number="13">        <span class="kw">this</span>.<span class="fu">feuilles</span> = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;(<span class="bu">Arrays</span>.<span class="fu">asList</span>(feuilles));</a>
+<a class="sourceLine" id="cb32-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb32-15" data-line-number="15">}</a></code></pre></div>
+<h3 id="ajout">Ajout</h3>
+<div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Classeur {</a>
+<a class="sourceLine" id="cb33-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">List</span>&lt;Feuille&gt; feuilles ;</a>
+<a class="sourceLine" id="cb33-3" data-line-number="3">    <span class="co">//...</span></a>
+<a class="sourceLine" id="cb33-4" data-line-number="4">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">addFeuille</span>(Feuille p) {</a>
+<a class="sourceLine" id="cb33-5" data-line-number="5">        feuilles.<span class="fu">add</span>(p);</a>
+<a class="sourceLine" id="cb33-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb33-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb33-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">addFeuilles</span>(<span class="bu">Collection</span>&lt;Feuille&gt; feuilles) {</a>
+<a class="sourceLine" id="cb33-9" data-line-number="9">        <span class="kw">this</span>.<span class="fu">feuilles</span>.<span class="fu">addAll</span>(feuilles);</a>
+<a class="sourceLine" id="cb33-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb33-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb33-12" data-line-number="12">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">addFeuilles</span>(Feuille<span class="kw">... </span>feuilles) {</a>
+<a class="sourceLine" id="cb33-13" data-line-number="13">        <span class="kw">this</span>.<span class="fu">feuilles</span>.<span class="fu">addAll</span>(<span class="bu">Arrays</span>.<span class="fu">asList</span>(feuilles));</a>
+<a class="sourceLine" id="cb33-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb33-15" data-line-number="15">}</a></code></pre></div>
+<h3 id="accès">Accès</h3>
+<div class="sourceCode" id="cb34"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Classeur {</a>
+<a class="sourceLine" id="cb34-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">List</span>&lt;Feuille&gt; feuilles ;</a>
+<a class="sourceLine" id="cb34-3" data-line-number="3">      <span class="co">//...</span></a>
+<a class="sourceLine" id="cb34-4" data-line-number="4">    <span class="kw">public</span> Feuille <span class="fu">getFeuille</span>(<span class="dt">int</span> index) {</a>
+<a class="sourceLine" id="cb34-5" data-line-number="5">        <span class="kw">return</span> feuilles.<span class="fu">get</span>(index);</a>
+<a class="sourceLine" id="cb34-6" data-line-number="6">    }</a>
+<a class="sourceLine" id="cb34-7" data-line-number="7"></a>
+<a class="sourceLine" id="cb34-8" data-line-number="8">    <span class="kw">public</span> <span class="bu">Iterator</span>&lt;Feuille&gt; <span class="fu">getFeuilles</span>() {</a>
+<a class="sourceLine" id="cb34-9" data-line-number="9">        <span class="kw">return</span> feuilles.<span class="fu">iterator</span>();</a>
+<a class="sourceLine" id="cb34-10" data-line-number="10">    }</a>
+<a class="sourceLine" id="cb34-11" data-line-number="11">}</a></code></pre></div>
+<h1 id="exercices-1">Exercices</h1>
+<h2 id="alphabet">Alphabet</h2>
+<p>Créer une classe <code>Alphabet</code>. Cette classe permet d’associer des symboles (‘A’, ‘b’, ‘Z’) sous la forme d’un ensemble (déterminer lequel est pertinent). Ces symboles seront représentés par la classe <code>Lettre</code>.</p>
+<p>Chaque symbole a une représentation minuscule ou majuscule.</p>
+<ol type="1">
+<li>Donner la représentation UML des différentes relations entre <code>Alphabet</code>, <code>Lettre</code> et <code>Symbole</code>.</li>
+<li>Créer les classes correspondantes en Java.</li>
+<li>Modifier la classe principale ‘LettresEtSymboles’ pour créer un alphabet complet (alphabet latin) : de <code>A</code>, à <code>Z</code>.</li>
+<li>Afficher les noms et symboles pour ces trois instances de <code>Lettre</code></li>
+</ol>
+<h2 id="mot">Mot</h2>
+<p>Un mot est une séquence de lettres. La classe <code>Mot</code> représente cette séquence.</p>
+<ol type="1">
+<li>Donner la représentation UML des différentes relations entre <code>Mot</code> et <code>Lettre</code>.</li>
+<li>Créer les classes correspondantes en Java.</li>
+<li>Créer une classe principale ‘DesMassesDeMots’ et créer les mots <code>chat</code>, <code>le</code>, <code>lait</code>, <code>boit</code>.</li>
+<li>Afficher ces mots.</li>
+</ol>
+<h1 id="associations-qualifiées">Associations qualifiées</h1>
+<h2 id="cardinalité-simple">Cardinalité simple</h2>
+<figure>
+<img src="images/UML-association-qualifie-simple.png" alt="Association qualifiée simple" /><figcaption>Association qualifiée simple</figcaption>
+</figure>
+<h3 id="code-java-équivalent-7">Code Java équivalent</h3>
+<div class="sourceCode" id="cb35"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb35-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Lexique {</a>
+<a class="sourceLine" id="cb35-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">Map</span>&lt;Mot, Signification&gt; significations;</a>
+<a class="sourceLine" id="cb35-3" data-line-number="3">}</a></code></pre></div>
+<h2 id="cardinalité-multiple">Cardinalité multiple</h2>
+<figure>
+<img src="images/UML-association-qualifie-multiple.png" alt="Association qualifiée multiple" /><figcaption>Association qualifiée multiple</figcaption>
+</figure>
+<h3 id="code-java-équivalent-8">Code Java équivalent</h3>
+<div class="sourceCode" id="cb36"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb36-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Lexique {</a>
+<a class="sourceLine" id="cb36-2" data-line-number="2">    <span class="kw">private</span> <span class="bu">Map</span>&lt;Mot, <span class="bu">Set</span>&lt;Page&gt;&gt; indexAlphabetique;</a>
+<a class="sourceLine" id="cb36-3" data-line-number="3">}</a></code></pre></div>
+<h1 id="exercices-2">Exercices</h1>
+<h2 id="glossaire">Glossaire</h2>
+<p>Dans un glossaire, on associe à chaque mot une définition dans une discipline donnée.</p>
+<p>Le glossaire sera ici organisé comme suit:</p>
+<ul>
+<li>pour chaque mot, on associera une et une seule définition</li>
+</ul>
+<h2 id="dictionnaire">Dictionnaire</h2>
+<p>Le dictionnaire sera ici organisé comme suit:</p>
+<ul>
+<li>pour chaque lettre de l’alphabet, on associera un ensemble de mots commençant par cette lettre</li>
+<li>pour chaque mot, on associera une ou plusieurs définitions, stockées dans un ensemble.</li>
+</ul>
+</body>
+</html>

+ 382 - 0
09-Swing-introduction.html

@@ -0,0 +1,382 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Interfaces graphiques avec Swing</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Interfaces graphiques avec Swing</div>
+<nav id="TOC">
+<ul>
+<li><a href="#introduction">Introduction</a><ul>
+<li><a href="#swing-et-java-se">Swing et Java SE</a><ul>
+<li><a href="#une-librairie-historique">Une librairie historique…</a></li>
+<li><a href="#partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</a></li>
+</ul></li>
+<li><a href="#hello-world">Hello World</a></li>
+</ul></li>
+<li><a href="#instructions-particulières">Instructions particulières</a><ul>
+<li><a href="#fermeture-de-la-fenêtre">Fermeture de la fenêtre</a></li>
+<li><a href="#ajout-dun-composant">Ajout d’un composant</a></li>
+<li><a href="#affichage-de-la-fenêtre">Affichage de la fenêtre</a></li>
+<li><a href="#dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</a></li>
+<li><a href="#le-lancement-thread-safe">Le lancement Thread-safe</a></li>
+</ul></li>
+<li><a href="#les-composants">Les composants</a><ul>
+<li><a href="#le-paquet-awt">Le paquet AWT</a></li>
+<li><a href="#awt-swing">AWT + Swing</a></li>
+<li><a href="#composants-swing">Composants Swing</a><ul>
+<li><a href="#composants-swing-basiques">Composants Swing basiques</a></li>
+<li><a href="#composants-swing-boutons">Composants Swing : boutons</a></li>
+<li><a href="#composants-swing-texte">Composants Swing : texte</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#disposition-des-éléments">Disposition des éléments</a><ul>
+<li><a href="#layout-agencement-et-disposition">Layout : agencement et disposition</a><ul>
+<li><a href="#section"></a></li>
+</ul></li>
+</ul></li>
+<li><a href="#composition-dihm">Composition d’IHM</a></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#jbutton-et-jlabel">JButton et JLabel</a></li>
+<li><a href="#jbutton-et-jlabel-1">JButton et JLabel</a></li>
+<li><a href="#jbutton-et-jlabel-2">JButton et JLabel</a></li>
+</ul></li>
+<li><a href="#changer-dapparence">Changer d’apparence</a><ul>
+<li><a href="#le-look-and-feel">Le Look And Feel</a><ul>
+<li><a href="#expérimentation-du-look-and-feel">Expérimentation du Look And Feel</a></li>
+<li><a href="#modification-en-cours-dexécution">Modification en cours d’exécution</a></li>
+<li><a href="#modification-au-démarrage">Modification au démarrage</a></li>
+</ul></li>
+</ul></li>
+<li><a href="#larchitecture-des-swing">L’architecture des Swing</a><ul>
+<li><a href="#larchitecture-mvc">L’architecture MVC</a></li>
+<li><a href="#intérêt-de-mvc">Intérêt de MVC</a></li>
+<li><a href="#swing-est-presque-mvc">Swing est (presque) MVC</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="introduction">Introduction</h1>
+<h2 id="swing-et-java-se">Swing et Java SE</h2>
+<h3 id="une-librairie-historique">Une librairie historique…</h3>
+<p>La librairie Swing est aujourd’hui largement utilisée dans de nombreuses applications Java.</p>
+<div class="incremental">
+<p>JavaFX est une librairie de substitution mise en avant par Oracle et présentée comme devant être privilégiée par rapport à Swing.</p>
+</div>
+<h3 id="partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</h3>
+<p>Cependant, comme indiqué <a href="http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#6">sur cette page</a>, Swing est et restera une partie de la spécification Java SE.</p>
+<div class="incremental">
+<p>Swing fait donc partie du JRE et le restera.</p>
+</div>
+<h2 id="hello-world">Hello World</h2>
+<p>Le programme Hello World en Swing peut se faire de la manière suivante :</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
+<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
+<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
+<a class="sourceLine" id="cb1-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb1-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> HelloSwing <span class="kw">implements</span> <span class="bu">Runnable</span> {</a>
+<a class="sourceLine" id="cb1-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){</a>
+<a class="sourceLine" id="cb1-9" data-line-number="9">        <span class="co">//Initialise la fenêtre</span></a>
+<a class="sourceLine" id="cb1-10" data-line-number="10">        <span class="bu">JFrame</span> frame = <span class="kw">new</span> <span class="bu">JFrame</span>(<span class="st">&quot;Hello Swing&quot;</span>);</a>
+<a class="sourceLine" id="cb1-11" data-line-number="11">        frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a>
+<a class="sourceLine" id="cb1-12" data-line-number="12">        </a>
+<a class="sourceLine" id="cb1-13" data-line-number="13">        <span class="co">//Ajoute un label</span></a>
+<a class="sourceLine" id="cb1-14" data-line-number="14">        <span class="bu">JLabel</span> label = <span class="kw">new</span> <span class="bu">JLabel</span>(<span class="st">&quot;Hello World !!!&quot;</span>);</a>
+<a class="sourceLine" id="cb1-15" data-line-number="15">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label);</a>
+<a class="sourceLine" id="cb1-16" data-line-number="16">        </a>
+<a class="sourceLine" id="cb1-17" data-line-number="17">        <span class="co">//Positionne et redimensionne la fenêtre</span></a>
+<a class="sourceLine" id="cb1-18" data-line-number="18">        frame.<span class="fu">setBounds</span>(<span class="dv">200</span>, <span class="dv">200</span>, <span class="dv">300</span>, <span class="dv">240</span>);</a>
+<a class="sourceLine" id="cb1-19" data-line-number="19">        frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
+<a class="sourceLine" id="cb1-20" data-line-number="20">    }</a>
+<a class="sourceLine" id="cb1-21" data-line-number="21">    </a>
+<a class="sourceLine" id="cb1-22" data-line-number="22">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb1-23" data-line-number="23">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="fu">HelloSwing</span>());</a>
+<a class="sourceLine" id="cb1-24" data-line-number="24">    }</a>
+<a class="sourceLine" id="cb1-25" data-line-number="25">}</a></code></pre></div>
+<p>Étapes principales:</p>
+<ul>
+<li>création d’une fenêtre (<code>JFrame</code>)</li>
+<li>création d’un <code>JLabel</code></li>
+<li>récupération du conteneur de la fenêtre (<code>getContentPane()</code>), un <code>JPanel</code></li>
+<li>ajout du label (<code>add(label)</code>)</li>
+</ul>
+<h1 id="instructions-particulières">Instructions particulières</h1>
+<h2 id="fermeture-de-la-fenêtre">Fermeture de la fenêtre</h2>
+<p>L’instruction suivante permet de terminer le programme dès que la fenêtre est fermée:</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1">frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a></code></pre></div>
+<h2 id="ajout-dun-composant">Ajout d’un composant</h2>
+<p>L’ajout d’un composant se fait en utilisant la méthode <code>add(JComponent)</code></p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1">frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label);</a></code></pre></div>
+<h2 id="affichage-de-la-fenêtre">Affichage de la fenêtre</h2>
+<p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1">frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a></code></pre></div>
+<h2 id="dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</h2>
+<p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1">frame.<span class="fu">pack</span>();</a></code></pre></div>
+<h2 id="le-lancement-thread-safe">Le lancement Thread-safe</h2>
+<p>Comme indiqué <a href="https://docs.oracle.com/javase/8/docs/api/javax/swing/package-summary.html#threading">sur cette page</a> il est nécessaire de lancer l’interface ainsi:</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="fu">HelloSwing</span>());</a></code></pre></div>
+<p>Ceci est dû à la manière de gérer les événements et permet d’éviter des exceptions ou bugs lors de l’affichage du programme.</p>
+<h1 id="les-composants">Les composants</h1>
+<h2 id="le-paquet-awt">Le paquet AWT</h2>
+<p>AWT = Abstract Window Toolkit</p>
+<p>Ce paquet fait partie intégrante de l’API Java.</p>
+<p>Il inclut des composants utilisables sur tous les environnements graphiques.</p>
+<figure>
+<img src="images/AWT-classes.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
+</figure>
+<h2 id="awt-swing">AWT + Swing</h2>
+<p>Les composants Swing sont basés sur l’API AWT et les complètent avec des fonctionnalités supplémentaires.</p>
+<figure>
+<img src="images/AWT-classes+swing.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
+</figure>
+<h2 id="composants-swing">Composants Swing</h2>
+<p>Ces composants sont indépendants des environnements graphiques.</p>
+<figure>
+<img src="images/Swing-classes.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
+</figure>
+<h3 id="composants-swing-basiques">Composants Swing basiques</h3>
+<p><code>JPanel</code> et <code>JLabel</code> sont les composants les plus basiques:</p>
+<ul>
+<li><code>JLabel</code>: affichage de texte et/ou image</li>
+<li><code>JPanel</code>: conteneur de base</li>
+</ul>
+<figure>
+<img src="images/Swing-classes-basiques.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
+</figure>
+<h3 id="composants-swing-boutons">Composants Swing : boutons</h3>
+<p>Les boutons permettent d’interagir avec la souris sur les interfaces</p>
+<figure>
+<img src="images/Swing-classes-boutons.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
+</figure>
+<h3 id="composants-swing-texte">Composants Swing : texte</h3>
+<p>Les zones de texte permettent d’afficher/éditer du texte</p>
+<figure>
+<img src="images/Swing-classes-texte.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
+</figure>
+<h1 id="disposition-des-éléments">Disposition des éléments</h1>
+<h2 id="layout-agencement-et-disposition">Layout : agencement et disposition</h2>
+<p>Agencer les composants = assurer une cohérence visuelle</p>
+<div class="incremental">
+<p>Layout = Gestionnaire d’agencement</p>
+<p>L’architecte d’intérieur de l’interface graphique</p>
+<h3 id="section"></h3>
+</div>
+<h1 id="composition-dihm">Composition d’IHM</h1>
+<h1 id="exercices">Exercices</h1>
+<h2 id="jbutton-et-jlabel">JButton et JLabel</h2>
+<p>Créer une fenêtre contenant:</p>
+<ul>
+<li>en premier, un JLabel affichant “&gt;”</li>
+<li>en deuxième position, un JButton affichant le texte “Cliquez ici”</li>
+<li>en premier, un JLabel affichant “&lt;”</li>
+</ul>
+<p>Dimensionner la fenêtre pour que les éléments soient disposés sur une seule ligne</p>
+<h2 id="jbutton-et-jlabel-1">JButton et JLabel</h2>
+<p>Créer une fenêtre contenant:</p>
+<ul>
+<li>en haut, un JLabel affichant “Bonjour”</li>
+<li>en bas, un JButton affichant le texte “Valider”</li>
+</ul>
+<p>Faites en sorte que la dimension de la fenêtre</p>
+<h2 id="jbutton-et-jlabel-2">JButton et JLabel</h2>
+<p>Créer une fenêtre contenant:</p>
+<ul>
+<li>en haut, un JLabel affichant “Bonjour”</li>
+<li>au milieu, un JTextArea contenant le texte <a href="https://loremipsum.io/fr/generator/?n=1&amp;t=p">généré sur cette page</a></li>
+<li>en bas, un JButton affichant le texte “Valider”</li>
+</ul>
+<h1 id="changer-dapparence">Changer d’apparence</h1>
+<h2 id="le-look-and-feel">Le Look And Feel</h2>
+<p>Le <em>Look And Feel</em> est une couche spécifique pour modifier l’affichage et le comportement des composants graphiques.</p>
+<p>Il peut être modifié au démarrage ou en cours d’exécution.</p>
+<h3 id="expérimentation-du-look-and-feel">Expérimentation du Look And Feel</h3>
+<p>Créer la classe <code>SwingExample.java</code> :</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.awt.BorderLayout;</span></a>
+<a class="sourceLine" id="cb7-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.JButton;</span></a>
+<a class="sourceLine" id="cb7-6" data-line-number="6"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
+<a class="sourceLine" id="cb7-7" data-line-number="7"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
+<a class="sourceLine" id="cb7-8" data-line-number="8"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
+<a class="sourceLine" id="cb7-9" data-line-number="9"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
+<a class="sourceLine" id="cb7-10" data-line-number="10"><span class="kw">import</span><span class="im"> javax.swing.UnsupportedLookAndFeelException;</span></a>
+<a class="sourceLine" id="cb7-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb7-12" data-line-number="12"><span class="kw">public</span> <span class="kw">class</span> SwingExample {</a>
+<a class="sourceLine" id="cb7-13" data-line-number="13">    <span class="kw">private</span> <span class="bu">JFrame</span> frame ;</a>
+<a class="sourceLine" id="cb7-14" data-line-number="14">    <span class="kw">private</span> <span class="bu">JLabel</span> label ;</a>
+<a class="sourceLine" id="cb7-15" data-line-number="15">    <span class="dt">void</span> <span class="fu">init</span>(){</a>
+<a class="sourceLine" id="cb7-16" data-line-number="16">        <span class="co">//Initialise la fenêtre</span></a>
+<a class="sourceLine" id="cb7-17" data-line-number="17">        frame = <span class="kw">new</span> <span class="bu">JFrame</span>(<span class="st">&quot;Swing Frame&quot;</span>);</a>
+<a class="sourceLine" id="cb7-18" data-line-number="18">        frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a>
+<a class="sourceLine" id="cb7-19" data-line-number="19">        </a>
+<a class="sourceLine" id="cb7-20" data-line-number="20">        <span class="co">//Ajoute un label</span></a>
+<a class="sourceLine" id="cb7-21" data-line-number="21">        label = <span class="kw">new</span> <span class="bu">JLabel</span>(<span class="st">&quot;About to change Look and Feel&quot;</span>);</a>
+<a class="sourceLine" id="cb7-22" data-line-number="22">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label, <span class="bu">BorderLayout</span>.<span class="fu">NORTH</span>);</a>
+<a class="sourceLine" id="cb7-23" data-line-number="23">        </a>
+<a class="sourceLine" id="cb7-24" data-line-number="24">        <span class="bu">JButton</span> button = <span class="kw">new</span> <span class="bu">JButton</span>(<span class="st">&quot;Does nothing&quot;</span>);</a>
+<a class="sourceLine" id="cb7-25" data-line-number="25">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(button, <span class="bu">BorderLayout</span>.<span class="fu">SOUTH</span>);</a>
+<a class="sourceLine" id="cb7-26" data-line-number="26">        </a>
+<a class="sourceLine" id="cb7-27" data-line-number="27">        <span class="co">//Positionne et redimensionne la fenêtre</span></a>
+<a class="sourceLine" id="cb7-28" data-line-number="28">        frame.<span class="fu">setBounds</span>(<span class="dv">200</span>, <span class="dv">200</span>, <span class="dv">300</span>, <span class="dv">240</span>);</a>
+<a class="sourceLine" id="cb7-29" data-line-number="29">        frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
+<a class="sourceLine" id="cb7-30" data-line-number="30">    }</a>
+<a class="sourceLine" id="cb7-31" data-line-number="31">    </a>
+<a class="sourceLine" id="cb7-32" data-line-number="32">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setLookAndFeel</span>(<span class="bu">String</span> name, <span class="bu">String</span> className){</a>
+<a class="sourceLine" id="cb7-33" data-line-number="33">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="bu">Runnable</span>(){</a>
+<a class="sourceLine" id="cb7-34" data-line-number="34">            <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){</a>
+<a class="sourceLine" id="cb7-35" data-line-number="35">                <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb7-36" data-line-number="36">                    <span class="bu">UIManager</span>.<span class="fu">setLookAndFeel</span>(className);</a>
+<a class="sourceLine" id="cb7-37" data-line-number="37">                    label.<span class="fu">setText</span>(name);</a>
+<a class="sourceLine" id="cb7-38" data-line-number="38">                    <span class="bu">SwingUtilities</span>.<span class="fu">updateComponentTreeUI</span>(frame);</a>
+<a class="sourceLine" id="cb7-39" data-line-number="39">                    frame.<span class="fu">pack</span>();</a>
+<a class="sourceLine" id="cb7-40" data-line-number="40">                } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">InstantiationException</span> | <span class="bu">IllegalAccessException</span></a>
+<a class="sourceLine" id="cb7-41" data-line-number="41">                        | <span class="bu">UnsupportedLookAndFeelException</span> e) {</a>
+<a class="sourceLine" id="cb7-42" data-line-number="42">                    e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb7-43" data-line-number="43">                }</a>
+<a class="sourceLine" id="cb7-44" data-line-number="44">            }</a>
+<a class="sourceLine" id="cb7-45" data-line-number="45">        });</a>
+<a class="sourceLine" id="cb7-46" data-line-number="46">        </a>
+<a class="sourceLine" id="cb7-47" data-line-number="47">    }</a>
+<a class="sourceLine" id="cb7-48" data-line-number="48">}</a></code></pre></div>
+<h3 id="modification-en-cours-dexécution">Modification en cours d’exécution</h3>
+<p>Créer et exécuter la classe exécutable <code>LookAndFeel.java</code> :</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.UIManager.LookAndFeelInfo;</span></a>
+<a class="sourceLine" id="cb8-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> <span class="bu">LookAndFeel</span> {</a>
+<a class="sourceLine" id="cb8-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {        </a>
+<a class="sourceLine" id="cb8-9" data-line-number="9">        SwingExample example = <span class="kw">new</span> <span class="fu">SwingExample</span>();</a>
+<a class="sourceLine" id="cb8-10" data-line-number="10">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="bu">Runnable</span>(){</a>
+<a class="sourceLine" id="cb8-11" data-line-number="11">            <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){ example.<span class="fu">init</span>(); }</a>
+<a class="sourceLine" id="cb8-12" data-line-number="12">        });</a>
+<a class="sourceLine" id="cb8-13" data-line-number="13">        </a>
+<a class="sourceLine" id="cb8-14" data-line-number="14">        LookAndFeelInfo[] lafiArray = <span class="bu">UIManager</span>.<span class="fu">getInstalledLookAndFeels</span>();</a>
+<a class="sourceLine" id="cb8-15" data-line-number="15">        <span class="dt">int</span> i = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb8-16" data-line-number="16">        <span class="kw">while</span>(<span class="kw">true</span>){</a>
+<a class="sourceLine" id="cb8-17" data-line-number="17">            <span class="kw">if</span>(i &gt;= lafiArray.<span class="fu">length</span>){</a>
+<a class="sourceLine" id="cb8-18" data-line-number="18">                i = <span class="dv">0</span>;</a>
+<a class="sourceLine" id="cb8-19" data-line-number="19">            }</a>
+<a class="sourceLine" id="cb8-20" data-line-number="20">            LookAndFeelInfo lafi = lafiArray[i];</a>
+<a class="sourceLine" id="cb8-21" data-line-number="21">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(lafi.<span class="fu">getName</span>()+<span class="st">&quot; : &quot;</span>+lafi.<span class="fu">getClassName</span>());</a>
+<a class="sourceLine" id="cb8-22" data-line-number="22">            <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb8-23" data-line-number="23">                <span class="bu">Thread</span>.<span class="fu">sleep</span>(<span class="dv">2000</span>);</a>
+<a class="sourceLine" id="cb8-24" data-line-number="24"></a>
+<a class="sourceLine" id="cb8-25" data-line-number="25">                example.<span class="fu">setLookAndFeel</span>(lafi.<span class="fu">getName</span>(), lafi.<span class="fu">getClassName</span>());</a>
+<a class="sourceLine" id="cb8-26" data-line-number="26">            } <span class="kw">catch</span> (<span class="bu">InterruptedException</span> e) {</a>
+<a class="sourceLine" id="cb8-27" data-line-number="27">                e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb8-28" data-line-number="28">            }</a>
+<a class="sourceLine" id="cb8-29" data-line-number="29">            i++;</a>
+<a class="sourceLine" id="cb8-30" data-line-number="30">        }</a>
+<a class="sourceLine" id="cb8-31" data-line-number="31">    }</a>
+<a class="sourceLine" id="cb8-32" data-line-number="32">}</a></code></pre></div>
+<h3 id="modification-au-démarrage">Modification au démarrage</h3>
+<p>Créer une nouvelle classe nommée <code>FixedLookAndFeel</code>.</p>
+<p>Dans la méthode <code>main</code>, utiliser la méthode suivante avec un Look And Feel de votre choix :</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="bu">UIManager</span>.<span class="fu">setLookAndFeel</span>(<span class="bu">String</span> className);</a></code></pre></div>
+<p>Afficher la fenêtre de SwingExample.</p>
+<h1 id="larchitecture-des-swing">L’architecture des Swing</h1>
+<h2 id="larchitecture-mvc">L’architecture MVC</h2>
+<p>Modèle-Vue-Contrôleur</p>
+<figure>
+<img src="images/MVC.png" alt="MVC" /><figcaption>MVC</figcaption>
+</figure>
+<h2 id="intérêt-de-mvc">Intérêt de MVC</h2>
+<figure>
+<img src="images/MVC-utilisateur.png" alt="MVC" /><figcaption>MVC</figcaption>
+</figure>
+<ul>
+<li>évolution</li>
+<li>maintenance</li>
+<li>vues multiples d’une même donnée</li>
+</ul>
+<h2 id="swing-est-presque-mvc">Swing est (presque) MVC</h2>
+<p>Il a été difficile d’appliquer MVC à l’architecture Swing, cependant, celle-ci s’en inspire.</p>
+<figure>
+<img src="images/Swing-architecture.png" alt="MVC" /><figcaption>MVC</figcaption>
+</figure>
+</body>
+</html>

+ 36 - 0
10-LesEntreesSorties.html

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Entrées/sorties</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Entrées/sorties</div>
+<nav id="TOC">
+<ul>
+<li><a href="#les-entréessorties">Les entrées/sorties</a></li>
+</ul>
+</nav>
+<h1 id="les-entréessorties">Les entrées/sorties</h1>
+<p>Les entrées/sorties (Input/Output ou IO) concernent tout ce qui concerne l’accès aux fichiers.</p>
+<p>Deux packages principaux sont proposés en standard avec Java:</p>
+<ul>
+<li>java.io</li>
+<li>java.nio</li>
+</ul>
+<p>Nous allons uniquement aborder le premier. Pour cela, nous allons suivre ce tutoriel (libre de droits):</p>
+<p>http://anisfrikha.developpez.com/tutoriel/java-io/</p>
+</body>
+</html>

+ 28 - 0
11-ExtensionsEtReutilisationDeCode.html

@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>les limites de l’héritage</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">les limites de l’héritage</div>
+<nav id="TOC">
+<ul>
+<li><a href="#limites-de-lhéritage">Limites de l’héritage</a></li>
+</ul>
+</nav>
+<h1 id="limites-de-lhéritage">Limites de l’héritage</h1>
+</body>
+</html>

+ 49 - 0
12-JavaFX.html

@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Interfaces graphiques</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Interfaces graphiques</div>
+<nav id="TOC">
+<ul>
+<li><a href="#interfaces-graphiques-et-javafx">Interfaces graphiques et JavaFX</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#prise-en-main">Prise en main</a><ul>
+<li><a href="#configuration-de-scenebuilder">Configuration de SceneBuilder</a></li>
+<li><a href="#en-cas-derreur">En cas d’erreur</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="interfaces-graphiques-et-javafx">Interfaces graphiques et JavaFX</h1>
+<h2 id="introduction">Introduction</h2>
+<p>JavaFX est une bibliothèque permettant de réaliser des interfaces graphiques.</p>
+<h2 id="prise-en-main">Prise en main</h2>
+<p>Après avoir installé les outils nécessaires (voir le tutoriel et les liens ci-dessous), vous pourrez prendre en main JavaFX, en suivant ce tutoriel:</p>
+<p>http://code.makery.ch/library/javafx-8-tutorial/fr/</p>
+<p>Partie 2:</p>
+<p>https://github.com/marcojakob/code.makery.ch/blob/master/collections/library/javafx-8-tutorial-fr-part2.md</p>
+<h3 id="configuration-de-scenebuilder">Configuration de SceneBuilder</h3>
+<p>Voir ce lien pour la configuration de SceneBuilder avec les différences IDEs:</p>
+<p>https://docs.oracle.com/javafx/scenebuilder/1/use_java_ides/jsbpub-use_java_ides.htm</p>
+<h3 id="en-cas-derreur">En cas d’erreur</h3>
+<p>Vous pouvez tomber sur une erreur de ce type:</p>
+<p><code>Access restriction: The type 'Application' is not API (restriction on required library '/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/ext/jfxrt.jar')</code></p>
+<p>Dans ce cas, il faut autoriser Eclipse à utiliser les classes qu’ils considère comme ne faisant pas partie de l’API publique de Java.</p>
+<p>Pour remédier à cela, suivre les instructions données sur <a href="https://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar">cette question de StackOverflow</a> (<strong>Attention</strong>: la première réponse ne marche par forcément, mais il y a d’autres pistes)</p>
+</body>
+</html>

+ 462 - 0
13-BaseDeDonnees.html

@@ -0,0 +1,462 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Base de données</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Base de données</div>
+<nav id="TOC">
+<ul>
+<li><a href="#accès-à-une-base-de-données">Accès à une base de données</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#accès-à-une-base-mysql">Accès à une base MySQL</a><ul>
+<li><a href="#installation">Installation</a></li>
+<li><a href="#utilisation">Utilisation</a></li>
+</ul></li>
+<li><a href="#exercice">Exercice</a></li>
+<li><a href="#ecrire-dans-les-bases-de-données">Ecrire dans les bases de données</a></li>
+<li><a href="#pour-aller-plus-loin">Pour aller plus loin</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="accès-à-une-base-de-données">Accès à une base de données</h1>
+<h2 id="introduction">Introduction</h2>
+<p>Nous allons utiliser JDBC pour accéder à une base de données. Il existe d’autres librairies qui permettent l’accès aux bases de données, avec des fonctionnalités plus avancées (par exemple JPA ou Hibernate).</p>
+<p>Cependant JDBC est l’API de bas niveau qui est utilisée par toutes celles de plus haut niveau.</p>
+<p>Nous allons donc découvrir le fonctionnement de cette API et voir comment on peut <em>mapper</em> (c’est-à-dire associer) les entrées d’une base de données avec les membres d’une classe. Ceci revient à faire correspondre les valeurs d’une table aux attributs d’une classe.</p>
+<h2 id="accès-à-une-base-mysql">Accès à une base MySQL</h2>
+<h3 id="installation">Installation</h3>
+<p>Pour commencer, vous allez écrire le programme suivant et le lancer:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.*;</span></a>
+<a class="sourceLine" id="cb1-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> Demo {</a>
+<a class="sourceLine" id="cb1-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb1-7" data-line-number="7">        <span class="co">//Commençons par charger le pilote:</span></a>
+<a class="sourceLine" id="cb1-8" data-line-number="8">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb1-9" data-line-number="9">            <span class="bu">Class</span>.<span class="fu">forName</span>(<span class="st">&quot;com.mysql.jdbc.Driver&quot;</span>);</a>
+<a class="sourceLine" id="cb1-10" data-line-number="10">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> e) {</a>
+<a class="sourceLine" id="cb1-11" data-line-number="11">            e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb1-12" data-line-number="12">        }</a>
+<a class="sourceLine" id="cb1-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb1-14" data-line-number="14">    }</a>
+<a class="sourceLine" id="cb1-15" data-line-number="15">}</a></code></pre></div>
+<p>Lancez ce programme. Vous constatez un erreur et c’est normal !</p>
+<p>Ce programme ne va pas marcher car il lui manque un connecteur que vous allez télécharger <a href="https://dev.mysql.com/downloads/connector/j/">sur le site de MySQL</a></p>
+<p>Choisissez une des deux archives, téléchargez-la et décompressez-la.</p>
+<p>Ce connecteur est une librairie qu’il faut ajouter à votre projet.</p>
+<p>Pour cela, ouvrez les propriétés du projet (bouton droit et <code>Properties</code>) et allez sur <code>Java Build Path</code> puis <code>Libraries</code></p>
+<figure>
+<img src="images/librairies.png" alt="Propriété du projet" /><figcaption>Propriété du projet</figcaption>
+</figure>
+<p>Cliquez sur <code>Add Library...</code></p>
+<figure>
+<img src="images/add_library_1.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
+</figure>
+<p>Sélectionnez <code>User Library</code> et cliquez sur <code>Next</code></p>
+<figure>
+<img src="images/add_library_2.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
+</figure>
+<p>Cliquez sur <code>User Libraries...</code></p>
+<figure>
+<img src="images/add_library_3.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
+</figure>
+<p>Cliquez sur <code>New...</code> et entrez comme nom : <code>Connecteur MySQL</code></p>
+<p>Sélectionnez la nouvelle librairie et cliquez sur <code>Add External JARs...</code></p>
+<p>Sélectionnez le fichier <code>mysql-connector-java-X.Y.ZZ-bin.jar</code> qui était dans l’archive puis validez les modifications</p>
+<p>Cliquez sur <code>Source attachment</code> puis sur <code>Edit...</code></p>
+<figure>
+<img src="images/add_library_4.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
+</figure>
+<p>Choisissez <code>External location</code> puis <code>External Folder...</code> et sélectionnez le répertoire <code>src</code> qui est dans le même dossier que le fichier JAR précédent.</p>
+<p>Validez toutes les modifications pour sortir des préférences</p>
+<figure>
+<img src="images/add_library_5.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
+</figure>
+<p>Cliquez sur <code>Finish</code> puis sur <code>OK</code></p>
+<p>Relancez le programme: aucune erreur n’apparaît, vous avez chargé un pilote pour le connecteur MySQL.</p>
+<h3 id="utilisation">Utilisation</h3>
+<h4 id="création-dune-base-de-données-de-test">Création d’une base de données de test</h4>
+<p>Vous pouvez soit utiliser <a href="exemples/demojava.sql">ce fichier</a>, soit suivre les instructions ci-dessous.</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb2-1" data-line-number="1">mysql&gt; <span class="kw">create</span> <span class="kw">database</span> demojava ;</a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"><span class="kw">Database</span> changed</a>
+<a class="sourceLine" id="cb2-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">mysql&gt; show <span class="kw">tables</span> ;</a>
+<a class="sourceLine" id="cb2-5" data-line-number="5"><span class="kw">Empty</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
+<p>Nous allons maintenant définir les privilèges d’accès à la base de données:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb3-1" data-line-number="1">mysql&gt;</a>
+<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">CREATE</span> <span class="fu">USER</span> <span class="st">&#39;demouser&#39;</span>@<span class="st">&#39;%&#39;</span> <span class="kw">IDENTIFIED</span> <span class="kw">BY</span> <span class="st">&#39;MotDePasse&#39;</span>;</a>
+<a class="sourceLine" id="cb3-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb3-4" data-line-number="4">mysql&gt; <span class="kw">GRANT</span> <span class="kw">ALL</span> <span class="kw">PRIVILEGES</span> <span class="kw">ON</span> demojava.* <span class="kw">TO</span> <span class="ot">&quot;demouser&quot;</span>@<span class="ot">&quot;%&quot;</span> <span class="kw">IDENTIFIED</span> <span class="kw">BY</span> <span class="ot">&quot;MotDePasse&quot;</span>;</a>
+<a class="sourceLine" id="cb3-5" data-line-number="5"><span class="kw">Query</span> OK, <span class="dv">0</span> <span class="kw">rows</span> affected (<span class="fl">0.00</span> sec)</a></code></pre></div>
+<p>Le <code>%</code> signifie que n’importe quelle machine pourra se connecter, ce qui n’est pas forcément une bonne chose.</p>
+<p>On pourra le remplacer soit par l’IP de l’hôte si elle est fixe, soit par <code>localhost</code>.</p>
+<p>Puis créer la table de démonstration:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb4-1" data-line-number="1">mysql&gt; <span class="kw">create</span> <span class="kw">table</span> personne (nom <span class="dt">varchar</span>(<span class="dv">64</span>), prenom <span class="dt">varchar</span>(<span class="dv">64</span>), dnaissance <span class="dt">date</span>);</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">Query</span> OK, <span class="dv">0</span> <span class="kw">rows</span> affected (<span class="fl">0.01</span> sec)</a>
+<a class="sourceLine" id="cb4-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb4-4" data-line-number="4">mysql&gt; show <span class="kw">tables</span> ;</a>
+<a class="sourceLine" id="cb4-5" data-line-number="5">+<span class="co">--------------------+</span></a>
+<a class="sourceLine" id="cb4-6" data-line-number="6">| Tables_in_demojava |</a>
+<a class="sourceLine" id="cb4-7" data-line-number="7">+<span class="co">--------------------+</span></a>
+<a class="sourceLine" id="cb4-8" data-line-number="8">| personne           |</a>
+<a class="sourceLine" id="cb4-9" data-line-number="9">+<span class="co">--------------------+</span></a>
+<a class="sourceLine" id="cb4-10" data-line-number="10"><span class="dv">1</span> <span class="kw">row</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
+<p>On peut voir la définition de la table avec la commande suivante:</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb5-1" data-line-number="1">mysql&gt; describe personne;</a>
+<a class="sourceLine" id="cb5-2" data-line-number="2">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
+<a class="sourceLine" id="cb5-3" data-line-number="3">| Field      | <span class="kw">Type</span>        | <span class="kw">Null</span> | <span class="kw">Key</span> | <span class="kw">Default</span> | Extra |</a>
+<a class="sourceLine" id="cb5-4" data-line-number="4">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
+<a class="sourceLine" id="cb5-5" data-line-number="5">| nom        | <span class="dt">varchar</span>(<span class="dv">64</span>) | YES  |     | <span class="kw">NULL</span>    |       |</a>
+<a class="sourceLine" id="cb5-6" data-line-number="6">| prenom     | <span class="dt">varchar</span>(<span class="dv">64</span>) | YES  |     | <span class="kw">NULL</span>    |       |</a>
+<a class="sourceLine" id="cb5-7" data-line-number="7">| dnaissance | <span class="dt">date</span>        | YES  |     | <span class="kw">NULL</span>    |       |</a>
+<a class="sourceLine" id="cb5-8" data-line-number="8">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
+<a class="sourceLine" id="cb5-9" data-line-number="9"><span class="dv">3</span> <span class="kw">rows</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.01</span> sec)</a></code></pre></div>
+<p>On ajoute une entrée:</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb6-1" data-line-number="1">mysql&gt; <span class="kw">insert</span> <span class="kw">into</span> personne <span class="kw">values</span> (<span class="st">&#39;Luther King&#39;</span>,<span class="st">&#39;Martin&#39;</span>,<span class="st">&#39;1929-01-15&#39;</span>);</a>
+<a class="sourceLine" id="cb6-2" data-line-number="2"><span class="kw">Query</span> OK, <span class="dv">1</span> <span class="kw">row</span> affected (<span class="fl">0.01</span> sec)</a>
+<a class="sourceLine" id="cb6-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb6-4" data-line-number="4">mysql&gt; <span class="kw">select</span> * <span class="kw">from</span> personne ;</a>
+<a class="sourceLine" id="cb6-5" data-line-number="5">+<span class="co">-------------+--------+------------+</span></a>
+<a class="sourceLine" id="cb6-6" data-line-number="6">| nom         | prenom | dnaissance |</a>
+<a class="sourceLine" id="cb6-7" data-line-number="7">+<span class="co">-------------+--------+------------+</span></a>
+<a class="sourceLine" id="cb6-8" data-line-number="8">| Luther King | Martin | <span class="dv">1929-01-15</span> |</a>
+<a class="sourceLine" id="cb6-9" data-line-number="9">+<span class="co">-------------+--------+------------+</span></a>
+<a class="sourceLine" id="cb6-10" data-line-number="10"><span class="dv">1</span> <span class="kw">row</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
+<h4 id="connecteur">Connecteur</h4>
+<p>Observez et analysez cet exemple :</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.*;</span></a>
+<a class="sourceLine" id="cb7-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> ConnectionMySQL {</a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">    <span class="kw">private</span> <span class="bu">Connection</span> connection = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">    <span class="kw">private</span> <span class="bu">String</span> user, password, host;</a>
+<a class="sourceLine" id="cb7-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb7-9" data-line-number="9">    <span class="kw">private</span> <span class="dt">static</span> <span class="dt">boolean</span> driverLoaded = <span class="kw">false</span>;</a>
+<a class="sourceLine" id="cb7-10" data-line-number="10"></a>
+<a class="sourceLine" id="cb7-11" data-line-number="11">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">boolean</span> <span class="fu">isDriverLoaded</span>(){</a>
+<a class="sourceLine" id="cb7-12" data-line-number="12">        <span class="kw">return</span> driverLoaded;</a>
+<a class="sourceLine" id="cb7-13" data-line-number="13">    }</a>
+<a class="sourceLine" id="cb7-14" data-line-number="14"></a>
+<a class="sourceLine" id="cb7-15" data-line-number="15">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">init</span>() <span class="kw">throws</span> <span class="bu">ClassNotFoundException</span>, <span class="bu">IllegalAccessException</span>, <span class="bu">InstantiationException</span>{</a>
+<a class="sourceLine" id="cb7-16" data-line-number="16">        <span class="kw">if</span>(!driverLoaded){</a>
+<a class="sourceLine" id="cb7-17" data-line-number="17">            <span class="co">//Chargement du pilote</span></a>
+<a class="sourceLine" id="cb7-18" data-line-number="18">            <span class="bu">Class</span>.<span class="fu">forName</span>(<span class="st">&quot;com.mysql.jdbc.Driver&quot;</span>).<span class="fu">newInstance</span>();</a>
+<a class="sourceLine" id="cb7-19" data-line-number="19">            driverLoaded = <span class="kw">true</span>;</a>
+<a class="sourceLine" id="cb7-20" data-line-number="20">        }</a>
+<a class="sourceLine" id="cb7-21" data-line-number="21">    }</a>
+<a class="sourceLine" id="cb7-22" data-line-number="22"></a>
+<a class="sourceLine" id="cb7-23" data-line-number="23">    <span class="kw">public</span> <span class="fu">ConnectionMySQL</span>() {</a>
+<a class="sourceLine" id="cb7-24" data-line-number="24">        <span class="kw">if</span>(!driverLoaded){</a>
+<a class="sourceLine" id="cb7-25" data-line-number="25">            <span class="kw">throw</span> <span class="kw">new</span> <span class="bu">IllegalStateException</span>(<span class="st">&quot;Cannot instantiate if driver is not loaded. Please call &quot;</span>+<span class="fu">getClass</span>().<span class="fu">getName</span>()+<span class="st">&quot;.init() method before invoking this constructor.&quot;</span>);</a>
+<a class="sourceLine" id="cb7-26" data-line-number="26">        }</a>
+<a class="sourceLine" id="cb7-27" data-line-number="27">    }</a>
+<a class="sourceLine" id="cb7-28" data-line-number="28"></a>
+<a class="sourceLine" id="cb7-29" data-line-number="29">    <span class="kw">public</span> <span class="fu">ConnectionMySQL</span>(<span class="bu">String</span> host, <span class="bu">String</span> user, <span class="bu">String</span> password) {</a>
+<a class="sourceLine" id="cb7-30" data-line-number="30">        <span class="kw">this</span>();</a>
+<a class="sourceLine" id="cb7-31" data-line-number="31">        <span class="kw">this</span>.<span class="fu">host</span> = host;</a>
+<a class="sourceLine" id="cb7-32" data-line-number="32">        <span class="kw">this</span>.<span class="fu">user</span> = user;</a>
+<a class="sourceLine" id="cb7-33" data-line-number="33">        <span class="kw">this</span>.<span class="fu">password</span> = password;</a>
+<a class="sourceLine" id="cb7-34" data-line-number="34">    }</a>
+<a class="sourceLine" id="cb7-35" data-line-number="35"></a>
+<a class="sourceLine" id="cb7-36" data-line-number="36">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">connect</span>() <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
+<a class="sourceLine" id="cb7-37" data-line-number="37">        <span class="co">//Connexion a la base de données</span></a>
+<a class="sourceLine" id="cb7-38" data-line-number="38">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Connexion à la base de données&quot;</span>);</a>
+<a class="sourceLine" id="cb7-39" data-line-number="39"></a>
+<a class="sourceLine" id="cb7-40" data-line-number="40">        <span class="bu">String</span> dBurl = <span class="st">&quot;jdbc:mysql://&quot;</span>+host+<span class="st">&quot;/demojava&quot;</span>;</a>
+<a class="sourceLine" id="cb7-41" data-line-number="41">        connection = <span class="bu">DriverManager</span>.<span class="fu">getConnection</span>(dBurl, user, password);</a>
+<a class="sourceLine" id="cb7-42" data-line-number="42"></a>
+<a class="sourceLine" id="cb7-43" data-line-number="43">        <span class="co">/*</span></a>
+<a class="sourceLine" id="cb7-44" data-line-number="44"><span class="co">         * Autre utilisation possible:</span></a>
+<a class="sourceLine" id="cb7-45" data-line-number="45"><span class="co">            String dBurl = &quot;jdbc:mysql://&quot;+host+&quot;/demojava&quot;</span></a>
+<a class="sourceLine" id="cb7-46" data-line-number="46"><span class="co">                            + &quot;?user=&quot;+user+&quot;&amp;password=&quot;+password;</span></a>
+<a class="sourceLine" id="cb7-47" data-line-number="47"><span class="co">            connection = DriverManager.getConnection(dBurl);</span></a>
+<a class="sourceLine" id="cb7-48" data-line-number="48"><span class="co">         */</span></a>
+<a class="sourceLine" id="cb7-49" data-line-number="49"></a>
+<a class="sourceLine" id="cb7-50" data-line-number="50">    }</a>
+<a class="sourceLine" id="cb7-51" data-line-number="51">    <span class="kw">public</span> <span class="bu">ResultSet</span> <span class="fu">execute</span>(<span class="bu">String</span> requete) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
+<a class="sourceLine" id="cb7-52" data-line-number="52">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;creation et execution de la requête :&quot;</span>+requete);</a>
+<a class="sourceLine" id="cb7-53" data-line-number="53">        <span class="bu">Statement</span> stmt = connection.<span class="fu">createStatement</span>();</a>
+<a class="sourceLine" id="cb7-54" data-line-number="54">        <span class="kw">return</span> stmt.<span class="fu">executeQuery</span>(requete);</a>
+<a class="sourceLine" id="cb7-55" data-line-number="55">    }</a>
+<a class="sourceLine" id="cb7-56" data-line-number="56"></a>
+<a class="sourceLine" id="cb7-57" data-line-number="57">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">close</span>() <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
+<a class="sourceLine" id="cb7-58" data-line-number="58">        connection.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb7-59" data-line-number="59">    }</a>
+<a class="sourceLine" id="cb7-60" data-line-number="60">}</a></code></pre></div>
+<p>Méthode <code>main</code> :</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.ResultSet;</span></a>
+<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.sql.ResultSetMetaData;</span></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.sql.SQLException;</span></a>
+<a class="sourceLine" id="cb8-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> AfficherTablePersonne {</a>
+<a class="sourceLine" id="cb8-8" data-line-number="8"></a>
+<a class="sourceLine" id="cb8-9" data-line-number="9">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">afficherDonnees</span>(<span class="bu">ResultSet</span> resultats) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
+<a class="sourceLine" id="cb8-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Parcours des donnees retournees&quot;</span>);</a>
+<a class="sourceLine" id="cb8-11" data-line-number="11">        <span class="bu">ResultSetMetaData</span> rsmd = resultats.<span class="fu">getMetaData</span>();</a>
+<a class="sourceLine" id="cb8-12" data-line-number="12">        <span class="dt">int</span> nbCols = rsmd.<span class="fu">getColumnCount</span>();</a>
+<a class="sourceLine" id="cb8-13" data-line-number="13">        <span class="dt">boolean</span> contientDAutresDonnees = resultats.<span class="fu">next</span>();</a>
+<a class="sourceLine" id="cb8-14" data-line-number="14"></a>
+<a class="sourceLine" id="cb8-15" data-line-number="15">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">1</span>; i &lt;= nbCols; i++) {</a>
+<a class="sourceLine" id="cb8-16" data-line-number="16">            <span class="kw">if</span>(i &gt; <span class="dv">1</span>) {</a>
+<a class="sourceLine" id="cb8-17" data-line-number="17">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>( <span class="st">&quot; | &quot;</span>);</a>
+<a class="sourceLine" id="cb8-18" data-line-number="18">            }</a>
+<a class="sourceLine" id="cb8-19" data-line-number="19">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(rsmd.<span class="fu">getColumnLabel</span>(i));</a>
+<a class="sourceLine" id="cb8-20" data-line-number="20">        }</a>
+<a class="sourceLine" id="cb8-21" data-line-number="21">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
+<a class="sourceLine" id="cb8-22" data-line-number="22"></a>
+<a class="sourceLine" id="cb8-23" data-line-number="23">        <span class="kw">while</span> (contientDAutresDonnees) {</a>
+<a class="sourceLine" id="cb8-24" data-line-number="24">            <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">1</span>; i &lt;= nbCols; i++){</a>
+<a class="sourceLine" id="cb8-25" data-line-number="25">                <span class="kw">if</span>(i &gt; <span class="dv">1</span>) {</a>
+<a class="sourceLine" id="cb8-26" data-line-number="26">                    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>( <span class="st">&quot; | &quot;</span>);</a>
+<a class="sourceLine" id="cb8-27" data-line-number="27">                }</a>
+<a class="sourceLine" id="cb8-28" data-line-number="28">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(resultats.<span class="fu">getString</span>(i));</a>
+<a class="sourceLine" id="cb8-29" data-line-number="29">            }</a>
+<a class="sourceLine" id="cb8-30" data-line-number="30">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
+<a class="sourceLine" id="cb8-31" data-line-number="31">            contientDAutresDonnees = resultats.<span class="fu">next</span>();</a>
+<a class="sourceLine" id="cb8-32" data-line-number="32">        }</a>
+<a class="sourceLine" id="cb8-33" data-line-number="33"></a>
+<a class="sourceLine" id="cb8-34" data-line-number="34">        resultats.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb8-35" data-line-number="35">    }</a>
+<a class="sourceLine" id="cb8-36" data-line-number="36"></a>
+<a class="sourceLine" id="cb8-37" data-line-number="37">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(java.<span class="fu">lang</span>.<span class="fu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb8-38" data-line-number="38">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb8-39" data-line-number="39">            ConnectionMySQL.<span class="fu">init</span>();</a>
+<a class="sourceLine" id="cb8-40" data-line-number="40">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">IllegalAccessException</span> | <span class="bu">InstantiationException</span> e) {</a>
+<a class="sourceLine" id="cb8-41" data-line-number="41">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;La librairie n&#39;est pas disponible&quot;</span>);</a>
+<a class="sourceLine" id="cb8-42" data-line-number="42">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">5</span>);</a>
+<a class="sourceLine" id="cb8-43" data-line-number="43">        }</a>
+<a class="sourceLine" id="cb8-44" data-line-number="44"></a>
+<a class="sourceLine" id="cb8-45" data-line-number="45"></a>
+<a class="sourceLine" id="cb8-46" data-line-number="46">        AfficherTablePersonne atp = <span class="kw">new</span> <span class="fu">AfficherTablePersonne</span>();</a>
+<a class="sourceLine" id="cb8-47" data-line-number="47">        ConnectionMySQL connecteur = <span class="kw">new</span> <span class="fu">ConnectionMySQL</span>(<span class="st">&quot;lamp.exemple.cesi&quot;</span>, <span class="st">&quot;demouser&quot;</span>, <span class="st">&quot;MotDePasse&quot;</span>);</a>
+<a class="sourceLine" id="cb8-48" data-line-number="48">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb8-49" data-line-number="49">            connecteur.<span class="fu">connect</span>();</a>
+<a class="sourceLine" id="cb8-50" data-line-number="50"></a>
+<a class="sourceLine" id="cb8-51" data-line-number="51">            <span class="bu">ResultSet</span> resultSet = connecteur.<span class="fu">execute</span>(<span class="st">&quot;SELECT * FROM personne&quot;</span>);</a>
+<a class="sourceLine" id="cb8-52" data-line-number="52">            atp.<span class="fu">afficherDonnees</span>(resultSet);</a>
+<a class="sourceLine" id="cb8-53" data-line-number="53"></a>
+<a class="sourceLine" id="cb8-54" data-line-number="54">            <span class="co">//Bonne pratique: fermer votre résultat</span></a>
+<a class="sourceLine" id="cb8-55" data-line-number="55">            resultSet.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb8-56" data-line-number="56"></a>
+<a class="sourceLine" id="cb8-57" data-line-number="57">            <span class="co">//Bonne pratique: fermer le connecteur</span></a>
+<a class="sourceLine" id="cb8-58" data-line-number="58">            connecteur.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb8-59" data-line-number="59">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
+<a class="sourceLine" id="cb8-60" data-line-number="60">            e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb8-61" data-line-number="61">        }</a>
+<a class="sourceLine" id="cb8-62" data-line-number="62">        <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">0</span>);</a>
+<a class="sourceLine" id="cb8-63" data-line-number="63">    }</a>
+<a class="sourceLine" id="cb8-64" data-line-number="64">}</a></code></pre></div>
+<h2 id="exercice">Exercice</h2>
+<p>Créez une classe qui permette de stocker les résultats en lisant un <code>ResultSet</code> et un algorithme qui instancie une Personne pour chaque entrée de la base.</p>
+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"></a>
+<a class="sourceLine" id="cb9-2" data-line-number="2"><span class="kw">public</span> <span class="kw">interface</span> Personne{</a>
+<a class="sourceLine" id="cb9-3" data-line-number="3">  <span class="co">//...</span></a>
+<a class="sourceLine" id="cb9-4" data-line-number="4">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getNom</span>();</a>
+<a class="sourceLine" id="cb9-5" data-line-number="5">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getPrenom</span>();</a>
+<a class="sourceLine" id="cb9-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb9-7" data-line-number="7">  <span class="kw">public</span> <span class="bu">Date</span> <span class="fu">getDateNaissance</span>();</a>
+<a class="sourceLine" id="cb9-8" data-line-number="8">}</a></code></pre></div>
+<h2 id="ecrire-dans-les-bases-de-données">Ecrire dans les bases de données</h2>
+<p>La classe suivante montre comment écrire dans une base de données:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database.lecture;</span></a>
+<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.SQLException;</span></a>
+<a class="sourceLine" id="cb10-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.sql.Statement;</span></a>
+<a class="sourceLine" id="cb10-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.text.SimpleDateFormat;</span></a>
+<a class="sourceLine" id="cb10-6" data-line-number="6"><span class="kw">import</span><span class="im"> java.util.InputMismatchException;</span></a>
+<a class="sourceLine" id="cb10-7" data-line-number="7"><span class="kw">import</span><span class="im"> java.util.List;</span></a>
+<a class="sourceLine" id="cb10-8" data-line-number="8"><span class="kw">import</span><span class="im"> java.util.Scanner;</span></a>
+<a class="sourceLine" id="cb10-9" data-line-number="9"></a>
+<a class="sourceLine" id="cb10-10" data-line-number="10"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.ConnectionMySQL;</span></a>
+<a class="sourceLine" id="cb10-11" data-line-number="11"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.DateSimple;</span></a>
+<a class="sourceLine" id="cb10-12" data-line-number="12"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.Personne;</span></a>
+<a class="sourceLine" id="cb10-13" data-line-number="13"><span class="kw">import</span><span class="im"> fr.greta.dwm2.util.GestionMenu;</span></a>
+<a class="sourceLine" id="cb10-14" data-line-number="14"></a>
+<a class="sourceLine" id="cb10-15" data-line-number="15"><span class="kw">public</span> <span class="kw">class</span> Ecriture {</a>
+<a class="sourceLine" id="cb10-16" data-line-number="16">    <span class="co">//INSERT INTO `personne`(`nom`, `prenom`, `dnaissance`) VALUES (&#39;RABHI&#39;,&#39;Pierre&#39;,&#39;1938-05-29&#39;)</span></a>
+<a class="sourceLine" id="cb10-17" data-line-number="17"></a>
+<a class="sourceLine" id="cb10-18" data-line-number="18">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">remplir</span>(ConnectionMySQL connecteur){</a>
+<a class="sourceLine" id="cb10-19" data-line-number="19">        <span class="co">//Nécessaire pour faire les insertions</span></a>
+<a class="sourceLine" id="cb10-20" data-line-number="20">        <span class="bu">Statement</span> stmt = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb10-21" data-line-number="21">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-22" data-line-number="22">            connecteur.<span class="fu">connect</span>();</a>
+<a class="sourceLine" id="cb10-23" data-line-number="23">            stmt = connecteur.<span class="fu">getConnection</span>().<span class="fu">createStatement</span>();</a>
+<a class="sourceLine" id="cb10-24" data-line-number="24">            <span class="dt">boolean</span> continuer = <span class="kw">true</span>;</a>
+<a class="sourceLine" id="cb10-25" data-line-number="25">            <span class="kw">while</span>(continuer){</a>
+<a class="sourceLine" id="cb10-26" data-line-number="26">                <span class="bu">String</span> nom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le nom:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-27" data-line-number="27">                <span class="bu">String</span> prenom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le prénom:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-28" data-line-number="28">                DateSimple ds = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb10-29" data-line-number="29">                <span class="kw">while</span>(ds == <span class="kw">null</span>){</a>
+<a class="sourceLine" id="cb10-30" data-line-number="30">                    <span class="bu">String</span> date = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez une date:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-31" data-line-number="31">                    ds = DateSimple.<span class="fu">checkDate</span>(date);</a>
+<a class="sourceLine" id="cb10-32" data-line-number="32">                }</a>
+<a class="sourceLine" id="cb10-33" data-line-number="33">                <span class="fu">inserer</span>(stmt, nom, prenom, ds);</a>
+<a class="sourceLine" id="cb10-34" data-line-number="34">                <span class="bu">String</span> doitContinuer = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Continuer (o/n):&quot;</span>);</a>
+<a class="sourceLine" id="cb10-35" data-line-number="35">                continuer = doitContinuer.<span class="fu">equals</span>(<span class="st">&quot;o&quot;</span>);</a>
+<a class="sourceLine" id="cb10-36" data-line-number="36">            }</a>
+<a class="sourceLine" id="cb10-37" data-line-number="37">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
+<a class="sourceLine" id="cb10-38" data-line-number="38">            e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb10-39" data-line-number="39">        }</a>
+<a class="sourceLine" id="cb10-40" data-line-number="40">        <span class="kw">finally</span>{</a>
+<a class="sourceLine" id="cb10-41" data-line-number="41">            <span class="kw">if</span> (stmt != <span class="kw">null</span>) {</a>
+<a class="sourceLine" id="cb10-42" data-line-number="42">                <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-43" data-line-number="43">                    stmt.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb10-44" data-line-number="44">                } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
+<a class="sourceLine" id="cb10-45" data-line-number="45">                    <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;Erreur à la sortie&quot;</span>);</a>
+<a class="sourceLine" id="cb10-46" data-line-number="46">                    e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb10-47" data-line-number="47">                }</a>
+<a class="sourceLine" id="cb10-48" data-line-number="48">            }</a>
+<a class="sourceLine" id="cb10-49" data-line-number="49">        }</a>
+<a class="sourceLine" id="cb10-50" data-line-number="50">    }</a>
+<a class="sourceLine" id="cb10-51" data-line-number="51"></a>
+<a class="sourceLine" id="cb10-52" data-line-number="52"></a>
+<a class="sourceLine" id="cb10-53" data-line-number="53">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">changerDate</span>(ConnectionMySQL connecteur){</a>
+<a class="sourceLine" id="cb10-54" data-line-number="54">        <span class="co">//Nécessaire pour faire les insertions</span></a>
+<a class="sourceLine" id="cb10-55" data-line-number="55">        <span class="bu">Statement</span> stmt = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb10-56" data-line-number="56">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-57" data-line-number="57">            connecteur.<span class="fu">connect</span>();</a>
+<a class="sourceLine" id="cb10-58" data-line-number="58">            stmt = connecteur.<span class="fu">getConnection</span>().<span class="fu">createStatement</span>();</a>
+<a class="sourceLine" id="cb10-59" data-line-number="59">            <span class="dt">boolean</span> continuer = <span class="kw">true</span>;</a>
+<a class="sourceLine" id="cb10-60" data-line-number="60">            <span class="kw">while</span>(continuer){</a>
+<a class="sourceLine" id="cb10-61" data-line-number="61">                <span class="bu">String</span> nom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le nom:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-62" data-line-number="62">                <span class="bu">String</span> prenom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le prénom:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-63" data-line-number="63">                DateSimple ds = <span class="kw">null</span>;</a>
+<a class="sourceLine" id="cb10-64" data-line-number="64">                <span class="kw">while</span>(ds == <span class="kw">null</span>){</a>
+<a class="sourceLine" id="cb10-65" data-line-number="65">                    <span class="bu">String</span> date = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez une date:&quot;</span>);</a>
+<a class="sourceLine" id="cb10-66" data-line-number="66">                    ds = DateSimple.<span class="fu">checkDate</span>(date);</a>
+<a class="sourceLine" id="cb10-67" data-line-number="67">                }</a>
+<a class="sourceLine" id="cb10-68" data-line-number="68">                <span class="fu">inserer</span>(stmt, nom, prenom, ds);</a>
+<a class="sourceLine" id="cb10-69" data-line-number="69">                <span class="bu">String</span> doitContinuer = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Continuer (o/n):&quot;</span>);</a>
+<a class="sourceLine" id="cb10-70" data-line-number="70">                continuer = doitContinuer.<span class="fu">equals</span>(<span class="st">&quot;o&quot;</span>);</a>
+<a class="sourceLine" id="cb10-71" data-line-number="71">            }</a>
+<a class="sourceLine" id="cb10-72" data-line-number="72">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
+<a class="sourceLine" id="cb10-73" data-line-number="73">            e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb10-74" data-line-number="74">        }</a>
+<a class="sourceLine" id="cb10-75" data-line-number="75">        <span class="kw">finally</span>{</a>
+<a class="sourceLine" id="cb10-76" data-line-number="76">            <span class="kw">if</span> (stmt != <span class="kw">null</span>) {</a>
+<a class="sourceLine" id="cb10-77" data-line-number="77">                <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-78" data-line-number="78">                    stmt.<span class="fu">close</span>();</a>
+<a class="sourceLine" id="cb10-79" data-line-number="79">                } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
+<a class="sourceLine" id="cb10-80" data-line-number="80">                    <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;Erreur à la sortie&quot;</span>);</a>
+<a class="sourceLine" id="cb10-81" data-line-number="81">                    e.<span class="fu">printStackTrace</span>();</a>
+<a class="sourceLine" id="cb10-82" data-line-number="82">                }</a>
+<a class="sourceLine" id="cb10-83" data-line-number="83">            }</a>
+<a class="sourceLine" id="cb10-84" data-line-number="84">        }</a>
+<a class="sourceLine" id="cb10-85" data-line-number="85">    }</a>
+<a class="sourceLine" id="cb10-86" data-line-number="86"></a>
+<a class="sourceLine" id="cb10-87" data-line-number="87">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">inserer</span>(<span class="bu">Statement</span> stmt,</a>
+<a class="sourceLine" id="cb10-88" data-line-number="88">            <span class="bu">String</span> nom, <span class="bu">String</span> prenom, DateSimple date) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
+<a class="sourceLine" id="cb10-89" data-line-number="89">        stmt.<span class="fu">executeUpdate</span>(</a>
+<a class="sourceLine" id="cb10-90" data-line-number="90">                <span class="st">&quot;insert into personne &quot;</span> +</a>
+<a class="sourceLine" id="cb10-91" data-line-number="91">                <span class="st">&quot;values(&#39;&quot;</span>+nom+<span class="st">&quot;&#39;, &#39;&quot;</span>+prenom+<span class="st">&quot;&#39;, &#39;&quot;</span>+date.<span class="fu">getSqlRepresentation</span>()+<span class="st">&quot;&#39;)&quot;</span>);</a>
+<a class="sourceLine" id="cb10-92" data-line-number="92">    }</a>
+<a class="sourceLine" id="cb10-93" data-line-number="93"></a>
+<a class="sourceLine" id="cb10-94" data-line-number="94">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
+<a class="sourceLine" id="cb10-95" data-line-number="95">        <span class="kw">try</span> {</a>
+<a class="sourceLine" id="cb10-96" data-line-number="96">            ConnectionMySQL.<span class="fu">init</span>();</a>
+<a class="sourceLine" id="cb10-97" data-line-number="97">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">IllegalAccessException</span> | <span class="bu">InstantiationException</span> e) {</a>
+<a class="sourceLine" id="cb10-98" data-line-number="98">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;La librairie n&#39;est pas disponible&quot;</span>);</a>
+<a class="sourceLine" id="cb10-99" data-line-number="99">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">5</span>);</a>
+<a class="sourceLine" id="cb10-100" data-line-number="100">        }</a>
+<a class="sourceLine" id="cb10-101" data-line-number="101"></a>
+<a class="sourceLine" id="cb10-102" data-line-number="102"></a>
+<a class="sourceLine" id="cb10-103" data-line-number="103">        <span class="co">//On peut continuer ici:</span></a>
+<a class="sourceLine" id="cb10-104" data-line-number="104">        ConnectionMySQL connecteur = <span class="kw">new</span> <span class="fu">ConnectionMySQL</span>(<span class="st">&quot;lamp.exemple.cesi&quot;</span>, <span class="st">&quot;demouser&quot;</span>, <span class="st">&quot;MotDePasse&quot;</span>);</a>
+<a class="sourceLine" id="cb10-105" data-line-number="105">        Ecriture ins = <span class="kw">new</span> <span class="fu">Ecriture</span>();</a>
+<a class="sourceLine" id="cb10-106" data-line-number="106">        ins.<span class="fu">remplir</span>(connecteur);</a>
+<a class="sourceLine" id="cb10-107" data-line-number="107"></a>
+<a class="sourceLine" id="cb10-108" data-line-number="108">    }</a>
+<a class="sourceLine" id="cb10-109" data-line-number="109">}</a></code></pre></div>
+<p>Le code source des classes qu’elle utilise est disponible <a href="exemples/database">ici</a> :</p>
+<ul>
+<li><a href="exemples/database/fr/greta/dwm2/util/GestionMenu.java">GestionMenu.java</a></li>
+<li><a href="exemples/database/fr/greta/dwm2/database/DateSimple.java">DateSimple.java</a></li>
+</ul>
+<p>Voir aussi cette page : <a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html">Retrieving and Modifying Values from Result Sets</a></p>
+<h2 id="pour-aller-plus-loin">Pour aller plus loin</h2>
+<p>Des exemples complets sur l’ensemble des fonctionnalités JDBC <a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html">sont disponibles ici</a>.</p>
+</body>
+</html>

+ 137 - 0
14-ThreadEtExecutionSimultanee.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Thread</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Thread</div>
+<nav id="TOC">
+<ul>
+<li><a href="#thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#observations">Observations</a><ul>
+<li><a href="#parallélisme">Parallélisme</a></li>
+<li><a href="#mise-en-pause-dun-thread">Mise en pause d’un Thread</a></li>
+<li><a href="#attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</a></li>
+<li><a href="#modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</a></li>
+<li><a href="#exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</a></li>
+<li><a href="#compte-en-banque-non-sécurisé">Compte en banque non sécurisé</a></li>
+<li><a href="#manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</a></li>
+<li><a href="#manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#semaphore-et-lock">Semaphore et Lock</a></li>
+<li><a href="#le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</a></li>
+<li><a href="#le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</a></li>
+<li><a href="#application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</a></li>
+</ul></li>
+<li><a href="#ressources">Ressources</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</h1>
+<h2 id="introduction">Introduction</h2>
+<p>De nos jours, les ordinateurs sont multi-tâches et sont capables d’exécuter plusieurs opérations simultanément (mise à jour en tâche de fond, contrôle de la bonne exécution d’une opération par une application tierce, etc).</p>
+<p>Il est fréquent que plusieurs acteurs accèdent de manière concurrente à une même ressource. Cela peut engendrer différents problèmes.</p>
+<h2 id="observations">Observations</h2>
+<h3 id="parallélisme">Parallélisme</h3>
+<p>Compiler et exécuter la classe <code>Thread1Parallelisme</code>.</p>
+<p>Le programme crée trois <em>threads</em> qui affichent 100 fois respectivement <code>Hello</code>, <code>World</code> et <code>and Everybody</code>.</p>
+<p>Que pouvez vous dire à propos de l’ordre d’affichage ? Expliquer.</p>
+<p><strong>Remarque</strong></p>
+<p>Ce programme hérite de <code>Thread</code> et réimplémente la méthode <code>run()</code> pour obtenir des flots d’exécutions parallèles.</p>
+<h3 id="mise-en-pause-dun-thread">Mise en pause d’un Thread</h3>
+<p>Compiler et exécuter plusieurs fois la classe <code>Thread2Sleep</code>.</p>
+<p>Voyez vous tous les affichages ?</p>
+<p>Essayez d’augmenter les valeurs d’attente (le troisième argument passé lors de la création des threads). Par quelle méthode de l’API Java est utilisé cette valeur ?</p>
+<p>Si vous mettez de trop grandes valeurs, vous devriez parfois ne plus voir aucun affichage.</p>
+<p><strong>Pourquoi ?</strong></p>
+<h3 id="attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</h3>
+<p>Dans la classe <code>Thread3Join</code>, nous faisons appel à la fonction join qui force le programme principal à attendre la terminaison des threads.</p>
+<p>Compiler le programme, Modifiez les valeurs d’attente (paramètre <code>delai</code>) et s’assurer que tous les affichages sont présents.</p>
+<h3 id="modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</h3>
+<p>Dans la classe <code>Thread4ModificationConflictuelle</code>, nous manipulons une variable partagée d etype <code>Tableau</code>.</p>
+<p>Les Thread sont instanciés en leur donnant en paramètre un objet de type <code>Runnable</code> : la méthode <code>Runnable.run()</code> est exécutée par le Thread.</p>
+<p>Ces objets sont fabriqués par la classe <code>TacheTableau</code>. Deux types de tâches sont effectuées:</p>
+<ul>
+<li>les tâches <em>Déposer</em> incrémentent les valeurs dans le tableau</li>
+<li>les tâches <em>Retirer</em> décrémentent les valeurs dans le tableau</li>
+</ul>
+<p>Logiquement, à la fin les valeurs doivent être égales à 0 puisque les tâches incrémentant et décrementant s’annulent.</p>
+<p>Exécuter plusieurs fois le programme. Y a-t-il des cas où le résultat est différent ?</p>
+<h3 id="exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</h3>
+<p>Pour corriger le problème dans l’exemple précédent, on ajoute le mot clé <code>synchronized</code> aux deux méthodes <code>incrementerValeurs</code> et <code>decrementerValeurs</code>.</p>
+<p>Exécuter le programme. S’assurer que le comportement est correct. Que remarquez vous au niveau du temps d’exécution ? Expliquer.</p>
+<h3 id="compte-en-banque-non-sécurisé">Compte en banque non sécurisé</h3>
+<p>Dans <code>Thread6CompteEnBanqueSansVerrou</code> la ressource partagée est un compte et non un tableau. Les opérations sont débiter, créditer et consulter.</p>
+<p>Est-ce que le solde est toujours égal à 0 à la fin ?</p>
+<h3 id="manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</h3>
+<p>Dans la classe <code>Thread7CompteSynchronized</code>, nous reprenons l’exemple de manipulation de comptes.</p>
+<p>Le programme est modifié pour interdire le retrait s’il n’y a pas assez d’argent.</p>
+<p>Quand le solde est insuffisant, les threads de retrait attendent (<code>wait()</code> dans la méthode <code>debiter</code>), ils sont réveillés par les threads de dépôt qui appellent la méthode <code>crediter</code> contenant un appel à <code>notify()</code>.</p>
+<p>Compiler et observer l’exécution de Thread7CompteSynchronized.</p>
+<p>Essayer de trouver un cas où un appel à retirer est fait avec un solde <code>0</code>. Que se passe-t-il ?</p>
+<h3 id="manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</h3>
+<p>La classe <code>Thread8MutexSansBoucle</code> utilise <code>CompteMutexIf</code> est quasi identique à la classe <code>CompteMutex</code>.</p>
+<p>La différence tient dans le fait que pour la vérification de la condition avant <code>wait</code>, nous avons remplace le <code>while</code> par un <code>if</code>.</p>
+<p>Y a-t-il des cas où le solde devient négatif ? Expliquer.</p>
+<h2 id="exercices">Exercices</h2>
+<h3 id="semaphore-et-lock">Semaphore et Lock</h3>
+<p>Cet exercice est à faire initialement sur feuille papier, avant d’être programmé.</p>
+<p>Faites une recherche sur le concept de sémaphore dans le domaine du parallélisme.</p>
+<p>Etudiez la classe <code>DemoSemaphore</code>. Modifez les valeurs suivantes dans le <code>main</code>:</p>
+<ul>
+<li>paramètre <code>token</code> sur le constructeur</li>
+<li><code>numberOfLoops</code></li>
+</ul>
+<p>Observez ce qui se passe et concluez.</p>
+<p>Faites de même avec la classe <code>DemoLock</code>.</p>
+<p>Etudiez la documentation sur la classe <code>Semaphore</code>.</p>
+<p>Etudiez cette classe et l’interface <code>Lock</code> (et les classes qui l’implémentent).</p>
+<h3 id="le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</h3>
+<p>Programmer le problème du producteur/consommateur en utilisant les <code>Lock</code>. Pour cela, écrire une classe Stockage contenant un tableau d’Object ainsi que les méthodes <code>Object consomme()</code> et <code>void produit(Object)</code>.</p>
+<p>Écrire un programme principal qui instancie un objet Stockage puis qui crée de nombreux threads dont certains vont produire et d’autres consommer des objets.</p>
+<p>Faites en sorte que l’on puisse observer le déroulement des synchronisations (par exemple avec des <code>System.out.println()</code> judicieusement placés). Pour cela, vous aurez probablement à ralentir vos threads (en insérant des appels à <code>sleep(int)</code> à l’intérieur des sections critiques ou entre les productions/consommations d’objets).</p>
+<p>Note : vous pouvez utiliser la classe <code>Random</code> (voir la Javadoc) pour générer des temps d’attente aléatoires, ainsi que la classe <code>TimeUnit</code>.</p>
+<p>Gardez des traces montrant que certains threads sont effectivement endormis (et réveillés plus tard) lorsqu’ils essayent de consommer alors que le stockage est vide ou bien au contraire lorsqu’ils essayent de produire alors que le stockage est plein.</p>
+<h3 id="le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</h3>
+<p>Réécrivez le problème du producteur/consommateur en utilisant directement les moniteurs Java (i.e. sans utiliser la classe Semaphore ou Lock mais uniquement <code>synchronized</code>, <code>wait</code> et <code>notify</code>).</p>
+<h3 id="application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</h3>
+<p>Ecrivez un programme simulant un repas fait par quatre convives (par l’affichage de messages).</p>
+<p>Les quatres convives doivent attendre d’être attablés avant de commencer le repas.</p>
+<p>Une fois le repas commencé, il se déroule comme suit:</p>
+<ul>
+<li>L’entrée est amenée. Les quatre convives mangent à des vitesses différentes (le premier met 2 minutes, le second 5 minutes, le troisième 3 minutes et le quatrième met 7 minutes).</li>
+<li>Une fois que tous les convives ont terminé leur entrée, le serveur enlève les assiettes vides.</li>
+<li>Le plat est alors amené et les quatre convives mangent également à des vitesses différentes (respectivement 4, 9, 6 et 5 minutes).</li>
+<li>Une fois le plat terminé par tous les convives il est desservi.</li>
+<li>Le café est alors servi et les convives mettent respectivement 2, 3, 1 et 4 minutes pour le boire.</li>
+<li>Le temps entre le moment où les convives ont terminé un met et le met suivant est servi est aléatoire (entre 1 et 15 minutes).</li>
+</ul>
+<p>Un serveur (géré par un Thread) enlève puis ramène les assiettes 2 par 2. Il met 1 minute pour effectuer un aller-retour en cuisine.</p>
+<p>Simulez ce repas (en remplaçant les minutes par des secondes pour plus de rapidité).</p>
+<p>Le programme doit inscrire dans un fichier les temps totaux d’exécution pour chaque repas (donc chaque lancement du programme).</p>
+<h2 id="ressources">Ressources</h2>
+<p>Un exemple d’utilisation de CyclicBarrier:</p>
+<p><a href="http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html" class="uri">http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html</a></p>
+<p>Une ressource pour les deux:</p>
+<p><a href="http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/" class="uri">http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/</a></p>
+<p>Un algorithme de tri parallèle:</p>
+<p><a href="http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml" class="uri">http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml</a></p>
+<p>Quelques explications sur l’usage de CountDownLatch:</p>
+<p><a href="http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/" class="uri">http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/</a></p>
+</body>
+</html>

+ 11 - 1
A-annexe-RecuperationDeDonneesDansLaConsole.html

@@ -4,7 +4,7 @@
   <meta charset="utf-8" />
   <meta name="generator" content="pandoc" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>annexe</title>
+  <title>Saisie de chaînes dans la console</title>
   <style type="text/css">
       code{white-space: pre-wrap;}
       span.smallcaps{font-variant: small-caps;}
@@ -82,6 +82,16 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
   <![endif]-->
 </head>
 <body>
+<div class="doctitle">Saisie de chaînes dans la console</div>
+<nav id="TOC">
+<ul>
+<li><a href="#saisir-des-chaînes-dans-la-console-en-java">Saisir des chaînes dans la console en Java</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#lecture-de-valeurs-depuis-la-console">Lecture de valeurs depuis la console</a></li>
+<li><a href="#information-à-propos-de-la-méthode-system.console">Information à propos de la méthode System.console()</a></li>
+</ul></li>
+</ul>
+</nav>
 <h1 id="saisir-des-chaînes-dans-la-console-en-java">Saisir des chaînes dans la console en Java</h1>
 <h2 id="introduction">Introduction</h2>
 <p>Cette annexe donne quelques pistes pour permettre la récupération de chaînes de caractères saisies par l’utilisateur depuis un programme.</p>

+ 137 - 0
B-ThreadEtExecutionSimultanee.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Thread</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Thread</div>
+<nav id="TOC">
+<ul>
+<li><a href="#thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#observations">Observations</a><ul>
+<li><a href="#parallélisme">Parallélisme</a></li>
+<li><a href="#mise-en-pause-dun-thread">Mise en pause d’un Thread</a></li>
+<li><a href="#attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</a></li>
+<li><a href="#modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</a></li>
+<li><a href="#exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</a></li>
+<li><a href="#compte-en-banque-non-sécurisé">Compte en banque non sécurisé</a></li>
+<li><a href="#manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</a></li>
+<li><a href="#manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</a></li>
+</ul></li>
+<li><a href="#exercices">Exercices</a><ul>
+<li><a href="#semaphore-et-lock">Semaphore et Lock</a></li>
+<li><a href="#le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</a></li>
+<li><a href="#le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</a></li>
+<li><a href="#application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</a></li>
+</ul></li>
+<li><a href="#ressources">Ressources</a></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</h1>
+<h2 id="introduction">Introduction</h2>
+<p>De nos jours, les ordinateurs sont multi-tâches et sont capables d’exécuter plusieurs opérations simultanément (mise à jour en tâche de fond, contrôle de la bonne exécution d’une opération par une application tierce, etc).</p>
+<p>Il est fréquent que plusieurs acteurs accèdent de manière concurrente à une même ressource. Cela peut engendrer différents problèmes.</p>
+<h2 id="observations">Observations</h2>
+<h3 id="parallélisme">Parallélisme</h3>
+<p>Compiler et exécuter la classe <code>Thread1Parallelisme</code>.</p>
+<p>Le programme crée trois <em>threads</em> qui affichent 100 fois respectivement <code>Hello</code>, <code>World</code> et <code>and Everybody</code>.</p>
+<p>Que pouvez vous dire à propos de l’ordre d’affichage ? Expliquer.</p>
+<p><strong>Remarque</strong></p>
+<p>Ce programme hérite de <code>Thread</code> et réimplémente la méthode <code>run()</code> pour obtenir des flots d’exécutions parallèles.</p>
+<h3 id="mise-en-pause-dun-thread">Mise en pause d’un Thread</h3>
+<p>Compiler et exécuter plusieurs fois la classe <code>Thread2Sleep</code>.</p>
+<p>Voyez vous tous les affichages ?</p>
+<p>Essayez d’augmenter les valeurs d’attente (le troisième argument passé lors de la création des threads). Par quelle méthode de l’API Java est utilisé cette valeur ?</p>
+<p>Si vous mettez de trop grandes valeurs, vous devriez parfois ne plus voir aucun affichage.</p>
+<p><strong>Pourquoi ?</strong></p>
+<h3 id="attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</h3>
+<p>Dans la classe <code>Thread3Join</code>, nous faisons appel à la fonction join qui force le programme principal à attendre la terminaison des threads.</p>
+<p>Compiler le programme, Modifiez les valeurs d’attente (paramètre <code>delai</code>) et s’assurer que tous les affichages sont présents.</p>
+<h3 id="modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</h3>
+<p>Dans la classe <code>Thread4ModificationConflictuelle</code>, nous manipulons une variable partagée d etype <code>Tableau</code>.</p>
+<p>Les Thread sont instanciés en leur donnant en paramètre un objet de type <code>Runnable</code> : la méthode <code>Runnable.run()</code> est exécutée par le Thread.</p>
+<p>Ces objets sont fabriqués par la classe <code>TacheTableau</code>. Deux types de tâches sont effectuées:</p>
+<ul>
+<li>les tâches <em>Déposer</em> incrémentent les valeurs dans le tableau</li>
+<li>les tâches <em>Retirer</em> décrémentent les valeurs dans le tableau</li>
+</ul>
+<p>Logiquement, à la fin les valeurs doivent être égales à 0 puisque les tâches incrémentant et décrementant s’annulent.</p>
+<p>Exécuter plusieurs fois le programme. Y a-t-il des cas où le résultat est différent ?</p>
+<h3 id="exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</h3>
+<p>Pour corriger le problème dans l’exemple précédent, on ajoute le mot clé <code>synchronized</code> aux deux méthodes <code>incrementerValeurs</code> et <code>decrementerValeurs</code>.</p>
+<p>Exécuter le programme. S’assurer que le comportement est correct. Que remarquez vous au niveau du temps d’exécution ? Expliquer.</p>
+<h3 id="compte-en-banque-non-sécurisé">Compte en banque non sécurisé</h3>
+<p>Dans <code>Thread6CompteEnBanqueSansVerrou</code> la ressource partagée est un compte et non un tableau. Les opérations sont débiter, créditer et consulter.</p>
+<p>Est-ce que le solde est toujours égal à 0 à la fin ?</p>
+<h3 id="manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</h3>
+<p>Dans la classe <code>Thread7CompteSynchronized</code>, nous reprenons l’exemple de manipulation de comptes.</p>
+<p>Le programme est modifié pour interdire le retrait s’il n’y a pas assez d’argent.</p>
+<p>Quand le solde est insuffisant, les threads de retrait attendent (<code>wait()</code> dans la méthode <code>debiter</code>), ils sont réveillés par les threads de dépôt qui appellent la méthode <code>crediter</code> contenant un appel à <code>notify()</code>.</p>
+<p>Compiler et observer l’exécution de Thread7CompteSynchronized.</p>
+<p>Essayer de trouver un cas où un appel à retirer est fait avec un solde <code>0</code>. Que se passe-t-il ?</p>
+<h3 id="manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</h3>
+<p>La classe <code>Thread8MutexSansBoucle</code> utilise <code>CompteMutexIf</code> est quasi identique à la classe <code>CompteMutex</code>.</p>
+<p>La différence tient dans le fait que pour la vérification de la condition avant <code>wait</code>, nous avons remplace le <code>while</code> par un <code>if</code>.</p>
+<p>Y a-t-il des cas où le solde devient négatif ? Expliquer.</p>
+<h2 id="exercices">Exercices</h2>
+<h3 id="semaphore-et-lock">Semaphore et Lock</h3>
+<p>Cet exercice est à faire initialement sur feuille papier, avant d’être programmé.</p>
+<p>Faites une recherche sur le concept de sémaphore dans le domaine du parallélisme.</p>
+<p>Etudiez la classe <code>DemoSemaphore</code>. Modifez les valeurs suivantes dans le <code>main</code>:</p>
+<ul>
+<li>paramètre <code>token</code> sur le constructeur</li>
+<li><code>numberOfLoops</code></li>
+</ul>
+<p>Observez ce qui se passe et concluez.</p>
+<p>Faites de même avec la classe <code>DemoLock</code>.</p>
+<p>Etudiez la documentation sur la classe <code>Semaphore</code>.</p>
+<p>Etudiez cette classe et l’interface <code>Lock</code> (et les classes qui l’implémentent).</p>
+<h3 id="le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</h3>
+<p>Programmer le problème du producteur/consommateur en utilisant les <code>Lock</code>. Pour cela, écrire une classe Stockage contenant un tableau d’Object ainsi que les méthodes <code>Object consomme()</code> et <code>void produit(Object)</code>.</p>
+<p>Écrire un programme principal qui instancie un objet Stockage puis qui crée de nombreux threads dont certains vont produire et d’autres consommer des objets.</p>
+<p>Faites en sorte que l’on puisse observer le déroulement des synchronisations (par exemple avec des <code>System.out.println()</code> judicieusement placés). Pour cela, vous aurez probablement à ralentir vos threads (en insérant des appels à <code>sleep(int)</code> à l’intérieur des sections critiques ou entre les productions/consommations d’objets).</p>
+<p>Note : vous pouvez utiliser la classe <code>Random</code> (voir la Javadoc) pour générer des temps d’attente aléatoires, ainsi que la classe <code>TimeUnit</code>.</p>
+<p>Gardez des traces montrant que certains threads sont effectivement endormis (et réveillés plus tard) lorsqu’ils essayent de consommer alors que le stockage est vide ou bien au contraire lorsqu’ils essayent de produire alors que le stockage est plein.</p>
+<h3 id="le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</h3>
+<p>Réécrivez le problème du producteur/consommateur en utilisant directement les moniteurs Java (i.e. sans utiliser la classe Semaphore ou Lock mais uniquement <code>synchronized</code>, <code>wait</code> et <code>notify</code>).</p>
+<h3 id="application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</h3>
+<p>Ecrivez un programme simulant un repas fait par quatre convives (par l’affichage de messages).</p>
+<p>Les quatres convives doivent attendre d’être attablés avant de commencer le repas.</p>
+<p>Une fois le repas commencé, il se déroule comme suit:</p>
+<ul>
+<li>L’entrée est amenée. Les quatre convives mangent à des vitesses différentes (le premier met 2 minutes, le second 5 minutes, le troisième 3 minutes et le quatrième met 7 minutes).</li>
+<li>Une fois que tous les convives ont terminé leur entrée, le serveur enlève les assiettes vides.</li>
+<li>Le plat est alors amené et les quatre convives mangent également à des vitesses différentes (respectivement 4, 9, 6 et 5 minutes).</li>
+<li>Une fois le plat terminé par tous les convives il est desservi.</li>
+<li>Le café est alors servi et les convives mettent respectivement 2, 3, 1 et 4 minutes pour le boire.</li>
+<li>Le temps entre le moment où les convives ont terminé un met et le met suivant est servi est aléatoire (entre 1 et 15 minutes).</li>
+</ul>
+<p>Un serveur (géré par un Thread) enlève puis ramène les assiettes 2 par 2. Il met 1 minute pour effectuer un aller-retour en cuisine.</p>
+<p>Simulez ce repas (en remplaçant les minutes par des secondes pour plus de rapidité).</p>
+<p>Le programme doit inscrire dans un fichier les temps totaux d’exécution pour chaque repas (donc chaque lancement du programme).</p>
+<h2 id="ressources">Ressources</h2>
+<p>Un exemple d’utilisation de CyclicBarrier:</p>
+<p><a href="http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html" class="uri">http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html</a></p>
+<p>Une ressource pour les deux:</p>
+<p><a href="http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/" class="uri">http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/</a></p>
+<p>Un algorithme de tri parallèle:</p>
+<p><a href="http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml" class="uri">http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml</a></p>
+<p>Quelques explications sur l’usage de CountDownLatch:</p>
+<p><a href="http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/" class="uri">http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/</a></p>
+</body>
+</html>

+ 226 - 0
B-annexe-configuration-ssh.html

@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Configuration SSH</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Configuration SSH</div>
+<nav id="TOC">
+<ul>
+<li><a href="#configuration-de-connexion-ssh">Configuration de connexion ssh</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#création-dune-clef">Création d’une clef</a><ul>
+<li><a href="#git-bash">Git-bash</a></li>
+<li><a href="#putty">Putty</a></li>
+</ul></li>
+<li><a href="#installation-de-la-clef-publique">Installation de la clef publique</a></li>
+<li><a href="#connexion-au-serveur">Connexion au serveur</a><ul>
+<li><a href="#en-utilisant-putty">En utilisant Putty</a></li>
+<li><a href="#avec-git-bash">Avec git-bash</a></li>
+</ul></li>
+<li><a href="#configuration-de-lagent">Configuration de l’agent</a><ul>
+<li><a href="#avec-putty">Avec Putty</a></li>
+<li><a href="#avec-git-bash-1">Avec git-bash</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="configuration-de-connexion-ssh">Configuration de connexion ssh</h1>
+<h2 id="introduction">Introduction</h2>
+<p>La première partie de ce document montre comment créer des paires de clefs publiques/privées.</p>
+<p>La méthode recommandée est celle utilisant <code>git-bash</code></p>
+<h2 id="création-dune-clef">Création d’une clef</h2>
+<h3 id="git-bash">Git-bash</h3>
+<h4 id="installation-de-git-bash">Installation de git-bash</h4>
+<p>Deux possibilités pour installer <code>git-bash</code></p>
+<p>La première: télécharger <code>git-bash</code> à l’adresse: http://gitforwindows.org/</p>
+<p>La seconde : <a href="https://chocolatey.org/install">installer <code>chocolatey</code></a> et installer le paquet <code>git</code></p>
+<p>L’avantage de <code>chocolatey</code> est qu’il permet d’installer des programmes supplémentaires sous Windows qui permettent d’augmenter les fonctionnalités du shell.</p>
+<h4 id="création-de-la-clef">Création de la clef</h4>
+<p>Sur le client <code>git-bash</code> la commande à utiliser est la suivante:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb1-1" data-line-number="1">$ <span class="fu">ssh-keygen</span></a></code></pre></div>
+<p>La commande affiche:</p>
+<pre><code>Generating public/private rsa key pair.
+Enter file in which to save the key (/Users/lauhub/.ssh/id_rsa):</code></pre>
+<p>Ne rien saisir (laisser la valeur par défaut) pour la question <code>Enter file in which to save the key</code> et appuyez sur la touche <code>Entrée</code>.</p>
+<p>Ensuite, choisir une passphrase:</p>
+<pre><code>Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /Users/lauhub/.ssh/id_bla.
+Your public key has been saved in /Users/lauhub/.ssh/id_bla.pub.
+The key fingerprint is:
+SHA256:qnMr1UW+zi3msGd/2UWfkqfq/ZkIi6mZzqeDLGFghh8 lauhub@MacBookAir-2-Laurent.local
+The key&#39;s randomart image is:
++---[RSA 2048]----+
+|                 |
+|          .      |
+|.        o       |
+|.+E       o     .|
+|o.  .. .S. .  ..o|
+|  .o  ... .  oo o|
+|  . o.o oo o  +o.|
+|   .o+o.o+X =.+ +|
+|    o+oO*Bo*O+.+ |
++----[SHA256]-----+</code></pre>
+<p>Vous obtenez deux fichiers:</p>
+<ul>
+<li><code>~/.ssh/id_rsa</code></li>
+<li><code>~/.ssh/id_rsa.pub</code></li>
+</ul>
+<p>Récupérez le contenu de la clef publique et copiez le:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb4-1" data-line-number="1">$ <span class="fu">cat</span> ~/.ssh/id_rsa.pub</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="ex">ssh-rsa</span> AAAAB3NzaC1yc2EAAAADAQABAAABAQC/tAFES1cFMs7O4mVJql7C4aLW/67F6gDyXiE2JOcQIk8+WeqSyMAegOHw0OsdhnAQdf5iDPI19UQgD+kES6gHG7ZBLg+sw3v0yloAf4W1HBdHVj75HTvx0i84d7WH0Q1RuBTgq52ni7IfmvZfhHaMaRHkRcY45cfX+BY2vh4y6BwYF0bmQWOlJUJgpMaJx9lZ2ByedCBlbnYRcdcKBASSHrL7TWR7twJyF321+B6W03BIlvwF8RupROVMBSn+56BIQ27HR4DKe/VL4FOpGAF4LM9vLEoG/9J3kuMWhwk44B3ZW7GTKAvFgmFTT7YH/gXwK4+lppJuGhPMqYLQSyzV commentaire</a></code></pre></div>
+<p>Copiez ce contenu (y compris <code>ssh-rsa</code> et <code>commentaire</code>).</p>
+<p>Suivez les instructions du paragraphe <em>Installation d’une clef publique</em></p>
+<h3 id="putty">Putty</h3>
+<p>En utilisant PuttyGen, vous pouvez générer une clef SSH</p>
+<p>Pour cela, cliquer sur le bouton <code>Generate</code> puis déplacer la souris pendant quelques secondes jusqu’à ce que la barre de progression soit complétée.</p>
+<p>Une fois cela fait:</p>
+<ol type="1">
+<li>Entrez une <em>passphrase</em> (une phrase assez longue qui va protéger votre clef)</li>
+<li>Confirmez la <em>passphrase</em></li>
+<li>Sauvez la clé privée avec le bouton <code>Save private key</code> dans un emplacement de votre disque</li>
+<li>Copiez le texte complet (y compris <code>ssh-rsa</code> et jusqu’en bas de la zone de sélection qui peut dépasser la zone visible)</li>
+<li>Suivez les instructions du paragraphe <em>Installation d’une clef publique</em></li>
+</ol>
+<h2 id="installation-de-la-clef-publique">Installation de la clef publique</h2>
+<p>La clef publique est la <em>serrure</em> qui permettra de se connecter à une machine en utilisant la clef privée qui lui est associée.</p>
+<p>Pour l’installer:</p>
+<ol type="1">
+<li>Ouvrez une session ssh sur la machine avec votre compte</li>
+<li>Créez un répertoire .ssh s’il n’existe pas (dans le répertoire utilisateur) : <code>mkdir -p ~/.ssh</code></li>
+<li>Allez dans le répertoire .ssh: <code>cd ~/.ssh</code></li>
+<li>Créez un nouveau fichier nommé <code>authorized_keys</code> : <code>nano authorized_keys</code></li>
+<li>Collez le contenu de la clef publique que vous avez copié précédemment</li>
+<li>Déconnectez-vous</li>
+<li>Testez l’installation en suivant les instructions du paragraphe <code>Connexion au serveur</code></li>
+</ol>
+<h2 id="connexion-au-serveur">Connexion au serveur</h2>
+<h3 id="en-utilisant-putty">En utilisant Putty</h3>
+<p>Dans le menu connexion, il faut définir la clef à utiliser:</p>
+<ol type="1">
+<li>Connection &gt; SSH &gt; Auth</li>
+<li>Choisir la clef privée créée précédemment dans le champ <code>Private key file for authentication</code></li>
+<li>Connectez-vous au serveur en cliquant sur le bouton Open</li>
+</ol>
+<h3 id="avec-git-bash">Avec git-bash</h3>
+<p>Connectez-vous directement:</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb5-1" data-line-number="1">$ <span class="fu">ssh</span> user@nom_ou_adresse_serveur</a></code></pre></div>
+<p>La passphrase vous est demandée. Entrez-la.</p>
+<p>Vous pouvez maintenant configurer l’agent (voir le paragraphe correspondant ci-dessous)</p>
+<h2 id="configuration-de-lagent">Configuration de l’agent</h2>
+<p>L’agent ssh démarre une première fois, demande la passphrase qui déverrouille la clef privée, et évite ainsi d’avoir à rentre cette passphrase à chaque fois.</p>
+<p>La passphrase étant stockée en mémoire vive, l’accès à la clef redevient verrouillé (et sécurisée) au redémarrage de la machine (ou en cas de vol de celle-ci).</p>
+<h3 id="avec-putty">Avec Putty</h3>
+<p>Ce tutoriel indique comment configurer <code>Pageant</code> (l’agent Putty de gestion des passphrases): https://www.siteground.com/tutorials/ssh/putty.htm</p>
+<h3 id="avec-git-bash-1">Avec git-bash</h3>
+<p>Sur le client, créer le fichier <code>.bash_profile</code> :</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="fu">touch</span> .bash_profile</a></code></pre></div>
+<p>Éditer le fichier <code>.bash_profile</code>. Ajoutez les lignes suivantes à la fin du fichier :</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="va">SSH_ENV=</span><span class="st">&quot;</span><span class="va">$HOME</span><span class="st">/.ssh/environment&quot;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">function</span><span class="fu"> start_agent</span> <span class="kw">{</span></a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">     <span class="bu">echo</span> <span class="st">&quot;Initialising new SSH agent...&quot;</span></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">     <span class="ex">/usr/bin/ssh-agent</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="st">&#39;s/^echo/#echo/&#39;</span> <span class="op">&gt;</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span></a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">     <span class="bu">echo</span> succeeded</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">     <span class="fu">chmod</span> 600 <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span></a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">     <span class="bu">.</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span> <span class="op">&gt;</span> <span class="ex">/dev/null</span></a>
+<a class="sourceLine" id="cb7-9" data-line-number="9">     <span class="ex">/usr/bin/ssh-add</span>;</a>
+<a class="sourceLine" id="cb7-10" data-line-number="10"><span class="kw">}</span></a>
+<a class="sourceLine" id="cb7-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb7-12" data-line-number="12"><span class="co"># Source SSH settings, if applicable</span></a>
+<a class="sourceLine" id="cb7-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb7-14" data-line-number="14"><span class="kw">if</span><span class="bu"> [</span> <span class="ot">-f</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></a>
+<a class="sourceLine" id="cb7-15" data-line-number="15">     <span class="bu">.</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span> <span class="op">&gt;</span> <span class="ex">/dev/null</span></a>
+<a class="sourceLine" id="cb7-16" data-line-number="16">     <span class="co">#ps ${SSH_AGENT_PID} doesn&#39;t work under cywgin</span></a>
+<a class="sourceLine" id="cb7-17" data-line-number="17">     <span class="fu">ps</span> -ef <span class="kw">|</span> <span class="fu">grep</span> <span class="va">${SSH_AGENT_PID}</span> <span class="kw">|</span> <span class="fu">grep</span> ssh-agent$ <span class="op">&gt;</span> /dev/null <span class="kw">||</span> <span class="kw">{</span></a>
+<a class="sourceLine" id="cb7-18" data-line-number="18">         <span class="ex">start_agent</span><span class="kw">;</span></a>
+<a class="sourceLine" id="cb7-19" data-line-number="19">     <span class="kw">}</span></a>
+<a class="sourceLine" id="cb7-20" data-line-number="20"><span class="kw">else</span></a>
+<a class="sourceLine" id="cb7-21" data-line-number="21">     <span class="ex">start_agent</span><span class="kw">;</span></a>
+<a class="sourceLine" id="cb7-22" data-line-number="22"><span class="kw">fi</span></a></code></pre></div>
+<p>En cas de non fonctionnement de l’agent ssh, voir:</p>
+<ul>
+<li>https://github.com/gnhuy91/til/issues/26</li>
+<li>https://stackoverflow.com/questions/3669001/getting-ssh-agent-to-work-with-git-run-from-windows-command-shell</li>
+</ul>
+</body>
+</html>

+ 226 - 0
C-annexe-configuration-ssh.html

@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Configuration SSH</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Configuration SSH</div>
+<nav id="TOC">
+<ul>
+<li><a href="#configuration-de-connexion-ssh">Configuration de connexion ssh</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#création-dune-clef">Création d’une clef</a><ul>
+<li><a href="#git-bash">Git-bash</a></li>
+<li><a href="#putty">Putty</a></li>
+</ul></li>
+<li><a href="#installation-de-la-clef-publique">Installation de la clef publique</a></li>
+<li><a href="#connexion-au-serveur">Connexion au serveur</a><ul>
+<li><a href="#en-utilisant-putty">En utilisant Putty</a></li>
+<li><a href="#avec-git-bash">Avec git-bash</a></li>
+</ul></li>
+<li><a href="#configuration-de-lagent">Configuration de l’agent</a><ul>
+<li><a href="#avec-putty">Avec Putty</a></li>
+<li><a href="#avec-git-bash-1">Avec git-bash</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="configuration-de-connexion-ssh">Configuration de connexion ssh</h1>
+<h2 id="introduction">Introduction</h2>
+<p>La première partie de ce document montre comment créer des paires de clefs publiques/privées.</p>
+<p>La méthode recommandée est celle utilisant <code>git-bash</code></p>
+<h2 id="création-dune-clef">Création d’une clef</h2>
+<h3 id="git-bash">Git-bash</h3>
+<h4 id="installation-de-git-bash">Installation de git-bash</h4>
+<p>Deux possibilités pour installer <code>git-bash</code></p>
+<p>La première: télécharger <code>git-bash</code> à l’adresse: http://gitforwindows.org/</p>
+<p>La seconde : <a href="https://chocolatey.org/install">installer <code>chocolatey</code></a> et installer le paquet <code>git</code></p>
+<p>L’avantage de <code>chocolatey</code> est qu’il permet d’installer des programmes supplémentaires sous Windows qui permettent d’augmenter les fonctionnalités du shell.</p>
+<h4 id="création-de-la-clef">Création de la clef</h4>
+<p>Sur le client <code>git-bash</code> la commande à utiliser est la suivante:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb1-1" data-line-number="1">$ <span class="fu">ssh-keygen</span></a></code></pre></div>
+<p>La commande affiche:</p>
+<pre><code>Generating public/private rsa key pair.
+Enter file in which to save the key (/Users/lauhub/.ssh/id_rsa):</code></pre>
+<p>Ne rien saisir (laisser la valeur par défaut) pour la question <code>Enter file in which to save the key</code> et appuyez sur la touche <code>Entrée</code>.</p>
+<p>Ensuite, choisir une passphrase:</p>
+<pre><code>Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /Users/lauhub/.ssh/id_bla.
+Your public key has been saved in /Users/lauhub/.ssh/id_bla.pub.
+The key fingerprint is:
+SHA256:qnMr1UW+zi3msGd/2UWfkqfq/ZkIi6mZzqeDLGFghh8 lauhub@MacBookAir-2-Laurent.local
+The key&#39;s randomart image is:
++---[RSA 2048]----+
+|                 |
+|          .      |
+|.        o       |
+|.+E       o     .|
+|o.  .. .S. .  ..o|
+|  .o  ... .  oo o|
+|  . o.o oo o  +o.|
+|   .o+o.o+X =.+ +|
+|    o+oO*Bo*O+.+ |
++----[SHA256]-----+</code></pre>
+<p>Vous obtenez deux fichiers:</p>
+<ul>
+<li><code>~/.ssh/id_rsa</code></li>
+<li><code>~/.ssh/id_rsa.pub</code></li>
+</ul>
+<p>Récupérez le contenu de la clef publique et copiez le:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb4-1" data-line-number="1">$ <span class="fu">cat</span> ~/.ssh/id_rsa.pub</a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="ex">ssh-rsa</span> AAAAB3NzaC1yc2EAAAADAQABAAABAQC/tAFES1cFMs7O4mVJql7C4aLW/67F6gDyXiE2JOcQIk8+WeqSyMAegOHw0OsdhnAQdf5iDPI19UQgD+kES6gHG7ZBLg+sw3v0yloAf4W1HBdHVj75HTvx0i84d7WH0Q1RuBTgq52ni7IfmvZfhHaMaRHkRcY45cfX+BY2vh4y6BwYF0bmQWOlJUJgpMaJx9lZ2ByedCBlbnYRcdcKBASSHrL7TWR7twJyF321+B6W03BIlvwF8RupROVMBSn+56BIQ27HR4DKe/VL4FOpGAF4LM9vLEoG/9J3kuMWhwk44B3ZW7GTKAvFgmFTT7YH/gXwK4+lppJuGhPMqYLQSyzV commentaire</a></code></pre></div>
+<p>Copiez ce contenu (y compris <code>ssh-rsa</code> et <code>commentaire</code>).</p>
+<p>Suivez les instructions du paragraphe <em>Installation d’une clef publique</em></p>
+<h3 id="putty">Putty</h3>
+<p>En utilisant PuttyGen, vous pouvez générer une clef SSH</p>
+<p>Pour cela, cliquer sur le bouton <code>Generate</code> puis déplacer la souris pendant quelques secondes jusqu’à ce que la barre de progression soit complétée.</p>
+<p>Une fois cela fait:</p>
+<ol type="1">
+<li>Entrez une <em>passphrase</em> (une phrase assez longue qui va protéger votre clef)</li>
+<li>Confirmez la <em>passphrase</em></li>
+<li>Sauvez la clé privée avec le bouton <code>Save private key</code> dans un emplacement de votre disque</li>
+<li>Copiez le texte complet (y compris <code>ssh-rsa</code> et jusqu’en bas de la zone de sélection qui peut dépasser la zone visible)</li>
+<li>Suivez les instructions du paragraphe <em>Installation d’une clef publique</em></li>
+</ol>
+<h2 id="installation-de-la-clef-publique">Installation de la clef publique</h2>
+<p>La clef publique est la <em>serrure</em> qui permettra de se connecter à une machine en utilisant la clef privée qui lui est associée.</p>
+<p>Pour l’installer:</p>
+<ol type="1">
+<li>Ouvrez une session ssh sur la machine avec votre compte</li>
+<li>Créez un répertoire .ssh s’il n’existe pas (dans le répertoire utilisateur) : <code>mkdir -p ~/.ssh</code></li>
+<li>Allez dans le répertoire .ssh: <code>cd ~/.ssh</code></li>
+<li>Créez un nouveau fichier nommé <code>authorized_keys</code> : <code>nano authorized_keys</code></li>
+<li>Collez le contenu de la clef publique que vous avez copié précédemment</li>
+<li>Déconnectez-vous</li>
+<li>Testez l’installation en suivant les instructions du paragraphe <code>Connexion au serveur</code></li>
+</ol>
+<h2 id="connexion-au-serveur">Connexion au serveur</h2>
+<h3 id="en-utilisant-putty">En utilisant Putty</h3>
+<p>Dans le menu connexion, il faut définir la clef à utiliser:</p>
+<ol type="1">
+<li>Connection &gt; SSH &gt; Auth</li>
+<li>Choisir la clef privée créée précédemment dans le champ <code>Private key file for authentication</code></li>
+<li>Connectez-vous au serveur en cliquant sur le bouton Open</li>
+</ol>
+<h3 id="avec-git-bash">Avec git-bash</h3>
+<p>Connectez-vous directement:</p>
+<div class="sourceCode" id="cb5"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb5-1" data-line-number="1">$ <span class="fu">ssh</span> user@nom_ou_adresse_serveur</a></code></pre></div>
+<p>La passphrase vous est demandée. Entrez-la.</p>
+<p>Vous pouvez maintenant configurer l’agent (voir le paragraphe correspondant ci-dessous)</p>
+<h2 id="configuration-de-lagent">Configuration de l’agent</h2>
+<p>L’agent ssh démarre une première fois, demande la passphrase qui déverrouille la clef privée, et évite ainsi d’avoir à rentre cette passphrase à chaque fois.</p>
+<p>La passphrase étant stockée en mémoire vive, l’accès à la clef redevient verrouillé (et sécurisée) au redémarrage de la machine (ou en cas de vol de celle-ci).</p>
+<h3 id="avec-putty">Avec Putty</h3>
+<p>Ce tutoriel indique comment configurer <code>Pageant</code> (l’agent Putty de gestion des passphrases): https://www.siteground.com/tutorials/ssh/putty.htm</p>
+<h3 id="avec-git-bash-1">Avec git-bash</h3>
+<p>Sur le client, créer le fichier <code>.bash_profile</code> :</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="fu">touch</span> .bash_profile</a></code></pre></div>
+<p>Éditer le fichier <code>.bash_profile</code>. Ajoutez les lignes suivantes à la fin du fichier :</p>
+<div class="sourceCode" id="cb7"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="va">SSH_ENV=</span><span class="st">&quot;</span><span class="va">$HOME</span><span class="st">/.ssh/environment&quot;</span></a>
+<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
+<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">function</span><span class="fu"> start_agent</span> <span class="kw">{</span></a>
+<a class="sourceLine" id="cb7-4" data-line-number="4">     <span class="bu">echo</span> <span class="st">&quot;Initialising new SSH agent...&quot;</span></a>
+<a class="sourceLine" id="cb7-5" data-line-number="5">     <span class="ex">/usr/bin/ssh-agent</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="st">&#39;s/^echo/#echo/&#39;</span> <span class="op">&gt;</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span></a>
+<a class="sourceLine" id="cb7-6" data-line-number="6">     <span class="bu">echo</span> succeeded</a>
+<a class="sourceLine" id="cb7-7" data-line-number="7">     <span class="fu">chmod</span> 600 <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span></a>
+<a class="sourceLine" id="cb7-8" data-line-number="8">     <span class="bu">.</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span> <span class="op">&gt;</span> <span class="ex">/dev/null</span></a>
+<a class="sourceLine" id="cb7-9" data-line-number="9">     <span class="ex">/usr/bin/ssh-add</span>;</a>
+<a class="sourceLine" id="cb7-10" data-line-number="10"><span class="kw">}</span></a>
+<a class="sourceLine" id="cb7-11" data-line-number="11"></a>
+<a class="sourceLine" id="cb7-12" data-line-number="12"><span class="co"># Source SSH settings, if applicable</span></a>
+<a class="sourceLine" id="cb7-13" data-line-number="13"></a>
+<a class="sourceLine" id="cb7-14" data-line-number="14"><span class="kw">if</span><span class="bu"> [</span> <span class="ot">-f</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></a>
+<a class="sourceLine" id="cb7-15" data-line-number="15">     <span class="bu">.</span> <span class="st">&quot;</span><span class="va">${SSH_ENV}</span><span class="st">&quot;</span> <span class="op">&gt;</span> <span class="ex">/dev/null</span></a>
+<a class="sourceLine" id="cb7-16" data-line-number="16">     <span class="co">#ps ${SSH_AGENT_PID} doesn&#39;t work under cywgin</span></a>
+<a class="sourceLine" id="cb7-17" data-line-number="17">     <span class="fu">ps</span> -ef <span class="kw">|</span> <span class="fu">grep</span> <span class="va">${SSH_AGENT_PID}</span> <span class="kw">|</span> <span class="fu">grep</span> ssh-agent$ <span class="op">&gt;</span> /dev/null <span class="kw">||</span> <span class="kw">{</span></a>
+<a class="sourceLine" id="cb7-18" data-line-number="18">         <span class="ex">start_agent</span><span class="kw">;</span></a>
+<a class="sourceLine" id="cb7-19" data-line-number="19">     <span class="kw">}</span></a>
+<a class="sourceLine" id="cb7-20" data-line-number="20"><span class="kw">else</span></a>
+<a class="sourceLine" id="cb7-21" data-line-number="21">     <span class="ex">start_agent</span><span class="kw">;</span></a>
+<a class="sourceLine" id="cb7-22" data-line-number="22"><span class="kw">fi</span></a></code></pre></div>
+<p>En cas de non fonctionnement de l’agent ssh, voir:</p>
+<ul>
+<li>https://github.com/gnhuy91/til/issues/26</li>
+<li>https://stackoverflow.com/questions/3669001/getting-ssh-agent-to-work-with-git-run-from-windows-command-shell</li>
+</ul>
+</body>
+</html>

+ 31 - 0
Exercices-a-faire.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Exercices</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Exercices</div>
+<nav id="TOC">
+<ul>
+<li><a href="#exercices-à-faire">Exercices à faire</a></li>
+</ul>
+</nav>
+<h1 id="exercices-à-faire">Exercices à faire</h1>
+<p>Gestion de comptes</p>
+<p>http://lig-membres.imag.fr/genoud/ENSJAVA/M2CCI/tds/td4/td4.html</p>
+<p>http://lig-membres.imag.fr/genoud/ENSJAVA/M2CCI/tds/td8/td8.html</p>
+</body>
+</html>

+ 263 - 0
F-annexe-ANT.html

@@ -0,0 +1,263 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>ANT et outils de build</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+  { position: relative; }
+pre.numberSource a.sourceLine:empty
+  { position: absolute; }
+pre.numberSource a.sourceLine::before
+  { content: attr(data-line-number);
+    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+    border: none; pointer-events: all;
+    -webkit-touch-callout: none; -webkit-user-select: none;
+    -khtml-user-select: none; -moz-user-select: none;
+    -ms-user-select: none; user-select: none;
+    padding: 0 4px; width: 4em;
+    color: #aaaaaa;
+  }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+div.sourceCode
+  {  }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">ANT et outils de build</div>
+<nav id="TOC">
+<ul>
+<li><a href="#ant">ANT</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#installation-de-ant">Installation de ant</a><ul>
+<li><a href="#vérification-de-linstallation">Vérification de l’installation</a></li>
+</ul></li>
+<li><a href="#premiers-pas-avec-ant">Premiers pas avec Ant</a><ul>
+<li><a href="#propriétés">Propriétés</a></li>
+<li><a href="#fichier-de-propriétés">Fichier de propriétés</a></li>
+</ul></li>
+</ul></li>
+</ul>
+</nav>
+<h1 id="ant">ANT</h1>
+<h2 id="introduction">Introduction</h2>
+<p><strong>Ant</strong> est un outil de build qui permet de :</p>
+<ul>
+<li>Compiler du code</li>
+<li>Empaqueter des binaires</li>
+<li>Déployer des binaires sur des serveurs</li>
+<li>Tester les modifications</li>
+</ul>
+<p>C’est un outil assez ancien qui a été intégré comme projet Apache en l’an 2000.</p>
+<p>Il est basé sur des fichiers de configuration écrits en XML (fichier build.xml).</p>
+<h2 id="installation-de-ant">Installation de ant</h2>
+<p>L’installation se fait en suivant les instructions données sur la page du <a href="https://ant.apache.org/">projet Ant</a>. Il est disponible à l’installation notamment via le gestionnaires de paquets.</p>
+<h3 id="vérification-de-linstallation">Vérification de l’installation</h3>
+<p>Pour vérifier la version de Ant présente sur votre système, tapez la commande:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb1-1" data-line-number="1">$ <span class="ex">ant</span> -version</a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ex">Apache</span> Ant(TM) <span class="ex">version</span> 1.10.2 compiled on February 3 2018</a></code></pre></div>
+<h2 id="premiers-pas-avec-ant">Premiers pas avec Ant</h2>
+<p>Créez un fichier <code>build.xml</code> qui va nous permettre de tester Ant:</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">&lt;?xml</span> version = &quot;1.0&quot;<span class="kw">?&gt;</span></a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"><span class="kw">&lt;project</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;Hello World with Ant&quot;</span><span class="ot"> default</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb2-3" data-line-number="3">   <span class="kw">&lt;target</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb2-4" data-line-number="4">      <span class="kw">&lt;echo&gt;</span>Hello World - Ant<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb2-5" data-line-number="5">   <span class="kw">&lt;/target&gt;</span></a>
+<a class="sourceLine" id="cb2-6" data-line-number="6"><span class="kw">&lt;/project&gt;</span></a></code></pre></div>
+<p>Lancez maintenant la commande <code>ant</code>:</p>
+<div class="sourceCode" id="cb3"><pre class="sourceCode bash"><code class="sourceCode bash"><a class="sourceLine" id="cb3-1" data-line-number="1">$ <span class="ex">ant</span></a>
+<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="ex">Buildfile</span>: /path/to/ant/project/build.xml</a>
+<a class="sourceLine" id="cb3-3" data-line-number="3"></a>
+<a class="sourceLine" id="cb3-4" data-line-number="4"><span class="ex">info</span>:</a>
+<a class="sourceLine" id="cb3-5" data-line-number="5">     [<span class="ex">echo</span>] Hello World - Ant</a>
+<a class="sourceLine" id="cb3-6" data-line-number="6"></a>
+<a class="sourceLine" id="cb3-7" data-line-number="7"><span class="ex">BUILD</span> SUCCESSFUL</a>
+<a class="sourceLine" id="cb3-8" data-line-number="8"><span class="ex">Total</span> time: 0 seconds</a></code></pre></div>
+<h3 id="propriétés">Propriétés</h3>
+<h4 id="définition-dune-propriété">Définition d’une propriété</h4>
+<p>Nous allons maintenant définir une propriété (<code>property</code>).</p>
+<p>Modifiez maintenant le fichier <code>build.xml</code> comme suit:</p>
+<div class="sourceCode" id="cb4"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">&lt;?xml</span> version = &quot;1.0&quot;<span class="kw">?&gt;</span></a>
+<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">&lt;project</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;Hello World with Ant&quot;</span><span class="ot"> default</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb4-3" data-line-number="3">   <span class="kw">&lt;property</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;site.name&quot;</span><span class="ot"> value</span> <span class="ot">=</span> <span class="st">&quot;www.example.com&quot;</span><span class="kw">/&gt;</span></a>
+<a class="sourceLine" id="cb4-4" data-line-number="4">   <span class="kw">&lt;target</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb4-5" data-line-number="5">      <span class="kw">&lt;echo&gt;</span>Hello World - Ant site is ${site.name}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb4-6" data-line-number="6">   <span class="kw">&lt;/target&gt;</span></a>
+<a class="sourceLine" id="cb4-7" data-line-number="7"><span class="kw">&lt;/project&gt;</span></a></code></pre></div>
+<p>L’appel de la commande <code>ant</code> donne:</p>
+<pre><code>...
+info:
+     [echo] Hello World - Ant site is www.example.com
+...</code></pre>
+<p>Nous venons de définir une propriété nommée <code>site.name</code>.</p>
+<h4 id="propriétés-pré-définies">Propriétés pré-définies</h4>
+<p>Ajoutez les deux lignes <code>echo</code> dans la cible <code>info</code> comme suit :</p>
+<div class="sourceCode" id="cb6"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">&lt;target</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb6-2" data-line-number="2">  <span class="kw">&lt;echo&gt;</span>Hello World - Ant site is ${site.name}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb6-3" data-line-number="3">  <span class="kw">&lt;echo&gt;</span>Ant version is ${ant.version}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb6-4" data-line-number="4">  <span class="kw">&lt;echo&gt;</span>Base dir is ${basedir}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb6-5" data-line-number="5"><span class="kw">&lt;/target&gt;</span></a></code></pre></div>
+<p>On obtient au lancement de <code>ant</code>:</p>
+<pre><code>info:
+     [echo] Hello World - Ant site is www.example.com /tmp/path/to/ant/project
+     [echo] Ant version is Apache Ant(TM) version 1.10.2 compiled on February 3 2018
+     [echo] Base dir is /tmp/path/to/ant/project</code></pre>
+<p>Nous venons d’utiliser des propriétés pré-définies. En voici une liste :</p>
+<table>
+<colgroup>
+<col style="width: 29%" />
+<col style="width: 70%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Nom</th>
+<th>Définition</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>ant.file</td>
+<td> Le chemin complet vers le fichier de build</td>
+</tr>
+<tr class="even">
+<td>ant.version</td>
+<td>La version de Ant</td>
+</tr>
+<tr class="odd">
+<td>basedir</td>
+<td>Répertoire de base du <em>build</em>. Peut être spécifié avec l’attribut <code>basedir</code> de l’élément <code>project</code></td>
+</tr>
+<tr class="even">
+<td>ant.java.version</td>
+<td>Version de Java utilisée</td>
+</tr>
+<tr class="odd">
+<td>ant.project.name</td>
+<td>Le nom du projet (attribute <code>name</code> de l’élément projet)</td>
+</tr>
+<tr class="even">
+<td>ant.project.default-target</td>
+<td>Cible par défaut du projet actuel</td>
+</tr>
+<tr class="odd">
+<td>ant.project.invoked-targets</td>
+<td>Cible invoquées (liste séparée par des virgules) du projet</td>
+</tr>
+<tr class="even">
+<td>ant.core.lib</td>
+<td>Chemin vers la librairie Ant (fichier JAR)</td>
+</tr>
+<tr class="odd">
+<td>ant.home</td>
+<td>Répertoire d’installation de Ant (<code>ANT_HOME</code>)</td>
+</tr>
+<tr class="even">
+<td>ant.library.dir   </td>
+<td>Répertoire des librairies Ant. En général: <code>ANT_HOME/lib</code></td>
+</tr>
+<tr class="odd">
+<td>file.separator  </td>
+<td>le séparateur des noms de répertoire</td>
+</tr>
+</tbody>
+</table>
+<p>Vous pouvez tester ces propriétés avec le fichier suivant:</p>
+<div class="sourceCode" id="cb8"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">&lt;?xml</span> version = &quot;1.0&quot;<span class="kw">?&gt;</span></a>
+<a class="sourceLine" id="cb8-2" data-line-number="2"><span class="kw">&lt;project</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;Hello World with Ant&quot;</span><span class="ot"> default</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb8-3" data-line-number="3">   <span class="kw">&lt;property</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;site.name&quot;</span><span class="ot"> value</span> <span class="ot">=</span> <span class="st">&quot;www.example.com&quot;</span><span class="kw">/&gt;</span></a>
+<a class="sourceLine" id="cb8-4" data-line-number="4">   <span class="kw">&lt;target</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb8-5" data-line-number="5">        <span class="kw">&lt;echo&gt;</span>Hello World - Ant site is ${site.name} ${basedir}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-6" data-line-number="6">        <span class="kw">&lt;echo&gt;</span>Ant version is ${ant.version}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-7" data-line-number="7">        <span class="kw">&lt;echo&gt;</span>Base dir is ${basedir}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-8" data-line-number="8">        <span class="kw">&lt;echo&gt;</span>Java version is ${ant.java.version}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-9" data-line-number="9">        <span class="kw">&lt;echo&gt;</span>ant.project.name is ${ant.project.name}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-10" data-line-number="10">        <span class="kw">&lt;echo&gt;</span>ant.project.default-target : ${ant.project.default-target}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-11" data-line-number="11">        <span class="kw">&lt;echo&gt;</span>ant.project.invoked-targets : ${ant.project.invoked-targets}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-12" data-line-number="12">        <span class="kw">&lt;echo&gt;</span>ant.core.lib : ${ant.core.lib}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-13" data-line-number="13">        <span class="kw">&lt;echo&gt;</span>ant.home : ${ant.home}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-14" data-line-number="14">        <span class="kw">&lt;echo&gt;</span>ant.library.dir : ${ant.library.dir}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-15" data-line-number="15">        <span class="kw">&lt;echo&gt;</span>file.separator : ${file.separator}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb8-16" data-line-number="16">   <span class="kw">&lt;/target&gt;</span></a>
+<a class="sourceLine" id="cb8-17" data-line-number="17"><span class="kw">&lt;/project&gt;</span></a></code></pre></div>
+<h3 id="fichier-de-propriétés">Fichier de propriétés</h3>
+<p>Il est possible de définir les propriétés d’un projet (son nom, sa version, etc) directement dans le fichier <code>build.xml</code>.</p>
+<p>Cependant, une pratique courante consiste à placer un fichier nommé <code>build.properties</code> à côté du fichier <code>build.xml</code></p>
+<p>Créez le fichier <code>build.properties</code> et y placer les éléments suivants:</p>
+<pre class="properties"><code>site.name = www.example.com
+build.version = 1.2.3</code></pre>
+<p>Modifiez le fichier <code>build.xml</code> comme suit:</p>
+<div class="sourceCode" id="cb10"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">&lt;?xml</span> version = &quot;1.0&quot;<span class="kw">?&gt;</span></a>
+<a class="sourceLine" id="cb10-2" data-line-number="2"><span class="kw">&lt;project</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;Hello World with Ant&quot;</span><span class="ot"> default</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb10-3" data-line-number="3">   <span class="kw">&lt;property</span><span class="ot"> file</span> <span class="ot">=</span> <span class="st">&quot;build.properties&quot;</span><span class="kw">/&gt;</span></a>
+<a class="sourceLine" id="cb10-4" data-line-number="4">   <span class="kw">&lt;target</span><span class="ot"> name</span> <span class="ot">=</span> <span class="st">&quot;info&quot;</span><span class="kw">&gt;</span></a>
+<a class="sourceLine" id="cb10-5" data-line-number="5">        <span class="kw">&lt;echo&gt;</span>Hello World - Ant site is ${site.name}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb10-6" data-line-number="6">        <span class="kw">&lt;echo&gt;</span>Project version is ${build.version}<span class="kw">&lt;/echo&gt;</span></a>
+<a class="sourceLine" id="cb10-7" data-line-number="7">   <span class="kw">&lt;/target&gt;</span></a>
+<a class="sourceLine" id="cb10-8" data-line-number="8"><span class="kw">&lt;/project&gt;</span></a></code></pre></div>
+<p>L’exécution de Ant donne alors:</p>
+<div class="sourceCode" id="cb11"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb11-1" data-line-number="1">iinfo:</a>
+<a class="sourceLine" id="cb11-2" data-line-number="2">     [echo] Hello World - Ant site is www.example.com</a>
+<a class="sourceLine" id="cb11-3" data-line-number="3">     [echo] Project version is 1.2.3</a>
+<a class="sourceLine" id="cb11-4" data-line-number="4"></a>
+<a class="sourceLine" id="cb11-5" data-line-number="5">BUILD SUCCESSFUL</a>
+<a class="sourceLine" id="cb11-6" data-line-number="6">Total time: 0 seconds</a></code></pre></div>
+</body>
+</html>

+ 451 - 0
buttondown.css

@@ -0,0 +1,451 @@
+/*
+    Buttondown
+    A Markdown/MultiMarkdown/Pandoc HTML output CSS stylesheet
+    Author: Ryan Gray
+    Date: 15 Feb 2011
+    Revised: 21 Feb 2012
+   
+    General style is clean, with minimal re-definition of the defaults or 
+    overrides of user font settings. The body text and header styles are 
+    left alone except title, author and date classes are centered. A Pandoc TOC 
+    is not printed, URLs are printed after hyperlinks in parentheses. 
+    Block quotes are italicized. Tables are lightly styled with lines above 
+    and below the table and below the header with a boldface header. Code 
+    blocks are line wrapped. 
+
+    All elements that Pandoc and MultiMarkdown use should be listed here, even 
+    if the style is empty so you can easily add styling to anything.
+    
+    There are some elements in here for HTML5 output of Pandoc, but I have not 
+    gotten around to testing that yet.
+*/
+
+/* NOTES:
+
+    Stuff tried and failed:
+    
+    It seems that specifying font-family:serif in Safari will always use 
+    Times New Roman rather than the user's preferences setting.
+    
+    Making the font size different or a fixed value for print in case the screen 
+    font size is making the print font too big: Making font-size different for 
+    print than for screen causes horizontal lines to disappear in math when using 
+    MathJax under Safari.
+*/
+
+/* ---- Front Matter ---- */
+
+/* Pandoc header DIV. Contains .title, .author and .date. Comes before div#TOC. 
+   Only appears if one of those three are in the document.
+*/
+
+div#header, header
+    {
+    /* Put border on bottom. Separates it from TOC or body that comes after it. */
+    border-bottom: 1px solid #aaa;
+    margin-bottom: 0.5em;
+    }
+
+.title /* Pandoc title header (h1.title) */
+    {
+    text-align: center;
+    }
+
+.author, .date /* Pandoc author(s) and date headers (h2.author and h3.date) */
+    {
+    text-align: center;
+    }
+
+/* Pandoc table of contents DIV when using the --toc option.
+   NOTE: this doesn't support Pandoc's --id-prefix option for #TOC and #header. 
+   Probably would need to use div[id$='TOC'] and div[id$='header'] as selectors.
+*/
+
+div#TOC, nav#TOC
+    {
+    /* Put border on bottom to separate it from body. */
+    border-bottom: 1px solid #aaa;
+    margin-bottom: 0.5em;
+    }
+
+@media print
+    {
+    div#TOC, nav#TOC
+        {
+        /* Don't display TOC in print */
+        display: none;
+        }
+    }
+
+/* ---- Headers and sections ---- */
+
+h1, h2, h3, h4, h5, h6
+{
+    font-family: "Helvetica Neue", Helvetica, "Liberation Sans", Calibri, Arial, sans-serif; /* Sans-serif headers */
+
+    /* font-family: "Liberation Serif", "Georgia", "Times New Roman", serif; /* Serif headers */
+
+    page-break-after: avoid; /* Firefox, Chrome, and Safari do not support the property value "avoid" */
+}
+
+/* Pandoc with --section-divs option */
+
+div div, section section /* Nested sections */
+    {
+    margin-left: 2em; /* This will increasingly indent nested header sections */
+    }
+
+p {}
+
+blockquote
+    { 
+    font-style: italic;
+    }
+
+li /* All list items */
+    {
+    }
+
+li > p /* Loosely spaced list item */
+    {
+    margin-top: 1em; /* IE: lack of space above a <li> when the item is inside a <p> */
+    }
+
+ul /* Whole unordered list */
+    {
+    }
+
+ul li /* Unordered list item */
+    {
+    }
+
+ol /* Whole ordered list */
+    {
+    }
+
+ol li /* Ordered list item */
+    {
+    }
+
+hr {}
+
+/* ---- Some span elements --- */
+
+sub /* Subscripts. Pandoc: H~2~O */
+    {
+    }
+
+sup /* Superscripts. Pandoc: The 2^nd^ try. */
+    {
+    }
+    
+em /* Emphasis. Markdown: *emphasis* or _emphasis_ */
+    {
+    }
+    
+em > em /* Emphasis within emphasis: *This is all *emphasized* except that* */
+    {
+    font-style: normal;
+    }
+
+strong /* Markdown **strong** or __strong__ */
+    {
+    }
+
+/* ---- Links (anchors) ---- */
+
+a /* All links */
+    {
+    /* Keep links clean. On screen, they are colored; in print, they do nothing anyway. */
+    text-decoration: none;
+    }
+
+@media screen
+    {
+    a:hover
+        {
+        /* On hover, we indicate a bit more that it is a link. */
+        text-decoration: underline;
+        }
+    }
+
+@media print
+    {
+    a   {
+        /* In print, a colored link is useless, so un-style it. */
+        color: black;
+        background: transparent;
+        }
+        
+    a[href^="http://"]:after, a[href^="https://"]:after
+        {
+        /* However, links that go somewhere else, might be useful to the reader,
+           so for http and https links, print the URL after what was the link 
+           text in parens
+        */
+        content: " (" attr(href) ") ";
+        font-size: 90%;
+        }
+    }
+
+/* ---- Images ---- */
+
+img
+    {
+    /* Let it be inline left/right where it wants to be, but verticality make 
+       it in the middle to look nicer, but opinions differ, and if in a multi-line 
+       paragraph, it might not be so great. 
+    */
+    vertical-align: middle;
+    }
+
+div.figure /* Pandoc figure-style image */
+    {
+    /* Center the image and caption */
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+    font-style: italic;
+    }
+
+p.caption /* Pandoc figure-style caption within div.figure */
+    {
+    /* Inherits div.figure props by default */
+    }
+
+/* ---- Code blocks and spans ---- */
+
+pre, code 
+    {
+    background-color: #fdf7ee;
+    /* BEGIN word wrap */
+    /* Need all the following to word wrap instead of scroll box */
+    /* This will override the overflow:auto if present */
+    white-space: pre-wrap; /* css-3 */
+    white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+    white-space: -pre-wrap; /* Opera 4-6 */
+    white-space: -o-pre-wrap; /* Opera 7 */
+    word-wrap: break-word; /* Internet Explorer 5.5+ */
+    /* END word wrap */
+    }
+
+pre /* Code blocks */
+    {
+    /* Distinguish pre blocks from other text by more than the font with a background tint. */
+    padding: 0.5em; /* Since we have a background color */
+    border-radius: 5px; /* Softens it */
+    /* Give it a some definition */
+    border: 1px solid #aaa;
+    /* Set it off left and right, seems to look a bit nicer when we have a background */
+    margin-left:  0.5em;
+    margin-right: 0.5em;
+    }
+
+@media screen
+    {
+    pre
+        {
+        /* On screen, use an auto scroll box for long lines, unless word-wrap is enabled */
+        white-space: pre;
+        overflow: auto;
+        /* Dotted looks better on screen and solid seems to print better. */
+        border: 1px dotted #777;
+        }
+    }
+
+code /* All inline code spans */
+    {
+    }
+
+p > code, li > code /* Code spans in paragraphs and tight lists */
+    {
+    /* Pad a little from adjacent text */
+    padding-left:  2px;
+    padding-right: 2px;
+    }
+    
+li > p code /* Code span in a loose list */
+    {
+    /* We have room for some more background color above and below */
+    padding: 2px;
+    }
+
+/* ---- Math ---- */
+
+span.math /* Pandoc inline math default and --jsmath inline math */
+    {
+    /* Tried font-style:italic here, and it messed up MathJax rendering in some browsers. Maybe don't mess with at all. */
+    }
+    
+div.math /* Pandoc --jsmath display math */
+    {
+    }
+    
+span.LaTeX /* Pandoc --latexmathml math */
+    {
+    } 
+
+eq /* Pandoc --gladtex math */
+    {
+    } 
+
+/* ---- Tables ---- */
+
+/*  A clean textbook-like style with horizontal lines above and below and under 
+    the header. Rows highlight on hover to help scanning the table on screen.
+*/
+
+table
+    {
+    border-collapse: collapse;
+    border-spacing: 0; /* IE 6 */
+    
+    border:1px solid black;
+    /* Center */
+    margin-left: auto;
+    margin-right: auto;
+    }
+    
+thead /* Entire table header */
+    {
+    border: 1pt solid #000;
+    background-color: #eee; /* Does this BG print well? */
+    }
+
+tr.header /* Each header row */
+    {
+    } 
+
+tbody /* Entire table  body */
+    {
+    }
+
+/* Table body rows */
+
+tr  {
+    }
+tr.odd:hover, tr.even:hover /* Use .odd and .even classes to avoid styling rows in other tables */
+    {
+    background-color: #eee;
+    }
+    
+/* Odd and even rows */
+tr.odd {}
+tr.even {}
+
+td, th /* Table cells and table header cells */
+    { 
+    vertical-align: top; /* Word */
+    vertical-align: baseline; /* Others */
+    padding-left:   0.5em;
+    padding-right:  0.5em;
+    padding-top:    0.2em;
+    padding-bottom: 0.2em;
+    }
+
+td {
+    border:1px solid black;
+}
+/* Removes padding on left and right of table for a tight look. Good if thead has no background color*/
+/*
+tr td:last-child, tr th:last-child
+    {
+    padding-right: 0;
+    }
+tr td:first-child, tr th:first-child 
+    {
+    padding-left: 0;
+    }
+*/
+
+th /* Table header cells */
+    {
+    font-weight: bold; 
+    }
+
+tfoot /* Table footer (what appears here if caption is on top?) */
+    {
+    }
+
+caption /* This is for a table caption tag, not the p.caption Pandoc uses in a div.figure */
+    {
+    caption-side: top;
+    border: none;
+    font-size: 0.9em;
+    font-style: italic;
+    text-align: center;
+    margin-bottom: 0.3em; /* Good for when on top */
+    padding-bottom: 0.2em;
+    }
+
+/* ---- Definition lists ---- */
+
+dl /* The whole list */
+    {
+    border-top: 2pt solid black;
+    padding-top: 0.5em;
+    border-bottom: 2pt solid black;
+    }
+
+dt /* Definition term */
+    {
+    font-weight: bold;
+    }
+
+dd+dt /* 2nd or greater term in the list */
+    {
+    border-top: 1pt solid black;
+    padding-top: 0.5em;
+    }
+    
+dd /* A definition */
+    {
+    margin-bottom: 0.5em;
+    }
+
+dd+dd /* 2nd or greater definition of a term */
+    {
+    border-top: 1px solid black; /* To separate multiple definitions */
+    }
+    
+/* ---- Footnotes ---- */
+
+a.footnote, a.footnoteRef { /* Pandoc, MultiMarkdown footnote links */
+    font-size: small; 
+    vertical-align: text-top;
+}
+
+a[href^="#fnref"], a.reversefootnote /* Pandoc, MultiMarkdown, ?? footnote back links */
+    {
+    }
+
+@media print
+    {
+    a[href^="#fnref"], a.reversefootnote /* Pandoc, MultiMarkdown */
+        {
+        /* Don't display these at all in print since the arrow is only something to click on */
+        display: none;
+        }
+    }
+    
+div.footnotes /* Pandoc footnotes div at end of the document */
+    {
+    }
+    
+div.footnotes li[id^="fn"] /* A footnote item within that div */
+    {
+    }
+
+/* You can class stuff as "noprint" to not print. 
+   Useful since you can't set this media conditional inside an HTML element's 
+   style attribute (I think), and you don't want to make another stylesheet that 
+   imports this one and adds a class just to do this.
+*/
+
+@media print
+    {
+    .noprint
+        {
+        display:none;
+        }
+    }

BIN
data/Threads.zip


BIN
data/ch2-Calculs.zip


BIN
data/ch3-Calculs.zip


BIN
data/ch4-Controles-test.zip


+ 1 - 0
data/ws

@@ -0,0 +1 @@
+../../ws

BIN
images/AWT-Container.png


BIN
images/AWT-classes+swing.png


BIN
images/AWT-classes.png


BIN
images/Access-Modifiers-calcul.png


BIN
images/Access-Modifiers-reference.png


BIN
images/Aggregation-classe.png


BIN
images/Aggregation-exemple.png


BIN
images/Autoradio.png


BIN
images/Calculs-delegation-classe.png


BIN
images/Calculs-delegation-hybride-classe.png


BIN
images/Calculs-delegation-hybride-sequence.png


BIN
images/Calculs-delegation-sequence-exercice.png


BIN
images/Calculs-delegation-sequence.png


BIN
images/CarnetAdresse-Map.png


BIN
images/Champs.png


BIN
images/Classes-Calcul.png


BIN
images/ClassesException.png


BIN
images/Collection-Map.png


BIN
images/Composition-classe.png


BIN
images/Composition-exemple.png


BIN
images/Constantes.png


BIN
images/Date-conception.png


BIN
images/ExceptionsPileAppel.png


BIN
images/ExceptionsPileAppelReseau.png


BIN
images/ExceptionsPileAppelReseauErreurs.png


BIN
images/Fleur-heritage-toString.png


BIN
images/Fleur.png


BIN
images/Heritage-Calcul-Abstract.png


BIN
images/Heritage-Calcul-Addition.png


BIN
images/Heritage-Calcul.png


BIN
images/HeritageMultInterface.png


BIN
images/HeritageMultInterfaceEtUtilise.png


BIN
images/HeritageMultiple.png


BIN
images/MVC-utilisateur.png


BIN
images/MVC.png


BIN
images/Multiplication.png


BIN
images/Observateur.png


BIN
images/PoeteEtStylo.png


BIN
images/Point.png


BIN
images/Programmation-objet.png


BIN
images/RendezVous.png


BIN
images/Stylo-diagramme_de_classe.png


BIN
images/Swing-architecture.png


BIN
images/Swing-classes-basiques.png


BIN
images/Swing-classes-boutons.png


BIN
images/Swing-classes-texte.png


BIN
images/Swing-classes.png


BIN
images/UML-association-attribut.png


BIN
images/UML-association-bidirectionnelle.png


BIN
images/UML-association-cardinalite-array.png


BIN
images/UML-association-cardinalite-famille.png


BIN
images/UML-association-cardinalite-list.png


BIN
images/UML-association-cardinalite-sequence.png


BIN
images/UML-association-cardinalite-set.png


BIN
images/UML-association-qualifie-multiple.png


BIN
images/UML-association-qualifie-simple.png


BIN
images/UML-association-role.png


BIN
images/UML-association.png


BIN
images/UML-dependance-creation.png


BIN
images/UML-dependance-instanciation.png


BIN
images/UML-dependance.png


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 50 - 0
images/attention.svg


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 67 - 0
images/important.svg


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 64 - 0
images/information.svg


+ 215 - 0
images/practice.svg

@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Layer_1"
+   style="enable-background:new 0 0 30 30;"
+   version="1.1"
+   viewBox="0 0 30 30"
+   xml:space="preserve"
+   sodipodi:docname="practice.svg"
+   inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
+     id="metadata9"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs7" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="751"
+     id="namedview5"
+     showgrid="false"
+     inkscape:zoom="15.733333"
+     inkscape:cx="22.989704"
+     inkscape:cy="20.624755"
+     inkscape:window-x="1680"
+     inkscape:window-y="543"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2"
+     inkscape:snap-bbox="true" /><g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Pancarte"
+     style="display:inline" /><g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Old"
+     style="display:inline"><path
+       style="fill:none;fill-rule:evenodd;stroke:#2bb771;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 27.647558,20.011658 c -2.058277,-2.984302 1.829056,-1.97399 1.89198,-8.663725 0.04523,-4.8086283 -0.534348,-4.3731862 -2.590386,-4.7377633"
+       id="path6597"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csc" /><path
+       style="opacity:1;vector-effect:none;fill:#8fe5ba;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 2.1331435,1.4342228 V 15.518207 H 26.574549 V 1.4342228 Z m 2.5287342,3.3439484 8.9602093,3.20627 V 9.6055349 L 4.8525557,13.002483 V 11.225139 L 11.16115,8.8047536 4.6618777,6.5555151 Z"
+       id="rect814"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" /><rect
+       style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2bb771;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect814-7"
+       width="24.202749"
+       height="13.940294"
+       x="2.1331434"
+       y="1.5779128" /><path
+       style="fill:#2bb771;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 0.38135593,25.932204 v 1.525423 H 25.805084 v -1.525423 z"
+       id="path857"
+       inkscape:connector-curvature="0" /><g
+       id="g6601"
+       transform="translate(0.25423729,13.983051)"><path
+         sodipodi:nodetypes="sszs"
+         inkscape:connector-curvature="0"
+         id="path859"
+         d="m 27.330508,5.3389831 c -1.779661,0.3813559 -1.3759,4.9994739 -0.762711,6.4194919 1.207627,2.79661 5.338982,0.953389 4.703389,-1.334746 C 30.635593,8.1355932 28.904118,5.001781 27.330508,5.3389831 Z"
+         style="fill:#8fe5ba;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+         sodipodi:nodetypes="sszs"
+         inkscape:connector-curvature="0"
+         id="path859-3"
+         d="m 27.477029,6.4430859 c -1.007222,0.2936345 -0.483361,1.198069 -0.267943,1.538361 0.424246,0.670177 1.740785,0.048696 1.405139,-0.6569312 -0.335646,-0.7056273 -0.60083,-1.037796 -1.137196,-0.8814298 z"
+         style="display:inline;fill:#2bb771;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /></g><path
+       style="fill:#8fe5ba;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 2.6059322,18.114407 H 23.771186 l 2.033898,7.817797 H 0.38135589 Z"
+       id="path884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" /><use
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2"
+       xlink:href="#path884-2"
+       id="use6539"
+       transform="translate(0.25423729,13.983051)"
+       width="100%"
+       height="100%" /><g
+       id="g6567"
+       transform="translate(0.25423729,13.983051)"><path
+         inkscape:tile-y0="4.7351691"
+         inkscape:tile-x0="2.4788137"
+         inkscape:tile-h="1.094491"
+         inkscape:tile-w="3.5593217"
+         inkscape:tile-cy="5.2824146"
+         inkscape:tile-cx="4.2584745"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path884-2"
+         d="M 2.7402015,4.7351694 H 5.2271187 L 5.4661018,6.3098407 H 2.4788138 Z"
+         style="display:inline;fill:#2bb771;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><use
+         id="use6541"
+         transform="translate(4.3601691)"
+         xlink:href="#path884-2"
+         inkscape:tiled-clone-of="#path884-2"
+         y="0"
+         x="0"
+         width="100%"
+         height="100%" /><use
+         id="use6543"
+         transform="translate(8.7203382)"
+         xlink:href="#path884-2"
+         inkscape:tiled-clone-of="#path884-2"
+         y="0"
+         x="0"
+         width="100%"
+         height="100%" /><use
+         id="use6545"
+         transform="translate(13.080507)"
+         xlink:href="#path884-2"
+         inkscape:tiled-clone-of="#path884-2"
+         y="0"
+         x="0"
+         width="100%"
+         height="100%" /><use
+         id="use6547"
+         transform="translate(17.440676)"
+         xlink:href="#path884-2"
+         inkscape:tiled-clone-of="#path884-2"
+         y="0"
+         x="0"
+         width="100%"
+         height="100%" /></g><path
+       style="display:inline;fill:#2bb771;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 2.4601789,20.886393 h 2.6648857 l 0.2560852,1.687358 h -3.201064 z"
+       id="path884-2-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       inkscape:tile-cx="4.2584745"
+       inkscape:tile-cy="5.2824146"
+       inkscape:tile-w="3.5593217"
+       inkscape:tile-h="1.094491"
+       inkscape:tile-x0="2.4788137"
+       inkscape:tile-y0="4.7351691" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.93321717"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-4"
+       xlink:href="#path884-2-4"
+       transform="translate(4.6721912)"
+       id="use6541-8" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.93321717"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-4"
+       xlink:href="#path884-2-4"
+       transform="translate(9.3443821)"
+       id="use6543-3" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.93321717"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-4"
+       xlink:href="#path884-2-4"
+       transform="translate(14.016573)"
+       id="use6545-9" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.93321717"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-4"
+       xlink:href="#path884-2-4"
+       transform="translate(18.688764)"
+       id="use6547-0" /><path
+       style="display:inline;fill:#2bb771;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 1.9019703,23.174529 h 2.7964286 l 0.2687258,1.770647 H 1.6080523 Z"
+       id="path884-2-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       inkscape:tile-cx="4.2584745"
+       inkscape:tile-cy="5.2824146"
+       inkscape:tile-w="3.5593217"
+       inkscape:tile-h="1.094491"
+       inkscape:tile-x0="2.4788137"
+       inkscape:tile-y0="4.7351691" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.43903449"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-5"
+       xlink:href="#path884-2-5"
+       transform="matrix(4.1031569,0,0,1,-0.0872225,1.5254232e-7)"
+       id="use6541-2" /><use
+       height="100%"
+       width="100%"
+       style="display:inline;stroke-width:0.8893193"
+       x="0"
+       y="0"
+       inkscape:tiled-clone-of="#path884-2-5"
+       xlink:href="#path884-2-5"
+       transform="translate(19.611264)"
+       id="use6547-3" /></g></svg>

BIN
images/sequence-Calcul-Soustraction.png


+ 79 - 0
images/sommaire.svg

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="30"
+   viewBox="0 0 116 30"
+   width="116"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="sommaire.svg"
+   inkscape:version="0.92.2 5c3e80d, 2017-08-06">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="751"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="80.01301"
+     inkscape:cy="18.892667"
+     inkscape:window-x="1680"
+     inkscape:window-y="543"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Pancarte"
+     transform="translate(0,6)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:'Century Gothic';-inkscape-font-specification:'Century Gothic, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="9.4237289"
+       y="16.76321"
+       id="text816"><tspan
+         sodipodi:role="line"
+         id="tspan814"
+         x="9.4237289"
+         y="16.76321"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.33333397px;font-family:Georgia;-inkscape-font-specification:Georgia;fill:#00b4fa;fill-opacity:1">Sommaire</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00b4fa;stroke-width:1.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.00936017,23.028835 H 109.42373 c 4.82292,0 5.31103,-1.830508 5.31103,-5.311028 V -6.1016949"
+       id="path820"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cssc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Old"
+     transform="translate(0,6)" />
+</svg>

+ 37 - 0
index.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>Guide Java</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+  <link rel="stylesheet" href="pandoc.css">
+  <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+  <![endif]-->
+</head>
+<body>
+<div class="doctitle">Guide Java</div>
+<h1 id="sommaire">Sommaire</h1>
+<ul>
+<li><a href="./01-install-env-dev-java.html">01: installation de l’environnement de développement</a></li>
+<li><a href="./02-DecouvrirJava.html">02: Découvrir Java</a></li>
+<li><a href="./03-ReglesDeCodage.html">03: Règles de codage</a></li>
+<li><a href="./04-StructuresDeControles.html">04: Structures de contrôle</a></li>
+<li><a href="./05-Exceptions.html">05: Les exceptions</a></li>
+<li><a href="./06-InteractionEntreObjets.html">06: Interfaces et interactions entre objets</a></li>
+<li><a href="./07-Collections.html">07: Collections</a></li>
+<li><a href="./08-DelegationAgregationCompositionAssociation.html">08: Mapping UML</a></li>
+</ul>
+<h1 id="annexes">Annexes</h1>
+<ul>
+<li><a href="./A-annexe-RecuperationDeDonneesDansLaConsole.html">A: récupération de données dans la console</a></li>
+</ul>
+</body>
+</html>

+ 477 - 0
pandoc.css

@@ -0,0 +1,477 @@
+/*
+ * I add this to html files generated with pandoc.
+ */
+
+html {
+  font-size: 100%;
+  overflow-y: scroll;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+
+body {
+  color: #444;
+  font-family: Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', serif;
+  font-size: 12px;
+  line-height: 1.7;
+  padding: 1em;
+  margin: auto;
+  max-width: 42em;
+  background: #fefefe;
+}
+
+a {
+  color: #0645ad;
+  text-decoration: none;
+}
+
+a:visited {
+  color: #0b0080;
+}
+
+a:hover {
+  color: #06e;
+}
+
+a:active {
+  color: #faa700;
+}
+
+a:focus {
+  outline: thin dotted;
+}
+
+*::-moz-selection {
+  background: rgba(255, 255, 0, 0.3);
+  color: #000;
+}
+
+*::selection {
+  background: rgba(255, 255, 0, 0.3);
+  color: #000;
+}
+
+a::-moz-selection {
+  background: rgba(255, 255, 0, 0.3);
+  color: #0645ad;
+}
+
+a::selection {
+  background: rgba(255, 255, 0, 0.3);
+  color: #0645ad;
+}
+
+p {
+  margin: 1em 0;
+}
+
+img {
+  max-width: 100%;
+}
+
+.doctitle {
+  color: #111;
+  line-height: 125%;
+  margin-top: 2em;
+  margin-bottom: 2em;
+  font-weight: normal;
+  font-size: 3em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  color: #111;
+  line-height: 125%;
+  margin-top: 2em;
+  font-weight: normal;
+}
+
+h4, h5, h6 {
+  font-weight: bold;
+}
+
+h1 {
+  font-size: 2.2em;
+}
+
+h2 {
+  font-size: 2em;
+}
+
+h3 {
+  font-size: 1.5em;
+}
+
+h4 {
+  font-size: 1.2em;
+}
+
+h5 {
+  font-size: 1em;
+}
+
+h6 {
+  font-size: 0.9em;
+}
+
+blockquote {
+  color: #666666;
+  margin: 0;
+  padding-left: 3em;
+  border-left: 0.5em #EEE solid;
+}
+
+hr {
+  display: block;
+  height: 2px;
+  border: 0;
+  border-top: 1px solid #aaa;
+  border-bottom: 1px solid #eee;
+  margin: 1em 0;
+  padding: 0;
+}
+
+pre, code, kbd, samp {
+  color: #000;
+  font-family: monospace, monospace;
+  _font-family: 'courier new', monospace;
+  font-size: 0.98em;
+}
+
+code {
+  background-color: #eee;
+}
+
+pre {
+  white-space: pre;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  background-color: #eee;
+  padding: 0.5em; /* Since we have a background color */
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #aaa;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+/* Source: https://stackoverflow.com/questions/40842277/create-line-numbers-on-pre-with-css-only */
+pre{
+    counter-reset: line;
+}
+pre .sourceLine {
+  /*display: block;*/
+  line-height: 1.5rem;
+}
+code.sourceCode{
+    position: static;
+}
+pre .sourceLine:before {
+  counter-increment: line;
+  content: counter(line);
+  display: inline-block;
+  border-right: 1px solid #ddd;
+  padding: 0 .5em;
+  margin-right: .5em;
+  width: 1.2em;
+  text-align: right;
+  /*
+  background-color: #fff;
+  border-top: 1px solid #fff;
+  border-bottom: 1px solid #fff;
+  */
+  color: #aaa;
+}
+.sourceLine:before{
+    -webkit-user-select: none;
+}
+a.sourceLine::before {
+    text-decoration: none;
+}
+
+/*ENd of line numbering in code*/
+
+b, strong {
+  font-weight: bold;
+}
+
+dfn {
+  font-style: italic;
+}
+
+ins {
+  background: #ff9;
+  color: #000;
+  text-decoration: none;
+}
+
+mark {
+  background: #ff0;
+  color: #000;
+  font-style: italic;
+  font-weight: bold;
+}
+
+sub, sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+ul, ol {
+  margin: 1em 0;
+  padding: 0 0 0 2em;
+}
+
+li p:last-child {
+  margin-bottom: 0;
+}
+
+ul ul, ol ol {
+  margin: .3em 0;
+}
+
+dl {
+  margin-bottom: 1em;
+}
+
+dt {
+  font-weight: bold;
+  margin-bottom: .8em;
+}
+
+dd {
+  margin: 0 0 .8em 2em;
+}
+
+dd:last-child {
+  margin-bottom: 0;
+}
+
+img {
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+  vertical-align: middle;
+}
+
+figure {
+  display: block;
+  text-align: center;
+  margin: 1em 0;
+}
+
+figure img {
+  border: none;
+  margin: 0 auto;
+}
+
+figcaption {
+  font-size: 0.8em;
+  font-style: italic;
+  margin: 0 0 .8em;
+}
+
+table {
+  margin-bottom: 2em;
+  border-bottom: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+table th {
+  padding: .2em 1em;
+  background-color: #eee;
+  border-top: 1px solid #ddd;
+  border-left: 1px solid #ddd;
+  text-align: left;
+}
+
+table td {
+  padding: .2em 1em;
+  border-top: 1px solid #ddd;
+  border-left: 1px solid #ddd;
+  vertical-align: top;
+}
+
+.author {
+  font-size: 1.2em;
+  text-align: center;
+}
+
+@media only screen and (min-width: 480px) {
+  body {
+    font-size: 14px;
+  }
+}
+@media only screen and (min-width: 768px) {
+  body {
+    font-size: 16px;
+  }
+}
+@media print {
+  * {
+    background: transparent !important;
+    color: black !important;
+    filter: none !important;
+    -ms-filter: none !important;
+  }
+
+  body {
+    font-size: 12pt;
+    max-width: 100%;
+  }
+
+  a, a:visited {
+    text-decoration: underline;
+  }
+
+  hr {
+    height: 1px;
+    border: 0;
+    border-bottom: 1px solid black;
+  }
+
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after {
+    content: "";
+  }
+
+  pre, blockquote {
+    border: 1px solid #999;
+    padding-right: 1em;
+    page-break-inside: avoid;
+  }
+
+  tr, img {
+    page-break-inside: avoid;
+  }
+
+  img {
+    max-width: 100% !important;
+  }
+
+  @page :left {
+    margin: 15mm 20mm 15mm 10mm;
+}
+
+  @page :right {
+    margin: 15mm 10mm 15mm 20mm;
+}
+
+  p, h2, h3 {
+    orphans: 3;
+    widows: 3;
+  }
+
+  h2, h3 {
+    page-break-after: avoid;
+  }
+}
+
+
+div.important {
+    background-image:url('images/important.svg');
+    background-repeat: no-repeat;
+    background-size: 48px 48px;
+    /*margin:0; /* If you want no margin */
+    /*padding:0; /*if your want to padding */
+  background-color: #FFEDED;
+  padding: 0.5em; /* Since we have a background color */
+  padding-left: 64px;
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #faa;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+div.warning {
+    background-image:url('images/attention.svg');
+    background-repeat: no-repeat;
+    background-size: 48px 48px;
+    /*margin:0; /* If you want no margin */
+    /*padding:0; /*if your want to padding */
+  background-color: #FFA70B16;
+  padding: 0.5em; /* Since we have a background color */
+  padding-left: 64px;
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #ffa70b;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+div.information {
+    background-image:url('images/information.svg');
+    background-repeat: no-repeat;
+    background-size: 48px 48px;
+    /*margin:0; /* If you want no margin */
+    /*padding:0; /*if your want to padding */
+  background-color: #FAFCFE;
+  padding: 0.5em; /* Since we have a background color */
+  padding-left: 64px;
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #00b4fa;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+div.practice {
+    background-image:url('images/practice.svg');
+    background-repeat: no-repeat;
+    background-size: 48px 48px;
+    /*margin:0; /* If you want no margin */
+    /*padding:0; /*if your want to padding */
+  background-color: #d1f4e3;
+  padding: 0.5em; /* Since we have a background color */
+  padding-left: 64px;
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #2bb771;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+#TOC {
+    background-image:url('images/sommaire.svg');
+    background-repeat: no-repeat;
+    background-size: 64px 20px;
+    /*margin:0; /* If you want no margin */
+    /*padding:0; /*if your want to padding */
+  background-color: #FAFCFE;
+  padding: 0.5em; /* Since we have a background color */
+  padding-left: 64px;
+  border-radius: 5px; /* Softens it */
+  /* Give it a some definition */
+  border: 1px solid #00b4fa;
+  /* Set it off left and right, seems to look a bit nicer when we have a background */
+  margin-left:  0.5em;
+  margin-right: 0.5em;
+}
+
+.commit-msg {
+    fill: #d3d3d3;
+    color: #333;
+}