Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 241 Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018 (20)

Publicité

Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018

  1. 1. http://www.isima.fr/~loic Janvier 2018 – Support
  2. 2. 2 Objectifs • Écrire un programme JAVA • Utiliser les concepts objets avec JAVA • Concevoir des IHM • Syntaxe C/C++ • Concepts objets Pré-requis
  3. 3. 3 Cadre • Le Java vu par SUN et uniquement • Préparer les premières certifications • Exception : utiliser l'EDI Eclipse • Présence • Examen final Évaluation
  4. 4. NetBeans vs Eclipse • Sun / Oracle • Supporte toujours les dernières technos Java • Conception de GUI native (matisse) • IBM • Réputation plus pro ? • Plugin : délai ? Incompatibilité ? • Plugin : WindowBuilder 4 Ne pas utiliser tout de suite…
  5. 5. 5 Plan 1. Premier programme 8 2. Notions de base & syntaxe 23 3. Concepts objets en Java 44 4. Les exceptions 94 5. IHM : AWT & Swing ou JavaFX 108 6. Concurrence (Threads) 144 7. Fichiers & flux, sérialisation 155 HS Compléments 173
  6. 6. 6 Introduction • Langage • Machine virtuelle • Plateforme • Île ? • Javascript (ECMA) ?
  7. 7. 7 Motivations • Langage créé en 1995  Patrick Naughton  James Gosling • Simple • Sécurisé (réseaux, Internet) • Portable • Performant Concepts difficiles du C++ évacués
  8. 8. 2. Premier programme
  9. 9. 9 Premier programme /** ma première classe */ public class Exemple { } Fichier source (texte) Exemple.java public static void main(String[] argv) { // afficher un message java.lang.System.out.println(”Bonjour”); } System.out.println(”;-)”);
  10. 10. 10 Pour voir le résultat… 1. Compiler le programme javac Exemple.java java Exemple .exe ? .class ? 2. Lancer le programme
  11. 11. 11 Fichier source • Extension : .java • Nom du fichier = nom de la classe publique • Respecter la casse Exemple • 1 classe publique par fichier • Pas de point virgule en fin de classe ! • Mélange déclaration + implémentation + commentaires
  12. 12. 12 Compilation • Fichier compilé : .class • Pseudo-code (byte-code) • ≠ Code machine javac Exemple.java Certains compilateurs transforment le code java en code natif : • Portabilité nulle • Gestion de la mémoire ?
  13. 13. • Pseudo-code interprété par la JVM Java Virtual Machine • voire compilé en natif à la volée (JVM hotspot) • Programme seul (standalone) • Embarqué dans une page web (applet) • Serveur applicatif, bases de données • Processeur JAVA (Smart Cards, Blu-ray) • Systèmes Android • Portabilité totale si bonne JVM 13 Exécution java Exemple Java 7 250 000 lignes C / C++
  14. 14. 14 Exercice • Tester le programme Exemple • Consulter la documentation  Google : java documentation api 8 ou 9  https://docs.oracle.com/javase/7/docs/api/  https://docs.oracle.com/javase/9/docs/api/ • Consulter les tutoriaux officiels • https://docs.oracle.com/javase/tutorial/
  15. 15. Documentation 15
  16. 16. Plateforme 16 Paquetage / package (1) • Un ensemble de classes/fichiers rassemblés pour une finalité besoin fonctionnel • [C++] espace de nommage • par défaut (java.lang) • Standard (gestion E/S, graphisme) • Personnel / Tiers Version
  17. 17. 17 Paquetage / package (2) • Nom spécifique suivant le type :  java.lang (sys), java.awt (std)  javax.swing (std), javax.xml (std)  org.w3c.dom (tiers/std)  loic.classeperso (perso) • Sous-package  Mécanisme arborescent comme les répertoires  Séparateur : le point • Retrouver les packages : classpath  Variable système  Paramètres en ligne de commande (-cp ou –classpath)
  18. 18. 18 Clause import • Spécification complète d’une classe d’un package qui n’est pas chargé par défaut • Facilité : clause import • Enumération  À l’unité  Par package (*) non récursif ;-( import javax.swing.SwingUtilities; import javax.swing.*; javax.swing.SwingUtilities; import javax.swing.event.*;
  19. 19. • 1.0 (1.1) – applet , jni, awt [1995]  236 classes pour 1.0.2 • 1.2 – swing (version 2) [1998]  1524 classes • 1.3 – débogage [2000] • 1.4 – performances – nio [2002] • 1.5 - patrons / templates [2004]  3279 classes • 1.6 – sécurité, scripts, performance [2006]  3795 classes • Acquisition de Sun par [2010] • 1.7 – open JDK - 4024 classes [2011] • 1.8 – 4240 classes [2014] 19 L E G A C Y
  20. 20. Aujourd’hui ? • Java 8 update 151  Streams  Lambdas  Code dans les interfaces • Java 9 update 1  Modularité  JShell  Performances 20 etud Berzet classe ⊂ package ⊂ module
  21. 21. 21 Plateforme  Plus grosse difficulté du java connaître ces classes standards classes deprecated  Documentation bien faite : javadoc & tutoriels java –showversion javac -version // version > 1.3, // options : –source et -target
  22. 22. 22 Distribution ? • Usage  Exécution seule (JRE)  Développement (JDK < 2, SDK v ≥ 2) • Cibles  Standard Java SE / J2SE  Entreprise Java EE / J2EE  Micro Java ME / J2ME (v ≥ 5)
  23. 23. 3. Notions de base Syntaxe
  24. 24. public class Exemple { } { Accolades } • Classe • Méthode • Bloc : ensemble séquentiel d’instructions 24 public static void main(String[] argv) { // afficher un commentaire monoligne /* commentaire sur plusieurs lignes */ /** commentaire javadoc */ }
  25. 25. 25 Attribut / Variable ? • Objet  Prédéfini ou utilisateur  Chaîne de caractères : String "Essai"  Manipulation par « références » (pointeurs ?) • Scalaire / Primitive  entier / réel / booléen  caractère ’A’  pour l'efficacité  doublé par un type objet
  26. 26. 26 Types de données scalaires (1) • char  type caractère  ≠ String  unicode 'u0000' • boolean  true ou false.  non homomorphe aux entiers • types entiers  byte (8 bits)  short (16 bits)  int (32 bits)  long (64 bits) • types réels  float (32 bits)  double (64 bits)
  27. 27. 27 Types de données scalaires (2) • Normalisés (portabilité) • Doublés par des types objets :  Double  Integer • Méthodes •toString() •Double.parseDouble()
  28. 28. 28 Déclaration de variables • N'importe où dans le bloc • Initialisation d'une variable pas automatique  Erreur : "might not be initialized" public static void main(String[] argv) { int i = 0; char c = 'A'; Classe objet; String s; double d = 1.0; float f = 1.3f; double[] tableau; } Référence (pointeur) Référence (pointeur)
  29. 29. 29 { int i = 0 ; { int j= 3 ; // i est utilisable dans ce bloc } // j n’est plus disponible ici } { int i = 0 ; boolean b = true; { double i= 3 ; boolean b = false; } }
  30. 30. 30 Manipulation de variables public static void main(String[] a) { int i = 0; i = i + 1; i += 1 ; i *= 2 ; System.out.println(i) ; System.out.println(++i) ; System.out.println(i) ; System.out.println(i++) ; System.out.println(i) ; i = (int) 10.6; }
  31. 31. 31 Condition (1) if (test) { … } if (test) { … } else { … } (i==5) (i!=5) Un test est un booléen : true ou false(test)?VRAI:FAUX boolean b1 =(i==5); boolean b2 = !b1; Opérateur ternaire Test
  32. 32. 32 Condition (2) if (test) instruction1; else instruction2; if (b1) … if (!b1)… Opérateur NON if (b1 || b2) … Opérateur OU if (b1 && b2) … Opérateur ET ALORS Une séquence de test n’est pas complètement évaluée si ce n’est pas nécessaire.
  33. 33. 33 Condition (3) switch (variable) { case valeur1 : instructions; break; case valeur2 : case valeur3 : instructions; break; default: instructions; [break;] } • Variable de type simple (String possible dans 1.7) • Oubli du break ? ( ≠ C#) • default facultatif
  34. 34. 34 Boucles conditionnelles for (initialisation;test;incrémentation) { … } while (test) { … } do { … } while (test); Accolades facultatives s'il n’y a qu'une instruction for (int i=0;i<10;++i) System.out.println(i);
  35. 35. 35 { int i; for(i=0; i<10; ++i) { … } } { for (int i=0; i<10; ++i) { … } for (int i=0; i<10; ++i) { … } } { int i; for (int i=0; i<10; ++i) { … } } Variable de boucle et visibilité…
  36. 36. 36 Tableaux (1) • Taille fixe, donnée par le champ length • Premier indice du tableau : 0 • Vérification de la validité des indices  Exception : OutOfBoundsArray // création d'un tableau vide de 10 entiers int[] t1 = new int[10]; // déclaration d'un tableau sans élément int[] t2; for(int i=0; i<t1.length; ++i) System.out.println(t1[i]); for(int e : t1) System.out.println(e);
  37. 37. 37 Tableaux (2) • Initialisation du tableau  Par des valeurs scalaires  Par des références nulles • "Libérer" un tableau • Tableau multidimensionnel t1 = null; String[][] chaines = new String[10][5]; t1[i] = ?;
  38. 38. 38 Chaîne de caractères (1) • String ≠ char[] • constante String • modifiable StringBuffer StringBuilder • UTF-16 • Bibliothèque fournie  Comparaison de chaînes : equals( ), compareTo( )  Recherche : indexOf( )  Extraction : substring( ), StringTokenizer, split, regexp  Transformation aisée de type scalaire vers StringBBBB
  39. 39. 39 Chaîne de caractères (2) String s1 = "hello"; String s2 = new String("hello"); String s3 = null; • Création de chaîne(s) • Que se passe-t-il ? String s4 = s1 + " " + s1; StringBuilder sb = new StringBuilder(s1); sb.append(" ").append(s1);
  40. 40. Manipulation de chaînes (1) 40 String s1 = new String("essai"); S.o.p(s1.concat("de concatenation")); S.o.p(s1); String s2 = new String(""); S.o.p(s2.replace('', ''); S.o.p(s2);
  41. 41. 41 String s1 = "loic" ; String s2 = "loic"; String s3 = new String("loic"); String s4 = new String("loic"); String s5 = s3; String s6 = null; System.out.println(s1==s2); System.out.println(s1==s3); System.out.println(s3==s4); System.out.println(s5==s3); System.out.println(s1.equals(s3)); System.out.println(s1.equals(s6)); System.out.println(s6.equals(s1));
  42. 42. Manipulation de chaînes (2) 42 // Un peu vieux, utiliser plutôt split OU // java.util.regex StringTokenizer st = new StringTokenizer("Quelle boucherie !"); while (st.hasMoreTokens()) System.out.println(st.nextToken()); String[] result = "et ça découpe toujours".split("s"); for (int i=0; i<result.length; i++) System.out.println(result[i]);
  43. 43. 43 « Fonction » main • Obligatoire en mode standalone • Point d’entrée unique du programme • argv :  tableau de chaînes de caractères  Paramètres de la ligne de commande public static void main(String[] argv); java Exemple param1 "param 2" param3
  44. 44. 44 Ligne de commande • Afficher les paramètres de la ligne de commande  String[ ] tab : tableau de chaînes de caractères  tab.length : longueur du tableau
  45. 45. 4. Concepts objets
  46. 46. Déclaration d'une classe • Moule / Modèle / Fabrique à objets • Caractéristiques / Attributs • Messages / Méthodes • Nom unique (package) • De classe /d’instance • Visibilité et encapsulation • Relations 46 Java 9 change pas mal de choses …
  47. 47. public class Etudiant { } 47 Attributs private String nom;  int id; public String getNom() { return nom; } Méthode static private int compteur; Attribut de classe Méthode de classe PAS DE POINT VIRGULE [ C++ ] VISIBILITÉ : public /  (package) / private Convention : Classe = type Nom avec majuscule static public int getCompteur() { return compteur; }
  48. 48. 48 Modificateurs de méthode public static final int methode(double d); Méthode publique, visible/appelable par tout le monde Méthode de classe Méthode non redéfinissable Type de retour Paramètre(s) Pas de valeur par défaut pour les arguments [C++]
  49. 49. 49 Constructeur • Initialiser les attributs d'un nouvel l'objet • Syntaxe différente d’une méthode  Porte le même nom que la classe  Pas de type de retour • Constructeur sans argument  fourni automatiquement si pas d'autres constructeurs • Surcharge de constructeur  Appel de constructeurs ≠ avec paramètres PAS d'héritage de constructeur PAS de constructeur de copie (clone())
  50. 50. public class Cours { } 50 Constructeurs Attributsint nbEtudiants; boolean passionnant; public Cours() { nbEtudiants = 0; } public Cours(int n) { nbEtudiants = n; } public void setNbEtudiants(int n) { nbEtudiants = n; } public int getNbEtudiants() { return nbEtudiants; } public boolean isPassionnant() { return passionnant; } Accesseur/Mutateur Getter/setter/mutator A répéter Pas de public: [C++] this(0); setNbEtudiants(n);
  51. 51. 51 Créer un objet • Demander la mémoire à la JVM  Opérateur new • Appeler le constructeur • Manipulation de pointeurs références ? • Valeur spéciale null  si création impossible  ou pas encore affectée Classe instance = new Classe(paramètres); (instance == null) Cours unCours = new Cours(24);
  52. 52. 52 Utiliser un objet • Accéder à un membre = • Opérateur point à l'extérieur de la classe • Référence valide ?  Null Pointer exception • Membre visible  Niveaux d'accès (public/privé/package)  Interface de classe  Encapsulation instance.methode(); instance.attribut; unCours.isPassionnant()
  53. 53. public class Cours { // reste de la classe } 53 public static void main(String[] argv) { Cours c1 = new Cours(); Cours c2 = new Cours(12); S.o.println("Classe #" +c2.getNbEtudiants()); S.o.println(c2); S.o.println(c2.toString()); if (!c1.isPassionnant()) S.o.println("bof"); }
  54. 54. 54 Exercice : Gérer un parc de véhicules • Écrire une application permettant de gérer un parc de véhicules d'une société possédant  des voitures  des camions 1. Créer des classes simples sans relation 2. Instancier des classes 3. Étudier l'héritage et le polymorphisme 4. Étudier les autres relations
  55. 55. 1 - Créer les classes • Où mettre le main() ? • Quelles classes compiler ? • Quelle classe exécuter ? 55 Voiture - immat : Chaîne - couleur : entier - places : entier + afficher() + avancer() Camion - immat : Chaîne - capacité : réel + afficher() + avancer() • Pas de relation entre les classes • Répartition ? 1. même fichier 2. fichiers différents (même package !) 3. Fichiers différents (packages différents)
  56. 56. 56 public class Gestion1 { // classe pour le programme public static void main(String[] a) { } } class Voiture { String immat; Voiture() {} void avancer() {} } class Camion { int capacite; Camion() {} void avancer() {} } 1 fichier : Gestion1.java 3 classes non imbriquées En général, on met une classe par fichier sauf si les programmes sont simplissimes.
  57. 57. public class Gestion2 { // classe pour le programme public static void main(String[] a) { Voiture v; Camion c; } } public class Voiture { String immat; Voiture() {} void avancer() {} } public class Camion { int capacite; Camion() {} void avancer() {} } 57 3 fichiers dans le même répertoire (même package implicite) • Gestion2.java • Voiture.java • Camion.java 3 classes publiques Compiler Gestion2 = Compilation des dépendances Exécuter Gestion2
  58. 58. public class Gestion3 { // classe pour le programme public static void main(String[] a) { vehicule.Voiture v; } } package vehicule; public class Voiture { String immat; Voiture() {} void avancer() {} } 58 ./ Gestion3.java vehicule/Voiture.java vehicule/Camion.java Compiler Gestion3 = dépendances Exécuter Gestion3 import vehicule.Camion;  Camion c;
  59. 59. Dans des répertoires différents… • Visibilité d'une classe au niveau package  1 package ≡ 1 répertoire • Si la classe n'est pas dans le répertoire courant • Fichiers jar 59 java –jar fichier.jar javac –cp chemin Classe.java javac paquetage.Classe.java java -cp chemin Classe
  60. 60. 60 2 - C'est pas déjà fait ? Voiture -immat : Chaîne -couleur : entier -places : entier + afficher() + avancer() Camion -immat : Chaîne -capacité : réel + afficher() + avancer() Afficher sur la console : • Je suis une Voiture/Camion et l'immatriculation • J'avance •Instancier des objets différents
  61. 61. // constructeur proposé par défaut public Voiture() { immat = null; } public Voiture(String im) { immat = im; } 61 public Voiture() { immat = "0000 AA 00"; // ou this("0000 AA 00"); } Voiture v = new Voiture(); Voiture v = new Voiture("300 ISI 63"); public String getImmat() {…} public void setImmat(String im) {…}
  62. 62. 62 Détruire une instance • Pas de destruction manuelle • Destruction automatique par la JVM  Ramasse-miettes (Garbage Collector)  Le développeur peut demander un nettoyage, enfin … • Plus de fuites de mémoire ?  Tables de hachage complexe  Boucle infinie  Aider la JVM en mettant à null • Méthode finalize( )  Ressemble au destructeur C++  Peut ne pas être appelée (si gc non exécuté)
  63. 63. Encapsulation 63 // classe A avec encapsulation brisée class A { public int valeur ; public A(int i) { valeur = i;} } // classe A avec encapsulation class AE { private int valeur ; public AE(int i) { setValeur(i);} final public int getValeur() { return valeur; } final public void setValeur(int v) { valeur = v; } } A a = new A(2); a.valeur = 5; AE ae = new AE(0); ae.setValeur(3); ae.valeur = 5; 1/ Contrôle d’accès 2/ Changer l’implémentation sans impact sur l’extérieur 2 2
  64. 64. 64 public class B { static void methode1(A a) { a = new A(2); } static void methode2(A c) { c.valeur = 3; } static A methode3(A b) { b = new A(4); return b; } public static void main(String[] param) { A a = new A(1); methode1(a); methode2(a); a = methode3(a); } } Afficher a.valeur et a. Que se passe-t'il ? Digression A@adresse
  65. 65. 65 Au chargement de la classe… • Instructions spécifiques exécutées au chargement de la classe dans la JVM  Pas à l'instanciation d'objet  Plus général que l'initialisation des attributs statiques static int[] tab = new int[100]; class Exemple { static int[] tab; static { // exécuté au chargement de la classe tab = new int[20]; for(int i=0; i<20; ++i) tab[i] = 2*i; } }
  66. 66. 66 Héritage • F hérite de M / dérive de M / spécialise M • Héritage SIMPLE seulement M F public class F extends M { public F() { super(); // appel du constructeur de M // initialisations spécifiques } }
  67. 67. public class M { public String att1; protected String att2; private String att3; public void methode1() {…} protected void methode2() {…} private void methode3() {…} } public class F extends M { } public class A { static void m() { F f = new F(); f.methode1(); }} Héritage sélectif 67
  68. 68. Conditions pour l'héritage • M doit être visible de F (public ou même package) • M doit être dérivable (non finale) 68 class M1 { public M1(String s) {} public M1 () {} } class F1 extends M1 { } public class A { static void m() { F1 f1a = new F1(); F1 f1b = new F1("essai"); } } final class M2 { public M2() {} } class F2 extends M2 { }
  69. 69. java.lang.Object (1) • clone() • finalize() • toString() • getClass().getName()  Connaître à l'exécution le nom de la classe 69 Classe@hashcode objet instanceof Classe
  70. 70. java.lang.Object (2)  Deux objets égaux ont le même hashcode  Ne doit pas changer pour une exécution  Deux objets distincts peuvent avoir le même  Souvent l'adresse mémoire de l'élément 70 == ne teste pas l'égalité de 2 objets boolean equals(Object) int hashCode()
  71. 71. 71 Référence this public class C { String chaine1, chaine2; public C() { chaine1 = "CHAINE1"; chaine2 = "CHAINE2" ; } void methode1(String chaine1, String c) { this.chaine1 = chaine1; chaine2 = c; } void methode2() { methode1("e","f"); this.methode1("",""); // utile ? } }
  72. 72. 72 Parentalité… public class M { private String m; public M(String s) { m = s; } public void p() { S.o.p(m); } } public class F extends M { public F(String s) { super(s); } public void p() { S.o.p("Fille"+super.p()); } }
  73. 73. 73 Noms qualifiés class M { protected int a; } public class F extends M { protected double a; public void toto() { a this.a super.a ((M)this).a ((F)this).a } } NOTE : Ce code compile …
  74. 74. • Forme forte  Redéfinition – overriding  "Surcharge" dynamique (abus de langage)  Actions différentes pour des classes d'une même hiérarchie 74 Polymorphisme • Forme faible  Surcharge de méthode – overloading  Statique (compilation)  Méthodes de signatures différentes Voiture + avancer(temps : entier) + avancer(distance : réel) Voiture + afficher(); Véhicule + afficher();
  75. 75. Voiture ? ? 75 3- Hériter … • Écrire une classe Véhicule qui reprend les caractéristiques communes des classes Voiture et Camion • Nous allons modifier les classes pour tester le polymorphisme Véhicule ? ? Camion ? ?
  76. 76. 76 class Vehicule { String immat; public Vehicule(String im) { immat = im; } public void afficher() { S.o.p("Je suis un vehicule "+immat); } } class Voiture extends Vehicule { String immat; public Voiture(String im) { super(im); } // afficher ? } Voiture v = new Voiture("300 ISI 63"); v.afficher();
  77. 77. 77 public class Vehicule { public void afficher() { System.out.println("Vehicule"); } public static void main(String[] param) { Vehicule v = new Vehicule(); Voiture w = new Voiture(); Camion c = new Camion(); Vehicule z = new Voiture(); Voiture i = new Vehicule(); } } class Voiture extends Vehicule { public void afficher() { System.out.println("Voiture"); } } class Camion extends Vehicule { } Appeler les méthodes afficher() des objets
  78. 78. 78 Méthodes virtuelles ou finales ? • Méthodes virtuelles  Par défaut  Construction d'une table de méthodes pour une hiérarchie  Recherche dans cette table (lenteur ?) Vehicule v = new Voiture(); v.afficher(); • Méthodes finales  Non redéfinissables dans les classes filles  Plus rapides que les méthodes virtuelles  Conseil : accesseurs en final Choix opposé au C++ • Le dernier mot : la JVM hotspot …
  79. 79. 79 public class Vehicule { public void afficher() { System.out.println("Vehicule"); } public static void main(String[] param) { Vehicule v = new Voiture(); v.afficher(); v.special(); ((Voiture)v).special(); ((Camion)v).afficher(); // défini précédemment } } class Voiture extends Vehicule { public void afficher() { System.out.println("Voiture"); } public void special() { System.out.println("special"); } } Que se passe-t'il ?
  80. 80. 80 Niveaux d'accès • Privé | private : même classe • Protégé | protected : même package ou sous-classe d’un package différent  Moins restrictif que le C++ !  Différent en UML également • Package | - (par défaut) : package  Sorte de friend du C++  DANGEREUX • Public : tout le monde
  81. 81. Encapsulation & visibilité 81 public class C1 { public int a; protected int b; int c; private int d; } public class C3 { ... } public class C5 { ... } a b c d Accessible par C2 Accessible par C3 Accessible par C4 Accessible par C5 Package p1 Package p2 public class C4 extends C1 { ... } public class C2 extends c1 { ... } Tiré de « Eléments de programmation JAVA », Olivier Dedieu, INRIA
  82. 82. 82 Méthodes et classes abstraites • Mot-clé abstract (modificateur) OBLIGATOIRE • Méthode abstraite  Sans implémentation • Classe abstraite  Toute classe avec au moins une méthode abstraite OU ALORS toute classe déclarée comme telle (sans abstract, elle serait instanciable)  Non instanciable  Permet d'implémenter la notion de concept
  83. 83. 83 public abstract class Vehicule1 { public void afficher() { System.out.println("Vehicule"); } } class Voiture2b extends Vehicule2 { public void afficher() {} } public abstract class Vehicule2 { abstract public void afficher() ; } class Voiture2a extends Vehicule2 { } ERREUR : must implement the inherited method abstract class Voiture2a extends Vehicule2 { } NON instanciable, sans méthode abstraite NON instanciable, avec méthode abstraite NON instanciable instanciable
  84. 84. Interface (1) • Description / contrat  Liste de méthode(s) sans code  "Constantes" autorisées (public static final par défaut)  Pas de variable/attribut [UML]  « Classe virtuelle pure » [C++] • Respecter le contrat = IMPLEMENTER l'interface 84 + flotter() + avancer() <<interface>> Flottant interface Flottant { public static final int CONSTANTE = 30; double PI = 3.14; public abstract void flotter(); public void avancer(); } par défaut 8
  85. 85. Interface (2) • [Vocabulaire ] IMPLEMENTER une interface • Instancier une classe ? 85 class Bateau implements Flottant { public void flotter() {} public void avancer() {} } Implémenter TOUTES les méthodes des interfaces qu’elle utilise class Radeau implements Flottant { public void avancer() {} } abstract
  86. 86. Interface & polymorphisme 86 interface Autonome { public static final boolean COMPLET = yes; public void rouler(); } class Voiture extends Vehicule implements Autonome{ public void rouler() { System.out.println("Pilote automatique"); }} public static void main(String[] param) { Vehicule v = new Voiture(); ((Voiture)v).rouler(); ((Autonome)v).rouler(); System.out.println(Autonome.COMPLET); System.out.println(Voiture.COMPLET); } Google car
  87. 87. instanceof 87 C M <<I>> F1 F2 C M I Object c = new C() m = new M() f1 = new F1() f2 = new F2()
  88. 88. Implémentation multiple 88 public class B extends A implements IC, ID { public void methodeIC() {} public void methodeID() {} } interface IC { void methodeIC(); } interface ID { void methodeID(); }
  89. 89. Héritage multiple ? 89 étend implémente interface Relation non symétrique = raison fonctionnelle class H extends A, B { … } class H extends A implements F { … }
  90. 90. 90 C++ : • héritage virtuel • conflit de méthode ? • conflit d’attribut ? + avancer() Véhicule avancer()? + flotter() + avancer() <<interface>> Flottant pas de conflit + avancer() Véhicule
  91. 91. Héritage multiple d'interface 91 <<interface>> IA A <<interface>> IB <<interface>> IC B <<interface>> IA A <<interface>> IB <<interface>> IC B <<interface>> I interface I extends IA, IB, IC { // … }
  92. 92. Héritage multiple d'implémentation • Implémentation par défaut  Ajout de fonctionnalités sans casser du code existant  Cachée si la méthode est implémentée  Ambiguïté à lever dans certains cas • Code statique 92 8 interface I { default void m1() {} static void m2() {} }
  93. 93. 93 Relations entre objets • Relation • Agrégation • Composition • Référence ou tableau de références • Conteneur spécifique  Collections  Ex : java.util.ArrayList
  94. 94. 94 public class Zoo { static final int NB_ANI = 50; Animal[] animaux; public Zoo() { // pas de création d'objet, sinon le constructeur // par défaut serait obligatoire animaux = new Animal[NB_ANI]; } public void setAnimal(int i, Animal a) { // if ((i>=0) && (i<NB_ANI)) animaux[i] = a; } public static void main(String[] chaines) { Zoo zoo = new Zoo(); zoo.setAnimal(0, new Animal("lion")); }} class Animal { String nom; // public Animal() { nom="INCONNU"; } public Animal(String nom) { this.nom = nom; }} Zoo Animal
  95. 95. 95 // ajouter dans la classe Zoo public Animal getAnimal(int i) { return animaux[i]; } // ajouter dans la classe Animal public void afficher() { System.out.println(nom); } // ajouter dans la methode main() zoo.getAnimal(0).afficher(); // c'est bon // c'est la meme chose que d'écrire // zoo.animaux[0].nom // si animaux et nom sont publics zoo.getAnimal(1).afficher(); // NullPointer zoo.getAnimal(60).afficher(); // ArrayOutOfBounds
  96. 96. 96 Tableau • De scalaires  int, double, char, …  Une case = un scalaire utilisable directement • D'objets  Un tableau de références sur des objets de la classe  Références initialisées à null  Pas de création d’objets par défaut comme en C++  Initialiser chaque élément du tableau pour l'utiliser
  97. 97. 97 Résumé • Héritage simple seulement • Implémentation multiple d’interfaces • Toutes les méthodes sont virtuelles • Une classe finale n’est pas dérivable • Tous les classes dérivent de java.lang.Object [Modificateur]* class identifiant [extends classe_de_base ] [implements interface {, interface}* ] { }
  98. 98. 5. Exceptions
  99. 99. 99 Exceptions • Manière élégante et efficace de gérer les erreurs potentielles d’exécution • Fonctionnement similaire au C++ • Une erreur potentielle  une exception • Hiérarchie des exceptions • Une erreur = une instance d'exception • Partie intégrante de la signature d'une méthode • Obligation de lever les exceptions
  100. 100. 100 Double.parseDouble(chaine); un double une exception Cas normal Cas "exceptionnel" Comportement adapté Reporter l'erreur au niveau supérieur • Surveiller le code • Traiter l'erreur OBLIGATION DE TRAITER UNE EXCEPTION "10.5" "dix"
  101. 101. Exemple 101 public void somme(String chaine) { res = Double.parseDouble(chaine); total += res; } Erreur de compilation ET / OU Erreur d'exécution public void saisie { String chaine = System.console().readLine(); while (!chaine.isEmpty()) { somme(chaine); chaine = System.console().readLine(); } }
  102. 102. Attraper une exception 102 public void somme(String chaine) { double res = .0; try { // bloc à surveiller res = Double.parseDouble(chaine); total += res; } catch (NumberFormatException e) { System.out.println(e.getMessage()); // ou e.printStackTrace(); } finally { // Clause TOUJOURS exécutée } } Traitement adapté à l'erreur décrite Arrêt de l'exécution à la première erreur
  103. 103. Reporter l'erreur … 103 public void somme(String chaine) throws NumberFormatException { double res = .0; res = Double.parseDouble(chaine); total += res; } Déclaration de l’erreur potentielle Obligatoire pour le compilateur public void saisie() { somme(chaine); } On n’a fait que reculer … Traiter l’exception : try /catch ou throws
  104. 104. Hiérarchie des exceptions 104 Exception IOException RuntimeException NullPointerException IndexOutOfBoundsException FileNotFoundException Gestion différenciée
  105. 105. 105 Ordre des blocs catch try { // code à tester } catch (Exception e) { e.printStackTrace(); } catch (IOException e) { // traitement adapté } try { // code à tester } catch (IOException e) { // traitement adapté } catch (Exception e) { e.printStackTrace(); } Compilateur : Already caught Exception Exécution du 1er bloc qui correspond [C++] masquage
  106. 106. 106 try { // bloc à surveiller } catch (NumberFormatException e) { e.printStackTrace(); throw e; } catch (IOException e) { e.printStackTrace(); throw e; } try { // bloc à surveiller } catch (NumberFormatException | IOException e ) { e.printStackTrace(); throw e; } Même traitement Même traitement ? 7
  107. 107. Bloc finally • Optionnel • TOUJOURS exécuté  Même si aucune exception n'a été levée  Même si une instruction continue, break ou return se trouve dans le bloc try  Sauf fin de thread ou de JVM • Utilité avec un langage doté d'un ramasse-miettes ???  Libérer les ressources  Fermer des fichiers, par exemple  Try-with-resources 107 7
  108. 108. 108 Exception personnalisée • Exception dérive de Throwable  Error  Exception • Dériver de java.lang.Exception  Surcharger Constructeur (String message)  OU Redéfinir getMessage() • Lancer une exception throw new MonException();
  109. 109. 109 class AutorisationException extends Exception { public String getMessage() { return "Op impossible : découvert trop grand"; } } public class CompteBancaire { double solde = 0.0; double decouvert = -700.; // … autorise public void retrait(double montant) throws ArithmeticException, AutorisationException { double nouveau = solde – montant; if (montant<0.0) throw new ArithmeticException("Mauvais montant"); if (nouveau<decouvert) throw new AutorisationException(); solde = nouveau; } } Lancement d'exception Signature : liste des exceptions lançables, remontées à l'appelant
  110. 110. 110 Clonage • Copier un objet pour ne pas le modifier  Pas de constructeur de copie • Implémenter Cloneable  Sert seulement à prévenir le compilateur • Appeler la méthode clone() de la classe mère en public • S’assurer que la méthode clone() d’Object est également appelée en haut de l’échelle • Traiter les exceptions dans clone()
  111. 111. 111 class Trooper implements Cloneable { public Object clone() { Trooper object = null; try { object = (Trooper) super.clone(); } catch(CloneNotSupportedException cnse) { cnse.printStackTrace(System.err); } // s'occuper des attributs "compliqués" // pour éviter la copie de surface // (shallow copy) si object != null return object; } } Copie des types primitifs Copie des références Objets non mutables (String)
  112. 112. 112 Conclusion exceptionnelle • Pour toute exception déclenchée, le compilateur impose un traitement 1. Bloc try/catch qui gère cette exception 2. Passage de l'exception au niveau supérieur (appelant).  L'exception apparait alors dans la signature de la méthode
  113. 113. 113 // exemple d'utilisation convertir("90"); public double convertir(String n) throws NumberFormatException { double res = Math.PI /180; try { res *= Double.parseDouble(n); } catch(NumberFormatException e) { res = .0; } return res; } Erreur du compilateur Gérer localement l'exception Passage au niveau supérieur
  114. 114. 6. Bibliothèques graphiques AWT & Swing Alternatives IBM : SWT / JFace
  115. 115. 115 AWT vs Swing • Abstract Window Toolkit (java.awt.*)  "Figé" depuis 1.1  Présent dans les navigateurs sans plug-in  Gestion des événements obsolète  Composants lourds • Swing (javax.swing.*)  Toujours en évolution  Plus complexe qu'AWT  Composants légers  Surcouche d'AWT (Jcomposant)
  116. 116. 116 Exemple d'application Swing
  117. 117. 117 Swing • Composants de haut-niveau (lourds)  JFrame, JDialog, JApplet • Conteneurs  JPanel, JScrollPane, JToolBar • Composants basiques  JMenu, JButton, JLabel • Dessiner  Canvas (AWT), JPanel (Swing) • Index graphique des composants Swing http://download.oracle.com/javase/tutorial/ui/features/components.html • Apparence / système (Look & Feel) NON ABORDÉ
  118. 118. 118
  119. 119. 119
  120. 120. 120
  121. 121. 121
  122. 122. 122 import javax.swing.*; public class HelloWorldSwing { private static void createAndShowGUI() { JFrame frame = new JFrame("HelloWorldSwing"); JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { createAndShowGUI(); } } Cas 1 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SwingUtilities.invokeLater(new Runnable() { public void run() { } }); JFrame.setDefaultLookAndFeelDecorated(true); Calcul de la taille Et affic hage Gestion des threads Et classe imbriqu ée Exemple du tutoriel officiel Sun/Oracle sur Swing :
  123. 123. • Classe imbriquée dite anonyme • Spécialise la classe donnée ou implémente l'interface donnée • Déclarée à la volée / utilisée qu'une seule fois • Compilée avec un nom arbitraire nomclasseenglobante$nombre.class 123 invokeLater(new Runnable() { public void run() { // faire qq chose } }); invokeLater(() -> createAndSowGUI()); 8 𝜆
  124. 124. 124 Manipuler une fenêtre ? (1) • Instancier un objet JFrame 1. Déclaré à la volée dans un méthode ;-(  Ne peut être réutilisé ailleurs 2. Spécialisation de classe ;-( 3. Attribut d'objet (composition)
  125. 125. 125 public class MonApplication extends JFrame{ public MonApplication() { super("Mon application"); } static public void main(String[] argv) { MonApplication ma = new MonApplication(); ma.afficher(); } } public class MonApplication { JFrame frame; public MonApplication() { frame = new JFrame("Mon Application"); } static public void main(String[] argv) { MonApplication ma = new MonApplication(); ma.afficher(); } } public void afficher() { frame.pack(); frame.setVisible(true); } Cas 2 public void afficher() { pack(); setVisible(true); } Cas 3
  126. 126. 126 Manipuler une fenêtre ? (2) Cas le plus général et recommandé ! L’application gère des fenêtres spécialisées !
  127. 127. 127 Boîte de dialogue simple • Classe JOptionPane • Méthodes de classe showXXXDialog  Message, Confirm, Option, Input JOptionPane.showConfirmDialog(frame, "Alors, ça vous plaît ?"); • Fenêtre parent • Peut être null Réponse
  128. 128. 128 Ouvrir une fenêtre • Afficher une application graphique simple agrégeant un JFrame • Ajouter une boite de dialogue modale
  129. 129. 129 Ajouter des composants ? • Que se passe-t'il ? • Nécessité de positionner les éléments • Qui peut recevoir des composants ?  Composants de haut niveau  Conteneurs -> Panels // après frame.getContentPane().add(label); // dans HelloWorldSwing frame.getContentPane().add(new JLabel("2"));
  130. 130. 130 Positionnement • Placer des composants  Taille (fixe, minimale, maximale et préférée)  Position absolue ou relative (portabilité) • Politique de placement d'un conteneur : Layout  JFrame, JDialog, JPanel, … • Complexe à manipuler  Conteneurs et Layouts spécialisés en cascade  GUI Builder • Matisse / Netbeans avec GroupLayout • WindowBuilder / Eclipse • IntelliJ
  131. 131. 131 Layout Manager (1) http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html Points cardinaux Horizontal ou vertical Complexe mais puissant Formulaire
  132. 132. 132 Layout Manager (2) • Flow • Box • Border • Grid • Card • GridBag • Spring • Aucun frame.getContentPane().setLayout(new FlowLayout()); frame.getContentPane().add(objet [, paramètres]); Managers par défaut : • BorderLayout pour le contentPane du JFrame • FlowLayout pour un JPanel Package : java.awt
  133. 133. 133 On teste … • Tester le BorderLayout …  avec un bouton dans chaque zone  Nord, Sud, Est, Ouest, Centre • Tester le FlowLayout  … en ajoutant des boutons frame.getContentPane().setLayout(new FlowLayout()); for (int i=0; i < 5; ++i) frame.getContentPane().add( new JButton(new String(i))); • ""+i Passage par StringBuffer • (new Integer(i)).toString() • String.valueOf(i) Changer la taille de la fenêtre
  134. 134. 134 contentPane (JFrame) pane = new JPanel(); (Layouts par défaut des composants) frame.getContentPane().add(pane, BorderLayout.CENTER);
  135. 135. 135 Organisation par couches Root Pane Layered Pane Glass Pane MenuBar ContentPane Layout Manager C1 C2 … … Cn
  136. 136. 136 Événements (1) • Communication entre les composants d'une application et l'utilisateur  Envoi de messages  Appel de méthodes d’une interface • Intéressé(e) par un événement ? 1. Vérifier que le composant permet d’y répondre 2. Écrire un gestionnaire 3. Enregistrer le gestionnaire auprès du composant
  137. 137. Événements (2) Activer un JButton Choisir un menu Appuyer sur une touche (focus) Appuyer / relâcher un bouton de souris Entrer ou sortir d’un composant avec la souris Déplacer la souris Utiliser la molette Déplacer la fenêtre Réduire la fenêtre Fermer la fenêtre Changer la taille 137 Action Regroupement fonctionnel = MouseListener
  138. 138. Activer un JButton (action) 1. Ecrire le gestionnaire 2. Enregistrer le gestionnaire 138 class Gestionnaire implements ActionListener { public void actionPerformed(ActionEvent e) { // ce qu'il y a à faire } } JButton bouton = new JButton("Libellé"); bouton.addActionListener(new Gestionnaire()); Afficher une boite de dialogue avec le programme précédent
  139. 139. Event / Listener / Adapter • Event • Listener  Spécifique à l'événement  Liste des méthodes / messages possibles composant.addEventListener() • Adapter  Patron de conception / design pattern  Implémentation "vide" de convenance 139 ActionAdapter n'existe pas ! AbstractAction existe MouseEvent MouseListener MouseAdapter Toujours possible ? addMouseListener()
  140. 140. 140 A bas les boutons … (1) • Afficher quelques boutons • Incrémenter la valeur d'un bouton à chaque fois que l'on clique dessus • Ajouter une boîte de confirmation pour la sortie du programme
  141. 141. 141 A bas les boutons … (2) • Bouton ? 1. Spécialiser JButton pour compter 2. Utiliser JButton directement • Gestionnaire ? 1. Une instance pour tous les boutons 2. Un instance par bouton • Possibilité : le bouton lui-même MonBouton #compteur : int + MonBouton(); + incrementer(); JButton DEPRECATED <<interface>> ActionListener
  142. 142. A bas les boutons (3) • Sortie propre ?  Changer le comportement par défaut  Gestionnaire • showConfirmDialog • Evénement ?  Quitter 142 FENETRE PAS ENCORE FERMEE
  143. 143. 143 Contexte graphique • Boîte à dessin • Associé à une fenêtre ou une image • Classe java.awt.Graphics  Couleur  Mode de dessin (XOR …)  Police de caractères  Actions basiques ( drawXXX, fillXXX) • Classe java.awt.Graphics2D  Plus de fonctionnalités en dessin  Changement de repère, transformations
  144. 144. 144 (0,0) y x Orientation par défaut (x1,y1) height width graphics.fillOval(x1, y1, width, height);
  145. 145. 145 Dessiner • Canvas [AWT]  Composant "lourd"  void paint(Graphics g) • JPanel [Swing]  Composant léger  Opacité  void paintComponent(Graphics g)  paint() existe mais … • Contexte graphique "prêté" par le système • Méthode repaint() pour mettre à jour
  146. 146. JCanvas • Étendre la classe JPanel  Opaque ? double buffering ?  Layout inutile ! • Fixer la taille du composant  PreferredSize (utilisée par pack())  MinimumSize, MaximumSize • Redéfinir paintComponent()  À ne jamais appeler directement  Appeler super.paintComponent(g) si besoin • Efface le composant 146
  147. 147. 1. Simuler un oscillateur "fixe" 2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal) 147
  148. 148. Solution ? 148 C contentPane (JFrame) JButton + gestionnaire (Action) appelle repaint()de la zone de dessin ou du JFrame. JLabel JCanvas • étend JPanel • redéfinit paintComponent(…) => dessin • commencer par un rectangle tout simple • précise la taille préférée setPreferredSize(new Dimension(800,600)); W E N S Math.random() Random getParent().repaint()
  149. 149. Barre de menus 149 Fichier Nouveau Ouvrir Sauvegarder Quitter menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); menu = new JMenu("Fichier"); menuBar.add(menu); item = new JMenuItem("Nouveau"); item.addActionListener(…); item.setAccelerator(…); menu.add(item); menu.addSeparator();
  150. 150. 6B. Bibliothèque graphique Java FX
  151. 151. 151 Swing vs Java FX • Développement d'applications riches • Swing (javax.swing.*)  Stack historique (depuis java 1.2)  "Figée" depuis 1.8 • Java FX 2 (javafx.*)  Bibliothèque officielle  MAIS pas livrée avec toutes les JVMs  Supporte le CSS et le FXML  Plus riche que Swing : 2D et 2D
  152. 152. 152 Exemple d'application javaFX Canvas Button Label Title Stage
  153. 153. Contrôles 153 Button ToggleButton RadioButton Checkbox ChoiceBox ComboBox MenuBar Menu MenuItem Separator ToolBar …
  154. 154. 154 TextField TextArea PasswordField HTMLEditor Spinner Slider Label Tooltip Hyperlink
  155. 155. 155 ColorPicker DatePicker FileChooser
  156. 156. 156 ListView TableView TreeView TreeTableView
  157. 157. Et encore … • ScrollBar / ScrollPane • ProgressBar / ProgressIndicator • Accordeon • PaginationControl • Pleins de Pane • Tab • Canvas • Chart • Des boîtes de dialogues 157
  158. 158. 158 public class FXHelloWorld extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } Exemple du tutoriel officiel Sun/Oracle sur JavaFX : Classe dédiée Créé par le système un composant ajout btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); Action au clic
  159. 159. 159 • Java FX n'est pas livré avec toutes les JVM 8 • Eclipse ne reconnaît pas Java FX par défaut Méthode 1 : • Paramétrer le projet • Règle d'accessibilité Méthode 2 : • Greffon e(fx)clipse • Projet spécifique
  160. 160. • Classe imbriquée dite anonyme • Spécialise la classe donnée ou implémente l'interface donnée • Déclarée à la volée / utilisée qu'une seule fois • Compilée avec un nom arbitraire nomclasseenglobante$nombre.class 160 btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } });
  161. 161. 161 Boîte de dialogue simple • Classe Alert  Type + Texte + Boutons  Modale : showAndWait() Alert a = new Alert(…); Optionnal<ButtonType> r = alert.showAndWait(); if (r.isPresent() && a.get() == ButtonType.OK) …
  162. 162. 162 Ajouter des composants ? • Que se passe-t'il ? • Nécessité de positionner les éléments • Qui peut recevoir des composants ?  Conteneurs -> Panels  Arborescence de composants // après root.getChildren().add(btn) Btn = new Button("Deuxième bouton); root.getChildren().add(btn);
  163. 163. 163 Positionnement / Layout • Placer des composants …  Taille (fixe, minimale, maximale et préférée)  Position absolue ou relative (portabilité) • ... dans des Nœuds particuliers Region  Transformations applicables  Composants ordonnées ou pas  Imbricables • FXML  Description en XML  Événements en Java ou JS ou …  Style en CSS Property
  164. 164. 164 Layouts (1) https://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm#JFXLY102 Boîte GridPane BorderPane
  165. 165. 165 Layouts (2) • BorderPane • HBox • VBox • StackPane • FlowPane • TextFlow • TilePane • DialogPane • GridPane • AnchorPane • … • SplitPane • TabPane • ScrollPane
  166. 166. 166 On teste … • Tester le BorderPane …  avec un bouton dans chaque zone  TOP, RIGHT, BOTTOM, LEFT, CENTER • Tester le FlowPane ou TilePane  … en ajoutant des boutons root = XXXXPane(); root1.setBottom(…); root2.getChildren().add(…); btn.setMaxWidth(Double.MAX_VALUE); btn.setMaxHeight(Double.MAX_VALUE); Changer la taille de la fenêtre
  167. 167. 167 Événements • Communication  Système – Application - Utilisateur • Propagation à double sens • Gérés au sein d'un unique thread  FX Application thread Platform.runLater(); isAppFXThread()
  168. 168. 168 Hiérarchie & type Event Input Window Action … ANY PRESSED RELEASED TYPED ANY CLOSE REQUEST HIDDEN / HIDDING SHOW / SHOWING ANY PRESSED / RELEASED MOVED ENTERED / EXITED …
  169. 169. Propagation 1. Cible ? 2. Route 3. Capture 4. Bubbling 169 Stage Scene … … Cible / target Capture (Filtre) Bubbling addEventFilter() setOnEvent() … Consommation e.consume() EventHandler<Event> -> handle()
  170. 170. Activer un Button (action) (1) 170 @FunctionalInterface interface EventHandler<ActionEvent> { public void handle(ActionEvent event); } Une seule méthode Type dérivé de Event Unique méthode à implémenter
  171. 171. Activer un Button (action) (2) • Utilisation d'un objet  Objet créé à la volée  Référence d'objet instance de EventHandler<AE> • Utilisation d'une méthode  Lambda  Référence de méthode 171 Choisir un bouton et écrire sur la console ou Afficher une boite de dialogue avec le programme précédent setOnAction(objet::handle) setOnAction(new EventHandler<AE>() {}); setOnAction(objet); setOnAction((AE e) -> { … }); 𝜆
  172. 172. 172 A bas les boutons … (1) • Afficher quelques boutons • Incrémenter la valeur d'un bouton à chaque fois que l'on clique dessus • Ajouter une boîte de confirmation pour la sortie du programme OU quitter après deux clics sur la croix
  173. 173. 173 A bas les boutons … (2) • Bouton ? 1. Spécialiser Button pour compter 2. Utiliser Button directement • Gestionnaire ? 1. Une instance pour tous les boutons 2. Un instance par bouton • Possibilité : le bouton lui-même Button : setText () Integer : parseInt() MonBouton - compteur : int + MonBouton(); + incrementer(); Button event.getSource() <<interface>> EventHandler<AE>
  174. 174. A bas les boutons (3) • Comportement par défaut • Modifier le comportement  Boite de dialogue  Consommer l'événement • Forcer une sortie 174 Platform.exit() System.exit(0) Application arrêtée lorsque toutes les fenêtres sont fermées (implicitExit) Alert a = new …; a.showAndWait()
  175. 175. 175 Dessiner • Canvas  Composant transparent  Pas forcément attaché à une scène  GraphicsContext • Hiérarchie de composants shape  Rectangle, Circle, SVGPath, Text …  Remplissage fill  Trait stroke  Combinaisons ( +, - )
  176. 176. 176 (0,0) y x Orientation par défaut (x1,y1) height width graphics.fillOval(x1, y1, width, height); Graphics.strokeRect(x1, y1, width, height); Contexte graphique
  177. 177. 1. Simuler un oscillateur "fixe" 2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal) 177
  178. 178. Solution ? 178 C BorderPane Button + EventHandler Label Canvas W E N S Math.random() Random
  179. 179. Barre de menus 179 Fichier Nouveau Ouvrir Sauvegarder Quitter menuBar = new MenuBar(); root.setTop(menuBar); menu = new Menu("Fichier"); menuBar.getMenus().add(menu); menuBar.getMenus().addAll(m1, m2, m3); item = new MenuItem("_Nouveau"); item.setMnemonicParsing(true); item.setAccelerator( new KeyCodeCombinaison(… )); item.setOnAction(…); menu.getItems().add(item); BorderPane.TOP
  180. 180. 7. Concurrence (Threads)
  181. 181. Concurrence • Plusieurs tâches en même temps • Processeurs multi cœurs • Threads ou processus légers  Partage données • Historiques : Thread, Runnable • Package java.util.concurrent • Modèles pour interfaces graphiques 181 5
  182. 182. 182 Tâche • Sécurité d'accès aux méthodes et données  Méthode/statement qualifié synchronized  Variable qualifiée volatile  Variable qualifiée final (Immutable) • Méthode pour démarrer start() • Méthode pour endormir sleep() • L'arrêt doit être NATUREL run()  La méthode d'exécution doit se terminer normalement  Test d'arrêt  Vérification de demande d'arrêt
  183. 183. Thread et UI ? • Interface gérée un unique thread  Propagation des événements  Patron MVC : concurrence difficile • Interface peut être figée facilement • Tâches longues en arrière-plan • Swing : fil des événements  SwingWorker (antérieur au patron Executor) • JavaFX Application thread  Package extension de java.util.concurrent 183
  184. 184. Tâche longue 184 Temps FinDébut Thread des événements paint paintclic Paint + calcul très long … Calcul très long … inits fin Actions simples successives Blocage de l'interface Paint + calcul long … Calcul en arrière-plan : interface libre
  185. 185. 185 Thread vs Runnable // Exemple avec implémentation d'interface // Modélisation : créer une nouvelle tâche class Tache implements Runnable { // implémenter run() } // AILLEURS : Tache tache = new Tache(); (new Thread(tache)).start(); // Exemple avec spécialisation de classe // Modélisation : créer un nouveau type de Thread class Special extends Thread { } Special special = new Special(); special.start(); CONSEILLÉ
  186. 186. Java FX • Interface Worker • Implémentation : Task et Service 186
  187. 187. • Tache : génération aléatoire de rectangles avec une composante alpha (couleur RGBA) • Menu : Rafraichir et quitter • "Quitter?" par le menu et la croix • Blocage de l'interface ? • Gérer le redimensionnement 187 Interface graphique & tâche longue
  188. 188. 188 Modèle MVC • Modèle / Vue / Contrôleur • Logique applicative vs présentation • Design(s) pattern(s) / Patron de conception  Communément adopté (un des plus vieux)  Pas trivial du tout  A éviter sur les trucs simples  Adopté par Swing (Table <-> TableModel)  Adopté par JavaFX (FXML)
  189. 189. Exemple 189 Modèle Contrôleur Vue 2 Vue 1
  190. 190. 190 Modèle Contrôleur Transmet l’action Vue Vue Vue (s) Rafraîchissement Données Changement d’état Notification changements (Observer) Action utilisateur
  191. 191. 8. Fichiers & Flux Sérialisation
  192. 192. 192 Gestion des entrées/sorties (1) • Flux E/S de données binaires • Flux E/S de caractères • Flux E/S d’objets • Communication avec des fichiers • Communication avec des ressources Internet • Sérialisation (=> réseau)
  193. 193. 193 Gestion des entrées/sorties (2) • java.io  Flux de données (fichier, pipe/threads, …)  Sérialisation  Système de fichiers • java.nio (java 4)  Mémoire tampon Buffer  Canaux + Sélecteurs : hautes performances  Traduction des jeux de caractères • java.nio2  Simplification  Path 7
  194. 194. 194 File FileDescriptor RandomAccessFile OutputStream StreamTokenizer BufferedInputStream DataInputStream LineNumberInputStream PushbackInputStream BufferedOutputStream DataOutputStream PrintStream ByteArrayInputStream FileInputStream FilterInputStream PipedInputStream SequenceInputStream StringBufferInputStream ByteArrayOutputStream FileOutputStream FilterOutputStream PipedOutputStream InputStream Object Tiré de « Eléments de programmation JAVA », Olivier Dedieu, INRIA java.io.*
  195. 195. File fic = new File("log.txt"); FOS fos = new FileOutputStream(fic); PS ps = new PrintStream(fos); ps.println("une chaine de caractères"); ps.close(); fos.close(); Flux de sortie 195 OutputStream PrintStreamFileOutputStream fichier sortie flux texte conversion System.out flux sortie conversion DataOutputStream flux binaire PrintStreamDataOutputStream flux écran Tiré de http://www.nawouak.net, B. Bachelet
  196. 196. Flux d’entrée 196 InputStream InputStreamReader FileInputStream flux texte (caractère par caractère) System.in flux entrée conversion DataInputStream flux binaire DataInputStream flux clavier StreamTokenizer conversion StreamTokenizer conversion flux texte (item par item) fichier entrée Tiré de http://www.nawouak.net, B. Bachelet
  197. 197. 197 // Version 1 standard // Attention aux exceptions soulevées InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); br.readLine(); Saisie clavier // Version 1.6 // les exceptions sont gérées par la Console System.console().readLine(); System.console() == null sous Eclipse ! 6
  198. 198. 198 BufferedReader br = null; FileReader fr = null; try { fr = new FileReader(nomFichier); br = new BufferedReader(fr); String lecture; while ((lecture = br.readLine())!=null) { // } br.close(); fr.close(); } catch (Exception e) { e.printStackTrace(); } Exceptions possibles ? Pas la bonne place } finally { if (br!=null) br.close(); if (fr!=null) fr.close(); } Bonne place Mais exception possible try { } catch(Exception e) { Pas la bonne place non plus = duplication de codeif (br!=null) br.close();
  199. 199. Try-with-resources • Ressource  Tout objet à fermer / libérer après utilisation  Fichier, flux, chaussette, requête • Méthode classique (< 1.7)  close() dans bloc finally => exception levable  Bloc try-catch englobant supplémentaire ou relance • Fermeture et libération automatique (1.7+)  Syntaxe simplifiée  Interface AutoCloseable 199 7 7
  200. 200. 200 // bloc try-with-resources try ( FileReader fr = new FileReader(nomFichier); BufferedReader br = new BufferedReader(fr); ){ String lecture; while ((lecture = br.readLine())!=null) { // } } // Les ressources sont fermées automatiquement catch (Exception e) { e.printStackTrace(); } Certaines exceptions peuvent être lancées mais elles sont dissimulées. Elles sont toutefois récupérables en cas de besoin.
  201. 201. 201 Sérialisation (1) • Transformer un objet présent en mémoire en bits  Sur un disque (Stockage - Persistance)  Sur le réseau (Communication – RMI)  Les infos de classe ne sont pas transmises • Implémenter l'interface Serializable  Ne fait rien, prévient le compilateur • Proposer une version de sérialisation  static final long serialVersionUID = 110L; • Attention à la protection des données  Données transient : données non copiées  Ou implémenter Externalizable
  202. 202. 202 Sérialisation (2) void writeObject(ObjectOutputStream out) throws IOException; void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; void readObjectNoData() throws ObjectStreamException; FileOutputStream/FileInputStream ObjectOutputStream/ObjectInputStream Flux (streams) à utiliser … Méthodes à redéfinir pour un comportement particulier
  203. 203. 203 FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("fichier.dat"); oos = new ObjectOutputStream(fos); oos.writeObject(objects); oos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (oos!=null) oos.close(); if (fos!=null) fos.close(); } FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("fichier.dat"); ois = new ObjectInputStream(fis); objects = (Composite) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { if (ois!=null) ois.close(); if (fis!=null) fis.close(); } Classe de l'objet
  204. 204. 204 Sérialisation en XML • XMLEncoder pour les objets respectant les conventions NetBeans • X-Stream pour les autres ;-)  Une bibliothèque tiers sur github
  205. 205. 205 FileOutputStream fos = null; XStream xstream = null; try { fos = new FileOutputStream(name); xstream = new XStream(new StaxDriver()); xstream.toXML(objects, fos); } catch (Exception e) { e.printStackTrace(); } finally { if (fos!=null) fos.close(); } FileInputStream fis = null; XStream xstream = null; try { fis = new FileInputStream(name); xstream = new XStream(new StaxDriver()); objects = (Composite)xstream.fromXML(fis)); } catch (Exception e) { e.printStackTrace(); } finally { if (fis!=null) fis.close(); } Classe de l'objet
  206. 206. TP "Houzehou" 206 • Manipulation de classes et d'interfaces • Conteneurs • Fichiers textes • Javadoc • JTable (Swing) TableView(JavaFX)
  207. 207. 207 Houzehou Personne // tableau statique static int MAX = 50; Personne[] p1 = new Personne[MAX]; p1[0] = new Personne(); // tableau dynamique (thread-safe) Vector<Personne> p2 = new Vector<Personne>(); p2.addElement(new Personne()); // Liste : ArrayList, LinkedList, … ArrayList<Personne> p3 = new ArrayList<Personne>(); p3.add(new Personne()); new StringBuffer(nom+":"+prenom); // tableau dynamique Legacy ou avec "erasure" Vector p2 = new Vector(); p2.addElement(new Personne());
  208. 208. 208 Constructeur() { a = null; b = 1; } private void init(O a, int b) { this.a = a; this.b = b; } Constructeur(int b) { a = null; this.b = b; } Constructeur() { this(null, 1); } Constructeur(int b) { this(null, b); } Constructeur() { init(null, 1); } Constructeur(int b) { init(null, b); } Constructeur(O a, int b) { this.a = a; this.b = b; } Duplication de code !!! Méthode privée (Sortie du constructeur) Pas d'argument par défaut mais une syntaxe sympa
  209. 209. 209 Éditions Ça aussi c'est important
  210. 210. 210 Plan • Plus d'exemples avec JAVA  Enumération,  Ajouts 5, 6 et 7, pas encore 8 • Généricité & collections • Applet • Outils • Autres documents : JNI, JDBC, Java EE
  211. 211. Langage
  212. 212. 212 Terminologie : classe imbriquée • Classe imbriquée / nested class  Classe définie à l’intérieur d’une autre classe • 4 types de nested class  Classe membre statique  Classe membre non statique  Classe locale (définie dans une méthode)  Classe anonyme (locale sans nom) Inner class • N’existe qu’avec une instance de la classe • Pas de membres statiques • Peut accéder aux variables / attributs de l'englobant
  213. 213. 213 Conventions (1) • Documentation officielle • Tutoriaux SUN/Oracle • Respect à l'écriture, facilité de lecture • Production rapide • Intégrée dans les EDI classiques  Génération automatique de code
  214. 214. 214 Conventions (2) • Nom de classe ou interface  Première lettre majuscule  Reste en minuscules  Majuscules aux mots composés • Attribut écrit en minuscule  Pas de tiret • Méthode  Verbe pour action  Premier mot en minuscule  Majuscules à la première lettre des mots suivants class CoursGenial int attribut; void ronfler();
  215. 215. 215 Conventions (3) • Accesseur / Accessor  get + nom de l'attribut  is pour un booléen • Mutateur/Mutator  set + nom de l'attribut • "Constante"  Tout en majuscules • Package  Tout en minuscules getAttribut() isAttribut() CONSTANTE fr.isima.paquetage setAttribut()
  216. 216. 216 Énumération ? (<1.5) • Pas de vérification de type • Affichage de la valeur sans intérêt public static final int LUNDI = 0; public static final int MARDI = 1; public static final int MERCREDI = 2; public static final int JEUDI = 3;
  217. 217. 217 Énumération http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html enum Semaine { LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE} for (Semaine jour : Semaine.values()) System.out.println(jour); for (Semaine j : EnumSet.range( Semaine.LUNDI, Semaine.VENDREDI)) System.out.println(j); Dangereux mais utile : le static import 5
  218. 218. 218 Enum améliorés enum Nom { VAL1(1), VAL2 (2); private int valeur; Nom(int i) { this.valeur = i }; } enum Nom { VAL1 { retour methode(params) {…}}, VAL2 { retour methode(params) {…}}; abstract retour methode(params); } 5
  219. 219. Annotation • "Extension" de celles du javadoc trop restrictives • Méta données  Développeur  Compilateur  Machine virtuelle  Génération code, documentation, configuration • Plus simple et plus léger que le XML • Utilisation intensive  JUnit 4+  Java EE : JPA, … 219 5
  220. 220. Annotations standards • @Override • @SuppressWarnings  @SuppressWarnings(value="deprecation")  @SuppressWarnings("deprecation")  @SuppressWarnings({"unchecked", "deprecation"}) • @Deprecated • @Documented  Documentation • @Retention(RetentionPolicy.RUNTIME)  Exécution
  221. 221. 221 class Mere { public void methode() { System.out.println("Methode de Mere"); } } class Fille extends Mere { @Override public void Methode() { System.out.println("Methode de Fille"); } } Fille f = new Fille(); f.methode(); The method Methode() of Fille must override or implement a supertype method
  222. 222. Annotations personnalisées 222 @interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; String[] reviewers(); // utilisation possible des tableaux } Aller plus loin : http://download.oracle.com/javase/tutorial/java/javaOO/annotations.html http://www.jmdoudoux.fr/java/dej/chap010.htm#annotations
  223. 223. Méthode à nombre d'arguments variable 223 public void somme(double … nombres) { double s = 0.0; // méthode classique for(int i=0; i < nombres.length; ++i) s += nombres[i]; // nouvelle forme de for for (double nb: nombres) s+= nb; } 5
  224. 224. Auto [un] Boxing • Conversions automatiques • AutoBoxing  attention à la création implicite d'objets • Auto unboxing 224 int n = nombre; // converti automatiquement int n = nombre.intValue(); Integer nombre = 10; // conversion automatique Integer nombre = new Integer(10); Avertissements / Erreurs possibles sous Eclipse 5
  225. 225. Généricité & Collections
  226. 226. 226 Généricité • Classes paramétrées • Méthodes paramétrées • Wildcards (<? extends classe>)  En lecture (pas en création) • Définition générique  Compilée une fois pour toutes (≠ C++), efficacité ?  Partagée par toutes ses invocations • Pas de typedef  paramètre : une lettre en majuscule (convention)  Éviter de dériver une classe pour donner un nom Plus de renseignements : http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf 5
  227. 227. 227 Généricité : exemple public interface List<E> { void add(E e); Iterator<E> iterator(); } public interface Iterator<E> { E next(); boolean hasNext(); } public void dessiner(List<E extends ObjetGraphique> l); static<T> void ajouter(T[] tab, Collection<T> c) { for(T o :tab) c.add(o); } 5
  228. 228. 228 Collections (1) • Gérer des collections dynamiques d'objets  Conteneurs non générique d'objets de classe Object  Conteneurs génériques  Incompatibilité de plateforme • Algorithmes  Tri  Recherche  Manipulation • Paquetage java.util Options –source et -target http://docs.oracle.com/javase/tutorial/collections/index.html 5 5
  229. 229. Collection (2) 229 «interface» Collection T «interface» Set «interface» List «interface» Queue T T T «interface» SortedSet T «interface» Map K,T «interface» SortedMap K,T «implémente» «implémente» «implémente» Set : pas de doublons Queue : FIFO par ex Map : table de hachage Vector
  230. 230. 230 Collections (3) • Avant Java 1.5  Conteneurs d'Object  Downcast obligatoire  Vector [Vecteur dynamique]  Enumeration [itérateur]  Dictionary (Hashtable) [Map] • Après 1.5  Mêmes conteneurs templatisés  Utiliser ArrayList plutôt que Vector sauf multithread  Utiliser la Map plutôt que Dictionary 5
  231. 231. 231 Exemple (non générique) Vector v = new Vector(); // on ne peut stocker que des objets, int est exclu for (int i=0; i<10; ++i) v.addElement(new Integer(i)); // transtypage obligatoire int somme = 0; for (int i=0; i<10; ++i) somme += ((Integer)v.elementAt(i)).intValue(); // avec une énumération Enumeration e = v.elements(); while (e.hasMoreElements()) somme += ((Integer)e.nextElement()).intValue();
  232. 232. 232 Exemple (générique) Vector<Integer> v = new Vector<Integer>(); // on ne peut toujours pas stocker de int for (int i=0; i<10; ++i) v.addElement(new Integer(i)); // plus de transtypage int somme = 0; for (int i=0; i<10; ++i) somme += v.elementAt(i).intValue(); // avec une énumération, elle aussi paramétrée Enumeration<Integer> e = v.elements(); while (e.hasMoreElements()) somme += e.nextElement().intValue(); 5
  233. 233. 233 for : nouvelle syntaxe ArrayList<Integer> al = new …; // collection int s = 0; // somme for(int i =0; i< al.size(); ++i) { s += al.get(i).intValue(); } for(Integer i : al) { s += i.intValue(); } 5
  234. 234. Outils javadoc - jar
  235. 235. 235 javadoc Outil externe pour générer une documentation au format HTML (similaire à la documentation officielle Java)  Intégré au langage, commande en standard  Format "universel" et simple  Commentaires dans le code  Autre outil similaire : Doxygen  Lisibilité du code  Le code doit compiler  Ne fait pas tout ! /** */
  236. 236. 236 javadoc ? • Commentaires spéciaux • Personnalisation avec code HTML ou CSS • Balises  @param  @return  @throws @exception  @see  @since  @deprecated  @author /** */ Eclipse : (M) Project > Generate Javadoc
  237. 237. 237 Exemple /** * Description de la classe * */ class ExempleJavaDoc { /** * description courte * * description longue …… * @param param1 description * @param param2 description * @return le resultat de la methode */ public int methode(int param1, double param2) {} }
  238. 238. 238 jar • Java ARchive  Exécutable ( ≈ tar)  Format de fichier compressé  Contrôle de version par exemple • Permet de distribuer/déployer  une application (autonome ou applet, JEE)  un package • Contenu  Fichiers .class  Fichiers ressources (images)  Fichier Manifest
  239. 239. 239 Bibliographie (1) • Documentation JAVA de Sun/Oracle • Tutoriaux Web de Sun/Oracle • Cours JAVA d'Olivier Dedieu, INRA • Intro JAVA, Bruno Bachelet http://www-sor.inria.fr/~dedieu/java/cours/ http://www.nawouak.net/?doc=java+lang=fr http://download.oracle.com/javase/tutorial/
  240. 240. 240 Bibliographie (2) • Thinking in Java, 2nd ed, Bruce Eckel • Head First Java, 2nd ed, Kathy Sierra, Bert Bates , O'Reilly, 2005
  241. 241. Aller plus loin… • Java standard  Introspection  Génériques  Réseau, RMI  Threads avancés  JNLP • Outils  Ant, Maven  Netbeans, IntelliJ IDE • Java Entreprise  Glassfish, tomcat  Servlets, jsp, beans  Persistance (JPA, Hibernate)  Facelets (JSF)  Frameworks : Struts, Spring, … 241

Notes de l'éditeur

  • Novembre 2006
  • Novembre 2006
  • Java 7 : Simplification de la syntaxe (Coin Project)
    switch, catch multiple, utilisation des <>
    Auto (un) boxing
    Nouveautés :
    NIO2
    Gestion des fichiers / répertoires (Path)
    Framework de parallélisation
    Java 8 : closures, stream, parallélisation, …
  • Java sorti en septembre 2017
  • Foreach dans un instant…
  • StringBuffer est synchronisée
    StringBuilder ne l'est pas ..
  • Scanner est déconseillé car pas tres performant
  • Enlever le set : lecture seule
  • F1b ne compile pas !!
  • Novembre 2006
  • Downcasting => compil OK, mais erreur à l'exécution
    Downcasting non vérifié … instanceof permet d'éviter
  • On peut avoir une classe abstraite sans méthode abstraite
    Passe au compilo en tout cas
  • Que des méthodes publiques … Constantes publiques ?
  • On parle aussi d'héritage multiple de type (et non d'implémentations)
  • On retrouve les problèmes du C++
  • Attention, la console n'est pas toujours définie, notamment sous les EDI
  • L'exception e est implicitement final pour faire de la relance efficace au cas ou …
  • Novembre 2006
  • Novembre 2006
  • Box : pas de wrap si redimensionnement
  • Novembre 2006
  • Novembre 2006
  • Javafx dans la doc 1.9 pas dans la 1.8
    Javafx dans la premiere version : un langage de script
  • Novembre 2006
  • Novembre 2006
  • Box : pas de wrap si redimensionnement
  • Novembre 2006
  • Exemple : empêcher une sortie d'application
  • Shape => en faire un Group
  • Novembre 2006
  • Existe depuis 1979
  • Les ressources sont fermées à la fin du catch que tout se soit bien passé ou pas.
    e.getSupressed() permet de récupérer les exceptions dissimulées.
  • StringBuffer sans +, append
  • Novembre 2006
  • Classe locale définie dans un bloc = peut accéder aux variables globales du bloc
  • Adresse du pdf pas changée au 29/09/2010

×