SlideShare una empresa de Scribd logo
1 de 241
http://www.isima.fr/~loic
Janvier 2018 – Support
2
Objectifs
• Écrire un programme JAVA
• Utiliser les concepts objets avec JAVA
• Concevoir des IHM
• Syntaxe C/C++
• Concepts objets
Pré-requis
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
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
Plan
1. Premier programme 8
2. Notions de base & syntaxe 23
3. Concepts objets en Java 44
4. Les exceptions 94
5. IHM : AWT & Swing ou JavaFX 108
6. Concurrence (Threads) 144
7. Fichiers & flux, sérialisation 155
HS Compléments 173
6
Introduction
• Langage
• Machine virtuelle
• Plateforme
• Île ?
• Javascript (ECMA) ?
7
Motivations
• Langage créé en 1995
 Patrick Naughton
 James Gosling
• Simple
• Sécurisé (réseaux, Internet)
• Portable
• Performant
Concepts difficiles du
C++ évacués
2. Premier programme
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
Pour voir le résultat…
1. Compiler le programme
javac Exemple.java
java Exemple
.exe ? .class ?
2. Lancer le programme
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
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 ?
• 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
Exercice
• Tester le programme Exemple
• Consulter la documentation
 Google : java documentation api 8 ou 9
 https://docs.oracle.com/javase/7/docs/api/
 https://docs.oracle.com/javase/9/docs/api/
• Consulter les tutoriaux officiels
• https://docs.oracle.com/javase/tutorial/
Documentation
15
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
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
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.*;
• 1.0 (1.1) – applet , jni, awt [1995]
 236 classes pour 1.0.2
• 1.2 – swing (version 2) [1998]
 1524 classes
• 1.3 – débogage [2000]
• 1.4 – performances – nio [2002]
• 1.5 - patrons / templates [2004]
 3279 classes
• 1.6 – sécurité, scripts, performance [2006]
 3795 classes
• Acquisition de Sun par [2010]
• 1.7 – open JDK - 4024 classes [2011]
• 1.8 – 4240 classes [2014]
19
L
E
G
A
C
Y
Aujourd’hui ?
• Java 8 update 151
 Streams
 Lambdas
 Code dans les interfaces
• Java 9 update 1
 Modularité
 JShell
 Performances
20
etud
Berzet
classe ⊂ package ⊂ module
21
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
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)
3. Notions de base
Syntaxe
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
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
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
Types de données scalaires (2)
• Normalisés (portabilité)
• Doublés par des types objets :
 Double
 Integer
• Méthodes
•toString()
•Double.parseDouble()
28
Déclaration de variables
• N'importe où dans le bloc
• Initialisation d'une variable pas automatique
 Erreur : "might not be initialized"
public static void main(String[] argv) {
int i = 0;
char c = 'A';
Classe objet;
String s;
double d = 1.0;
float f = 1.3f;
double[] tableau;
}
Référence
(pointeur)
Référence
(pointeur)
29
{
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
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
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
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
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
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
{
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
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
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
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
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);
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
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 (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
« 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
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
4. Concepts objets
Déclaration d'une classe
• Moule / Modèle / Fabrique à objets
• Caractéristiques / Attributs
• Messages / Méthodes
• Nom unique (package)
• De classe /d’instance
• Visibilité et encapsulation
• Relations
46
Java 9 change
pas mal de choses …
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
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
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 {
}
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
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
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()
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
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
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
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.
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
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;
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
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
// 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
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é)
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
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
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
Héritage
• F hérite de M / dérive de M / spécialise M
• Héritage SIMPLE seulement
M
F
public class F extends M {
public F() {
super(); // appel du constructeur de M
// initialisations spécifiques
}
}
public class M {
public String att1;
protected String att2;
private String att3;
public void methode1() {…}
protected void methode2() {…}
private void methode3() {…}
}
public class F extends M {
}
public class A {
static void m() {
F f = new F();
f.methode1();
}}
Héritage
sélectif
67
Conditions pour l'héritage
• M doit être visible de F (public ou même package)
• M doit être dérivable (non finale)
68
class M1 {
public M1(String s) {}
public M1 () {}
}
class F1 extends M1 {
}
public class A {
static void m() {
F1 f1a = new F1();
F1 f1b = new F1("essai");
}
}
final class M2 {
public M2() {}
}
class F2 extends M2 {
}
java.lang.Object (1)
• clone()
• finalize()
• toString()
• getClass().getName()
 Connaître à l'exécution le nom de la classe
69
Classe@hashcode
objet instanceof Classe
java.lang.Object (2)
 Deux objets égaux ont le même hashcode
 Ne doit pas changer pour une exécution
 Deux objets distincts peuvent avoir le même
 Souvent l'adresse mémoire de l'élément
70
== ne teste pas l'égalité de 2 objets
boolean equals(Object)
int hashCode()
71
Référence this
public class C {
String chaine1, chaine2;
public C() {
chaine1 = "CHAINE1";
chaine2 = "CHAINE2" ;
}
void methode1(String chaine1, String c) {
this.chaine1 = chaine1;
chaine2 = c;
}
void methode2() {
methode1("e","f");
this.methode1("",""); // utile ?
}
}
72
Parentalité…
public class M {
private String m;
public M(String s) {
m = s;
}
public void p() {
S.o.p(m);
}
}
public class F extends M {
public F(String s) {
super(s);
}
public void p() {
S.o.p("Fille"+super.p());
}
}
73
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 …
• Forme forte
 Redéfinition – overriding
 "Surcharge" dynamique (abus de langage)
 Actions différentes pour des classes d'une même
hiérarchie
74
Polymorphisme
• Forme faible
 Surcharge de méthode – overloading
 Statique (compilation)
 Méthodes de signatures différentes
Voiture
+ avancer(temps : entier)
+ avancer(distance : réel)
Voiture
+ afficher();
Véhicule
+ afficher();
Voiture
?
?
75
3- Hériter …
• Écrire une classe Véhicule qui
reprend les caractéristiques
communes des classes
Voiture et Camion
• Nous allons modifier les
classes pour tester le
polymorphisme
Véhicule
?
?
Camion
?
?
76
class Vehicule {
String immat;
public Vehicule(String im) {
immat = im;
}
public void afficher() {
S.o.p("Je suis un vehicule "+immat);
}
}
class Voiture extends Vehicule {
String immat;
public Voiture(String im) {
super(im);
}
// afficher ?
}
Voiture v = new Voiture("300 ISI 63");
v.afficher();
77
public class Vehicule {
public void afficher() {
System.out.println("Vehicule");
}
public static void main(String[] param) {
Vehicule v = new Vehicule();
Voiture w = new Voiture();
Camion c = new Camion();
Vehicule z = new Voiture();
Voiture i = new Vehicule();
}
}
class Voiture extends Vehicule {
public void afficher() {
System.out.println("Voiture");
}
}
class Camion extends Vehicule {
}
Appeler les méthodes afficher() des objets
78
Méthodes virtuelles ou finales ?
• Méthodes virtuelles
 Par défaut
 Construction d'une table de méthodes pour une
hiérarchie
 Recherche dans cette table (lenteur ?)
Vehicule v = new Voiture();
v.afficher();
• Méthodes finales
 Non redéfinissables dans les classes filles
 Plus rapides que les méthodes virtuelles
 Conseil : accesseurs en final
Choix opposé au C++
• Le dernier mot : la JVM hotspot …
79
public class Vehicule {
public void afficher() {
System.out.println("Vehicule");
}
public static void main(String[] param) {
Vehicule v = new Voiture();
v.afficher();
v.special();
((Voiture)v).special();
((Camion)v).afficher(); // défini précédemment
}
}
class Voiture extends Vehicule {
public void afficher() {
System.out.println("Voiture");
}
public void special() {
System.out.println("special");
}
}
Que se passe-t'il ?
80
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 & visibilité
81
public class C1 {
public int a;
protected int b;
int c;
private int d;
}
public
class C3 {
...
}
public class C5 {
...
}
a b c d
Accessible par C2
Accessible par C3
Accessible par C4
Accessible par C5
Package p1 Package p2
public class C4 extends C1 {
...
}
public class C2
extends c1 {
...
}
Tiré de « Eléments de programmation JAVA », Olivier Dedieu, INRIA
82
Méthodes et classes abstraites
• Mot-clé abstract (modificateur) OBLIGATOIRE
• Méthode abstraite
 Sans implémentation
• Classe abstraite
 Toute classe avec au moins une méthode abstraite
OU ALORS toute classe déclarée comme telle
(sans abstract, elle serait instanciable)
 Non instanciable
 Permet d'implémenter la notion de concept
83
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
Interface (1)
• Description / contrat
 Liste de méthode(s) sans code
 "Constantes" autorisées (public static final par défaut)
 Pas de variable/attribut [UML]
 « Classe virtuelle pure » [C++]
• Respecter le contrat = IMPLEMENTER l'interface
84
+ flotter()
+ avancer()
<<interface>>
Flottant
interface Flottant {
public static final int CONSTANTE = 30;
double PI = 3.14;
public abstract void flotter();
public void avancer();
}
par défaut
8
Interface (2)
• [Vocabulaire ] IMPLEMENTER une interface
• Instancier une classe ?
85
class Bateau implements Flottant {
public void flotter() {}
public void avancer() {}
}
Implémenter TOUTES les méthodes
des interfaces qu’elle utilise
class Radeau implements Flottant {
public void avancer() {}
}
abstract
Interface & polymorphisme
86
interface Autonome {
public static final boolean COMPLET = yes;
public void rouler();
}
class Voiture extends Vehicule implements Autonome{
public void rouler() {
System.out.println("Pilote automatique");
}}
public static void main(String[] param) {
Vehicule v = new Voiture();
((Voiture)v).rouler();
((Autonome)v).rouler();
System.out.println(Autonome.COMPLET);
System.out.println(Voiture.COMPLET);
}
Google car
instanceof
87
C M <<I>>
F1 F2
C M I Object
c = new C()
m = new M()
f1 = new F1()
f2 = new F2()
Implémentation multiple
88
public class B extends A implements IC, ID {
public void methodeIC() {}
public void methodeID() {}
}
interface IC {
void methodeIC();
}
interface ID {
void methodeID();
}
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
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
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 {
// …
}
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
Relations entre objets
• Relation
• Agrégation
• Composition
• Référence ou tableau de références
• Conteneur spécifique
 Collections
 Ex : java.util.ArrayList
94
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
// 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
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
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}* ] {
}
5. Exceptions
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
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"
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();
}
}
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
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
Hiérarchie des exceptions
104
Exception
IOException RuntimeException
NullPointerException
IndexOutOfBoundsException
FileNotFoundException
Gestion
différenciée
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
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
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
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
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
Clonage
• Copier un objet pour ne pas le modifier
 Pas de constructeur de copie
• Implémenter Cloneable
 Sert seulement à prévenir le compilateur
• Appeler la méthode clone() de la classe mère
en public
• S’assurer que la méthode clone() d’Object
est également appelée en haut de l’échelle
• Traiter les exceptions dans clone()
111
class Trooper implements Cloneable {
public Object clone() {
Trooper object = null;
try {
object = (Trooper) super.clone();
} catch(CloneNotSupportedException cnse) {
cnse.printStackTrace(System.err);
}
// s'occuper des attributs "compliqués"
// pour éviter la copie de surface
// (shallow copy) si object != null
return object;
}
}
Copie des types primitifs
Copie des références
Objets non mutables (String)
112
Conclusion exceptionnelle
• Pour toute exception déclenchée, le
compilateur impose un traitement
1. Bloc try/catch qui gère cette exception
2. Passage de l'exception au niveau supérieur
(appelant).
 L'exception apparait alors dans la signature de la
méthode
113
// 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
6. Bibliothèques graphiques
AWT & Swing
Alternatives IBM : SWT / JFace
115
AWT vs Swing
• Abstract Window Toolkit (java.awt.*)
 "Figé" depuis 1.1
 Présent dans les navigateurs sans plug-in
 Gestion des événements obsolète
 Composants lourds
• Swing (javax.swing.*)
 Toujours en évolution
 Plus complexe qu'AWT
 Composants légers
 Surcouche d'AWT (Jcomposant)
116
Exemple d'application Swing
117
Swing
• Composants de haut-niveau (lourds)
 JFrame, JDialog, JApplet
• Conteneurs
 JPanel, JScrollPane, JToolBar
• Composants basiques
 JMenu, JButton, JLabel
• Dessiner
 Canvas (AWT), JPanel (Swing)
• Index graphique des composants Swing
http://download.oracle.com/javase/tutorial/ui/features/components.html
• Apparence / système (Look & Feel) NON ABORDÉ
118
119
120
121
122
import javax.swing.*;
public class HelloWorldSwing {
private static void createAndShowGUI() {
JFrame frame = new JFrame("HelloWorldSwing");
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
createAndShowGUI();
}
}
Cas 1
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
}
});
JFrame.setDefaultLookAndFeelDecorated(true);
Calcul de la taille
Et affic
hage
Gestion des threads
Et classe imbriqu
ée
Exemple du tutoriel officiel Sun/Oracle sur Swing :
• Classe imbriquée dite anonyme
• Spécialise la classe donnée ou
implémente l'interface donnée
• Déclarée à la volée / utilisée qu'une seule fois
• Compilée avec un nom arbitraire
nomclasseenglobante$nombre.class
123
invokeLater(new Runnable() {
public void run() {
// faire qq chose
}
});
invokeLater(() -> createAndSowGUI()); 8
𝜆
124
Manipuler une fenêtre ? (1)
• Instancier un objet JFrame
1. Déclaré à la volée dans un méthode ;-(
 Ne peut être réutilisé ailleurs
2. Spécialisation de classe ;-(
3. Attribut d'objet (composition)
125
public class MonApplication extends JFrame{
public MonApplication() {
super("Mon application");
}
static public void main(String[] argv) {
MonApplication ma = new MonApplication();
ma.afficher();
}
}
public class MonApplication {
JFrame frame;
public MonApplication() {
frame = new JFrame("Mon Application");
}
static public void main(String[] argv) {
MonApplication ma = new MonApplication();
ma.afficher();
}
}
public void afficher() {
frame.pack();
frame.setVisible(true);
}
Cas 2
public void afficher() {
pack();
setVisible(true);
}
Cas 3
126
Manipuler une fenêtre ? (2)
Cas le plus général et recommandé !
L’application gère des fenêtres spécialisées !
127
Boîte de dialogue simple
• Classe JOptionPane
• Méthodes de classe showXXXDialog
 Message, Confirm, Option, Input
JOptionPane.showConfirmDialog(frame,
"Alors, ça vous plaît ?");
• Fenêtre parent
• Peut être null
Réponse
128
Ouvrir une fenêtre
• Afficher une application graphique simple
agrégeant un JFrame
• Ajouter une boite de dialogue modale
129
Ajouter des composants ?
• Que se passe-t'il ?
• Nécessité de positionner les éléments
• Qui peut recevoir des composants ?
 Composants de haut niveau
 Conteneurs -> Panels
// après frame.getContentPane().add(label);
// dans HelloWorldSwing
frame.getContentPane().add(new JLabel("2"));
130
Positionnement
• Placer des composants
 Taille (fixe, minimale, maximale et préférée)
 Position absolue ou relative (portabilité)
• Politique de placement d'un conteneur : Layout
 JFrame, JDialog, JPanel, …
• Complexe à manipuler
 Conteneurs et Layouts spécialisés en cascade
 GUI Builder
• Matisse / Netbeans avec GroupLayout
• WindowBuilder / Eclipse
• IntelliJ
131
Layout Manager (1)
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html
Points cardinaux Horizontal
ou vertical
Complexe mais
puissant
Formulaire
132
Layout Manager (2)
• Flow
• Box
• Border
• Grid
• Card
• GridBag
• Spring
• Aucun
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(objet [, paramètres]);
Managers par défaut :
• BorderLayout pour le contentPane du JFrame
• FlowLayout pour un JPanel
Package : java.awt
133
On teste …
• Tester le BorderLayout …
 avec un bouton dans chaque zone
 Nord, Sud, Est, Ouest, Centre
• Tester le FlowLayout
 … en ajoutant des boutons
frame.getContentPane().setLayout(new FlowLayout());
for (int i=0; i < 5; ++i)
frame.getContentPane().add(
new JButton(new String(i)));
• ""+i Passage par StringBuffer
• (new Integer(i)).toString()
• String.valueOf(i)
Changer
la taille de
la fenêtre
134
contentPane (JFrame) pane = new JPanel();
(Layouts par défaut des composants)
frame.getContentPane().add(pane, BorderLayout.CENTER);
135
Organisation par couches
Root Pane
Layered Pane
Glass Pane
MenuBar ContentPane
Layout Manager
C1 C2 … … Cn
136
Événements (1)
• Communication entre les composants d'une
application et l'utilisateur
 Envoi de messages
 Appel de méthodes d’une interface
• Intéressé(e) par un événement ?
1. Vérifier que le composant permet d’y répondre
2. Écrire un gestionnaire
3. Enregistrer le gestionnaire auprès du composant
Événements (2)
Activer un JButton
Choisir un menu
Appuyer sur une touche (focus)
Appuyer / relâcher un bouton de souris
Entrer ou sortir d’un composant avec la souris
Déplacer la souris
Utiliser la molette
Déplacer la fenêtre
Réduire la fenêtre
Fermer la fenêtre
Changer la taille
137
Action
Regroupement fonctionnel =
MouseListener
Activer un JButton (action)
1. Ecrire le gestionnaire
2. Enregistrer le gestionnaire
138
class Gestionnaire implements ActionListener {
public void actionPerformed(ActionEvent e) {
// ce qu'il y a à faire
}
}
JButton bouton = new JButton("Libellé");
bouton.addActionListener(new Gestionnaire());
Afficher une boite de dialogue avec le programme précédent
Event / Listener / Adapter
• Event
• Listener
 Spécifique à l'événement
 Liste des méthodes / messages possibles
composant.addEventListener()
• Adapter
 Patron de conception / design pattern
 Implémentation "vide" de convenance
139
ActionAdapter n'existe pas !
AbstractAction existe
MouseEvent
MouseListener
MouseAdapter
Toujours
possible ?
addMouseListener()
140
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. 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
A bas les boutons (3)
• Sortie propre ?
 Changer le comportement par défaut
 Gestionnaire
• showConfirmDialog
• Evénement ?
 Quitter
142
FENETRE PAS ENCORE FERMEE
143
Contexte graphique
• Boîte à dessin
• Associé à une fenêtre ou une image
• Classe java.awt.Graphics
 Couleur
 Mode de dessin (XOR …)
 Police de caractères
 Actions basiques ( drawXXX, fillXXX)
• Classe java.awt.Graphics2D
 Plus de fonctionnalités en dessin
 Changement de repère, transformations
144
(0,0)
y
x
Orientation par défaut
(x1,y1)
height
width
graphics.fillOval(x1, y1, width, height);
145
Dessiner
• Canvas [AWT]
 Composant "lourd"
 void paint(Graphics g)
• JPanel [Swing]
 Composant léger
 Opacité
 void paintComponent(Graphics g)
 paint() existe mais …
• Contexte graphique "prêté" par le système
• Méthode repaint() pour mettre à jour
JCanvas
• Étendre la classe JPanel
 Opaque ? double buffering ?
 Layout inutile !
• Fixer la taille du composant
 PreferredSize (utilisée par pack())
 MinimumSize, MaximumSize
• Redéfinir paintComponent()
 À ne jamais appeler directement
 Appeler super.paintComponent(g) si besoin
• Efface le composant
146
1. Simuler un oscillateur "fixe"
2. Gérer l'appui du bouton : générer un
nouvel affichage (aléatoire ou sinusoïdal)
147
Solution ?
148
C
contentPane (JFrame)
JButton
+ gestionnaire (Action)
appelle repaint()de la zone
de dessin ou du JFrame.
JLabel
JCanvas
• étend JPanel
• redéfinit paintComponent(…) => dessin
• commencer par un rectangle tout simple
• précise la taille préférée
setPreferredSize(new Dimension(800,600));
W E
N
S
Math.random()
Random
getParent().repaint()
Barre de menus
149
Fichier
Nouveau
Ouvrir
Sauvegarder
Quitter
menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
menu = new JMenu("Fichier");
menuBar.add(menu);
item = new JMenuItem("Nouveau");
item.addActionListener(…);
item.setAccelerator(…);
menu.add(item);
menu.addSeparator();
6B. Bibliothèque graphique
Java FX
151
Swing vs Java FX
• Développement d'applications riches
• Swing (javax.swing.*)
 Stack historique (depuis java 1.2)
 "Figée" depuis 1.8
• Java FX 2 (javafx.*)
 Bibliothèque officielle
 MAIS pas livrée avec toutes les JVMs
 Supporte le CSS et le FXML
 Plus riche que Swing : 2D et 2D
152
Exemple d'application javaFX
Canvas
Button
Label
Title
Stage
Contrôles
153
Button ToggleButton
RadioButton Checkbox
ChoiceBox ComboBox
MenuBar
Menu
MenuItem
Separator
ToolBar
…
154
TextField
TextArea
PasswordField
HTMLEditor
Spinner
Slider
Label Tooltip Hyperlink
155
ColorPicker
DatePicker
FileChooser
156
ListView
TableView
TreeView
TreeTableView
Et encore …
• ScrollBar / ScrollPane
• ProgressBar / ProgressIndicator
• Accordeon
• PaginationControl
• Pleins de Pane
• Tab
• Canvas
• Chart
• Des boîtes de dialogues
157
158
public class FXHelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Exemple du tutoriel officiel Sun/Oracle sur JavaFX :
Classe
dédiée
Créé par le
système
un composant
ajout
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
}); Action au clic
159
• Java FX n'est pas livré avec toutes les JVM 8
• Eclipse ne reconnaît pas Java FX par défaut
Méthode 1 :
• Paramétrer le projet
• Règle d'accessibilité
Méthode 2 :
• Greffon e(fx)clipse
• Projet spécifique
• Classe imbriquée dite anonyme
• Spécialise la classe donnée ou
implémente l'interface donnée
• Déclarée à la volée / utilisée qu'une seule fois
• Compilée avec un nom arbitraire
nomclasseenglobante$nombre.class
160
btn.setOnAction(new
EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
161
Boîte de dialogue simple
• Classe Alert
 Type + Texte + Boutons
 Modale : showAndWait()
Alert a = new Alert(…);
Optionnal<ButtonType> r = alert.showAndWait();
if (r.isPresent() && a.get() == ButtonType.OK)
…
162
Ajouter des composants ?
• Que se passe-t'il ?
• Nécessité de positionner les éléments
• Qui peut recevoir des composants ?
 Conteneurs -> Panels
 Arborescence de composants
// après root.getChildren().add(btn)
Btn = new Button("Deuxième bouton);
root.getChildren().add(btn);
163
Positionnement / Layout
• Placer des composants …
 Taille (fixe, minimale, maximale et préférée)
 Position absolue ou relative (portabilité)
• ... dans des Nœuds particuliers Region
 Transformations applicables
 Composants ordonnées ou pas
 Imbricables
• FXML
 Description en XML
 Événements en Java ou JS ou …
 Style en CSS
Property
164
Layouts (1)
https://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm#JFXLY102
Boîte
GridPane
BorderPane
165
Layouts (2)
• BorderPane
• HBox
• VBox
• StackPane
• FlowPane
• TextFlow
• TilePane
• DialogPane
• GridPane
• AnchorPane
• …
• SplitPane
• TabPane
• ScrollPane
166
On teste …
• Tester le BorderPane …
 avec un bouton dans chaque zone
 TOP, RIGHT, BOTTOM, LEFT, CENTER
• Tester le FlowPane ou TilePane
 … en ajoutant des boutons
root = XXXXPane();
root1.setBottom(…);
root2.getChildren().add(…);
btn.setMaxWidth(Double.MAX_VALUE);
btn.setMaxHeight(Double.MAX_VALUE);
Changer
la taille de
la fenêtre
167
Événements
• Communication
 Système – Application - Utilisateur
• Propagation à double sens
• Gérés au sein d'un unique thread
 FX Application thread
Platform.runLater();
isAppFXThread()
168
Hiérarchie & type
Event
Input
Window
Action
…
ANY
PRESSED
RELEASED
TYPED
ANY
CLOSE REQUEST
HIDDEN / HIDDING
SHOW / SHOWING
ANY
PRESSED / RELEASED
MOVED
ENTERED / EXITED
…
Propagation
1. Cible ?
2. Route
3. Capture
4. Bubbling
169
Stage
Scene
…
…
Cible /
target
Capture
(Filtre)
Bubbling
addEventFilter()
setOnEvent()
…
Consommation
e.consume()
EventHandler<Event>
-> handle()
Activer un Button (action) (1)
170
@FunctionalInterface
interface EventHandler<ActionEvent> {
public void handle(ActionEvent event);
}
Une seule méthode
Type dérivé de Event
Unique méthode à implémenter
Activer un Button (action) (2)
• Utilisation d'un objet
 Objet créé à la volée
 Référence d'objet instance de EventHandler<AE>
• Utilisation d'une méthode
 Lambda
 Référence de méthode
171
Choisir un bouton et écrire sur la console ou
Afficher une boite de dialogue avec le programme précédent
setOnAction(objet::handle)
setOnAction(new EventHandler<AE>() {});
setOnAction(objet);
setOnAction((AE e) -> { … });
𝜆
172
A bas les boutons … (1)
• Afficher quelques boutons
• Incrémenter la valeur d'un bouton à chaque fois
que l'on clique dessus
• Ajouter une boîte de confirmation pour la sortie
du programme OU quitter après deux clics sur la
croix
173
A bas les boutons … (2)
• Bouton ?
1. Spécialiser Button pour compter
2. Utiliser Button directement
• Gestionnaire ?
1. Une instance pour tous les boutons
2. Un instance par bouton
• Possibilité : le bouton lui-même
Button : setText ()
Integer : parseInt()
MonBouton
- compteur : int
+ MonBouton();
+ incrementer();
Button
event.getSource()
<<interface>>
EventHandler<AE>
A bas les boutons (3)
• Comportement par défaut
• Modifier le comportement
 Boite de dialogue
 Consommer l'événement
• Forcer une sortie
174
Platform.exit()
System.exit(0)
Application arrêtée lorsque toutes les
fenêtres sont fermées (implicitExit)
Alert a = new …;
a.showAndWait()
175
Dessiner
• Canvas
 Composant transparent
 Pas forcément attaché à une scène
 GraphicsContext
• Hiérarchie de composants shape
 Rectangle, Circle, SVGPath, Text …
 Remplissage fill
 Trait stroke
 Combinaisons ( +, - )
176
(0,0)
y
x
Orientation par défaut
(x1,y1)
height
width
graphics.fillOval(x1, y1, width, height);
Graphics.strokeRect(x1, y1, width, height);
Contexte graphique
1. Simuler un oscillateur "fixe"
2. Gérer l'appui du bouton : générer un
nouvel affichage (aléatoire ou sinusoïdal)
177
Solution ?
178
C
BorderPane
Button + EventHandler
Label
Canvas
W E
N
S
Math.random()
Random
Barre de menus
179
Fichier
Nouveau
Ouvrir
Sauvegarder
Quitter
menuBar = new MenuBar();
root.setTop(menuBar);
menu = new Menu("Fichier");
menuBar.getMenus().add(menu);
menuBar.getMenus().addAll(m1, m2, m3);
item = new MenuItem("_Nouveau");
item.setMnemonicParsing(true);
item.setAccelerator(
new KeyCodeCombinaison(… ));
item.setOnAction(…);
menu.getItems().add(item);
BorderPane.TOP
7. Concurrence (Threads)
Concurrence
• Plusieurs tâches en même temps
• Processeurs multi cœurs
• Threads ou processus légers
 Partage données
• Historiques : Thread, Runnable
• Package java.util.concurrent
• Modèles pour interfaces graphiques
181
5
182
Tâche
• Sécurité d'accès aux méthodes et données
 Méthode/statement qualifié synchronized
 Variable qualifiée volatile
 Variable qualifiée final (Immutable)
• Méthode pour démarrer start()
• Méthode pour endormir sleep()
• L'arrêt doit être NATUREL run()
 La méthode d'exécution doit se terminer normalement
 Test d'arrêt
 Vérification de demande d'arrêt
Thread et UI ?
• Interface gérée un unique thread
 Propagation des événements
 Patron MVC : concurrence difficile
• Interface peut être figée facilement
• Tâches longues en arrière-plan
• Swing : fil des événements
 SwingWorker (antérieur au patron Executor)
• JavaFX Application thread
 Package extension de java.util.concurrent
183
Tâche longue
184
Temps
FinDébut
Thread des événements
paint paintclic
Paint + calcul très long …
Calcul très long …
inits fin
Actions simples
successives
Blocage de
l'interface
Paint + calcul long …
Calcul en arrière-plan : interface libre
185
Thread vs Runnable
// Exemple avec implémentation d'interface
// Modélisation : créer une nouvelle tâche
class Tache implements Runnable {
// implémenter run()
}
// AILLEURS :
Tache tache = new Tache();
(new Thread(tache)).start();
// Exemple avec spécialisation de classe
// Modélisation : créer un nouveau type de Thread
class Special extends Thread {
}
Special special = new Special();
special.start();
CONSEILLÉ
Java FX
• Interface Worker
• Implémentation : Task et Service
186
• Tache : génération aléatoire de rectangles avec
une composante alpha (couleur RGBA)
• Menu : Rafraichir et quitter
• "Quitter?" par le menu et la croix
• Blocage de l'interface ?
• Gérer le redimensionnement
187
Interface graphique &
tâche longue
188
Modèle MVC
• Modèle / Vue / Contrôleur
• Logique applicative vs présentation
• Design(s) pattern(s) / Patron de conception
 Communément adopté (un des plus vieux)
 Pas trivial du tout
 A éviter sur les trucs simples
 Adopté par Swing (Table <-> TableModel)
 Adopté par JavaFX (FXML)
Exemple
189
Modèle
Contrôleur
Vue 2
Vue 1
190
Modèle
Contrôleur
Transmet l’action
Vue
Vue
Vue (s)
Rafraîchissement
Données
Changement d’état
Notification changements
(Observer)
Action utilisateur
8. Fichiers & Flux
Sérialisation
192
Gestion des entrées/sorties (1)
• Flux E/S de données binaires
• Flux E/S de caractères
• Flux E/S d’objets
• Communication avec des fichiers
• Communication avec des ressources
Internet
• Sérialisation (=> réseau)
193
Gestion des entrées/sorties (2)
• java.io
 Flux de données (fichier, pipe/threads, …)
 Sérialisation
 Système de fichiers
• java.nio (java 4)
 Mémoire tampon Buffer
 Canaux + Sélecteurs : hautes performances
 Traduction des jeux de caractères
• java.nio2
 Simplification
 Path
7
194
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.*
File fic = new File("log.txt");
FOS fos = new FileOutputStream(fic);
PS ps = new PrintStream(fos);
ps.println("une chaine de caractères");
ps.close();
fos.close();
Flux de sortie
195
OutputStream
PrintStreamFileOutputStream
fichier sortie
flux texte
conversion
System.out
flux sortie
conversion
DataOutputStream
flux binaire
PrintStreamDataOutputStream
flux écran
Tiré de http://www.nawouak.net, B. Bachelet
Flux d’entrée
196
InputStream
InputStreamReader
FileInputStream
flux texte
(caractère par caractère)
System.in
flux entrée
conversion
DataInputStream
flux binaire
DataInputStream
flux
clavier
StreamTokenizer
conversion
StreamTokenizer
conversion
flux texte
(item par item)
fichier entrée
Tiré de http://www.nawouak.net, B. Bachelet
197
// Version 1 standard
// Attention aux exceptions soulevées
InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
br.readLine();
Saisie clavier
// Version 1.6
// les exceptions sont gérées par la Console
System.console().readLine();
System.console() == null sous Eclipse !
6
198
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();
Try-with-resources
• Ressource
 Tout objet à fermer / libérer après utilisation
 Fichier, flux, chaussette, requête
• Méthode classique (< 1.7)
 close() dans bloc finally => exception levable
 Bloc try-catch englobant supplémentaire ou relance
• Fermeture et libération automatique (1.7+)
 Syntaxe simplifiée
 Interface AutoCloseable
199
7
7
200
// bloc try-with-resources
try (
FileReader fr = new FileReader(nomFichier);
BufferedReader br = new BufferedReader(fr);
){
String lecture;
while ((lecture = br.readLine())!=null) {
//
}
} // Les ressources sont fermées automatiquement
catch (Exception e) {
e.printStackTrace();
}
Certaines exceptions peuvent être lancées mais elles sont dissimulées.
Elles sont toutefois récupérables en cas de besoin.
201
Sérialisation (1)
• Transformer un objet présent en mémoire en bits
 Sur un disque (Stockage - Persistance)
 Sur le réseau (Communication – RMI)
 Les infos de classe ne sont pas transmises
• Implémenter l'interface Serializable
 Ne fait rien, prévient le compilateur
• Proposer une version de sérialisation
 static final long serialVersionUID = 110L;
• Attention à la protection des données
 Données transient : données non copiées
 Ou implémenter Externalizable
202
Sérialisation (2)
void writeObject(ObjectOutputStream out)
throws IOException;
void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException;
void readObjectNoData()
throws ObjectStreamException;
FileOutputStream/FileInputStream
ObjectOutputStream/ObjectInputStream
Flux (streams) à utiliser …
Méthodes à redéfinir pour un comportement particulier
203
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream("fichier.dat");
oos = new ObjectOutputStream(fos);
oos.writeObject(objects);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos!=null) oos.close();
if (fos!=null) fos.close();
}
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream("fichier.dat");
ois = new ObjectInputStream(fis);
objects = (Composite) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ois!=null) ois.close();
if (fis!=null) fis.close();
}
Classe de l'objet
204
Sérialisation en XML
• XMLEncoder pour les objets respectant les
conventions NetBeans
• X-Stream pour les autres ;-)
 Une bibliothèque tiers sur github
205
FileOutputStream fos = null;
XStream xstream = null;
try {
fos = new FileOutputStream(name);
xstream = new XStream(new StaxDriver());
xstream.toXML(objects, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos!=null) fos.close();
}
FileInputStream fis = null;
XStream xstream = null;
try {
fis = new FileInputStream(name);
xstream = new XStream(new StaxDriver());
objects = (Composite)xstream.fromXML(fis));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis!=null) fis.close();
}
Classe de l'objet
TP "Houzehou"
206
• Manipulation de classes et d'interfaces
• Conteneurs
• Fichiers textes
• Javadoc
• JTable (Swing) TableView(JavaFX)
207
Houzehou Personne
// tableau statique
static int MAX = 50;
Personne[] p1 = new Personne[MAX];
p1[0] = new Personne();
// tableau dynamique (thread-safe)
Vector<Personne> p2 = new Vector<Personne>();
p2.addElement(new Personne());
// Liste : ArrayList, LinkedList, …
ArrayList<Personne> p3 = new ArrayList<Personne>();
p3.add(new Personne());
new StringBuffer(nom+":"+prenom);
// tableau dynamique Legacy ou avec "erasure"
Vector p2 = new Vector();
p2.addElement(new Personne());
208
Constructeur() {
a = null;
b = 1;
}
private void init(O a, int b) {
this.a = a;
this.b = b;
}
Constructeur(int b) {
a = null;
this.b = b;
}
Constructeur() {
this(null, 1);
}
Constructeur(int b) {
this(null, b);
}
Constructeur() {
init(null, 1);
}
Constructeur(int b) {
init(null, b);
}
Constructeur(O a, int b) {
this.a = a;
this.b = b;
}
Duplication de code !!!
Méthode privée
(Sortie du constructeur)
Pas d'argument par défaut
mais une syntaxe sympa
209
Éditions
Ça aussi
c'est
important
210
Plan
• Plus d'exemples avec JAVA
 Enumération,
 Ajouts 5, 6 et 7, pas encore 8
• Généricité & collections
• Applet
• Outils
• Autres documents : JNI, JDBC, Java EE
Langage
212
Terminologie : classe imbriquée
• Classe imbriquée / nested class
 Classe définie à l’intérieur d’une autre classe
• 4 types de nested class
 Classe membre statique
 Classe membre non statique
 Classe locale (définie dans une méthode)
 Classe anonyme (locale sans nom)
Inner class
• N’existe qu’avec une instance de la classe
• Pas de membres statiques
• Peut accéder aux variables / attributs de l'englobant
213
Conventions (1)
• Documentation officielle
• Tutoriaux SUN/Oracle
• Respect à l'écriture, facilité de lecture
• Production rapide
• Intégrée dans les EDI classiques
 Génération automatique de code
214
Conventions (2)
• Nom de classe ou interface
 Première lettre majuscule
 Reste en minuscules
 Majuscules aux mots composés
• Attribut écrit en minuscule
 Pas de tiret
• Méthode
 Verbe pour action
 Premier mot en minuscule
 Majuscules à la première lettre des mots suivants
class
CoursGenial
int attribut;
void ronfler();
215
Conventions (3)
• Accesseur / Accessor
 get + nom de l'attribut
 is pour un booléen
• Mutateur/Mutator
 set + nom de l'attribut
• "Constante"
 Tout en majuscules
• Package
 Tout en minuscules
getAttribut()
isAttribut()
CONSTANTE
fr.isima.paquetage
setAttribut()
216
Énumération ? (<1.5)
• Pas de vérification de type
• Affichage de la valeur sans intérêt
public static final int LUNDI = 0;
public static final int MARDI = 1;
public static final int MERCREDI = 2;
public static final int JEUDI = 3;
217
Énumération
http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html
enum Semaine { LUNDI, MARDI, MERCREDI,
JEUDI, VENDREDI, SAMEDI, DIMANCHE}
for (Semaine jour : Semaine.values())
System.out.println(jour);
for (Semaine j : EnumSet.range(
Semaine.LUNDI, Semaine.VENDREDI))
System.out.println(j);
Dangereux mais utile : le static import
5
218
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
Annotation
• "Extension" de celles du javadoc trop restrictives
• Méta données
 Développeur
 Compilateur
 Machine virtuelle
 Génération code, documentation, configuration
• Plus simple et plus léger que le XML
• Utilisation intensive
 JUnit 4+
 Java EE : JPA, …
219
5
Annotations standards
• @Override
• @SuppressWarnings
 @SuppressWarnings(value="deprecation")
 @SuppressWarnings("deprecation")
 @SuppressWarnings({"unchecked", "deprecation"})
• @Deprecated
• @Documented
 Documentation
• @Retention(RetentionPolicy.RUNTIME)
 Exécution
221
class Mere {
public void methode() {
System.out.println("Methode de Mere");
}
}
class Fille extends Mere {
@Override
public void Methode() {
System.out.println("Methode de Fille");
}
}
Fille f = new Fille();
f.methode();
The method Methode() of Fille must override or implement a
supertype method
Annotations personnalisées
222
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
String[] reviewers();
// utilisation possible des tableaux
}
Aller plus loin :
http://download.oracle.com/javase/tutorial/java/javaOO/annotations.html
http://www.jmdoudoux.fr/java/dej/chap010.htm#annotations
Méthode à nombre
d'arguments variable
223
public void somme(double … nombres) {
double s = 0.0;
// méthode classique
for(int i=0; i < nombres.length; ++i)
s += nombres[i];
// nouvelle forme de for
for (double nb: nombres) s+= nb;
}
5
Auto [un] Boxing
• Conversions automatiques
• AutoBoxing
 attention à la création implicite d'objets
• Auto unboxing
224
int n = nombre; // converti automatiquement
int n = nombre.intValue();
Integer nombre = 10; // conversion automatique
Integer nombre = new Integer(10);
Avertissements / Erreurs possibles sous Eclipse
5
Généricité &
Collections
226
Généricité
• Classes paramétrées
• Méthodes paramétrées
• Wildcards (<? extends classe>)
 En lecture (pas en création)
• Définition générique
 Compilée une fois pour toutes (≠ C++), efficacité ?
 Partagée par toutes ses invocations
• Pas de typedef
 paramètre : une lettre en majuscule (convention)
 Éviter de dériver une classe pour donner un nom
Plus de renseignements :
http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf
5
227
Généricité : exemple
public interface List<E> {
void add(E e);
Iterator<E> iterator();
}
public interface Iterator<E> {
E next();
boolean hasNext();
}
public void dessiner(List<E extends ObjetGraphique> l);
static<T> void ajouter(T[] tab, Collection<T> c) {
for(T o :tab)
c.add(o);
}
5
228
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
Collection (2)
229
«interface»
Collection
T
«interface»
Set
«interface»
List
«interface»
Queue
T T T
«interface»
SortedSet
T
«interface»
Map
K,T
«interface»
SortedMap
K,T
«implémente»
«implémente»
«implémente»
Set : pas de doublons
Queue : FIFO par ex
Map : table de hachage
Vector
230
Collections (3)
• Avant Java 1.5
 Conteneurs d'Object
 Downcast obligatoire
 Vector [Vecteur dynamique]
 Enumeration [itérateur]
 Dictionary (Hashtable) [Map]
• Après 1.5
 Mêmes conteneurs templatisés
 Utiliser ArrayList plutôt que Vector
sauf multithread
 Utiliser la Map plutôt que Dictionary
5
231
Exemple (non générique)
Vector v = new Vector();
// on ne peut stocker que des objets, int est exclu
for (int i=0; i<10; ++i)
v.addElement(new Integer(i));
// transtypage obligatoire
int somme = 0;
for (int i=0; i<10; ++i)
somme += ((Integer)v.elementAt(i)).intValue();
// avec une énumération
Enumeration e = v.elements();
while (e.hasMoreElements())
somme += ((Integer)e.nextElement()).intValue();
232
Exemple (générique)
Vector<Integer> v = new Vector<Integer>();
// on ne peut toujours pas stocker de int
for (int i=0; i<10; ++i)
v.addElement(new Integer(i));
// plus de transtypage
int somme = 0;
for (int i=0; i<10; ++i)
somme += v.elementAt(i).intValue();
// avec une énumération, elle aussi paramétrée
Enumeration<Integer> e = v.elements();
while (e.hasMoreElements())
somme += e.nextElement().intValue();
5
233
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
Outils
javadoc - jar
235
javadoc
Outil externe pour générer une documentation au format
HTML (similaire à la documentation officielle Java)
 Intégré au langage, commande en standard
 Format "universel" et simple
 Commentaires dans le code
 Autre outil similaire : Doxygen
 Lisibilité du code
 Le code doit compiler
 Ne fait pas tout !
/** */
236
javadoc ?
• Commentaires spéciaux
• Personnalisation avec code HTML ou CSS
• Balises
 @param
 @return
 @throws @exception
 @see
 @since
 @deprecated
 @author
/** */
Eclipse : (M) Project > Generate Javadoc
237
Exemple
/**
* Description de la classe
*
*/
class ExempleJavaDoc {
/**
* description courte
*
* description longue ……
* @param param1 description
* @param param2 description
* @return le resultat de la methode
*/
public int methode(int param1, double param2) {}
}
238
jar
• Java ARchive
 Exécutable ( ≈ tar)
 Format de fichier compressé
 Contrôle de version par exemple
• Permet de distribuer/déployer
 une application (autonome ou applet, JEE)
 un package
• Contenu
 Fichiers .class
 Fichiers ressources (images)
 Fichier Manifest
239
Bibliographie (1)
• Documentation JAVA de Sun/Oracle
• Tutoriaux Web de Sun/Oracle
• Cours JAVA d'Olivier Dedieu, INRA
• Intro JAVA, Bruno Bachelet
http://www-sor.inria.fr/~dedieu/java/cours/
http://www.nawouak.net/?doc=java+lang=fr
http://download.oracle.com/javase/tutorial/
240
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, …
241

Más contenido relacionado

La actualidad más candente

Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
Julien CROUZET
 

La actualidad más candente (20)

Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Introduction à la SDL2
Introduction à la SDL2Introduction à la SDL2
Introduction à la SDL2
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Formation python
Formation pythonFormation python
Formation python
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelist
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 

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

I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
sabrine_hamdi
 
Play Framework
Play FrameworkPlay Framework
Play Framework
Armaklan
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
Ombotimbe Salifou
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APP
frwebhelp
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
Algeria JUG
 

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

Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
Part1
Part1Part1
Part1
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
Seance_1_cours_introduction_java_Copie.pptx
Seance_1_cours_introduction_java_Copie.pptxSeance_1_cours_introduction_java_Copie.pptx
Seance_1_cours_introduction_java_Copie.pptx
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
Introduction a Java
Introduction a JavaIntroduction a Java
Introduction a Java
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APP
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winforms
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 

Último

Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
ikospam0
 
Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdf
AmgdoulHatim
 

Último (16)

Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projetFormation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
 
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptx
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptxIntégration des TICE dans l'enseignement de la Physique-Chimie.pptx
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptx
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
 
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
 
les_infections_a_streptocoques.pptkioljhk
les_infections_a_streptocoques.pptkioljhkles_infections_a_streptocoques.pptkioljhk
les_infections_a_streptocoques.pptkioljhk
 
L application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptxL application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptx
 
Cours Généralités sur les systèmes informatiques
Cours Généralités sur les systèmes informatiquesCours Généralités sur les systèmes informatiques
Cours Généralités sur les systèmes informatiques
 
Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdf
 
Echos libraries Burkina Faso newsletter 2024
Echos libraries Burkina Faso newsletter 2024Echos libraries Burkina Faso newsletter 2024
Echos libraries Burkina Faso newsletter 2024
 
L'expression du but : fiche et exercices niveau C1 FLE
L'expression du but : fiche et exercices  niveau C1 FLEL'expression du but : fiche et exercices  niveau C1 FLE
L'expression du but : fiche et exercices niveau C1 FLE
 
CompLit - Journal of European Literature, Arts and Society - n. 7 - Table of ...
CompLit - Journal of European Literature, Arts and Society - n. 7 - Table of ...CompLit - Journal of European Literature, Arts and Society - n. 7 - Table of ...
CompLit - Journal of European Literature, Arts and Society - n. 7 - Table of ...
 
Télécommunication et transport .pdfcours
Télécommunication et transport .pdfcoursTélécommunication et transport .pdfcours
Télécommunication et transport .pdfcours
 
Apolonia, Apolonia.pptx Film documentaire
Apolonia, Apolonia.pptx         Film documentaireApolonia, Apolonia.pptx         Film documentaire
Apolonia, Apolonia.pptx Film documentaire
 
python-Cours Officiel POO Python-m103.pdf
python-Cours Officiel POO Python-m103.pdfpython-Cours Officiel POO Python-m103.pdf
python-Cours Officiel POO Python-m103.pdf
 
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANKRAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
 
Neuvaine de la Pentecôte avec des textes de saint Jean Eudes
Neuvaine de la Pentecôte avec des textes de saint Jean EudesNeuvaine de la Pentecôte avec des textes de saint Jean Eudes
Neuvaine de la Pentecôte avec des textes de saint Jean Eudes
 

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

  • 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 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. 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 Plan 1. Premier programme 8 2. Notions de base & syntaxe 23 3. Concepts objets en Java 44 4. Les exceptions 94 5. IHM : AWT & Swing ou JavaFX 108 6. Concurrence (Threads) 144 7. Fichiers & flux, sérialisation 155 HS Compléments 173
  • 6. 6 Introduction • Langage • Machine virtuelle • Plateforme • Île ? • Javascript (ECMA) ?
  • 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
  • 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 Pour voir le résultat… 1. Compiler le programme javac Exemple.java java Exemple .exe ? .class ? 2. Lancer le programme
  • 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 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. • 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 Exercice • Tester le programme Exemple • Consulter la documentation  Google : java documentation api 8 ou 9  https://docs.oracle.com/javase/7/docs/api/  https://docs.oracle.com/javase/9/docs/api/ • Consulter les tutoriaux officiels • https://docs.oracle.com/javase/tutorial/
  • 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 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 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. • 1.0 (1.1) – applet , jni, awt [1995]  236 classes pour 1.0.2 • 1.2 – swing (version 2) [1998]  1524 classes • 1.3 – débogage [2000] • 1.4 – performances – nio [2002] • 1.5 - patrons / templates [2004]  3279 classes • 1.6 – sécurité, scripts, performance [2006]  3795 classes • Acquisition de Sun par [2010] • 1.7 – open JDK - 4024 classes [2011] • 1.8 – 4240 classes [2014] 19 L E G A C Y
  • 20. Aujourd’hui ? • Java 8 update 151  Streams  Lambdas  Code dans les interfaces • Java 9 update 1  Modularité  JShell  Performances 20 etud Berzet classe ⊂ package ⊂ module
  • 21. 21 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 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. 3. Notions de base Syntaxe
  • 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 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 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 Types de données scalaires (2) • Normalisés (portabilité) • Doublés par des types objets :  Double  Integer • Méthodes •toString() •Double.parseDouble()
  • 28. 28 Déclaration de variables • N'importe où dans le bloc • Initialisation d'une variable pas automatique  Erreur : "might not be initialized" public static void main(String[] argv) { int i = 0; char c = 'A'; Classe objet; String s; double d = 1.0; float f = 1.3f; double[] tableau; } Référence (pointeur) Référence (pointeur)
  • 29. 29 { 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 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 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 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 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 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 { 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 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 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 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 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. 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 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. 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 « 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 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
  • 46. Déclaration d'une classe • Moule / Modèle / Fabrique à objets • Caractéristiques / Attributs • Messages / Méthodes • Nom unique (package) • De classe /d’instance • Visibilité et encapsulation • Relations 46 Java 9 change pas mal de choses …
  • 47. 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 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 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. 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 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 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. 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 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. 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 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. 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. 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. 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 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. // 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 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. 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 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 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 Héritage • F hérite de M / dérive de M / spécialise M • Héritage SIMPLE seulement M F public class F extends M { public F() { super(); // appel du constructeur de M // initialisations spécifiques } }
  • 67. public class M { public String att1; protected String att2; private String att3; public void methode1() {…} protected void methode2() {…} private void methode3() {…} } public class F extends M { } public class A { static void m() { F f = new F(); f.methode1(); }} Héritage sélectif 67
  • 68. Conditions pour l'héritage • M doit être visible de F (public ou même package) • M doit être dérivable (non finale) 68 class M1 { public M1(String s) {} public M1 () {} } class F1 extends M1 { } public class A { static void m() { F1 f1a = new F1(); F1 f1b = new F1("essai"); } } final class M2 { public M2() {} } class F2 extends M2 { }
  • 69. java.lang.Object (1) • clone() • finalize() • toString() • getClass().getName()  Connaître à l'exécution le nom de la classe 69 Classe@hashcode objet instanceof Classe
  • 70. java.lang.Object (2)  Deux objets égaux ont le même hashcode  Ne doit pas changer pour une exécution  Deux objets distincts peuvent avoir le même  Souvent l'adresse mémoire de l'élément 70 == ne teste pas l'égalité de 2 objets boolean equals(Object) int hashCode()
  • 71. 71 Référence this public class C { String chaine1, chaine2; public C() { chaine1 = "CHAINE1"; chaine2 = "CHAINE2" ; } void methode1(String chaine1, String c) { this.chaine1 = chaine1; chaine2 = c; } void methode2() { methode1("e","f"); this.methode1("",""); // utile ? } }
  • 72. 72 Parentalité… public class M { private String m; public M(String s) { m = s; } public void p() { S.o.p(m); } } public class F extends M { public F(String s) { super(s); } public void p() { S.o.p("Fille"+super.p()); } }
  • 73. 73 Noms qualifiés class M { protected int a; } public class F extends M { protected double a; public void toto() { a this.a super.a ((M)this).a ((F)this).a } } NOTE : Ce code compile …
  • 74. • Forme forte  Redéfinition – overriding  "Surcharge" dynamique (abus de langage)  Actions différentes pour des classes d'une même hiérarchie 74 Polymorphisme • Forme faible  Surcharge de méthode – overloading  Statique (compilation)  Méthodes de signatures différentes Voiture + avancer(temps : entier) + avancer(distance : réel) Voiture + afficher(); Véhicule + afficher();
  • 75. Voiture ? ? 75 3- Hériter … • Écrire une classe Véhicule qui reprend les caractéristiques communes des classes Voiture et Camion • Nous allons modifier les classes pour tester le polymorphisme Véhicule ? ? Camion ? ?
  • 76. 76 class Vehicule { String immat; public Vehicule(String im) { immat = im; } public void afficher() { S.o.p("Je suis un vehicule "+immat); } } class Voiture extends Vehicule { String immat; public Voiture(String im) { super(im); } // afficher ? } Voiture v = new Voiture("300 ISI 63"); v.afficher();
  • 77. 77 public class Vehicule { public void afficher() { System.out.println("Vehicule"); } public static void main(String[] param) { Vehicule v = new Vehicule(); Voiture w = new Voiture(); Camion c = new Camion(); Vehicule z = new Voiture(); Voiture i = new Vehicule(); } } class Voiture extends Vehicule { public void afficher() { System.out.println("Voiture"); } } class Camion extends Vehicule { } Appeler les méthodes afficher() des objets
  • 78. 78 Méthodes virtuelles ou finales ? • Méthodes virtuelles  Par défaut  Construction d'une table de méthodes pour une hiérarchie  Recherche dans cette table (lenteur ?) Vehicule v = new Voiture(); v.afficher(); • Méthodes finales  Non redéfinissables dans les classes filles  Plus rapides que les méthodes virtuelles  Conseil : accesseurs en final Choix opposé au C++ • Le dernier mot : la JVM hotspot …
  • 79. 79 public class Vehicule { public void afficher() { System.out.println("Vehicule"); } public static void main(String[] param) { Vehicule v = new Voiture(); v.afficher(); v.special(); ((Voiture)v).special(); ((Camion)v).afficher(); // défini précédemment } } class Voiture extends Vehicule { public void afficher() { System.out.println("Voiture"); } public void special() { System.out.println("special"); } } Que se passe-t'il ?
  • 80. 80 Niveaux d'accès • Privé | private : même classe • Protégé | protected : même package ou sous-classe d’un package différent  Moins restrictif que le C++ !  Différent en UML également • Package | - (par défaut) : package  Sorte de friend du C++  DANGEREUX • Public : tout le monde
  • 81. Encapsulation & visibilité 81 public class C1 { public int a; protected int b; int c; private int d; } public class C3 { ... } public class C5 { ... } a b c d Accessible par C2 Accessible par C3 Accessible par C4 Accessible par C5 Package p1 Package p2 public class C4 extends C1 { ... } public class C2 extends c1 { ... } Tiré de « Eléments de programmation JAVA », Olivier Dedieu, INRIA
  • 82. 82 Méthodes et classes abstraites • Mot-clé abstract (modificateur) OBLIGATOIRE • Méthode abstraite  Sans implémentation • Classe abstraite  Toute classe avec au moins une méthode abstraite OU ALORS toute classe déclarée comme telle (sans abstract, elle serait instanciable)  Non instanciable  Permet d'implémenter la notion de concept
  • 83. 83 public abstract class Vehicule1 { public void afficher() { System.out.println("Vehicule"); } } class Voiture2b extends Vehicule2 { public void afficher() {} } public abstract class Vehicule2 { abstract public void afficher() ; } class Voiture2a extends Vehicule2 { } ERREUR : must implement the inherited method abstract class Voiture2a extends Vehicule2 { } NON instanciable, sans méthode abstraite NON instanciable, avec méthode abstraite NON instanciable instanciable
  • 84. Interface (1) • Description / contrat  Liste de méthode(s) sans code  "Constantes" autorisées (public static final par défaut)  Pas de variable/attribut [UML]  « Classe virtuelle pure » [C++] • Respecter le contrat = IMPLEMENTER l'interface 84 + flotter() + avancer() <<interface>> Flottant interface Flottant { public static final int CONSTANTE = 30; double PI = 3.14; public abstract void flotter(); public void avancer(); } par défaut 8
  • 85. Interface (2) • [Vocabulaire ] IMPLEMENTER une interface • Instancier une classe ? 85 class Bateau implements Flottant { public void flotter() {} public void avancer() {} } Implémenter TOUTES les méthodes des interfaces qu’elle utilise class Radeau implements Flottant { public void avancer() {} } abstract
  • 86. Interface & polymorphisme 86 interface Autonome { public static final boolean COMPLET = yes; public void rouler(); } class Voiture extends Vehicule implements Autonome{ public void rouler() { System.out.println("Pilote automatique"); }} public static void main(String[] param) { Vehicule v = new Voiture(); ((Voiture)v).rouler(); ((Autonome)v).rouler(); System.out.println(Autonome.COMPLET); System.out.println(Voiture.COMPLET); } Google car
  • 87. instanceof 87 C M <<I>> F1 F2 C M I Object c = new C() m = new M() f1 = new F1() f2 = new F2()
  • 88. Implémentation multiple 88 public class B extends A implements IC, ID { public void methodeIC() {} public void methodeID() {} } interface IC { void methodeIC(); } interface ID { void methodeID(); }
  • 89. 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 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
  • 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 Relations entre objets • Relation • Agrégation • Composition • Référence ou tableau de références • Conteneur spécifique  Collections  Ex : java.util.ArrayList
  • 94. 94 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 // 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 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 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}* ] { }
  • 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 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. 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. 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. 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. Hiérarchie des exceptions 104 Exception IOException RuntimeException NullPointerException IndexOutOfBoundsException FileNotFoundException Gestion différenciée
  • 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 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. 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 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 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 Clonage • Copier un objet pour ne pas le modifier  Pas de constructeur de copie • Implémenter Cloneable  Sert seulement à prévenir le compilateur • Appeler la méthode clone() de la classe mère en public • S’assurer que la méthode clone() d’Object est également appelée en haut de l’échelle • Traiter les exceptions dans clone()
  • 111. 111 class Trooper implements Cloneable { public Object clone() { Trooper object = null; try { object = (Trooper) super.clone(); } catch(CloneNotSupportedException cnse) { cnse.printStackTrace(System.err); } // s'occuper des attributs "compliqués" // pour éviter la copie de surface // (shallow copy) si object != null return object; } } Copie des types primitifs Copie des références Objets non mutables (String)
  • 112. 112 Conclusion exceptionnelle • Pour toute exception déclenchée, le compilateur impose un traitement 1. Bloc try/catch qui gère cette exception 2. Passage de l'exception au niveau supérieur (appelant).  L'exception apparait alors dans la signature de la méthode
  • 113. 113 // exemple d'utilisation convertir("90"); public double convertir(String n) throws NumberFormatException { double res = Math.PI /180; try { res *= Double.parseDouble(n); } catch(NumberFormatException e) { res = .0; } return res; } Erreur du compilateur Gérer localement l'exception Passage au niveau supérieur
  • 114. 6. Bibliothèques graphiques AWT & Swing Alternatives IBM : SWT / JFace
  • 115. 115 AWT vs Swing • Abstract Window Toolkit (java.awt.*)  "Figé" depuis 1.1  Présent dans les navigateurs sans plug-in  Gestion des événements obsolète  Composants lourds • Swing (javax.swing.*)  Toujours en évolution  Plus complexe qu'AWT  Composants légers  Surcouche d'AWT (Jcomposant)
  • 117. 117 Swing • Composants de haut-niveau (lourds)  JFrame, JDialog, JApplet • Conteneurs  JPanel, JScrollPane, JToolBar • Composants basiques  JMenu, JButton, JLabel • Dessiner  Canvas (AWT), JPanel (Swing) • Index graphique des composants Swing http://download.oracle.com/javase/tutorial/ui/features/components.html • Apparence / système (Look & Feel) NON ABORDÉ
  • 118. 118
  • 119. 119
  • 120. 120
  • 121. 121
  • 122. 122 import javax.swing.*; public class HelloWorldSwing { private static void createAndShowGUI() { JFrame frame = new JFrame("HelloWorldSwing"); JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { createAndShowGUI(); } } Cas 1 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SwingUtilities.invokeLater(new Runnable() { public void run() { } }); JFrame.setDefaultLookAndFeelDecorated(true); Calcul de la taille Et affic hage Gestion des threads Et classe imbriqu ée Exemple du tutoriel officiel Sun/Oracle sur Swing :
  • 123. • Classe imbriquée dite anonyme • Spécialise la classe donnée ou implémente l'interface donnée • Déclarée à la volée / utilisée qu'une seule fois • Compilée avec un nom arbitraire nomclasseenglobante$nombre.class 123 invokeLater(new Runnable() { public void run() { // faire qq chose } }); invokeLater(() -> createAndSowGUI()); 8 𝜆
  • 124. 124 Manipuler une fenêtre ? (1) • Instancier un objet JFrame 1. Déclaré à la volée dans un méthode ;-(  Ne peut être réutilisé ailleurs 2. Spécialisation de classe ;-( 3. Attribut d'objet (composition)
  • 125. 125 public class MonApplication extends JFrame{ public MonApplication() { super("Mon application"); } static public void main(String[] argv) { MonApplication ma = new MonApplication(); ma.afficher(); } } public class MonApplication { JFrame frame; public MonApplication() { frame = new JFrame("Mon Application"); } static public void main(String[] argv) { MonApplication ma = new MonApplication(); ma.afficher(); } } public void afficher() { frame.pack(); frame.setVisible(true); } Cas 2 public void afficher() { pack(); setVisible(true); } Cas 3
  • 126. 126 Manipuler une fenêtre ? (2) Cas le plus général et recommandé ! L’application gère des fenêtres spécialisées !
  • 127. 127 Boîte de dialogue simple • Classe JOptionPane • Méthodes de classe showXXXDialog  Message, Confirm, Option, Input JOptionPane.showConfirmDialog(frame, "Alors, ça vous plaît ?"); • Fenêtre parent • Peut être null Réponse
  • 128. 128 Ouvrir une fenêtre • Afficher une application graphique simple agrégeant un JFrame • Ajouter une boite de dialogue modale
  • 129. 129 Ajouter des composants ? • Que se passe-t'il ? • Nécessité de positionner les éléments • Qui peut recevoir des composants ?  Composants de haut niveau  Conteneurs -> Panels // après frame.getContentPane().add(label); // dans HelloWorldSwing frame.getContentPane().add(new JLabel("2"));
  • 130. 130 Positionnement • Placer des composants  Taille (fixe, minimale, maximale et préférée)  Position absolue ou relative (portabilité) • Politique de placement d'un conteneur : Layout  JFrame, JDialog, JPanel, … • Complexe à manipuler  Conteneurs et Layouts spécialisés en cascade  GUI Builder • Matisse / Netbeans avec GroupLayout • WindowBuilder / Eclipse • IntelliJ
  • 131. 131 Layout Manager (1) http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html Points cardinaux Horizontal ou vertical Complexe mais puissant Formulaire
  • 132. 132 Layout Manager (2) • Flow • Box • Border • Grid • Card • GridBag • Spring • Aucun frame.getContentPane().setLayout(new FlowLayout()); frame.getContentPane().add(objet [, paramètres]); Managers par défaut : • BorderLayout pour le contentPane du JFrame • FlowLayout pour un JPanel Package : java.awt
  • 133. 133 On teste … • Tester le BorderLayout …  avec un bouton dans chaque zone  Nord, Sud, Est, Ouest, Centre • Tester le FlowLayout  … en ajoutant des boutons frame.getContentPane().setLayout(new FlowLayout()); for (int i=0; i < 5; ++i) frame.getContentPane().add( new JButton(new String(i))); • ""+i Passage par StringBuffer • (new Integer(i)).toString() • String.valueOf(i) Changer la taille de la fenêtre
  • 134. 134 contentPane (JFrame) pane = new JPanel(); (Layouts par défaut des composants) frame.getContentPane().add(pane, BorderLayout.CENTER);
  • 135. 135 Organisation par couches Root Pane Layered Pane Glass Pane MenuBar ContentPane Layout Manager C1 C2 … … Cn
  • 136. 136 Événements (1) • Communication entre les composants d'une application et l'utilisateur  Envoi de messages  Appel de méthodes d’une interface • Intéressé(e) par un événement ? 1. Vérifier que le composant permet d’y répondre 2. Écrire un gestionnaire 3. Enregistrer le gestionnaire auprès du composant
  • 137. Événements (2) Activer un JButton Choisir un menu Appuyer sur une touche (focus) Appuyer / relâcher un bouton de souris Entrer ou sortir d’un composant avec la souris Déplacer la souris Utiliser la molette Déplacer la fenêtre Réduire la fenêtre Fermer la fenêtre Changer la taille 137 Action Regroupement fonctionnel = MouseListener
  • 138. Activer un JButton (action) 1. Ecrire le gestionnaire 2. Enregistrer le gestionnaire 138 class Gestionnaire implements ActionListener { public void actionPerformed(ActionEvent e) { // ce qu'il y a à faire } } JButton bouton = new JButton("Libellé"); bouton.addActionListener(new Gestionnaire()); Afficher une boite de dialogue avec le programme précédent
  • 139. Event / Listener / Adapter • Event • Listener  Spécifique à l'événement  Liste des méthodes / messages possibles composant.addEventListener() • Adapter  Patron de conception / design pattern  Implémentation "vide" de convenance 139 ActionAdapter n'existe pas ! AbstractAction existe MouseEvent MouseListener MouseAdapter Toujours possible ? addMouseListener()
  • 140. 140 A bas les boutons … (1) • Afficher quelques boutons • Incrémenter la valeur d'un bouton à chaque fois que l'on clique dessus • Ajouter une boîte de confirmation pour la sortie du programme
  • 141. 141 A bas les boutons … (2) • Bouton ? 1. Spécialiser JButton pour compter 2. Utiliser JButton directement • Gestionnaire ? 1. Une instance pour tous les boutons 2. Un instance par bouton • Possibilité : le bouton lui-même MonBouton #compteur : int + MonBouton(); + incrementer(); JButton DEPRECATED <<interface>> ActionListener
  • 142. A bas les boutons (3) • Sortie propre ?  Changer le comportement par défaut  Gestionnaire • showConfirmDialog • Evénement ?  Quitter 142 FENETRE PAS ENCORE FERMEE
  • 143. 143 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
  • 145. 145 Dessiner • Canvas [AWT]  Composant "lourd"  void paint(Graphics g) • JPanel [Swing]  Composant léger  Opacité  void paintComponent(Graphics g)  paint() existe mais … • Contexte graphique "prêté" par le système • Méthode repaint() pour mettre à jour
  • 146. JCanvas • Étendre la classe JPanel  Opaque ? double buffering ?  Layout inutile ! • Fixer la taille du composant  PreferredSize (utilisée par pack())  MinimumSize, MaximumSize • Redéfinir paintComponent()  À ne jamais appeler directement  Appeler super.paintComponent(g) si besoin • Efface le composant 146
  • 147. 1. Simuler un oscillateur "fixe" 2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal) 147
  • 148. Solution ? 148 C contentPane (JFrame) JButton + gestionnaire (Action) appelle repaint()de la zone de dessin ou du JFrame. JLabel JCanvas • étend JPanel • redéfinit paintComponent(…) => dessin • commencer par un rectangle tout simple • précise la taille préférée setPreferredSize(new Dimension(800,600)); W E N S Math.random() Random getParent().repaint()
  • 149. Barre de menus 149 Fichier Nouveau Ouvrir Sauvegarder Quitter menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); menu = new JMenu("Fichier"); menuBar.add(menu); item = new JMenuItem("Nouveau"); item.addActionListener(…); item.setAccelerator(…); menu.add(item); menu.addSeparator();
  • 151. 151 Swing vs Java FX • Développement d'applications riches • Swing (javax.swing.*)  Stack historique (depuis java 1.2)  "Figée" depuis 1.8 • Java FX 2 (javafx.*)  Bibliothèque officielle  MAIS pas livrée avec toutes les JVMs  Supporte le CSS et le FXML  Plus riche que Swing : 2D et 2D
  • 153. Contrôles 153 Button ToggleButton RadioButton Checkbox ChoiceBox ComboBox MenuBar Menu MenuItem Separator ToolBar …
  • 157. Et encore … • ScrollBar / ScrollPane • ProgressBar / ProgressIndicator • Accordeon • PaginationControl • Pleins de Pane • Tab • Canvas • Chart • Des boîtes de dialogues 157
  • 158. 158 public class FXHelloWorld extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } Exemple du tutoriel officiel Sun/Oracle sur JavaFX : Classe dédiée Créé par le système un composant ajout btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); Action au clic
  • 159. 159 • Java FX n'est pas livré avec toutes les JVM 8 • Eclipse ne reconnaît pas Java FX par défaut Méthode 1 : • Paramétrer le projet • Règle d'accessibilité Méthode 2 : • Greffon e(fx)clipse • Projet spécifique
  • 160. • Classe imbriquée dite anonyme • Spécialise la classe donnée ou implémente l'interface donnée • Déclarée à la volée / utilisée qu'une seule fois • Compilée avec un nom arbitraire nomclasseenglobante$nombre.class 160 btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } });
  • 161. 161 Boîte de dialogue simple • Classe Alert  Type + Texte + Boutons  Modale : showAndWait() Alert a = new Alert(…); Optionnal<ButtonType> r = alert.showAndWait(); if (r.isPresent() && a.get() == ButtonType.OK) …
  • 162. 162 Ajouter des composants ? • Que se passe-t'il ? • Nécessité de positionner les éléments • Qui peut recevoir des composants ?  Conteneurs -> Panels  Arborescence de composants // après root.getChildren().add(btn) Btn = new Button("Deuxième bouton); root.getChildren().add(btn);
  • 163. 163 Positionnement / Layout • Placer des composants …  Taille (fixe, minimale, maximale et préférée)  Position absolue ou relative (portabilité) • ... dans des Nœuds particuliers Region  Transformations applicables  Composants ordonnées ou pas  Imbricables • FXML  Description en XML  Événements en Java ou JS ou …  Style en CSS Property
  • 165. 165 Layouts (2) • BorderPane • HBox • VBox • StackPane • FlowPane • TextFlow • TilePane • DialogPane • GridPane • AnchorPane • … • SplitPane • TabPane • ScrollPane
  • 166. 166 On teste … • Tester le BorderPane …  avec un bouton dans chaque zone  TOP, RIGHT, BOTTOM, LEFT, CENTER • Tester le FlowPane ou TilePane  … en ajoutant des boutons root = XXXXPane(); root1.setBottom(…); root2.getChildren().add(…); btn.setMaxWidth(Double.MAX_VALUE); btn.setMaxHeight(Double.MAX_VALUE); Changer la taille de la fenêtre
  • 167. 167 Événements • Communication  Système – Application - Utilisateur • Propagation à double sens • Gérés au sein d'un unique thread  FX Application thread Platform.runLater(); isAppFXThread()
  • 168. 168 Hiérarchie & type Event Input Window Action … ANY PRESSED RELEASED TYPED ANY CLOSE REQUEST HIDDEN / HIDDING SHOW / SHOWING ANY PRESSED / RELEASED MOVED ENTERED / EXITED …
  • 169. Propagation 1. Cible ? 2. Route 3. Capture 4. Bubbling 169 Stage Scene … … Cible / target Capture (Filtre) Bubbling addEventFilter() setOnEvent() … Consommation e.consume() EventHandler<Event> -> handle()
  • 170. Activer un Button (action) (1) 170 @FunctionalInterface interface EventHandler<ActionEvent> { public void handle(ActionEvent event); } Une seule méthode Type dérivé de Event Unique méthode à implémenter
  • 171. Activer un Button (action) (2) • Utilisation d'un objet  Objet créé à la volée  Référence d'objet instance de EventHandler<AE> • Utilisation d'une méthode  Lambda  Référence de méthode 171 Choisir un bouton et écrire sur la console ou Afficher une boite de dialogue avec le programme précédent setOnAction(objet::handle) setOnAction(new EventHandler<AE>() {}); setOnAction(objet); setOnAction((AE e) -> { … }); 𝜆
  • 172. 172 A bas les boutons … (1) • Afficher quelques boutons • Incrémenter la valeur d'un bouton à chaque fois que l'on clique dessus • Ajouter une boîte de confirmation pour la sortie du programme OU quitter après deux clics sur la croix
  • 173. 173 A bas les boutons … (2) • Bouton ? 1. Spécialiser Button pour compter 2. Utiliser Button directement • Gestionnaire ? 1. Une instance pour tous les boutons 2. Un instance par bouton • Possibilité : le bouton lui-même Button : setText () Integer : parseInt() MonBouton - compteur : int + MonBouton(); + incrementer(); Button event.getSource() <<interface>> EventHandler<AE>
  • 174. A bas les boutons (3) • Comportement par défaut • Modifier le comportement  Boite de dialogue  Consommer l'événement • Forcer une sortie 174 Platform.exit() System.exit(0) Application arrêtée lorsque toutes les fenêtres sont fermées (implicitExit) Alert a = new …; a.showAndWait()
  • 175. 175 Dessiner • Canvas  Composant transparent  Pas forcément attaché à une scène  GraphicsContext • Hiérarchie de composants shape  Rectangle, Circle, SVGPath, Text …  Remplissage fill  Trait stroke  Combinaisons ( +, - )
  • 176. 176 (0,0) y x Orientation par défaut (x1,y1) height width graphics.fillOval(x1, y1, width, height); Graphics.strokeRect(x1, y1, width, height); Contexte graphique
  • 177. 1. Simuler un oscillateur "fixe" 2. Gérer l'appui du bouton : générer un nouvel affichage (aléatoire ou sinusoïdal) 177
  • 178. Solution ? 178 C BorderPane Button + EventHandler Label Canvas W E N S Math.random() Random
  • 179. Barre de menus 179 Fichier Nouveau Ouvrir Sauvegarder Quitter menuBar = new MenuBar(); root.setTop(menuBar); menu = new Menu("Fichier"); menuBar.getMenus().add(menu); menuBar.getMenus().addAll(m1, m2, m3); item = new MenuItem("_Nouveau"); item.setMnemonicParsing(true); item.setAccelerator( new KeyCodeCombinaison(… )); item.setOnAction(…); menu.getItems().add(item); BorderPane.TOP
  • 181. Concurrence • Plusieurs tâches en même temps • Processeurs multi cœurs • Threads ou processus légers  Partage données • Historiques : Thread, Runnable • Package java.util.concurrent • Modèles pour interfaces graphiques 181 5
  • 182. 182 Tâche • Sécurité d'accès aux méthodes et données  Méthode/statement qualifié synchronized  Variable qualifiée volatile  Variable qualifiée final (Immutable) • Méthode pour démarrer start() • Méthode pour endormir sleep() • L'arrêt doit être NATUREL run()  La méthode d'exécution doit se terminer normalement  Test d'arrêt  Vérification de demande d'arrêt
  • 183. Thread et UI ? • Interface gérée un unique thread  Propagation des événements  Patron MVC : concurrence difficile • Interface peut être figée facilement • Tâches longues en arrière-plan • Swing : fil des événements  SwingWorker (antérieur au patron Executor) • JavaFX Application thread  Package extension de java.util.concurrent 183
  • 184. Tâche longue 184 Temps FinDébut Thread des événements paint paintclic Paint + calcul très long … Calcul très long … inits fin Actions simples successives Blocage de l'interface Paint + calcul long … Calcul en arrière-plan : interface libre
  • 185. 185 Thread vs Runnable // Exemple avec implémentation d'interface // Modélisation : créer une nouvelle tâche class Tache implements Runnable { // implémenter run() } // AILLEURS : Tache tache = new Tache(); (new Thread(tache)).start(); // Exemple avec spécialisation de classe // Modélisation : créer un nouveau type de Thread class Special extends Thread { } Special special = new Special(); special.start(); CONSEILLÉ
  • 186. Java FX • Interface Worker • Implémentation : Task et Service 186
  • 187. • Tache : génération aléatoire de rectangles avec une composante alpha (couleur RGBA) • Menu : Rafraichir et quitter • "Quitter?" par le menu et la croix • Blocage de l'interface ? • Gérer le redimensionnement 187 Interface graphique & tâche longue
  • 188. 188 Modèle MVC • Modèle / Vue / Contrôleur • Logique applicative vs présentation • Design(s) pattern(s) / Patron de conception  Communément adopté (un des plus vieux)  Pas trivial du tout  A éviter sur les trucs simples  Adopté par Swing (Table <-> TableModel)  Adopté par JavaFX (FXML)
  • 190. 190 Modèle Contrôleur Transmet l’action Vue Vue Vue (s) Rafraîchissement Données Changement d’état Notification changements (Observer) Action utilisateur
  • 191. 8. Fichiers & Flux Sérialisation
  • 192. 192 Gestion des entrées/sorties (1) • Flux E/S de données binaires • Flux E/S de caractères • Flux E/S d’objets • Communication avec des fichiers • Communication avec des ressources Internet • Sérialisation (=> réseau)
  • 193. 193 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
  • 195. File fic = new File("log.txt"); FOS fos = new FileOutputStream(fic); PS ps = new PrintStream(fos); ps.println("une chaine de caractères"); ps.close(); fos.close(); Flux de sortie 195 OutputStream PrintStreamFileOutputStream fichier sortie flux texte conversion System.out flux sortie conversion DataOutputStream flux binaire PrintStreamDataOutputStream flux écran Tiré de http://www.nawouak.net, B. Bachelet
  • 196. Flux d’entrée 196 InputStream InputStreamReader FileInputStream flux texte (caractère par caractère) System.in flux entrée conversion DataInputStream flux binaire DataInputStream flux clavier StreamTokenizer conversion StreamTokenizer conversion flux texte (item par item) fichier entrée Tiré de http://www.nawouak.net, B. Bachelet
  • 197. 197 // Version 1 standard // Attention aux exceptions soulevées InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); br.readLine(); Saisie clavier // Version 1.6 // les exceptions sont gérées par la Console System.console().readLine(); System.console() == null sous Eclipse ! 6
  • 198. 198 BufferedReader br = null; FileReader fr = null; try { fr = new FileReader(nomFichier); br = new BufferedReader(fr); String lecture; while ((lecture = br.readLine())!=null) { // } br.close(); fr.close(); } catch (Exception e) { e.printStackTrace(); } Exceptions possibles ? Pas la bonne place } finally { if (br!=null) br.close(); if (fr!=null) fr.close(); } Bonne place Mais exception possible try { } catch(Exception e) { Pas la bonne place non plus = duplication de codeif (br!=null) br.close();
  • 199. Try-with-resources • Ressource  Tout objet à fermer / libérer après utilisation  Fichier, flux, chaussette, requête • Méthode classique (< 1.7)  close() dans bloc finally => exception levable  Bloc try-catch englobant supplémentaire ou relance • Fermeture et libération automatique (1.7+)  Syntaxe simplifiée  Interface AutoCloseable 199 7 7
  • 200. 200 // bloc try-with-resources try ( FileReader fr = new FileReader(nomFichier); BufferedReader br = new BufferedReader(fr); ){ String lecture; while ((lecture = br.readLine())!=null) { // } } // Les ressources sont fermées automatiquement catch (Exception e) { e.printStackTrace(); } Certaines exceptions peuvent être lancées mais elles sont dissimulées. Elles sont toutefois récupérables en cas de besoin.
  • 201. 201 Sérialisation (1) • Transformer un objet présent en mémoire en bits  Sur un disque (Stockage - Persistance)  Sur le réseau (Communication – RMI)  Les infos de classe ne sont pas transmises • Implémenter l'interface Serializable  Ne fait rien, prévient le compilateur • Proposer une version de sérialisation  static final long serialVersionUID = 110L; • Attention à la protection des données  Données transient : données non copiées  Ou implémenter Externalizable
  • 202. 202 Sérialisation (2) void writeObject(ObjectOutputStream out) throws IOException; void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; void readObjectNoData() throws ObjectStreamException; FileOutputStream/FileInputStream ObjectOutputStream/ObjectInputStream Flux (streams) à utiliser … Méthodes à redéfinir pour un comportement particulier
  • 203. 203 FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("fichier.dat"); oos = new ObjectOutputStream(fos); oos.writeObject(objects); oos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (oos!=null) oos.close(); if (fos!=null) fos.close(); } FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("fichier.dat"); ois = new ObjectInputStream(fis); objects = (Composite) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { if (ois!=null) ois.close(); if (fis!=null) fis.close(); } Classe de l'objet
  • 204. 204 Sérialisation en XML • XMLEncoder pour les objets respectant les conventions NetBeans • X-Stream pour les autres ;-)  Une bibliothèque tiers sur github
  • 205. 205 FileOutputStream fos = null; XStream xstream = null; try { fos = new FileOutputStream(name); xstream = new XStream(new StaxDriver()); xstream.toXML(objects, fos); } catch (Exception e) { e.printStackTrace(); } finally { if (fos!=null) fos.close(); } FileInputStream fis = null; XStream xstream = null; try { fis = new FileInputStream(name); xstream = new XStream(new StaxDriver()); objects = (Composite)xstream.fromXML(fis)); } catch (Exception e) { e.printStackTrace(); } finally { if (fis!=null) fis.close(); } Classe de l'objet
  • 206. TP "Houzehou" 206 • Manipulation de classes et d'interfaces • Conteneurs • Fichiers textes • Javadoc • JTable (Swing) TableView(JavaFX)
  • 207. 207 Houzehou Personne // tableau statique static int MAX = 50; Personne[] p1 = new Personne[MAX]; p1[0] = new Personne(); // tableau dynamique (thread-safe) Vector<Personne> p2 = new Vector<Personne>(); p2.addElement(new Personne()); // Liste : ArrayList, LinkedList, … ArrayList<Personne> p3 = new ArrayList<Personne>(); p3.add(new Personne()); new StringBuffer(nom+":"+prenom); // tableau dynamique Legacy ou avec "erasure" Vector p2 = new Vector(); p2.addElement(new Personne());
  • 208. 208 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
  • 210. 210 Plan • Plus d'exemples avec JAVA  Enumération,  Ajouts 5, 6 et 7, pas encore 8 • Généricité & collections • Applet • Outils • Autres documents : JNI, JDBC, Java EE
  • 212. 212 Terminologie : classe imbriquée • Classe imbriquée / nested class  Classe définie à l’intérieur d’une autre classe • 4 types de nested class  Classe membre statique  Classe membre non statique  Classe locale (définie dans une méthode)  Classe anonyme (locale sans nom) Inner class • N’existe qu’avec une instance de la classe • Pas de membres statiques • Peut accéder aux variables / attributs de l'englobant
  • 213. 213 Conventions (1) • Documentation officielle • Tutoriaux SUN/Oracle • Respect à l'écriture, facilité de lecture • Production rapide • Intégrée dans les EDI classiques  Génération automatique de code
  • 214. 214 Conventions (2) • Nom de classe ou interface  Première lettre majuscule  Reste en minuscules  Majuscules aux mots composés • Attribut écrit en minuscule  Pas de tiret • Méthode  Verbe pour action  Premier mot en minuscule  Majuscules à la première lettre des mots suivants class CoursGenial int attribut; void ronfler();
  • 215. 215 Conventions (3) • Accesseur / Accessor  get + nom de l'attribut  is pour un booléen • Mutateur/Mutator  set + nom de l'attribut • "Constante"  Tout en majuscules • Package  Tout en minuscules getAttribut() isAttribut() CONSTANTE fr.isima.paquetage setAttribut()
  • 216. 216 Énumération ? (<1.5) • Pas de vérification de type • Affichage de la valeur sans intérêt public static final int LUNDI = 0; public static final int MARDI = 1; public static final int MERCREDI = 2; public static final int JEUDI = 3;
  • 217. 217 Énumération http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html enum Semaine { LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE} for (Semaine jour : Semaine.values()) System.out.println(jour); for (Semaine j : EnumSet.range( Semaine.LUNDI, Semaine.VENDREDI)) System.out.println(j); Dangereux mais utile : le static import 5
  • 218. 218 Enum améliorés enum Nom { VAL1(1), VAL2 (2); private int valeur; Nom(int i) { this.valeur = i }; } enum Nom { VAL1 { retour methode(params) {…}}, VAL2 { retour methode(params) {…}}; abstract retour methode(params); } 5
  • 219. Annotation • "Extension" de celles du javadoc trop restrictives • Méta données  Développeur  Compilateur  Machine virtuelle  Génération code, documentation, configuration • Plus simple et plus léger que le XML • Utilisation intensive  JUnit 4+  Java EE : JPA, … 219 5
  • 220. Annotations standards • @Override • @SuppressWarnings  @SuppressWarnings(value="deprecation")  @SuppressWarnings("deprecation")  @SuppressWarnings({"unchecked", "deprecation"}) • @Deprecated • @Documented  Documentation • @Retention(RetentionPolicy.RUNTIME)  Exécution
  • 221. 221 class Mere { public void methode() { System.out.println("Methode de Mere"); } } class Fille extends Mere { @Override public void Methode() { System.out.println("Methode de Fille"); } } Fille f = new Fille(); f.methode(); The method Methode() of Fille must override or implement a supertype method
  • 222. Annotations personnalisées 222 @interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; String[] reviewers(); // utilisation possible des tableaux } Aller plus loin : http://download.oracle.com/javase/tutorial/java/javaOO/annotations.html http://www.jmdoudoux.fr/java/dej/chap010.htm#annotations
  • 223. Méthode à nombre d'arguments variable 223 public void somme(double … nombres) { double s = 0.0; // méthode classique for(int i=0; i < nombres.length; ++i) s += nombres[i]; // nouvelle forme de for for (double nb: nombres) s+= nb; } 5
  • 224. Auto [un] Boxing • Conversions automatiques • AutoBoxing  attention à la création implicite d'objets • Auto unboxing 224 int n = nombre; // converti automatiquement int n = nombre.intValue(); Integer nombre = 10; // conversion automatique Integer nombre = new Integer(10); Avertissements / Erreurs possibles sous Eclipse 5
  • 226. 226 Généricité • Classes paramétrées • Méthodes paramétrées • Wildcards (<? extends classe>)  En lecture (pas en création) • Définition générique  Compilée une fois pour toutes (≠ C++), efficacité ?  Partagée par toutes ses invocations • Pas de typedef  paramètre : une lettre en majuscule (convention)  Éviter de dériver une classe pour donner un nom Plus de renseignements : http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf 5
  • 227. 227 Généricité : exemple public interface List<E> { void add(E e); Iterator<E> iterator(); } public interface Iterator<E> { E next(); boolean hasNext(); } public void dessiner(List<E extends ObjetGraphique> l); static<T> void ajouter(T[] tab, Collection<T> c) { for(T o :tab) c.add(o); } 5
  • 228. 228 Collections (1) • Gérer des collections dynamiques d'objets  Conteneurs non générique d'objets de classe Object  Conteneurs génériques  Incompatibilité de plateforme • Algorithmes  Tri  Recherche  Manipulation • Paquetage java.util Options –source et -target http://docs.oracle.com/javase/tutorial/collections/index.html 5 5
  • 229. Collection (2) 229 «interface» Collection T «interface» Set «interface» List «interface» Queue T T T «interface» SortedSet T «interface» Map K,T «interface» SortedMap K,T «implémente» «implémente» «implémente» Set : pas de doublons Queue : FIFO par ex Map : table de hachage Vector
  • 230. 230 Collections (3) • Avant Java 1.5  Conteneurs d'Object  Downcast obligatoire  Vector [Vecteur dynamique]  Enumeration [itérateur]  Dictionary (Hashtable) [Map] • Après 1.5  Mêmes conteneurs templatisés  Utiliser ArrayList plutôt que Vector sauf multithread  Utiliser la Map plutôt que Dictionary 5
  • 231. 231 Exemple (non générique) Vector v = new Vector(); // on ne peut stocker que des objets, int est exclu for (int i=0; i<10; ++i) v.addElement(new Integer(i)); // transtypage obligatoire int somme = 0; for (int i=0; i<10; ++i) somme += ((Integer)v.elementAt(i)).intValue(); // avec une énumération Enumeration e = v.elements(); while (e.hasMoreElements()) somme += ((Integer)e.nextElement()).intValue();
  • 232. 232 Exemple (générique) Vector<Integer> v = new Vector<Integer>(); // on ne peut toujours pas stocker de int for (int i=0; i<10; ++i) v.addElement(new Integer(i)); // plus de transtypage int somme = 0; for (int i=0; i<10; ++i) somme += v.elementAt(i).intValue(); // avec une énumération, elle aussi paramétrée Enumeration<Integer> e = v.elements(); while (e.hasMoreElements()) somme += e.nextElement().intValue(); 5
  • 233. 233 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
  • 235. 235 javadoc Outil externe pour générer une documentation au format HTML (similaire à la documentation officielle Java)  Intégré au langage, commande en standard  Format "universel" et simple  Commentaires dans le code  Autre outil similaire : Doxygen  Lisibilité du code  Le code doit compiler  Ne fait pas tout ! /** */
  • 236. 236 javadoc ? • Commentaires spéciaux • Personnalisation avec code HTML ou CSS • Balises  @param  @return  @throws @exception  @see  @since  @deprecated  @author /** */ Eclipse : (M) Project > Generate Javadoc
  • 237. 237 Exemple /** * Description de la classe * */ class ExempleJavaDoc { /** * description courte * * description longue …… * @param param1 description * @param param2 description * @return le resultat de la methode */ public int methode(int param1, double param2) {} }
  • 238. 238 jar • Java ARchive  Exécutable ( ≈ tar)  Format de fichier compressé  Contrôle de version par exemple • Permet de distribuer/déployer  une application (autonome ou applet, JEE)  un package • Contenu  Fichiers .class  Fichiers ressources (images)  Fichier Manifest
  • 239. 239 Bibliographie (1) • Documentation JAVA de Sun/Oracle • Tutoriaux Web de Sun/Oracle • Cours JAVA d'Olivier Dedieu, INRA • Intro JAVA, Bruno Bachelet http://www-sor.inria.fr/~dedieu/java/cours/ http://www.nawouak.net/?doc=java+lang=fr http://download.oracle.com/javase/tutorial/
  • 240. 240 Bibliographie (2) • Thinking in Java, 2nd ed, Bruce Eckel • Head First Java, 2nd ed, Kathy Sierra, Bert Bates , O'Reilly, 2005
  • 241. Aller plus loin… • Java standard  Introspection  Génériques  Réseau, RMI  Threads avancés  JNLP • Outils  Ant, Maven  Netbeans, IntelliJ IDE • Java Entreprise  Glassfish, tomcat  Servlets, jsp, beans  Persistance (JPA, Hibernate)  Facelets (JSF)  Frameworks : Struts, Spring, … 241

Notas del editor

  1. Novembre 2006
  2. Novembre 2006
  3. 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, …
  4. Java sorti en septembre 2017
  5. Foreach dans un instant…
  6. StringBuffer est synchronisée StringBuilder ne l'est pas ..
  7. Scanner est déconseillé car pas tres performant
  8. Enlever le set : lecture seule
  9. F1b ne compile pas !!
  10. Novembre 2006
  11. Downcasting => compil OK, mais erreur à l'exécution Downcasting non vérifié … instanceof permet d'éviter
  12. On peut avoir une classe abstraite sans méthode abstraite Passe au compilo en tout cas
  13. Que des méthodes publiques … Constantes publiques ?
  14. On parle aussi d'héritage multiple de type (et non d'implémentations)
  15. On retrouve les problèmes du C++
  16. Attention, la console n'est pas toujours définie, notamment sous les EDI
  17. L'exception e est implicitement final pour faire de la relance efficace au cas ou …
  18. Novembre 2006
  19. Novembre 2006
  20. Box : pas de wrap si redimensionnement
  21. Novembre 2006
  22. Novembre 2006
  23. Javafx dans la doc 1.9 pas dans la 1.8 Javafx dans la premiere version : un langage de script
  24. Novembre 2006
  25. Novembre 2006
  26. Box : pas de wrap si redimensionnement
  27. Novembre 2006
  28. Exemple : empêcher une sortie d'application
  29. Shape => en faire un Group
  30. Novembre 2006
  31. Existe depuis 1979
  32. 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.
  33. StringBuffer sans +, append
  34. Novembre 2006
  35. Classe locale définie dans un bloc = peut accéder aux variables globales du bloc
  36. Adresse du pdf pas changée au 29/09/2010