java isima 2011c etudiant
Transcript of java isima 2011c etudiant
1
Décembre2011
Éditions
Tout ce qu'il faut savoir !!!
Tout ce qu'il
faudrait savoir !!!
Version étudianteF. ChadebecqB. ChapelA. HarbR. MartinL. Yon
http://www.isima.fr/~loic 2
AVERTISSEMENT
THESE SLIDES ARE RATED ZZTHESE SLIDES ARE RATED ZZTHESE SLIDES ARE RATED ZZTHESE SLIDES ARE RATED ZZ
• La page de garde est honteusement copiée des ouvrages des éditions First.• Ce cours est libre et réutilisable pour tout à chacun sous la licence EMAILCOUCOUWARE ;-)
• Le support original est présenté dans un cours• Certains transparents comportent volontairementvolontairementvolontairementvolontairement des erreurs. Certaines peuvent aussi être involontaires• Il est fortement recommandé d'essayer les exemples proposés.
3
Objectifs
• Écrire un programme JAVA
• Utiliser les concepts objets avec JAVA
• Concevoir des IHM
• Syntaxe C/C++
• Concepts objets
Pré-requis
4
Cadre
• Le Java vu par SUN et uniquement
• Préparer les premières certifications
• Exception : utiliser l'EDI Eclipse
• Présence
• Examen final
Évaluation
5
Plan
1. Introduction
2. Premier programme
3. Notions de base & syntaxe
4. Concepts objets en Java
5. Les exceptions
6. IHM : AWT & Swing
7. Concurrence (Threads)
8. Fichiers & flux, sérialisation
+ Compléments
1. Introduction
7
Introduction
• Langage
• Machine virtuelle
• Plateforme
• Île ?
• Javascript (ECMA) ?
8
Motivations
• Simple
• Sécurisé (réseaux, Internet)
• Portable
• Performant
9
Et alors ?
• Langage proposé par (1995)
• Tout objet
� Constantes ?
� Variables globales ?
� Fonctions globales ?
Tout est encapsulé dans des classes
2. Premier programme
11
Premier programme
/** ma première classe */public class Exemple{
}Fichier source (texte) Exemple.java
public static void main (String[] argv) {
// afficher un messagejava.lang. System .out.println(”Bonjour”);
}
12
Pour voir le résultat…
1. Compiler le programme
javac Exemple.java
java Exemple
.exe ? .class ?
2. Lancer le programme
13
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
14
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 ?
15
Exécution
java Exemple
• Pseudo-code interprété par la JVMJava Virtual Machine
• voire compilé en natif à la volée (JVM hotspot)
• Programme seul embarqué dans (standalone) une page HTML (applet)
� Différences : son, sécurité (gestionnaire)
• Processeur JAVA (Smart Cards)
• Portabilité totale si bonne JVM
16
Exercice
• Tester le programme Exemple
• Consulter la documentation
� Google : java documentation api 7
� http://download.oracle.com/javase/7/docs/api/
• Consulter les tutoriaux officiels• http://download.oracle.com/javase/tutorial/
17 18
Documentation
19
Paquetage / package (1)
• Un ensemble de classes/fichiers rassemblés pour une finalité besoin fonctionnel
• [C++] espace de nommage
• Différents types :
� Par défaut (java.lang)
� Standard (gestion E/S, graphisme)
� Personnel / Tiers
20
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)
• Nom en chemin d’un package� Mécanisme arborescent comme les répertoires� Séparateur : le point
• Retrouver les chemins : classpath� Variable système,� Paramètres en ligne de commande (-cp ou –classpath)
21
Clause import
• Spécification complète d’une classe d’un package qui n’est pas chargé par défaut� Ex : javax.swing. SwingUtilities
• Facilité : clause import
• Liste des classes utilisées� Énumération à l’unité� Import automatique (*) non récursif ;-(
import java.io.StreamTokenizer;import javax.swing.*;import javax.swing.event.*;import nom_ccomplet_lasse;
22
Plateforme (1)
• Packages « standards »
• Relativement à une version de java
� 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
java –showversionjavac -version// version > 1.3, options : –source et -target
23
Plateforme (2)
• Relativement à une version de java
� 1.4 – performances - nio
� 1.5 - patrons / templates [2004]
• 3279 classes
� 1.6 – sécurité, scripts, performance [2006]
• 3795 classes
Java 7
• Sorti en juillet 2011
• Attendu depuis 4 ans
• Simplification de la syntaxe (Coin)
� switch, catch multiple, utilisation des <>
• NIO2
• Gestion des fichiers / répertoires (Path)
• Framework de parallélisation
24
25
Java en 2011 ?
• Rachat de Sun par en 2010
• Concurrents :
� Plateforme .net, C#
� Frameworks comme RubyOnRails
• Java FX
� Concurrents : Adobe Air, Microsoft Silverlight
• Vers Java 7 open source GPL8
26
Plateforme (3)
���� Plus grosse difficulté du javaconnaître ces classes standardsclasses deprecated
☺☺☺☺ Documentation bien faite (javadoc)
• 2 versions distribuées� Exécution seule (JRE)
� Développement (JDK < 2, SDK v ≥ 2)
• Autres dénominations� J2SE, J2EE, J2ME - standard, entreprise, micro
� Java SE, Java EE, Java ME (v ≥ 5)
3. Notions de base
Syntaxe
public class Exemple{
}
{ Accolades }
• Classe
• Méthode
• Bloc : ensemble séquentiel d’instructions28
public static void main(String [] argv) {
// afficher un commentaire monoligne/* commentaire
sur plusieurs lignes *//** commentaire javadoc */
}
29
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
30
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)
31
Types de données scalaires (2)
• Normalisés (portabilité)
• Doublés par des types objets : � Double
� Integer
• Méthodes• toString()
• Double.parseDouble()
32
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[] tableau ;
}
33
{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;
}}
34
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;}
35
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
36
Condition (2)
if ( test) instruction1;else instruction2;
if (b1) …if (!b1)… Opérateur NON
if (b1 || b2) … Opérateur OUif (b1 && b2) … Opérateur ET ALORS
Une séquence de test n’est pas complètement évaluéesi ce n’est pas nécessaire.
37
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
38
Boucles conditionnelles
for (initialisation;test;incrémentation) { …
}
while ( test) { …
}
do {…
} while ( test);
for (int i=0;i<10;++i) System.out.println(i);
Accolades facultatives s'il n’y a qu'une instruction
39
{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é…
40
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 entiersint[] t1 = new int[10]; // déclaration d'un tableau sans élémentsint[] t2;
for(int i=0; i<t1.length; ++i) System.out.println(t1[i]);
41
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] = ?;
42
Chaîne de caractères (1)
• String ≠ char[]
• statique String• dynamique 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
43
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 s3 = s1 + " " + s1;
44
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));
Manipulation de chaînes
45
// Un peu vieux, utiliser plutôt split// Scanner ou java.util.regexStringTokenizer 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]);
46
« 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
47
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
// s’il manque la méthode main, à l’exécutionException in thread "main" java.lang.NoSuchMethodError : main
4. Concepts objets
Déclaration d'une classe
• Moule / Modèle / Fabrique à objets
• Caractéristiques / Attributs
• Messages / Méthodes
• Nom unique (package)
• Relation entre les objets
49 50
Exemple
public class ExempleSimple { …
}
class Voiture {…
}
class Camion {…
}
51
Contenu de la classe
• Attributs� D’instance
� De Classe
• Méthodes � D’instance
� De classe
• Constructeur(s)
• Instructions au chargement de la classe
52
Attributs
• Listés n'importe où (début de classe préférable)
• Valeurs par défaut ( ≠ variables locales)
• D’instance
• De classe
� Accessibles sans créer d’objet
� Initialisés à la déclaration ou bloc spécial
static int compteur = 0;
String chaine;int entier;
53
Méthodes
• D’instance
• De classe
� Accessibles sans créer d’objet
� Ne peut PAS accéder aux attributs d’instance
• Pas de valeur par défaut des paramètres [C++]
static int getCompteur() { return compteur;}
String getNom() { return "NOM"; }int max(int a, int b) { return a<b?b:a; }void traitement() {}
54
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)
55
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() )
public class Cours {
}56
int nb_etudiants;boolean passionnant;
public Cours() {this(0);
}public Cours(int n) {
setNbEtudiants(n);}
public void setNbEtudiants(int n) {nb_etudiants = n;
}public int getNbEtudiants() {
return nb_etudiants;}
public boolean isPassionnant(){ return passionnant; }
57
Objectif : 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 relation2. Instancier des classes3. Étudier l'héritage et le polymorphisme4. Étudier les autres relations
1 - Créer les classes
• Où mettre le main() ?
• Quelles classes compiler ?
• Quelle classe exécuter ?58
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 ?)
59
public class Gestion1 {// classe pour le programmepublic static void main(String[] a) {}
}
class Voiture {String immat;Voiture() {}void avancer() {}
}
class Camion {int capacite;Camion() {}void avancer() {}
}
public class Gestion2 {// classe pour le programmepublic 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() {}
}60
Dans des répertoires différents…
• Visibilité au niveau package
� 1 package ≡ 1 répertoire
• Si la classe n'est pas dans le répertoire courant
• Fichiers jar
61
java –jar fichier.jar
javac –cp chemin Classe.javajavac paquetage.Classe.javajava -cp chemin Classe
62
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
63
Créer une instance
• 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 )
64
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é)
65
Accéder aux membres
• 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;
66
2- Créer des objets
• Créer quelques voitures avec des attributs différents
• Créer quelques camions avec des attributs différents
• Appeler les méthodes des objets ainsi créés• Constructeurs ? Accesseurs ?
double d = 1.0;float f = 2.0f;
// constructeur proposé par défautpublic Voiture() { immat = null;}
public Voiture(String im) {immat = im;
}
67
public Voiture() {immat = "0000 AA 00";
}
Voiture v = new Voiture();
Voiture v = new Voiture("300 ISI 63");
public String getImmat() {…}public void setImmat(String im) {…}
Encapsulation (1)
• Protéger les attributs de l'extérieur
public / package (par défaut) / privé
68
// classe A avec encapsulation briséeclass A {
public int valeur;public A(int i) { valeur = i;}
}
A a = new A(2);a.valeur = 5;
Encapsulation (2)• Changer l'implémentation de la classe
≠ changer l'interface de la classe
69
// classe A avec encapsulationclass AE {
private int valeur;public AE(int i) { setValeur(i);}final public int getValeur() { return valeur; }final public void setValeur(int v){ valeur = v; }
}
AE ae = new AE(0);ae.setValeur(3);ae.valeur = 5;
70
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
71
Au chargement de la classe…
• Instructions spécifiques exécutées au chargementde la classe dans la JVM
� Pas à l'instanciation d'objet
� Plus général que l'initialisation des attributs statiquesstatic int[] tab = new int[100];
class Exemple {static int[] tab;static {
// exécuté au chargement de la classetab = new int[20];for(int i=0; i<20; ++i) tab[i] = 2*i;
}}
72
Héritage (1)
• F hérite de M ?
• Conditions
� M doit être visible (publique même package)
� M n’est pas 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
73
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 constructeursuper.methode();super.attribut;super.super.attribut // illégal
74
Référence thispublic 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("","");
}}
75
Noms qualifiés
class M {protected int a;
} public class F extends M {
protected double a;public void toto() {
athis.asuper.a((M)this).a((F)this).a
}}
76
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();
• Forme forte
� Redéfinition – overriding
� "Surcharge" dynamique (abus de langage)
� Actions différentes pour des classes d'une même hiérarchie
Voiture
?
?
77
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
?
?
78
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();
79
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
80
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 ?
81
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 ?)
• Méthodes finales
� Non redéfinissables dans les classes filles
� Plus rapides que les méthodes virtuelles
� Conseil : accesseurs en final
• Le dernier mot : la JVM hotspot …
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
82
doivent être cohérentes
83
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’Objectest également appelée en haut de l’échelle
• Traiter les exceptions dans clone()
84
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 primitifsCopie des référencesObjets non mutables (String)
85
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
Encapsulation des membres
public class c1 {public int A;
protected int B;int C;
private int D;}
public class c3 {
...}
public class c5 {...
}
A B C DAccessible 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 87
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
88
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 {}
abstract class Voiture2a extends Vehicule2 {}
Interface (1)
• "Classe virtuelle pure"� Pas de code� Pas de variable/attribut (UML)� "Constantes" autorisées (public| package static final)
• Toutes les méthodes sont abstract par défaut• [Vocabulaire ] IMPLEMENTER une interface
89
+ flotter()
+ avancer()
<<interface>>
Flottant
interface Flottant {public static final int CONSTANTE = 30;
public void flotter();public void avancer();
}
Héritage multiple ?
90
étend
implémente
interface
Relation non symétrique= raison fonctionnelle
class H extends A, B {…
}
class H extends A implements F {…
}
91
C++ : • héritage virtuel• conflit de méthode ?
+ avancer()
Véhicule
avancer()?
+ flotter()
+ avancer()
<<interface>>
Flottant
pas de conflit
+ avancer()
Véhicule
92
Interface (2)
• Réponse à l’héritage multiple
• Instancier une classe ?
• Polymorphisme ?
Implémenter TOUTES les méthodes des interfaces qu’elle utilise
la classe est du type de l'interface qu'elle implémente
public class B extends A implements IC, ID {// …
}
93
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");
}public void embrayer() {
System.out.println("Boite manuelle");}}
classe du type de l'interface qu'elleimplémente
94
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
95
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 obligatoireanimaux = new Animal[NB_ANI];
}public void placerAnimal(int i, Animal a) {
// if ((i>=0) && (i<NB_ANI))animaux[i] = a;
}public static void main(String[] chaines) {
Zoo zoo = new Zoo();zoo.placerAnimal(0, new Animal("lion"));
}}class Animal {
String nom;// public Animal() { nom="INCONNU"; }public Animal(String nom) {
this.nom = nom; }}
Zoo Animal
96
// ajouter dans la classe Zoopublic Animal quelAnimal(int i) {
return animaux[i];}
// ajouter dans la class Animalpublic void afficher() {
System.out.println(nom);}
// ajouter dans la methode main()zoo.quelAnimal(0).afficher(); // c'est bon// c'est la meme chose que d'écrire// zoo.animaux[0].nom// si animaux et nom sont publicszoo.quelAnimal(1).afficher(); // NullPointerzoo.quelAnimal(60).afficher(); // ArrayOutOfBounds
97
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
98
Résumé
• Héritage simple seulement
• Implémentation multiple d’interfaces
• Toutes le 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}* ] {
}
5. Exceptions
100
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 exceptions101
Double.parseDouble(chaine);
un doubleune
exception
Cas normal Cas "exceptionnel"
Comportement adapté
Reporter l'erreurau niveau supérieur
• Surveiller le code• Traiter l'erreur
OBLIGATION DE TRAITER UNE EXCEPTION
"10.5""dix"
Attraper une exception
102
public void methode() {
try {// bloc à surveillerres = Double.parseDouble(chaine);total += res;
} catch (NumberFormatException e) {System.out.println(e.getMessage());// ou e.printStackTrace();
} finally {// Clause TOUJOURS exécutée
}}
Déléguer le traitement
103
public void methode() throws NumberFormatException {
res = Double.parseDouble(chaine);total += res;
}
public void methode_appelante() {
methode();
}
104
Diviser par 0
• Faire une division par zéro avec deux variables entières PUIS afficher le résultat de 22-11
• Que se passe-t’il ?
• Mettre en place le mécanisme d’exception pour attraper l'exception arithmétique.
int n = 10;int d = 0;System.out.println(n/d);
à la taille du bloc try
Hiérarchie des exceptions
105
Exception
IOException RuntimeException
NullPointerException
IndexOutOfBoundsException
FileNotFoundException
Gestion différenciée
106
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();}
Nouvelle syntaxe
107
try {// bloc à surveiller
} catch (NumberFormatException e) {e.printStackTrace();
} catch (IOException) {e.printStackTrace();
}
try {// bloc à surveiller
} catch (NumberFormatException |IOException e ) {
e.printStackTrace();}
Même traitement
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
• Utilité avec un langage doté d'un ramasse-miettes ???
� Rendre les ressources
� Fermer des fichiers, par exemple
• final CATCH …108
109
Exception personnalisée
• Exception dérive de Throwable� Error
� Exception
• Dériver d’Exception� Surcharger Constructeur (String message)
� OU Redéfinir getMessage()
• Lancer une exception
throw new MonException();
110
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;
}}
111
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
112
// 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;
}
6. Bibliothèques graphiques AWT & Swing
114
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)
115
Exemple d'application Swing
116
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 Swinghttp://download.oracle.com/javase/tutorial/ui/featu res/components.html
• Apparence / système (Look & Feel) NON ABORDÉ117
118 119 120
121
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 );
javax.swing.SwingUtilities.invokeLater(new Runnable () {public void run() {
}});
JFrame.setDefaultLookAndFeelDecorated(true);
Exemple du tutoriel officiel Sun/Oracle sur Swing :
• Classe imbriquée dite anonyme
• Spécialise la classe donnée ouimplémente l'interface donnée
• Déclarée à la volée / utilisée qu'une seule fois
• Compilée avec un nom arbitrairenomclasseenglobante$nombre.class
122
invokeLater(new Runnable() {public void run() {
// faire qq chose}
});
123
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. Membre de classe (agrégation)
3. Spécialisation de classe
124
public class MonFrame extends JFrame{public MonFrame() {
super("Mon application");}
static public void main(String[] argv) {MonFrame mf = new MonFrame();
mf.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 3
public void afficher() {pack();setVisible(true);
}
Cas 2
125
Manipuler une fenêtre ? (2)
Cas le plus général et recommandé !L’ application gère une fenêtre spécialisée !
126
Boîte de dialogue simple
• Classe JOptionPane
• Méthodes statiques showXXXDialog� Message, Confirm, Option, Input
JOptionPane.showConfirmDialog(frame,"Alors, ça vous plaît ?");
127
Ouvrir une fenêtre
• Afficher une application graphique simple agrégeant un JFrame
• Ajouter une boite de dialogue modale
128
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 HelloWorldSwingframe.getContentPane().add(new JLabel("2"));
129
Positionnement
• Placer des composants� Taille (fixe, minimale, maximale et préférée)
� Position relative (portabilité)
� Position absolue (extension JBuilder)
• 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
130
Layout Manager (1)
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html 131
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
132
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)));
133
contentPane (JFrame) pane = new JPanel();
(Layouts par défaut des composants) 134
Organisation par couches
Root Pane
Layered Pane
Glass Pane
MenuBar ContentPane
Layout Manager
C1 C2 … … Cn
135
Événements
• Communication entre les composants d'une application et avec l'utilisateur� Envoi de messages
• Gestion des événements incompatible entre AWT et Swing
• Réaction au moindre événement� Action� Souris ? (déplacement, clic, action)� Clavier ? (appui, focus)� Fenêtre ? (déplacement, visibilité)
136
Gestionnaire d'événements
• Surveiller (écouter) les messages/événements
• Délégation des actions à réaliser
• Dépendant des objets manipulés
1. Écrire le gestionnaire
� Implémentation de Listener (interface)
� Spécialisation d'Adapter (classe)
2. Enregistrer le gestionnaire
OU
137
Appuyer sur un bouton
// Ecrire le gestionnaireclass Gestionnaire implements ActionListener {
public void actionPerformed(ActionEvent e) {// ce qu'il y a à faire
}}
// enregistrement du gestionnaireJButton bouton = new JButton("Libellé");bouton.addActionListener(new Gestionnaire());
class Gestionnaire extends AbstractAction {public void actionPerformed(ActionEvent e) {
// ce qu'il y a à faire}
}
OPTION 1
OPTION 2
ACTION
138
Essayer
• Choisir un des deux gestionnaires
• Afficher une boite de dialogue de type Message à l'appui d'un bouton
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 ?
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
A bas les boutons … (2)
• Bouton ?1. Spécialiser JButton pour compter
2. Utiliser JButton directement
• Gestionnaire ?
1. Un pour tous les boutons
2. Un par bouton
JButton : setText ()setLabel()
Integer : parseInt()
MonBouton
#compteur : int
+ MonBouton();+ incrementer();
JButton
event.getSource()
142
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, transformations143
(0,0)
y
x
Orientation par défaut
(x1,y1)
height
width
graphics.fillOval(x1, y1, width, height);144
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
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
145
1. Simuler un oscillateur "fixe"
2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal)
146
Solution ?
147
C
contentPane (JFrame)JButton
+ gestionnaire (Action)appelle repaint() de la zonede 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()
Barre de menus
148
Fichier
NouveauOuvrirSauvegarder
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();
Zone spéciale ≠ BorderLayout.NORTH
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 : VEP
149
Choix arbitraire mais obligatoire pour les TPs et mini-projets
7. Concurrence (Threads)
151
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
152
Threads (2)
// Exemple avec implémentation d'interface// Modélisation : créer une nouvelle tâcheclass 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 Threadclass Special extends Thread {}
Special special = new Special();special.start();
CONSEILLÉ
153
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
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)
154
Threads et Swing
155
Temps
FinDébut
Thread des événements
paint paintclic
Paint + calcul très long …
Calcul très long …
inits gc
Actions simplessuccessives
Blocage del'interface
Paint + calcul long …
Calcul en arrière-plan : interface libre
• "Rafraîchir " par menu
• "Quitter?" par le menu et la croix
• Dessiner dans une image (BufferedImage)
• Dessiner par thread (Runnable ou SwingWorker)� Rafraîchir ne doit plus faire un nouveau dessin
� Menu pour faire une nouvelle toile ;-)
• Gérer le redimensionnement 156
Dessiner avec la composante alpha=> bloquer l'interface
Coder avec un EDI !
É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
157
Toujours danspaintComponent()
Éléments de réponse (2)• 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
• BufferedImage
� TYPE_INT_ARGB
� graphics.drawImage(img, 0, 0, null);
158 159
Modèle MVC
• Modèle / Vue / Contrôleur
• Logique applicative vs présentation
• Design(s) pattern(s) / Patron de conception
� Communément adopté
� Pas trivial du tout
� A éviter sur les trucs simples
� Adopté par Swing (Table <-> TableModel)
160
Modèle
Contrôleur
VueVueVue (s)
8. Fichiers & Flux
Sérialisation
162
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)
163
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
� Path164
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 « Elements de programmation JAVA », Olivier Dedieu, INRIA
java.io.*
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
165
OutputStream
PrintStreamFileOutputStreamfichier sortie
flux texteconversion
System.out
flux sortieconversion
DataOutputStreamflux binaire
PrintStreamDataOutputStream
flux écran
Tiré de http://www.nawouak.net, B. Bachelet
Flux d’entrée
166
InputStream
InputStreamReader
FileInputStream
flux texte
(caractère par caractère)
System.in
flux entréeconversion
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 167
// Version 1 standard// Attention aux exceptions soulevéesInputStreamReader 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 ConsoleSystem.console().readLine();
System.console() == null sous Eclipse !168
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
169
Sérialisation (2)
void writeObject (ObjectOutputStream out)throws IOException;
void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException;
void readObjectNoData () throws ObjectStreamException;
FileOutputStream/FileInputStreamObjectOutputStream/ObjectInputStream
Flux (streams) à utiliser …
Méthodes à redéfinir pour un comportement particulier
170
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
171
Sérialisation en XML
• XMLEncoder pour les objets respectant les conventions NetBeans
• XStream pour les autres ;-)
� Une bibliothèque tiers
172
FileOutputStream fos = null;XStream xstream = null;try {
fos = new FileOutputStream(name);xstream = new XStream();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(); objects = ( Composite ) xstream.fromXML(fis));
} catch (Exception e) {e.printStackTrace();
} finally {if (fis!=null) fis.close();
}
Classe de l'objet
TP "Agenda Simple"
173
• Manipulation de classes et d'interfaces• Fichiers textes• Javadoc• JTable de Swing
174
Agenda Personne
// tableau statiquestatic int MAX = 50;Personne[] p1 = new Personne[MAX];p1[0] = new Personne();
// tableau dynamique (Legacy ou 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);
175
Éditions
Tout ce qu'il faut savoir !!!
Ça aussic'est
important
176
Plan
• Plus d'exemples avec JAVA
� Enumération, nouveautés 5 et 6
• Généricité & collections
• Applet
• Outils
• Sur un complément : JNI, JDBC
Langage
178
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)
179
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)
180
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();
181
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()
182
É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;
183
Énumération
http://download.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
184
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);}
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, … 185
Annotations standards
• @Override
• @SuppressWarnings
� @SuppressWarnings(value="deprecation")
� @SuppressWarnings("deprecation")
� @SuppressWarnings({"unchecked", "deprecation"})
• @Deprecated
• @Documented
� Documentation
• @Retention(RetentionPolicy.RUNTIME)
� Exécution186
187
class Mere {public void methode() {
System.out.println("Methode de Mere");}
}
class Fille extends Mere {@Overridepublic 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
Annotations personnalisées
188
@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.htmlhttp://www.jmdoudoux.fr/java/dej/chap010.htm#annotations
Méthode à nombre d'arguments variable
189
public void somme( double … nombres) {double s = 0.0;
// méthode classiquefor(int i=0; i < nombres.length ; ++i)
s += nombres[i] ;
// nouvelle forme de forfor (double nb: nombres) s+= nb;
}
Auto [un] Boxing
• Conversions automatiques
• AutoBoxing
� attention à la création implicite d'objets
• Auto unboxing
190
int n = nombre; // converti automatiquementint n = nombre.intValue();
Integer nombre = 10; // conversion automatiqueInteger nombre = new Integer(10);
Avertissements / Erreurs possibles sous Eclipse
Généricité &
Collections
192
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
193
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);}
194
Collections (1)
• Gérer des collections dynamiques d'objets
� Conteneurs non générique d'objets de classe Object
� Conteneurs génériques (Java 1.5+)
� Incompatibilité de plateforme
• Algorithmes
� Tri
� Recherche
� Manipulation
• Paquetage java.util
Options –source et -target
http://download.oracle.com/javase/tutorial/collections/index.html
Collection (2)
195
«interface»
CollectionT
«interface»
Set«interface»
List«interface»
QueueT T T
«interface»
SortedSetT
«interface»
MapK,T
«interface»
SortedMapK,T
«implémente»
«implémente»
«implémente»
Set : pas de doublonsQueue : FIFO par exMap : table de hachage
Vector
196
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 Mapplutôt que Dictionary
197
Exemple (non générique)
Vector v = new Vector();// on en peut stocker que des objets, int est exclu
for (int i=0; i<10; ++i)v.addElement(new Integer (i));
// transtypage obligatoireint somme = 0;for (int i=0; i<10; ++i)
somme += ( (Integer) v.elementAt(i)).intValue();
// avec une énumérationEnumeration e = v.elements();while (e.hasMoreElements())
somme += ((Integer)e.nextElement()).intValue();
198
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éeEnumeration<Integer> e = v.elements();while (e.hasMoreElements())
somme += e.nextElement().intValue();
199
Nouveau for
ArrayList<Integer> al = new …; // Collectionint s = 0; // somme
for(int i =0; i< al.size(); ++i) {s += al.get(i).intValue();
}
for(Integer i : al) {s += i.intValue();
}
Applet
201
Applet / Appliquette
• Embarquée dans une page Ouaib� Butineur
� Outil appletviewer
� Java plug-in
• 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)
202
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>
203
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)
Outils
205
Outils
1. javadoc
2. appletviewer
3. jar
4. Netbeans
206
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 !
/** */
207
javadoc ?
• Commentaires spéciaux• Personnalisation avec code HTML ou CSS• Balises
� @param� @return� @throws @exception� @see� @since� @deprecated� @author
/** */
Eclipse : (M) Project > Generate Javadoc
208
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) {}}
209
Appletviewer
Exécuter une applet sans butineur
appletviewer page.html
Attention au gestionnaire de sécurité !
210
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
211
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.html213
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/
214
Bibliographie (2)
• Thinking in Java, 2nd ed, Bruce Eckel
• Head First Java, 2nd ed, Kathy Sierra, Bert Bates , O'Reilly, 2005
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, …
215