Vous êtes sur la page 1sur 213

Novembre

2014 Support tudiant

h"p://www.isima.fr/~loic

ObjecDfs
crire un programme JAVA
UDliser les concepts objets avec JAVA
Concevoir des IHM

Pr-requis
Syntaxe C/C++
Concepts objets
2

Cadre
Le Java vu par SUN et uniquement
Prparer les premires cerDcaDons
ExcepDon : uDliser l'EDI Eclipse

valuaDon
Prsence
Examen nal
3

NetBeans vs Eclipse
Sun / Oracle
Supporte toujours les
dernires technos
Java
ConcepDon de GUI
naDve (maDsse)

IBM
RputaDon plus pro ?
Plugin : dlai ?
IncompaDbilit ?

Plugin :
WindowBuilder

Ne pas uDliser tout de suite


4

Plan
1.
2.
3.
4.
5.
6.
7.
HS

Premier programme
NoDons de base & syntaxe
Concepts objets en Java
Les excepDons
IHM : AWT & Swing
Concurrence (Threads)
Fichiers & ux, srialisaDon
Complments

8
23
44
94
108
144
155
173
5

IntroducDon
le ?
Javascript (ECMA) ?

Langage
Machine virtuelle
Plateforme
6

MoDvaDons
Langage cr en 1995
Patrick Naughton
James Gosling

Simple
Scuris (rseaux, Internet)
Portable
Performant

Concepts diciles du
C++ vacus
7

2. Premier programme

Premier programme
/** ma premire classe */
public class Exemple
{
public static void main(String[] argv)
{
// afficher un message
java.lang.System.out.println(Bonjour);
System.out.println(;-));
}
}

Fichier source (texte) Exemple.java


9

Pour voir le rsultat


1. Compiler le programme
javac Exemple.java

2. Lancer le programme
java Exemple

.exe ?

.class ?
10

Fichier source
Extension : .java
Nom du chier = nom de la classe publique
Respecter la casse Exemple
1 classe publique par chier
Pas de point virgule en n de classe !
Mlange dclaraDon + implmentaDon
+ commentaires
11

CompilaDon
Fichier compil : .class
Pseudo-code (byte-code)
Code machine
javac Exemple.java

Certains compilateurs transforment le code java


en code naDf :
Portabilit nulle
GesDon de la mmoire ?

12

ExcuDon
Pseudo-code interprt par la JVM
Java Virtual Machine
java Exemple

voire compil en naDf la vole (JVM hotspot)


Programme seul embarqu dans
(standalone) une page HTML (applet)
Dirences : son, scurit (gesDonnaire)

Processeur JAVA (Smart Cards)


Systmes Android
Portabilit totale si bonne JVM
13

Exercice
Tester le programme Exemple
Consulter la documentaDon
Google : java documentaDon api 7 ou 8
h"p://docs.oracle.com/javase/7/docs/api/
h"p://docs.oracle.com/javase/8/docs/api/

Consulter les tutoriaux ociels


h"p://docs.oracle.com/javase/tutorial/

14

DocumentaDon

15

Paquetage / package (1)


Un ensemble de classes/chiers rassembls pour une
nalit
besoin foncDonnel
[C++] espace de nommage
par dfaut (java.lang)
Standard (gesDon E/S, graphisme)
Personnel / Tiers

Version

Plateforme

16

Paquetage / package (2)


Nom spcique 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

Mcanisme arborescent comme les rpertoires


Sparateur : le point

Retrouver les packages : classpath

Variable systme
Paramtres en ligne de commande (-cp ou classpath)

17

Clause import
SpcicaDon complte dune classe dun package
qui nest pas charg par dfaut
javax.swing.SwingUtilities;

Facilit : clause import


import javax.swing.SwingUtilities;
import javax.swing.*;


EnumraDon

lunit
Par package (*) non rcursif ;-(

import javax.swing.event.*;

18

L
E
G
A
C
Y

1.0 (1.1) applet , jni, awt

[1995]

[1998]

[2000]
[2002]
[2004]

1.6 scurit, scripts, performance


3795 classes
AcquisiDon de Sun par


1.7 open JDK - 4024 classes

1.8 4240 classes


[2006]

236 classes pour 1.0.2

1.2 swing (version 2)


1524 classes

1.3 dbogage

1.4 performances nio
1.5 - patrons / templates
3279 classes

[2010]
[2011]
[2014]

19

Aujourdhui ?
Java 7 update 71/72
Open JDK
SimplicaDon de syntaxe
Framework de paralllisaDon

Java 8 update 25
Streams
Lambdas
Code dans les interfaces

etud
Java 7 u71

berzet
Java 8 u20

Java 9 ? 2016 ?
Modularit
20

Plateforme
L Plus grosse dicult du java

connatre ces classes standards

classes deprecated
J DocumentaDon bien faite :
javadoc & tutoriels


java showversion
javac -version
// version > 1.3,
// options : source et -target
21

DistribuDon ?
Usage
ExcuDon seule (JRE)
Dveloppement (JDK < 2, SDK v 2)

Cibles
Standard Java SE / J2SE
Entreprise Java EE / J2EE
Micro
Java ME / J2ME (v 5)
22

3. NoDons de base
Syntaxe

{ Accolades }
public class Exemple
{
public static void main(String[] argv)
{
// afficher un commentaire monoligne
/* commentaire
sur plusieurs lignes
*/
/** commentaire javadoc
*/
}
}

Classe
Mthode
Bloc : ensemble squenDel dinstrucDons

24

A"ribut / Variable ?
Objet
Prdni ou uDlisateur
Chane de caractres : String "Essai"
ManipulaDon par rfrences (pointeurs ?)

Scalaire / PrimiDve

enDer / rel / boolen


caractre A
pour l'ecacit
doubl par un type objet
25

Types de donnes scalaires (1)


char
type caractre
String
unicode '\u0000'

boolean
true ou false.
non homomorphe aux
enDers

types enDers

byte (8 bits)
short (16 bits)
int (32 bits)
long (64 bits)

types rels
float (32 bits)
double (64 bits)

26

Types de donnes scalaires (2)


Normaliss (portabilit)
Doubls par des types objets :
Double
Integer

Mthodes
toString()
Double.parseDouble()

27

DclaraDon de variables
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;
}

N'importe o dans le bloc


IniDalisaDon d'une variable pas automaDque
Erreur : "might not be iniDalized"
28

{
int i = 0 ;
{
int j= 3 ;
// i est utilisable dans ce bloc
}
// j nest plus disponible ici
}
{
int
i = 0 ;
boolean b = true;
{
double i= 3 ;
boolean b = false;
}
}

29

ManipulaDon 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;
}
30

CondiDon (1)
if (test) {

}
Test
(i==5)
(i!=5)
Oprateur ternaire
(test)?VRAI:FAUX

if (test) {

} else {

}
boolean b1 =(i==5);
boolean b2 = !b1;

Un test est un boolen :


true ou false
31

CondiDon (2)
if (test) instruction1;
else instruction2;
if (b1)
if (!b1)

Oprateur NON

if (b1 || b2) Oprateur OU


if (b1 && b2) Oprateur ET ALORS
Une squence de test nest pas compltement value
si ce nest pas ncessaire.
32

CondiDon (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 facultaDf

33

Boucles condiDonnelles
for (initialisation;test;incrmentation) {

}
for (int i=0;i<10;++i)
System.out.println(i);
while (test) {

Accolades facultaDves
s'il ny a qu'une instrucDon

do {

} while (test);
34

Variable de boucle et visibilit


{
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)

{ }

}
{
}
35

Tableaux (1)
// cration d'un tableau vide de 10 entiers
int[] t1 = new int[10];
// dclaration d'un tableau sans lment
int[] t2;
for(int i=0; i<t1.length; ++i)
System.out.println(t1[i]);

Taille xe, donne par le champ length


Premier indice du tableau : 0
VricaDon de la validit des indices
ExcepDon : OutOfBoundsArray
36

Tableaux (2)
IniDalisaDon du tableau
Par des valeurs scalaires
Par des rfrences nulles

t1[i] = ?;

"Librer" un tableau
t1 = null;

Tableau mulDdimensionnel
String[][] chaines = new String[10][5];

37

Chane de caractres (1)


String char[]

sta7que
String
dynamique
StringBuffer
StringBuilder
UTF-16
Bibliothque fournie

Comparaison de chanes : equals( ), compareTo( )


Recherche : indexOf( )
ExtracDon : substring( ), StringTokenizer, split, regexp
TransformaDon aise de type scalaire vers StringBBBB

38

Chane de caractres (2)


CraDon de chane(s)
String s1 = "hello";
String s2 = new String("hello");
String s3 = null;

Que se passe-t'il ?
String s3 = s1 + " " + s1;

39

String
String
String
String
String
String

s1
s2
s3
s4
s5
s6

=
=
=
=
=
=

"loic" ;
"loic";
new String("loic");
new String("loic");
s3;
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));
40

ManipulaDon de chanes
// Un peu vieux, utiliser plutt split OU
// java.util.regex
StringTokenizer st =
new StringTokenizer("Quelle boucherie !");
while (st.hasMoreTokens())
System.out.println(st.nextToken());
String[] result =
"et a dcoupe toujours".split("\\s");
for (int i=0; i<result.length; i++)
System.out.println(result[i]);
41

FoncDon main
public static void main(String[] argv);

Obligatoire en mode standalone


Point dentre unique du programme
java Exemple param1 "param 2" param3

argv :
tableau de chanes de caractres
Paramtres de la ligne de commande
42

Ligne de commande
Acher les paramtres de la ligne de commande
String[ ] tab : tableau de chanes de caractres
tab.length : longueur du tableau



43

4. Concepts objets

DclaraDon d'une classe

Moule / Modle / Fabrique objets


CaractrisDques / A"ributs
Messages / Mthodes
Nom unique (package)
De classe /dinstance
Visibilit et encapsulaDon

RelaDons
45

public class Etudiant {


VISIBILIT : public / ! (package) / private
private String nom;
! int id;
static private int compteur;

ConvenDon :
Classe = type
Nom avec majuscule
A"ributs
A"ribut de classe

public String getNom() {


return nom;
Mthode
}
static public int getCompteur() {
return compteur;
Mthode de classe
}
}

PAS DE POINT VIRGULE [ C++ ]


46

Modicateurs de mthode
Mthode publique, visible/appelable par tout le monde
Mthode de classe
Mthode non rednissable
Type de retour
Paramtre(s)
public static final int methode(double d);
Pas de valeur par dfaut pour les arguments [C++]
47

Constructeur
IniDaliser les a"ributs d'un nouvel l'objet
Syntaxe dirente dune mthode
Porte le mme nom que la classe
Pas de type de retour

Constructeur sans argument


fourni automaDquement si pas d'autres constructeurs

Surcharge de constructeur
Appel de constructeurs avec paramtres

"PAS d'hritage de constructeur


"PAS de constructeur de copie (clone())
48

public class Cours {


int
nbEtudiants;
boolean passionnant;

A"ributs

public Cours() {
nbEtudiants = 0; this(0);
}
Constructeurs
public Cours(int n) {
nbEtudiants = n; setNbEtudiants(n);
}
A rpter n) {
public void setNbEtudiants(int
Pas de public: [C++]
nbEtudiants = n;
}
public int getNbEtudiants() { Accesseur/Mutateur
Ge"er/se"er/mutator
return nbEtudiants;
}
public boolean isPassionnant()
}
{ return passionnant; }
49

Crer un objet
Demander la mmoire la JVM
Oprateur new

Appeler le constructeur
Classe instance = new Classe(paramtres);
Cours
unCours = new Cours(24);

ManipulaDon de pointeurs rfrences ?


Valeur spciale null
si craDon impossible
ou pas encore aecte

(instance == null)
50

UDliser un objet
Accder un membre =
Oprateur point l'extrieur de la classe
instance.methode();
instance.attribut;
unCours.isPassionnant()

Rfrence valide ?
Null Pointer exception

Membre visible
Niveaux d'accs (public/priv/package)
Interface de classe
EncapsulaDon

51

public class Cours {


// reste de la classe
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");
}
}
52

Exercice :
Grer un parc de vhicules
crire une applicaDon perme"ant de grer un
parc de vhicules d'une socit possdant
des voitures
des camions
1. Crer des classes simples sans relaDon
2. Instancier des classes
3. tudier l'hritage et le polymorphisme
4. tudier les autres relaDons
53

1 - Crer les classes


Pas de relaDon entre
les classes
RparDDon ?
1. mme chier
2. chiers dirents
(mme package !)
3. Fichiers dirents
(packages dirents)

O me"re le main() ?
Quelles classes compiler ?
Quelle classe excuter ?

Voiture
- immat : Chane
- couleur : enDer
- places : enDer
+ acher()
+ avancer()
Camion
- immat : Chane
- capacit : rel
+ acher()
+ avancer()
54

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 chier : GesDon1.java
3 classes non imbriques

En gnral, on met une


classe par chier sauf si
les programmes sont
simplissimes.
55

public class Gestion2 {


// classe pour le programme
public static void main(String[] a) {
Voiture v;
Camion c;
}
}
3 chiers dans le mme rpertoire
public class Voiture { (mme package implicite)
String immat;
GesDon2.java
Voiture() {}
Voiture.java
void avancer() {}
Camion.java
}
3 classes publiques
public class Camion { Compiler GesDon2 =
int capacite;
CompilaDon des
Camion() {}
dpendances
void avancer() {}
Excuter GesDon2
}
56

import vehicule.Camion;
public class Gestion3 {
// classe pour le programme
public static void main(String[] a) {
vehicule.Voiture v;
! Camion c;
}
}
package vehicule;

./ GesDon3.java
vehicule/Voiture.java
public class Voiture {
vehicule/Camion.java
String immat;
Compiler GesDon3 =
Voiture() {}

void avancer() {}
dpendances
}
Excuter GesDon3

57

Dans des rpertoires dirents


Visibilit d'une classe au niveau package
1 package 1 rpertoire

Si la classe n'est pas dans le rpertoire courant


javac cp chemin Classe.java
javac paquetage.Classe.java
java -cp chemin Classe

Fichiers jar
java jar fichier.jar
58

2 - C'est pas dj fait ?


Voiture
-immat : Chane
-couleur : enDer
-places : enDer
+ acher()
+ avancer()

Camion
-immat : Chane
-capacit : rel
+ acher()
+ avancer()

Acher sur la console :


Je suis une Voiture/Camion et l'immatriculaDon
J'avance
Instancier des objets dirents
59

// constructeur propos par dfaut


public Voiture() {
immat = null;
}
Voiture v = new Voiture();
public Voiture() {
immat = "0000 AA 00";
// ou this("0000 AA 00");
}
public Voiture(String im) {
immat = im;
}
Voiture v = new Voiture("300 ISI 63");
public String getImmat() {}
public void setImmat(String im) {}
60

Dtruire une instance


Pas de destrucDon manuelle
DestrucDon automaDque par la JVM

Ramasse-mie"es (Garbage Collector)


Le dveloppeur peut demander un ne"oyage, enn

Plus de fuites de mmoire ?

Tables de hachage complexe


Boucle innie
Aider la JVM en me"ant null

Mthode nalize( )

Ressemble au destructeur C++


Peut ne pas tre appele (si gc non excut)
61

EncapsulaDon
// classe A avec encapsulation brise
class A {
A a = new A(2);
public int valeur 2 ;
a.valeur = 5;
public A(int i) { valeur = i;}
}
2/ Changer limplmentation
sans impact sur lextrieur
// classe A avec encapsulation
class AE {
1/ Contrle daccs
private int valeur 2 ;
public AE(int i) { setValeur(i);}
final public int getValeur() { return valeur; }
final public void setValeur(int v)
{ valeur = v; }
AE ae = new AE(0);
}
ae.setValeur(3);
ae.valeur = 5;
62

public class B {
static void methode1(A a) {
a = new A(2);
}
static void methode2(A c) {
c.valeur = 3;
}

Digression

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@adresse
a = methode3(a);
}
}

Acher a.valeur et a. Que se passe-t'il ?

63

Au chargement de la classe
InstrucDons spciques excutes au chargement
de la classe dans la JVM
Pas l'instanciaDon d'objet
Plus gnral que l'iniDalisaDon des a"ributs staDques
static int[] tab = new int[100];
class Exemple {
static int[] tab;
static {
// excut au chargement de la classe
tab = new int[20];
for(int i=0; i<20; ++i) tab[i] = 2*i;
}
}
64

Hritage (1)
F hrite de M ?
CondiDons

M
F

M doit tre visible (publique mme package)


M est drivable (non nale)

F hrite de tous les membres protgs et publics


de M sauf les constructeurs
Les membres privs ne sont jamais transmis

F n'hrite que d'une SEULE classe directe


Toute classe hrite de java.lang.Object
65

Hritage (2)
public class F extends M {
public F() {
super(); // appel du constructeur de M
// initialisations spcifiques
}
}

super : ce qui vient de la classe mre


super(champ1, champ2); // appel de constructeur
super.methode();
super.attribut;
super.super.attribut
// illgal

this : concerne l'objet courant


66

Rfrence 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 ?
}
}

67

Noms qualis
class M {
NOTE : Ce code compile
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
}
}
68

Polymorphisme
Forme faible
Surcharge de mthode overloading
StaDque (compilaDon)
Mthodes de signatures direntes

Voiture
+ avancer(temps : enDer)
+ avancer(distance : rel)

Forme forte

RedniDon overriding
"Surcharge" dynamique (abus de langage)
AcDons direntes pour des classes d'une mme
hirarchie
Vhicule

Voiture

+ acher();

+ acher();
69

3- Hriter
crire une classe Vhicule qui
reprend les caractrisDques
communes des classes
Voiture et Camion
Nous allons modier les
classes pour tester le
polymorphisme

Voiture
?
?

Vhicule
?
?

Camion
?
?
70

class Vehicule {
String immat;
public Vehicule(String im) {
immat = im;
}
public void afficher() {
S.o.p("Je suis un vehicule "+immat);
}
Voiture v = new Voiture("300 ISI 63");
}
v.afficher();
class Voiture extends Vehicule {
String immat;
public Voiture(String im) {
super(im);
}
// afficher ?
}
71

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();
}
Appeler les mthodes acher() des objets
}
class Voiture extends Vehicule {
public void afficher() {
System.out.println("Voiture");
}
}
class Camion extends Vehicule {
}
72

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(); // dfini prcdemment
}
Que se passe-t'il ?
}
class Voiture extends Vehicule {
public void afficher() {
System.out.println("Voiture");
}
public void special() {
System.out.println("special");
}
}

73

Mthodes virtuelles ou nales ?


Mthodes virtuelles
Choix oppos au C++
Par dfaut
ConstrucDon d'une table de mthodes pour une
hirarchie
Recherche dans ce"e table (lenteur ?)

Vehicule v = new Voiture();
v.afficher();

Mthodes nales

Non rednissables dans les classes lles


Plus rapides que les mthodes virtuelles
Conseil : accesseurs en nal

Le dernier mot : la JVM hotspot


74

java.lang.Object

clone()
Rappel : on ne teste pas l'galit
nalize()
de deux objets avec ==
toString()
getClass().getName()
equals()
doivent tre cohrentes
hashCode()
Deux objets gaux ont le mme hashcode
Ne doit pas changer pour une excuDon
Deux objets disDncts peuvent avoir le mme
75

Clonage
Copier un objet pour ne pas le modier
Pas de constructeur de copie

Implmenter Cloneable
Sert seulement prvenir le compilateur

Appeler la mthode clone() de la classe mre


en public
Sassurer que la mthode clone() dObject
est galement appele en haut de lchelle
Traiter les excepDons dans clone()
76

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 "compliqus"
// pour viter la copie de surface
// (shallow copy) si object != null
return object;
}
}

ExcepDons traites
au chapitre suivant

Copie des types primiDfs


Copie des rfrences
Objets non mutables (String)

77

Niveaux d'accs
Priv | private : mme classe
Protg | protected : mme package ou
sous-classe dun package dirent
Moins restricDf que le C++ !
Dirent en UML galement

Package | - (par dfaut) : package


Sorte de friend du C++
DANGEREUX

Public : tout le monde


78

EncapsulaDon & visibilit


Package p1

public class C1 {
public int a;
protected int b;
int c;
private int d;

Package p2
public class C4 extends C1 {

...
}

public class C2
extends c1 {
...
}

public
class C3 {

public class C5 {

...

...



Accessible par C2
Accessible par C3
Accessible par C4
Accessible par C5

Tir de Elments de programmaDon JAVA , Olivier Dedieu, INRIA

d




79

Mthodes et classes abstraites


Mot-cl abstract (modicateur) OBLIGATOIRE
Mthode abstraite
Sans implmentaDon

Classe abstraite
Toute classe avec au moins une mthode abstraite
OU ALORS toute classe dclare comme telle
(sans abstract, elle serait instanciable)
Non instanciable
Permet d'implmenter la noDon de concept
80

public abstract class Vehicule1 {


public void afficher() {
System.out.println("Vehicule");
}
}
NON instanciable, sans mthode abstraite
public abstract class Vehicule2 {
abstract public void afficher() ;
}
NON instanciable, avec mthode abstraite
class Voiture2a extends Vehicule2 {
}
ERREUR : must implement the inherited method
abstract class Voiture2a extends Vehicule2 {
}
NON instanciable
class Voiture2b extends Vehicule2 {
public void afficher() {}
instanciable
}

81

Interface (1)
DescripDon / contrat

<<interface>>
FloJant
+ oJer()
+ avancer()


8
Liste de mthode(s) sans code
"Constantes" autorises (public staFc nal par dfaut)
Pas de variable/a"ribut [UML]
Classe virtuelle pure [C++]

interface Flottant {
public static final int CONSTANTE = 30;
double PI = 3.14;
par dfaut

public abstract void flotter();


public
void avancer();
}
82

Interface (2)
[Vocabulaire ] IMPLEMENTER une interface
public class Bateau implements Flottant {
public void flotter() {}
public void avancer() {}
}

Instancier une classe ?




Polymorphisme ?

83

public class Vehicule {


public void afficher() {
System.out.println("Vehicule");
}
public static void main(String[] param) {
Vehicule v = new Voiture();
((Voiture)v).embrayer();
classe du type de
((Manuel)v).embrayer();
l'interface qu'elle
System.out.println(Manuel.VITESSES); implmente
}}
interface Manuel {
public static final int VITESSES = 5;
public void embrayer();
}
class Voiture extends Vehicule implements Manuel {
public void afficher() {
System.out.println("Voiture");
}
public void embrayer() {
System.out.println("Boite manuelle");
}}

84

Interface (3)
ImplmentaDon mulDple dinterfaces
RAPPEL : Hritage simple seulement
public class B extends A implements IC, ID {
//
}

Parade lhritage mulDple

85

Hritage mulDple ?

RelaDon non symtrique


= raison foncDonnelle
interface

tend
implmente

class H extends A, B {

class H extends A implements F {

}
86

Vhicule

Vhicule

+ avancer()

+ avancer()
<<interface>>
FloJant
+ oJer()
+ avancer()

avancer()?

C++ :
hritage virtuel
conit de mthode ?

pas de conit
87

Interface (4)
Hritage mulDple d'interfaces
interface IC {
}
interface ID {
}
interface I extends IC, ID {
//
}
88

RelaDons entre objets


RelaDon
AgrgaDon
ComposiDon
Rfrence ou tableau de rfrences
UDliser un conteneur spcique
CollecDons
Ex : java.util.ArrayList
89

public class Zoo {


static final int NB_ANI = 50;
Animal[] animaux;
public Zoo() {
// pas de cration d'objet, sinon le constructeur
// par dfaut serait obligatoire
animaux = new Animal[NB_ANI];
}
public void placerAnimal(int i, Animal a) {
// if ((i>=0) && (i<NB_ANI))
animaux[i] = a;
}
public static void main(String[] chaines) {
Zoo zoo = new Zoo();
zoo.placerAnimal(0, new Animal("lion"));
}}
Zoo
Animal
class Animal {
String nom;
// public Animal() { nom="INCONNU"; }
public Animal(String nom) {
this.nom = nom;
}}

90

// ajouter dans la classe Zoo


public Animal quelAnimal(int i) {
return animaux[i];
}
// ajouter dans la class Animal
public void afficher() {
System.out.println(nom);
}
// ajouter dans la methode main()
zoo.quelAnimal(0).afficher(); // c'est bon
// c'est la meme chose que d'crire
// zoo.animaux[0].nom
// si animaux et nom sont publics
zoo.quelAnimal(1).afficher(); // NullPointer
zoo.quelAnimal(60).afficher(); // ArrayOutOfBounds
91

Tableau
De scalaires
int, double, char,
Une case = un scalaire uDlisable directement

D'objets

Un tableau de rfrences sur des objets de la classe


Rfrences iniDalises null
Pas de craDon dobjets par dfaut comme en C++
IniDaliser chaque lment du tableau pour l'uDliser

92

Rsum
[Modificateur]* class identifiant
[extends
classe_de_base ]
[implements interface {, interface}*
}

] {

Hritage simple seulement


ImplmentaDon mulDple dinterfaces
Toutes les mthodes sont virtuelles
Une classe nale nest pas drivable
Tous les classes drivent de java.lang.Object
93

5. ExcepDons

ExcepDons
Manire lgante et ecace de grer les erreurs
potenDelles dexcuDon
FoncDonnement similaire au C++

Une erreur potenDelle une excepDon


Hirarchie des excepDons
Une erreur = une instance d'excepDon
ParDe intgrante de la signature d'une mthode
ObligaDon de lever les excepDons

95

Double.parseDouble(chaine);
"dix"

"10.5"

un double
Cas normal

Reporter l'erreur
au niveau suprieur

une
excep7on
Cas "excep7onnel"
Comportement adapt

Surveiller le code
Traiter l'erreur

OBLIGATION DE TRAITER UNE EXCEPTION

96

Exemple
public void somme(String chaine) {
res = Double.parseDouble(chaine);
total += res;
Erreur de compila7on
}
public void saisie {
String chaine = System.console().readLine();
while (!chaine.isEmpty()) {
somme(chaine);
chaine = System.console().readLine();
}

97

A"raper une excepDon


public void somme() {
double res = .0;
try {
// bloc surveiller
Arrt de l'excu7on la
res = Double.parseDouble(chaine);
premire erreur
total += res;
} catch (NumberFormatException e) {
System.out.println(e.getMessage());
// ou e.printStackTrace();
Traitement adapt l'erreur
dcrite
} finally {
// Clause TOUJOURS excute
}
}

98

Reporter l'erreur
public void somme()
throws NumberFormatException {
double res = .0;
res = Double.parseDouble(chaine);
total += res;
Dclara7on de lerreur poten7elle
}
Obligatoire p
our le compilateur
public void saisie() {
somme(chaine);
}

On na fait que reculer


Traiter lexcep7on :
try /catch ou throws
99

Hirarchie des excepDons


ExcepDon
IOExcepDon

GesDon
direncie

RunDmeExcepDon
NullPointerExcepDon
IndexOutOfBoundsExcepDon

FileNotFoundExcepDon
100

Ordre des blocs catch


try {
Compilateur :
// code tester
Already caught
} catch (Exception e) {
Exception
e.printStackTrace();
[C++] masquage
} catch (IOException e) {
// traitement adapt
}
try {
// code tester
} catch (IOException e) {
Excution du
// traitement adapt
1er bloc qui
} catch (Exception e) {
correspond
e.printStackTrace();
}

101

Mme traitement ?

try {
// bloc surveiller
} catch (NumberFormatException e) {
e.printStackTrace();
throw e;
} catch (IOException e) {
e.printStackTrace();
throw e;
Mme traitement
}
try {
// bloc surveiller
} catch (NumberFormatException |
IOException
e ) {
e.printStackTrace();
throw e;
}

102

Bloc nally
OpDonnel
TOUJOURS excut
Mme si aucune excepDon n'a t leve
Mme si une instrucDon conFnue, break ou return se trouve
dans le bloc try
Sauf n de thread ou de JVM

UDlit avec un langage dot d'un ramasse-mie"es ???


Librer les ressources
Fermer des chiers, par exemple
Try-with-resources 7

103

ExcepDon personnalise
ExcepDon drive de Throwable
Error
Exception

Driver dException
Surcharger Constructeur (String message)
OU Rednir getMessage()

Lancer une excepDon


throw new MonException();
104

class AutorisationException extends Exception {


public String getMessage() {
return "Op impossible : dcouvert trop grand";
}
}
public class CompteBancaire {
double solde = 0.0;
double decouvert = -700.; // autorise

Signature : liste des excep7ons lanables, remontes l'appelant


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'excep7on
}
}
105

Conclusion excepDonnelle

Pour toute excepDon dclenche, le


compilateur impose un traitement

1. Bloc try/catch qui gre ce"e excepDon


2. Passage de l'excepDon au niveau suprieur
(appelant).

L'excepDon apparait alors dans la signature de la


mthode

106

Passage au niveau suprieur


// 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;
Grer localement l'excepDon
}
return res;
}
Erreur du compilateur
107

6. Bibliothques graphiques
AWT & Swing

AlternaDves IBM : SWT / JFace

AWT vs Swing
Abstract Window Toolkit (java.awt.*)

"Fig" depuis 1.1


Prsent dans les navigateurs sans plug-in
GesDon des vnements obsolte
Composants lourds

Swing (javax.swing.*)

Toujours en voluDon
Plus complexe qu'AWT
Composants lgers
Surcouche d'AWT (Jcomposant)
109

Exemple d'applicaDon Swing

110

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 / systme (Look & Feel) NON ABORD

111

112

113

114

115

Exemple du tutoriel ociel Sun/Oracle sur Swing :


import javax.swing.*;

Cas 1

public class HelloWorldSwing {


private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}

Calcul de la taille
Et ac
hage

public static void main(String[] args) {


SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
GesDon des threads
});
Et classe imbriqu
}
e
}
116

invokeLater(new Runnable() {
public void run() {
// faire qq chose
}
});

Classe imbrique dite anonyme


Spcialise la classe donne ou
implmente l'interface donne
Dclare la vole / uDlise qu'une seule fois
Compile avec un nom arbitraire
nomclasseenglobante$nombre.class
117

Manipuler une fentre ? (1)


Instancier un objet JFrame
1. Dclar la vole dans un mthode ;-(
Ne peut tre ruDlis ailleurs
2. SpcialisaDon de classe ;-(

3. A"ribut d'objet (composiDon)

118

public class MonApplication extends JFrame{


public MonApplication() {
super("Mon application");
}

Cas 2

static public void main(String[] argv) {


MonApplication ma = new MonApplication();
ma.afficher();
public void afficher() {
}
pack();
}
setVisible(true);
}

public class MonApplication {


JFrame frame;

public void afficher() {


frame.pack();
frame.setVisible(true);
}

public MonApplication() {
frame = new JFrame("Mon Application");
}
static public void main(String[] argv) {
MonApplication ma = new MonApplication();
ma.afficher();
}
}

Cas 3

119

Manipuler une fentre ? (2)

Cas le plus gnral et recommand !


LapplicaDon gre des fentres spcialises !
120

Bote de dialogue simple


Classe JOptionPane
Mthodes staDques showXXXDialog
Message, Conrm, OpDon, Input

JOptionPane.showConfirmDialog(frame,
"Alors, a vous plat ?");
121

Ouvrir une fentre


Acher une applicaDon graphique simple
agrgeant un JFrame
Ajouter une boite de dialogue modale

122

Ajouter des composants ?


Que se passe-t'il ?
// aprs frame.getContentPane().add(label);
// dans HelloWorldSwing
frame.getContentPane().add(new JLabel("2"));

Ncessit de posiDonner les lments


Qui peut recevoir des composants ?
Composants de haut niveau
Conteneurs
Panels
123

PosiDonnement
Placer des composants
Taille (xe, minimale, maximale et prfre)
PosiDon relaDve (portabilit)
PosiDon absolue (extension JBuilder)

PoliDque de placement d'un conteneur : Layout


JFrame, JDialog, JPanel,
Complexe manipuler
Conteneurs et Layouts spcialiss en cascade
GUI Builder
MaDsse / Netbeans avec GroupLayout
WindowBuilder / Eclipse
IntelliJ

124

Layout Manager (1)


Points cardinaux

Complexe mais
puissant

Horizontal
ou verDcal

Formulaire

h"p://download.oracle.com/javase/tutorial/uiswing/layout/visual.html

125

Layout Manager (2)

Flow
Box
Border
Grid

Card
GridBag
Spring
Aucun

Managers par dfaut :


BorderLayout pour le contentPane du JFrame
FlowLayout pour un JPanel
Package : java.awt
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(objet [, paramtres]);
126

On teste
Tester le BorderLayout
avec un bouton dans chaque zone
Nord, Sud, Est, Ouest, Centre

Tester le FlowLayout

Changer
la taille de
la fentre

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)

127

contentPane (JFrame)

pane = new JPanel();

frame.getContentPane().add(pane, BorderLayout.CENTER);

(Layouts par dfaut des composants)

128

OrganisaDon par couches


Root Pane
Layered Pane
MenuBar

ContentPane
Layout Manager
C1

C2

Cn

Glass Pane

129

vnements (1)
CommunicaDon entre les composants d'une
applicaDon et l'uDlisateur
Envoi de messages
Appel de mthodes dune interface

Intress(e) par un vnement ?

1. Vrier que le composant permet dy rpondre


2. crire un gesDonnaire
3. Enregistrer le gesDonnaire auprs du composant

130

vnements (2)
AcDver un JBu"on
AcDon
Choisir un menu
Appuyer sur une touche (focus)
Appuyer / relcher un bouton de souris
Entrer ou sorDr dun composant avec la souris
Dplacer la souris
Regroupement foncDonnel =
UDliser la mole"e
MouseListener
Dplacer la fentre
Rduire la fentre

Fermer la fentre
Changer la taille

131

AcDver un JBu"on (acDon)


1. Ecrire le gesDonnaire
class Gestionnaire implements ActionListener {
public void actionPerformed(ActionEvent e) {
// ce qu'il y a faire
}
}

2. Enregistrer le gesDonnaire
JButton bouton = new JButton("Libell");
bouton.addActionListener(new Gestionnaire());
Acher une boite de dialogue avec le programme prcdent
132

Event / Listener / Adapter


Event
Listener

MouseEvent
MouseListener

Spcique l'vnement
Liste des mthodes / messages possibles
composant.addEventListener() addMouseListener()

Adapter
Patron de concepDon / design paJern
ImplmentaDon "vide" de convenance
ActionAdapter n'existe pas !
AbstractAction existe

MouseAdapter
Toujours
possible ?
133

A bas les boutons (1)

Acher quelques boutons


Incrmenter la valeur d'un bouton chaque fois
que l'on clique dessus
Ajouter une bote de conrmaDon pour la sorDe
du programme

134

A bas les boutons (2)


Bouton ?
1. Spcialiser JButton pour compter
JBu"on

MonBouton
#compteur : int

2. UDliser JButton directement


GesDonnaire ?

+ MonBouton();
+ incrementer();
DEPRECATED

1. Une instance pour tous les boutons


2. Un instance par bouton
<<interface>>
Possibilit : le bouton lui-mme

AcDonListener

135

A bas les boutons (3)


SorDe propre ?
Changer le comportement par dfaut
GesDonnaire
showConrmDialog
Evnement ?

FENETRE PAS ENCORE FERMEE

Qui"er

136

Contexte graphique
Bote dessin
Associ une fentre ou une image
Classe java.awt.Graphics

Couleur
Mode de dessin (XOR )
Police de caractres
AcDons basiques ( drawXXX, llXXX)

Classe java.awt.Graphics2D
Plus de foncDonnalits en dessin
Changement de repre, transformaDons

137

OrientaDon par dfaut


(0,0)

x
(x1,y1)

height

width

graphics.fillOval(x1, y1, width, height);

138

Dessiner
Canvas [AWT]
Composant "lourd"
void paint(Graphics g)

JPanel [Swing]

Composant lger
Opacit
void paintComponent(Graphics g)
paint() existe mais

Contexte graphique "prt" par le systme


Mthode repaint() pour me"re jour

139

JCanvas
tendre la classe JPanel
Opaque ? double buering ?
Layout inuDle !

Fixer la taille du composant


PreferredSize (uDlise par pack())
MinimumSize, MaximumSize

Rednir paintComponent()
ne jamais appeler directement
Appeler super.paintComponent(g) si besoin
Eace le composant
140

1. Simuler un oscillateur "xe"


2. Grer l'appui du bouton : gnrer un
nouvel achage (alatoire ou sinusodal)
141

SoluDon ?
contentPane (JFrame)

N
W

C
S

JBubon
+ gesDonnaire (AcDon)
appelle repaint()de la zone
de dessin ou du JFrame.
getParent().repaint()

JLabel
setPreferredSize(new Dimension(800,600));

JCanvas
Math.random()
tend JPanel
rednit paintComponent() => dessin
commencer par un rectangle tout simple
prcise la taille prfre
142

Barre de menus
Fichier

Nouveau
Ouvrir
Sauvegarder

Qui"er

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();
143

7. Concurrence (Threads)

Threads (1)
Processus "lger"
ExcuDon simultane / concurrence
Partage de donnes

3 mthodes
Implmenter run( ) de Runnable
Dlguer un Executor
5
(java.util.concurrent)
Rednir la mthode run( ) de Thread

145

Threads (2)
// Exemple avec implmentation d'interface
// Modlisation : crer une nouvelle tche
class Tache implements Runnable {
// implmenter run()
}

CONSEILL

// AILLEURS :
Tache tache = new Tache();
(new Thread(tache)).start();
// Exemple avec spcialisation de classe
// Modlisation : crer un nouveau type de Thread
class Special extends Thread {
}
Special special = new Special();
special.start();

146

Threads (3)
Scurit d'accs aux mthodes et donnes
Mthode/statement quali synchronized
Variable qualie vola0le
Variable qualie nal (Immutable)

Mthode start( ) pour dmarrer


Mthodes interrupt( ) ou sleep( )
L'arrt doit tre NATUREL
la mthode run( ) doit se terminer normalement
Ex : test d'une variable d'arrt
stop( ) est obsolte
147

Threads et Swing (1)


Deux ls dexcuDon
Fil du programme
Fil des vnements

Fil des vnements monothread


Patron MVC : concurrence dicile
Interface peut tre ge facilement
Swing Worker (antrieur au patron Executor)

148

Threads et Swing
Temps
inits

Thread des vnements


paint

clic

Paint + calcul trs long

Calcul trs long


Dbut

gc

paint

AcDons simples
successives

Paint + calcul long


Blocage de
l'interface

Calcul en arrire-plan : interface libre

Fin
149

Interface graphique &


tche longue

Tache : gnraDon alatoire de rectangles avec


une composante alpha (couleur RGBA)
Menu : Rafraichir et qui"er
"Qui"er?" par le menu et la croix
Blocage de l'interface ?
Grer le redimensionnement
150

lments de rponse (1)


1. Dessiner directement dans paintComponent()
2. Dessiner dans une image
Crer une image
Dessiner dans limage
Acher limage

Toujours dans
paintComponent()

3. Mise en place du thread


Exporter le dessin de limage dans le run() dune tche
Dans paintComponent() : Image dessiner ?
Non : lancer le calcul (lancement dun thread)
Oui : acher limage
151

lments de rponse (2)


BueredImage
TYPE_INT_ARGB
graphics.drawImage(img, 0, 0, null);

Une seule mthode qui"er() appele


JOpDonPane.show
System.exit()
1. Par litem du menu - AcDonListener
2. Par le clic sur la souris WindowListener
JFrame.DO_NOTHING_ON_CLOSE
152

Modle MVC
Modle / Vue / Contrleur
Logique applicaDve vs prsentaDon
Design(s) pa"ern(s) / Patron de concepDon

Communment adopt (un des plus vieux)


Pas trivial du tout
A viter sur les trucs simples
Adopt par Swing (Table <-> TableModel)

153

Contrleur

Transmet lacDon
Changement dtat

Modle

AcDon uDlisateur
Rafrachissement

NoDcaDon changements
(Observer)
Donnes

Vue
Vue (s)
Vue

154

8. Fichiers & Flux


SrialisaDon

GesDon des entres/sorDes (1)


Flux E/S de donnes binaires
Flux E/S de caractres
Flux E/S dobjets
CommunicaDon avec des chiers
CommunicaDon avec des ressources
Internet
SrialisaDon (=> rseau)
156

GesDon des entres/sorDes (2)


java.io
Flux de donnes (chier, pipe/threads, )
SrialisaDon
Systme de chiers

java.nio (java 4)
Mmoire tampon Buer
Canaux + Slecteurs : hautes performances
TraducDon des jeux de caractres

java.nio2
SimplicaDon
Path

7
157

java.io.*
InputStream
File
FileDescriptor
Object

ByteArrayInputStream

BufferedInputStream

FileInputStream

DataInputStream

FilterInputStream

LineNumberInputStream

PipedInputStream

PushbackInputStream

SequenceInputStream
StringBufferInputStream

RandomAccessFile
ByteArrayOutputStream
OutputStream
StreamTokenizer

FileOutputStream
FilterOutputStream
PipedOutputStream

Tir de Elments de programmaDon JAVA , Olivier Dedieu, INRIA

BufferedOutputStream
DataOutputStream
PrintStream

158

Flux de sorDe
conversion

ux sorFe

OutputStream

ux texte

DataOutputStream

FileOutputStream

ux binaire

chier sorFe

File fic = new File("log.txt");


FOS fos = new FileOutputStream(fic);
PS
ps = new PrintStream(fos);

conversion

PrintStream
ux cran

System.out

ps.println("une chaine de caractres");


ps.close();
fos.close();
Tir de h"p://www.nawouak.net, B. Bachelet

159

Flux dentre
ux entre

conversion

InputStream

DataInputStream

FileInputStream

ux binaire

ux

System.in clavier

chier entre

conversion

ux texte

InputStreamReader (caractre par caractre)


conversion

StreamTokenizer
Tir de h"p://www.nawouak.net, B. Bachelet

ux texte
(item par item)
160

Saisie clavier
// Version 1 standard
// Attention aux exceptions souleves
InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
br.readLine();

// Version 1.6
// les exceptions sont gres par la Console
System.console().readLine();

System.console() == null sous Eclipse !


161

Try-with-resources

Ressource
Tout objet fermer / librer aprs uDlisaDon
Fichier, ux, chausse"e, requte

Mthode classique (< 1.7)


close() dans bloc nally => excepDon levable
Bloc try-catch englobant supplmentaire ou relance

Fermeture et libraDon automaDque (1.7+)


Syntaxe simplie
Interface AutoCloseable

7
162

try {
BufferedReader br = null;
FileReader
fr = null;
try {
ExcepDons
fr = new FileReader(nomFichier);
possibles ?
br = new BufferedReader(fr);
String lecture;
while ((lecture = br.readLine())!=null) {
//
}
br.close();
Pas la bonne place
fr.close();
} catch (Exception e) {
Pas la bonne place non plus
e.printStackTrace();
if (br!=null) br.close();
}
} finally {
if (br!=null) br.close();
if (fr!=null) fr.close();
}

} catch(Exception e) {

= duplicaDon de code

Bonne place
Mais excepDon possible
163

// bloc try-with-resources
try (
BufferedReader br = new FileReader(nomFichier);
FileReader
fr = new BufferedReader(fr);
){
String lecture;
while ((lecture = br.readLine())!=null) {
//
}
} // Les ressources sont fermes automatiquement
catch (Exception e) {
e.printStackTrace();
}

Certaines excepDons peuvent tre lances mais elles sont dissimules.


Elles sont toutefois rcuprables en cas de besoin.
164

SrialisaDon (1)
Transformer un objet prsent en mmoire en bits
Sur un disque (Stockage - Persistance)
Sur le rseau (CommunicaDon RMI)
Les infos de classe ne sont pas transmises

Implmenter l'interface Serializable


Ne fait rien, prvient le compilateur

Proposer une version de srialisaDon


staFc nal long serialVersionUID = 110L;

A"enDon la protecDon des donnes


Donnes transient : donnes non copies
Ou implmenter Externalizable
165

SrialisaDon (2)
Mthodes rednir pour un comportement parDculier
void writeObject(ObjectOutputStream out)
throws IOException;
void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException;
void readObjectNoData()
throws ObjectStreamException;

Flux (streams) uDliser


FileOutputStream/FileInputStream
ObjectOutputStream/ObjectInputStream
166

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();
FileInputStream
fis
= null;
if (fos!=null)
fos.close();
ObjectInputStream
ois
= null;
}
try {
fis = new FileInputStream("fichier.dat");
ois = new ObjectInputStream(fis);
objects = (Composite) ois.readObject();
} catch (Exception e) {
Classe de l'objet
e.printStackTrace();
} finally {
if (ois!=null) ois.close();
if (fis!=null) fis.close();
}

167

SrialisaDon en XML
XMLEncoder pour les objets respectant les
convenDons NetBeans
XStream pour les autres ;-)
Une bibliothque Ders

168

FileOutputStream
fos
= null;
XStream
xstream = null;
try {
fos = new FileOutputStream(name);
xstream = new XStream();
xstream.toXML(objects, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos!=null) fos.close();
}
FileInputStream
fis
= null;
XStream
xstream = null;
try {
fis = new FileInputStream(name);
xstream = new XStream();
objects = (Composite)xstream.fromXML(fis));
} catch (Exception e) {
e.printStackTrace();
Classe de l'objet
} finally {
if (fis!=null) fis.close();
}

169

TP "Houzehou"

ManipulaDon de classes et d'interfaces


Conteneurs
Fichiers textes
Javadoc
JTable de Swing
170

Houzehou

Personne

// tableau statique
static int MAX = 50;
Personne[] p1 = new Personne[MAX];
p1[0] = new Personne();
// tableau dynamique (Legacy ou thread-safe)
Vector<Personne> p2 = new Vector<Personne>();
p2.addElement(new Personne());
// tableau dynamique avec "erasure"
Vector p2 = new Vector();
p2.addElement(new Personne());
// Liste : ArrayList, LinkedList,
ArrayList<Personne> p3 = new ArrayList<Personne>();
p3.add(new Personne());
new StringBuffer(nom+":"+prenom);

171

Constructeur() {
Constructeur(int b) {
a = null;
a = null;
DuplicaDon
d
e
c
ode !!!
b = 1;
this.b = b;
}
}
Constructeur() {
init(null, 1);
}

Constructeur(int b) {
init(null, b);
}

private void init(O a, int b) {


this.a = a;
this.b = b;
Mthode prive
}

(SorDe du constructeur)

Constructeur() {
this(null, 1);
}
Constructeur(int b) {
this(null, b);
}

Constructeur(O a, int b) {
this.a = a;
this.b = b;
}

Pas d'argument par dfaut


mais une syntaxe sympa

172

s
t
n
e
m

l
p
Com
A
V
JA

a aussi
c'est
important

ditions

173

Plan
Plus d'exemples avec JAVA
EnumraDon,
Ajouts 5, 6 et 7, pas encore 8

Gnricit & collecDons


Applet
OuDls
Autres documents : JNI, JDBC, Java EE
174

Langage

Terminologie : classe imbrique


Classe imbrique / nested class
Classe dnie lintrieur dune autre classe

4 types de nested class


Classe membre staDque
Classe membre non staDque, inner class
Pas de membres staDques
Nexiste quavec une instance de la classe

Classe locale (dnie dans une mthode)


Classe anonyme (locale sans nom)
176

ConvenDons (1)

DocumentaDon ocielle
Tutoriaux SUN/Oracle
Respect l'criture, facilit de lecture
ProducDon rapide

Intgre dans les EDI classiques


Formatage automaDque dans Eclipse (CTRL+i)

177

ConvenDons (2)
Nom de classe ou interface
Premire le"re majuscule
Reste en minuscules
Majuscules aux mots composs

class
CoursGenial

A"ribut crit en minuscule


Pas de Dret

Mthode

int attribut;

Verbe pour acDon


void ronfler();
Premier mot en minuscule
Majuscules la premire le"re des mots suivants
178

ConvenDons (3)
Accesseur / Accessor
get + nom de l'a"ribut
is pour un boolen

getAttribut()
isAttribut()

Mutateur/Mutator
set + nom de l'a"ribut

setAttribut()

"Constante"
Tout en majuscules

CONSTANTE

Package
Tout en minuscules

fr.isima.paquetage
179

numraDon ? (<1.5)
Pas de vricaDon de type
Achage de la valeur sans intrt
public
public
public
public

static
static
static
static

final
final
final
final

int
int
int
int

LUNDI
MARDI
MERCREDI
JEUDI

=
=
=
=

0;
1;
2;
3;

180

numraDon
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 uDle : le staDc import
h"p://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

181

Enum amliors
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);
}
182

AnnotaDon

"Extension" de celles du javadoc trop restricDves


Mta donnes

Dveloppeur
Compilateur
Machine virtuelle
GnraDon code, documentaDon, conguraDon

Plus simple et plus lger que le XML


UDlisaDon intensive
JUnit 4+
Java EE : JPA,
183

AnnotaDons standards
@Override
@SuppressWarnings
@SuppressWarnings(value="deprecaDon")
@SuppressWarnings("deprecaDon")
@SuppressWarnings({"unchecked", "deprecaDon"})

@Deprecated
@Documented
DocumentaDon

@RetenDon(RetenDonPolicy.RUNTIME)
ExcuDon

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
185

AnnotaDons personnalises
@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 :
h"p://download.oracle.com/javase/tutorial/java/javaOO/annotaDons.html
h"p://www.jmdoudoux.fr/java/dej/chap010.htm#annotaDons
186

Mthode nombre
d'arguments variable

public void somme(double nombres) {


double s = 0.0;
// mthode classique
for(int i=0; i < nombres.length; ++i)
s += nombres[i];
// nouvelle forme de for
for (double nb: nombres) s+= nb;
}
187

Auto [un] Boxing


Conversions automaDques
AutoBoxing
a"enDon la craDon implicite d'objets
Integer nombre = 10; // conversion automatique
Integer nombre = new Integer(10);

Auto unboxing
int n = nombre; // converti automatiquement
int n = nombre.intValue();

Aver7ssements / Erreurs possibles sous Eclipse

188

Gnricit &
CollecDons

Gnricit
Classes paramtres
Mthodes paramtres
Wildcards (<? extends classe>)
En lecture (pas en craDon)

DniDon gnrique

Compile une fois pour toutes ( C++), ecacit ?


Partage par toutes ses invocaDons

Pas de typedef

paramtre : une le"re en majuscule (convenDon)


viter de driver une classe pour donner un nom

Plus de renseignements :
h"p://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf

190

Gnricit : 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);
}
191

CollecDons (1)
Grer des collecDons dynamiques d'objets
Conteneurs non gnrique d'objets de classe Object
Conteneurs gnriques 5
IncompaDbilit de plateforme

Options source et -target

Algorithmes
Tri
Recherche
ManipulaDon

Paquetage java.util
h"p://docs.oracle.com/javase/tutorial/collecDons/index.html

192

CollecDon (2)
interface

CollecDon

interface

Map

implmente
interface

Set

K,T

implmente

interface

List

interface

Queue

K,T
SortedMap
interface

implmente

T
SortedSet
interface

Vector

Set : pas de doublons


Queue : FIFO par ex
Map : table de hachage
193

CollecDons (3)
Avant Java 1.5

Conteneurs d'Object
Downcast obligatoire

Vector


Enumeration

Dictionary (Hashtable)

[Vecteur dynamique]
[itrateur]
[Map]

Aprs 1.5

Mmes conteneurs templaDss


UDliser ArrayList plutt que Vector
sauf mulDthread
UDliser la Map plutt que Dictionary

5
194

Exemple (non gnrique)


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 numration
Enumeration e = v.elements();
while (e.hasMoreElements())
somme += ((Integer)e.nextElement()).intValue();
195

Exemple (gnrique)
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 numration, elle aussi paramtre
Enumeration<Integer> e = v.elements();
while (e.hasMoreElements())
somme += e.nextElement().intValue();
196

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();
}
197


Applet

Applet / Applique"e
Embarque dans une page Ouaib

BuDneur
OuDl appletviewer
Java plug-in
Bientt obsolte ? (HTML5)

Dirent d'une applicaDon autonome


Scurit renforce (GesDonnaire de scurit) :
Fichiers inaccessibles sauf JNLP (Java 6u10)
GesDon du son

Classes : Applet ou JApplet (Swing)


199

Code HTML
ConDent une balise dcrivant l'applet excuter
Dans un chier .class
Dans un chier .jar
<applet code="Exemple.class"
codebase="."
archive="ex01.jar, ex02.jar"
width="600" height="95">
<param name="param1" value="1000">
<param name="nom" value="loic">
</applet>
200

Code JAVA
public String getParameter(String)

Permet de rcuprer un paramtre du chier


HTML
Mthodes lies la vie de l'applet
init()
destroy()

Mthodes lies l'excuDon de l'applet


start()
stop()
201

OuDls

OuDls
1.
2.
3.
4.

javadoc
appletviewer
jar
Netbeans

203

javadoc
OuDl externe pour gnrer une documentaDon au format
HTML (similaire la documentaDon ocielle Java)

J Intgr au langage, commande en standard


J Format "universel" et simple
Commentaires dans le code
Autre ouDl similaire : Doxygen

/**

*/

L Lisibilit du code
L Le code doit compiler
L Ne fait pas tout !
204

javadoc ?
Commentaires spciaux
PersonnalisaDon avec code HTML ou CSS
Balises

@param
@return
@throws @excepDon
@see
@since
@deprecated
@author

/**

*/

Eclipse : (M) Project > Generate Javadoc


205

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) {}
}
206

Appletviewer

Excuter une applet sans buDneur
appletviewer page.html

A"enDon au gesDonnaire de scurit !

207

jar
Java ARchive
Excutable ( tar)
Format de chier compress
Contrle de version par exemple

Permet de distribuer/dployer
une applicaDon (autonome ou applet, JEE)
un package

Contenu
Fichiers .class
Fichiers ressources (images)
Fichier Manifest

208

Dployer une applicaDon JAVA


UDlisaDon intensive de JAR
ExcuDon protge (sandbox)
Scurit (Java Network Launching Protocol)

Java Web Start (>1.4)


Pour les applicaDons standalone
Simple clic dans un page Web

Java Plug-in
Pour les Applets
h"p://download.oracle.com/javase/tutorial/deployment/index.html

209

Bibliographie (1)
DocumentaDon JAVA de Sun/Oracle
Tutoriaux Web de Sun/Oracle
h"p://download.oracle.com/javase/tutorial/

Cours JAVA d'Olivier Dedieu, INRA


h"p://www-sor.inria.fr/~dedieu/java/cours/

Intro JAVA, Bruno Bachelet


h"p://www.nawouak.net/?doc=java+lang=fr

211

Bibliographie (2)
Thinking in Java, 2nd ed, Bruce Eckel
Head First Java, 2nd ed, Kathy Sierra, Bert Bates ,
O'Reilly, 2005

212

Aller plus loin


Java standard

IntrospecDon
Gnriques
Rseau, RMI
Threads avancs
JNLP

OuDls
Ant, Maven
Netbeans, IntelliJ IDE

Java Entreprise
Glasssh, tomcat
Servlets, jsp, beans
Persistance
(JPA, Hibernate)
Facelets (JSF)
Frameworks : Struts,
Spring,

213