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

4,433 views

Published on

Support de cours de deuxième année ISIMA
Tronc commun

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,433
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
183
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 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, …
  • StringBuffer est synchronisée
    StringBuilder ne l'est pas ..
  • Scanner est déconseillé car pas tres performant
  • Enlever le set : lecture seule
  • Novembre 2006
  • On peut avoir une classe abstraite sans méthode abstraite
    Passe au compilo en tout cas
  • Que des méthodes publiques … Constantes publiques ?
  • 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
  • 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
  • Adresse du pdf pas changée au 29/09/2010
  • http://download.oracle.com/javase/tutorial/deployment/TOC.html
  • Java - Support etudiant - Tronc Commun Deuxième année ISIMA

    1. 1. http://www.isima.fr/~loic Décembre 2016 – Support étudiant
    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 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 7 ou 8  http://docs.oracle.com/javase/7/docs/api/  http://docs.oracle.com/javase/8/docs/api/ • Consulter les tutoriaux officiels • http://docs.oracle.com/javase/tutorial/
    15. 15. 15 Documentation
    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] 19 L E G A C Y
    20. 20. Aujourd’hui ? • Java 7 update 121– Plus dispo  Open JDK  Simplification de syntaxe  Framework de parallélisation • Java 8 update 112  Streams  Lambdas  Code dans les interfaces • Java 9 ? 2017 ?  Modularité 20 etud Java 7 u91 berzet Java 8 u20
    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; }
    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
    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 (1) • F hérite de M ? • Conditions  M doit être visible (publique même package)  M est dérivable (non finale) • F hérite de tous les membres protégés et publics de M sauf les constructeurs  Les membres privés ne sont jamais transmis • F n'hérite que d'une SEULE classe directe • Toute classe hérite de java.lang.Object M F
    67. 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(); }}
    68. 68. 68 public class M1 { public M1(String s) {} public M1 () {} } public class F1 extends M1 { } public class A { static void m() { F1 f1 = new F1("essai); } } final public class M2 { } public class F2 extends M2 { }
    69. 69. 69 Héritage (2) • super : ce qui vient de la classe mère • this : concerne l'objet courant public class F extends M { public F() { super(); // appel du constructeur de M // initialisations spécifiques } } super(champ1, champ2); // appel de constructeur super.methode(); super.attribut; super.super.attribut // illégal
    70. 70. 70 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 ? } }
    71. 71. 71 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 …
    72. 72. • Forme forte  Redéfinition – overriding  "Surcharge" dynamique (abus de langage)  Actions différentes pour des classes d'une même hiérarchie 72 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();
    73. 73. Voiture ? ? 73 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 ? ?
    74. 74. 74 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();
    75. 75. 75 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
    76. 76. 76 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 …
    77. 77. 77 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 ?
    78. 78. java.lang.Object • clone() • finalize() • toString() • getClass().getName() • equals() • hashCode()  Deux objets égaux ont le même hashcode  Ne doit pas changer pour une exécution  Deux objets distincts peuvent avoir le même 78 doivent être cohérentes Rappel : on ne teste pas l'égalité de deux objets avec ==
    79. 79. 79 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()
    80. 80. 80 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) Exceptions traitées au chap itre suivant
    81. 81. 81 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
    82. 82. Encapsulation & visibilité 82 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
    83. 83. 83 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
    84. 84. 84 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
    85. 85. 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++] 85 + 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
    86. 86. Interface (2) • [Vocabulaire ] IMPLEMENTER une interface • Instancier une classe ? • Polymorphisme ? 86 public class Bateau implements Flottant { public void flotter() {} public void avancer() {} }
    87. 87. 87 public class Vehicule { public void afficher() { System.out.println("Vehicule"); } public static void main(String[] param) { Vehicule v = new Voiture(); ((Voiture)v).embrayer(); ((Manuel)v).embrayer(); System.out.println(Manuel.VITESSES); }} interface Manuel { public static final int VITESSES = 5; public void embrayer(); } class Voiture extends Vehicule implements Manuel { public void afficher() { System.out.println("Voiture à boite manuelle"); } public void embrayer() { System.out.println("Embrayer manuellement"); }} classe du type de l'interface qu'elle implémente
    88. 88. 88 Interface (3) • Implémentation multiple d’interfaces • RAPPEL : Héritage simple seulement • Parade à l’héritage multiple… public class B extends A implements IC, ID { // … }
    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 • Utiliser un 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 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
    111. 111. 111 // 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
    112. 112. 6. Bibliothèques graphiques AWT & Swing Alternatives IBM : SWT / JFace
    113. 113. 113 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)
    114. 114. 114 Exemple d'application Swing
    115. 115. 115 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É
    116. 116. 116
    117. 117. 117
    118. 118. 118
    119. 119. 119
    120. 120. 120 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 :
    121. 121. • 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 121 invokeLater(new Runnable() { public void run() { // faire qq chose } });
    122. 122. 122 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)
    123. 123. 123 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
    124. 124. 124 Manipuler une fenêtre ? (2) Cas le plus général et recommandé ! L’application gère des fenêtres spécialisées !
    125. 125. 125 Boîte de dialogue simple • Classe JOptionPane • Méthodes statiques showXXXDialog  Message, Confirm, Option, Input JOptionPane.showConfirmDialog(frame, "Alors, ça vous plaît ?");
    126. 126. 126 Ouvrir une fenêtre • Afficher une application graphique simple agrégeant un JFrame • Ajouter une boite de dialogue modale
    127. 127. 127 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"));
    128. 128. 128 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
    129. 129. 129 Layout Manager (1) http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html Points cardinaux Horizontal ou vertical Complexe mais puissant Formulaire
    130. 130. 130 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
    131. 131. 131 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
    132. 132. 132 contentPane (JFrame) pane = new JPanel(); (Layouts par défaut des composants) frame.getContentPane().add(pane, BorderLayout.CENTER);
    133. 133. 133 Organisation par couches Root Pane Layered Pane Glass Pane MenuBar ContentPane Layout Manager C1 C2 … … Cn
    134. 134. 134 É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
    135. 135. É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 135 Action Regroupement fonctionnel = MouseListener
    136. 136. Activer un JButton (action) 1. Ecrire le gestionnaire 2. Enregistrer le gestionnaire 136 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
    137. 137. 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 137 ActionAdapter n'existe pas ! AbstractAction existe MouseEvent MouseListener MouseAdapter Toujours possible ? addMouseListener()
    138. 138. 138 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
    139. 139. 139 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
    140. 140. A bas les boutons (3) • Sortie propre ?  Changer le comportement par défaut  Gestionnaire • showConfirmDialog • Evénement ?  Quitter 140 FENETRE PAS ENCORE FERMEE
    141. 141. 141 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
    142. 142. 142 (0,0) y x Orientation par défaut (x1,y1) height width graphics.fillOval(x1, y1, width, height);
    143. 143. 143 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
    144. 144. 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 144
    145. 145. 1. Simuler un oscillateur "fixe" 2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal) 145
    146. 146. Solution ? 146 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()
    147. 147. Barre de menus 147 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();
    148. 148. 7. Concurrence (Threads)
    149. 149. 149 Threads (1) • Processus "léger"  Exécution simultanée / concurrence  Partage de données • 3 méthodes  Implémenter run( ) de Runnable  Déléguer à un Executor (java.util.concurrent)  Redéfinir la méthode run( ) de Thread 5
    150. 150. 150 Threads (2) // 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É
    151. 151. 151 Threads (3) • 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 start( ) pour démarrer • Méthodes interrupt( ) ou sleep( ) • L'arrêt doit être NATUREL  la méthode run( ) doit se terminer normalement  Ex : test d'une variable d'arrêt  stop( ) est obsolète
    152. 152. Threads et Swing (1) • Deux fils d’exécution  Fil du programme  Fil des événements • Fil des événements monothread  Patron MVC : concurrence difficile  Interface peut être figée facilement  Swing Worker (antérieur au patron Executor) 152
    153. 153. Threads et Swing 153 Temps FinDébut Thread des événements paint paintclic Paint + calcul très long … Calcul très long … inits gc Actions simples successives Blocage de l'interface Paint + calcul long … Calcul en arrière-plan : interface libre
    154. 154. • 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 154 Interface graphique & tâche longue
    155. 155. Éléments de réponse (1) 1. Dessiner directement dans paintComponent() 2. Dessiner dans une image  Créer une image  Dessiner dans l’image  Afficher l’image 3. Mise en place du thread  Exporter le dessin de l’image dans le run() d’une tâche  Dans paintComponent() : Image à dessiner ? • Non : lancer le calcul (lancement d’un thread) • Oui : afficher l’image 155 Toujours dans paintComponent()
    156. 156. Éléments de réponse (2) • BufferedImage  TYPE_INT_ARGB  graphics.drawImage(img, 0, 0, null); • Une seule méthode quitter() appelée  JOptionPane.show…  System.exit() 1. Par l’item du menu - ActionListener 2. Par le clic sur la souris – WindowListener • JFrame.DO_NOTHING_ON_CLOSE 156
    157. 157. 157 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)
    158. 158. Exemple 158 Modèle Contrôleur Vue 2 Vue 1
    159. 159. 159 Modèle Contrôleur Transmet l’action Vue Vue Vue (s) Rafraîchissement Données Changement d’état Notification changements (Observer) Action utilisateur
    160. 160. 8. Fichiers & Flux Sérialisation
    161. 161. 161 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)
    162. 162. 162 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
    163. 163. 163 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.*
    164. 164. 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 164 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
    165. 165. Flux d’entrée 165 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
    166. 166. 166 // 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
    167. 167. 167 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();
    168. 168. 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 168 7 7
    169. 169. 169 // 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.
    170. 170. 170 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
    171. 171. 171 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
    172. 172. 172 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
    173. 173. 173 Sérialisation en XML • XMLEncoder pour les objets respectant les conventions NetBeans • X-Stream pour les autres ;-)  Une bibliothèque tiers sur github
    174. 174. 174 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
    175. 175. TP "Houzehou" 175 • Manipulation de classes et d'interfaces • Conteneurs • Fichiers textes • Javadoc • JTable de Swing
    176. 176. 176 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());
    177. 177. 177 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
    178. 178. 178 Éditions Ça aussi c'est important
    179. 179. 179 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
    180. 180. Langage
    181. 181. 181 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, inner class • Pas de membres statiques • N’existe qu’avec une instance de la classe  Classe locale (définie dans une méthode)  Classe anonyme (locale sans nom)
    182. 182. 182 Conventions (1) • Documentation officielle • Tutoriaux SUN/Oracle • Respect à l'écriture, facilité de lecture • Production rapide • Intégrée dans les EDI classiques  Formatage automatique dans Eclipse (CTRL+i)
    183. 183. 183 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();
    184. 184. 184 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()
    185. 185. 185 É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;
    186. 186. 186 É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
    187. 187. 187 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
    188. 188. 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, … 188 5
    189. 189. Annotations standards • @Override • @SuppressWarnings  @SuppressWarnings(value="deprecation")  @SuppressWarnings("deprecation")  @SuppressWarnings({"unchecked", "deprecation"}) • @Deprecated • @Documented  Documentation • @Retention(RetentionPolicy.RUNTIME)  Exécution
    190. 190. 190 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
    191. 191. Annotations personnalisées 191 @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
    192. 192. Méthode à nombre d'arguments variable 192 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
    193. 193. Auto [un] Boxing • Conversions automatiques • AutoBoxing  attention à la création implicite d'objets • Auto unboxing 193 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
    194. 194. Généricité & Collections
    195. 195. 195 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
    196. 196. 196 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
    197. 197. 197 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
    198. 198. Collection (2) 198 «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
    199. 199. 199 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
    200. 200. 200 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();
    201. 201. 201 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
    202. 202. 202 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
    203. 203. Applet
    204. 204. 204 Applet / Appliquette • Embarquée dans une page Ouaib  Butineur  Outil appletviewer  Java plug-in  Bientôt obsolète ? (HTML5) • Différent d'une application autonome  Sécurité renforcée (Gestionnaire de sécurité) : Fichiers inaccessibles sauf JNLP (Java 6u10)  Gestion du son • Classes : Applet ou JApplet (Swing)
    205. 205. 205 Code HTML • Contient une balise décrivant l'applet à exécuter  Dans un fichier .class  Dans un fichier .jar <applet code="Exemple.class" codebase="." archive="ex01.jar, ex02.jar" width="600" height="95"> <param name="param1" value="1000"> <param name="nom" value="loic"> </applet>
    206. 206. 206 Code JAVA • Permet de récupérer un paramètre du fichier HTML • Méthodes liées à la vie de l'applet  init()  destroy() • Méthodes liées à l'exécution de l'applet  start()  stop() public String getParameter(String)
    207. 207. Outils
    208. 208. 208 Outils 1. javadoc 2. appletviewer 3. jar 4. Netbeans
    209. 209. 209 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 ! /** */
    210. 210. 210 javadoc ? • Commentaires spéciaux • Personnalisation avec code HTML ou CSS • Balises  @param  @return  @throws @exception  @see  @since  @deprecated  @author /** */ Eclipse : (M) Project > Generate Javadoc
    211. 211. 211 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) {} }
    212. 212. 212 Appletviewer Exécuter une applet sans butineur appletviewer page.html Attention au gestionnaire de sécurité !
    213. 213. 213 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
    214. 214. 214 Déployer une application JAVA • Utilisation intensive de JAR • Exécution protégée (sandbox) • Sécurité (Java Network Launching Protocol) • Java Web Start (>1.4)  Pour les applications standalone  Simple clic dans un page Web • Java Plug-in  Pour les Applets http://download.oracle.com/javase/tutorial/deployment/index.html
    215. 215. 216 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/
    216. 216. 217 Bibliographie (2) • Thinking in Java, 2nd ed, Bruce Eckel • Head First Java, 2nd ed, Kathy Sierra, Bert Bates , O'Reilly, 2005
    217. 217. 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, … 218

    ×