Introduction à la Programmation Java
Introduction à la Programmation Java
Programmation Java
Version.1.10 du 11/05/98
Université de Nice
orsini@[Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-1
Programmation Java
Remerciements
• Je tiens à remercier les personnes suivantes qui
ont grandement contribué à la mise à jour de ce
cours
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-2
Programmation Java
Introduction
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-3
Programmation Java
Introduction à Java
Généralités
• Java est un véritable langage de programmation !
• Java et l’internet
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-4
Programmation Java
Introduction à Java
Caractéristiques de base
• Java est un langage
1. simple,
2. orienté objet,
3. distribué,
4. interprété,
5. robuste,
6. sûr,
7. indépendant de l’architecture (portable),
8. mobile,
9. performant (pas pour toutes les applications,
mais ça va venir...)
10. multithreadé,
11. dynamique,
12. exécuté non pas au travers d’un interpréteur,
mais au travers de l’émulation d’une machine vir-
tuelle, ou d’un puce JavaOS
13. possédant une riche API : le JDK
14. véritable explosion depuis son lancement : nom-
breux produits commerciaux : IDEs, APIs spécia-
lisées, etc...
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-5
Programmation Java
Introduction à Java
Simplicité (apparente ?)
• Basé sur C/C++, mais...
- pas de pointeurs,
- pas de structures ni de macros (struct, type-
def et #defines),
- pas de gestion de la mémoire laissée au program-
meur (malloc() et free() sont morts, paix à
leurs âmes...)
Java offre toute la fonctionnalité d’un langage de pro-
grammation puissant, mais débarrassé des caractéris-
tiques prêtant à confusion.
Sa syntaxe est proche de celle de C/C++ mais (fort
heureusement !) a été adaptée pour en permettre une
approche plus rapide et surtout en gommer certains
aspects critiqués ou provocant de nombreuses erreurs
de programmation.
L’expérience prouve que Java est un langage simple à
prendre en main, mais en aucun cas limité. La révision
1.1 propose même des technologies objets très avan-
cées comme les RMIs (Remote Method Invocations).
En revanche, comme tous les langages objets, il faut
une certaine expérience avant de tirer parti au mieux
de ses possibilités, et surtout de son API très riche.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-6
Programmation Java
Introduction à Java
Simplicité (apparente ?)
• N’a-t-on rien perdu par rapport au C/C++ ?
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-7
Programmation Java
Introduction à Java
Orienté objet, distribué
• Orienté objet
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-8
Programmation Java
Introduction à Java
Robuste
• Nombreuses vérifications à la compilation et à
l’exécution
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-9
Programmation Java
Introduction à Java
Indépendant de l’architecture
• Indépendance au niveau des sources (JDK) et du
Byte Code (machine virtuelle)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-10
Programmation Java
Introduction à Java
Sûr : le vérificateur de byte-code
• Contrôle de tout code chargé avant instanciation
pour exécution
• Vérificateur de byte-code
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-11
Programmation Java
Introduction à Java
Sûr : le Class Loader
• Les classes sont chargées dans un NameSpace in-
dépendant et identifié en fonction de l’origine du
code chargé
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-12
Programmation Java
Introduction à Java
Le code Java est mobile
• Java intègre, au travers de son JDK, une interface
commune permettant une compatibilité source to-
tale entre les architectures
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-13
Programmation Java
Introduction à Java
Java est interprété
• La compilation produit du byte-code non lié à une
plate-forme
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-14
Programmation Java
Introduction à Java
Java est multithreadé
• Un Thread est une partie de code, un “flot d’ins-
tructions” s’exécutant en concurrence avec
d’autres Threads dans un même processus
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-15
Programmation Java
Introduction à Java
Java est multithreadé
• Sous Java les Threads
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-16
Programmation Java
Introduction à Java
Java est dynamique
• Un programme est constitué de plusieurs classes
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-17
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-18
Programmation Java
1. La machine virtuelle
2. Une méthode :
public static void main(String argv[])
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-19
Programmation Java
1. la machine virtuelle,
2. sa propre méthode
public static void main(String argv[])
Une applet est une application Java très particulière
car elle s’exécute dans un browser. Ce dernier doit
donc pouvoir comprendre Java mais aussi effectuer un
certain nombre de contrôles sur le code qu’il va exécu-
ter. Ce dernier point justifie (entre autre) le besoin de
ne pas mettre en contact direct la machine virtuelle
avec un code qui la contrôlerait. Le Browser fait donc
tourner une application indépendante qui se charge
d’exécuter des applets après avoir fait les vérifications
nécessaires.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-20
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-21
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-22
Programmation Java
// méthodes
public static void main(String argv[]) {
int donnee_locale;
[Link](“Hello world”);
}
}
Fichier [Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-23
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-24
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-25
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-26
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-27
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-28
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-29
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-30
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-31
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-32
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-33
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-34
Programmation Java
• Identificateurs
int variable;
int autreVariable = 10;
double variableReelle;
short petitEntier;
float le_$prix;
Un identificateur désigne tout objet que le program-
meur souhaite manipuler. Il peut s’agir d’une classe,
d’un objet, d’une variable ou d’une méthode.
Un identificateur Java commence par une lettre et peut
ensuite contenir d’autres lettres, des chiffres, un carac-
tère souligné (_), ou encore un dollar ($)
• Terminateur d’instructions
int x = 1;
int y = 10;
int somme;
somme = x + y;
Il s’agit du caractère point-virgule, déjà utilisé par le C,
le C++, Modula 2, etc...
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-35
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-36
Programmation Java
Taille en
Nom Exemples de littéraux
bits
byte 8 1
short 16 2
int 32 2, -12, 300
long 64 2L
float 32 3.14, 3.1E12, 2e12
double 64 0.5d
boolean 1 true ou false
char 16 ‘a’, ‘\t’ (tab), ‘\u0000’ (NULL en unicode)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-37
Programmation Java
• En C++
• En Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-38
Programmation Java
int x;
float f;
char a;
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false
référence objet (pointeur) null
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-39
Programmation Java
int i;
while(i < 10) {
[Link](“i vaut “ + i);
i++;
}
La compilation produit le message d’erreur suivant
[Link] Variable i may not have
been initialized.
while(i < 10) {
1 error
Le compilateur javac effectue de nombreuses vérifica-
tions quant à la qualité du code qu’il compile.
Il est en particulier capable d’avertir le programmeur
d’une incohérence éventuelle.
Ici, une donnée n’est pas initialisée avant son utilisa-
tion. Cette donnée est une variable locale à une mé-
thode. Dans ce cas, elle n’est pas initialisée avec des
valeurs par défaut.
Le seul cas d’initialisation automatique avec une va-
leur par défaut est celui des attributs d’une classe (ou
variable de classe).
Dans l’exemple, il aurait fallu mettre :
int i = 0;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-40
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-41
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-42
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-43
Programmation Java
int tableau1[];
int[] tableau2;
int matrice[][];
int[] x, y[]; // équivalent à :
int x[], y[][];
- En java il n’est pas possible de définir des tableaux
de taille statique à la déclaration.
- Un tableau doit être alloué dynamiquement, com-
me tout objet Java (à l’aide de l’opérateur new)
int tab[10]; // ne compile pas
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-44
Programmation Java
int tab[10];
- Ce serait bien que ça compile, non ?
• Ou bien
int x = [Link](“12”);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-45
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-46
Programmation Java
[Link]: 10 at Tab-
[Link]([Link])
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-47
Programmation Java
int i = 2;
int resultat = 3 * i;
• Opérateurs
Il faudrait écrire :
x = (int)z /y; // division entière
ou :
x = (int) (z /(float) y); // division
// réelle
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-48
Programmation Java
int i = 2;
double d = 4;
... Ces exemples marchent
d = i;
double d1 = 8;
int i = 2;
double d2 = d1/i;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-49
Programmation Java
Associativité
Droite-Gauche . {} ()
Droite-Gauche ++ --
Droite-Gauche ! ~ (conversion de type)
Gauche-Droite */%
Gauche-Droite +-
Gauche-Droite << >> >>>
Gauche-Droite < > <= >= instanceof
Gauche-Droite == !=
Gauche-Droite &
Gauche-Droite ^
Gauche-Droite |
Gauche-Droite &&
Gauche-Droite ||
Droite-Gauche ?:
Droite-Gauche = *= /= %= += -= <<=
>>= >>>= &= ^= |=
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-50
Programmation Java
...
if ((x != 0) && (y/x == 2)) {
....
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-51
Programmation Java
if(expression_booléenne){
instructions
} else {
instructions
}
- Le bloc else est optionnel
- Les accolades {} sont obligatoires dès que l’on
désire exécuter plus d’une instruction dans le bloc
du if ou du else.
- Exemples :
if(i < 0) i = 0; // avec int i;
if(error) {
fin = true;
i = 0;
} else
i++;
int i=10;
if(i) i=0; // Non! i n’est pas booléen
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-52
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-53
Programmation Java
switch(expression){
case expr1:
instructions;
[break;]
...
case exprN:
instructions;
[break;]
default:
instructions;
[break;]
}
- L’expression évaluée dans le switch doit retour-
ner un type dont les valeurs peuvent être énumé-
rées (int, boolean, char).
- Il est possible de mettre plusieurs instructions dans
un case.
- Si on ne met pas de break à la fin des instructions
d’un case, les instructions du case suivant sont
exécutées. Voir le cas du case 1 de l’exemple
page suivante.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-54
Programmation Java
switch(count % 3) {
case 0:
methode1(count);
break;
case 1:
count = -1;
case 2:
methode2(count);
} // fin du switch
- Si (count % 3) vaut 1, les instructions suivantes
seront exécutées :
count = -1;
methode2(count);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-55
Programmation Java
• Exemple
int i;
for(i =0; i < 10; i++) {
[Link](i);
...
if(i == 1) continue;
if(val_i_ok(i)) break;
}
- L’instruction break permet de sortir de la boucle et
de continuer l’exécution après le bloc d’instructions
du for.
- L’instruction continue force l’exécution à l’itéra-
tion suivante. Dans l’exemple, lorsque i vaut 1, la li-
gne suivante if(val_i_ok...) n’est pas exécu-
tée, on reprend sur la ligne [Link]... avec
i = 2
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-56
Programmation Java
Visibilité de i
• Etiquettes
while(expression_booléenne){
instructions;
}
do {
instructions;
} while(expression_booléenne);
• Exemple
int i = 10;
while(i > 10) {
...
i--;
}
int j = 0;
do {
...
j++;
} while(j < 100);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-58
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-59
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-60
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-61
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-62
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-63
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-64
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-65
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-66
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-67
Programmation Java
Héritage
Partie héritée de
ObjetGraphique
Class Cercle extends ObjetGraphique{
float rayon; int x, y;
Partie héritée de
ObjetGraphique
Class Rect extends ObjetGraphique{ int x, y;
int width, height;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-68
Programmation Java
• Définition du polymorphisme
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-69
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-70
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-71
Programmation Java
• Réutilisabilité et évolutivité
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-72
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-73
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-74
Programmation Java
• Méthodes
[visibilité] [type retour] nom (liste paramètres);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-75
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-76
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-77
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-78
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-79
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-80
Programmation Java
private int x;
private int y;
public Point(int px, int py){
x = px;
y = py;
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-81
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-82
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-83
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-84
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-85
Programmation Java
Héritage en Java
Introduction
• Dans le prototype de la classe à l’aide du mot-clé
extends
classe ObjetGraphique
Attributs : Héritage
Point origine
Méthodes :
public ObjetGraphique(int x, int y)
void setOrigine(int x, int y)
Point getOrigine()
void Dessiner()
Méthodes :
public Cercle(int x, public ObjetGraphique(int x, int y)
int y,
float f) void setOrigine(int x, int y)
Point getOrigine()
void Dessiner() void Dessiner()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-86
Programmation Java
Héritage en Java
Introduction
• Syntaxe
class <dérivée> extends <base>
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-87
Programmation Java
Héritage en Java
Introduction
• Attributs privés
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-88
Programmation Java
Héritage en Java
Redéfinition et surcharge
• Redéfinition et super
class ObjetGraphique {
Point origine;
...
public void afficher(){
[Link]();
}
...
}
class Cercle extends ObjetGraphique {
...
public void afficher() {
[Link]();
...
}
...
}
• Surcharge
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-89
Programmation Java
Héritage en Java
Surcharge et constructeurs
• Un constructeur peut utiliser le code d’un autre par
appel explicite à this(...) en première instruc-
tion
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-90
Programmation Java
Héritage en Java
Redéfinition et surcharge
• Redéfinition et super
• Surcharge
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-91
Programmation Java
Héritage en Java
Visibilité et héritage
• En plus de public et private, de nouveaux mots-
clés permettent de régler la visibilité au sens de
l’héritage
• protected
class ObjetGraphique {
protected Point origine;
...
}
class Cercle extends ObjetGraphique {
protected float rayon;
...
}
• final
class ObjetGraphique {
Point origine; // friendly
...
}
class Cercle extends ObjetGraphique {
final float rayon = 10.0;
...
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-92
Programmation Java
Héritage en Java
Visibilité et héritage
• Friendly (par défaut)
• Protected
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-93
Programmation Java
Héritage en Java
Visibilité et héritage
• Un exemple :
Package P1; Package P2; }
a.x = 0;
this.f();
b.f();
c.f();
package P4;
a.f();
public class D
d.x = 0;
extends A {
} }
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-94
Programmation Java
Héritage en Java
Visibilité et héritage
• final
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-95
Programmation Java
Héritage en Java
Classe abstraite
• Utilité
• Exemple
abstract class ObjetGraphique {
private Point origine;
public ObjetGraphique(int x, int y){
origine = new Point(x, y);
}
abstract public void dessiner();
}
class Cercle extends ObjetGraphique {
private float rayon;
public Cercle(int x, int y, float r){
super(x, y);
rayon = r;
}
public void dessiner() {
// code d’implémentation...
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-96
Programmation Java
Héritage en Java
Classe abstraite
• Fonctionnement des classes abstraites
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-97
Programmation Java
Héritage en Java
Interface
• Définition
• Utilisation
Héritage en Java
Interface
• Spécification formelle de classe
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-99
Programmation Java
Héritage en Java
Interface
• En pratique, dans le code, une interface ne peut
contenir que des constantes (static final) et
des méthodes publiques non implémentées
interface Nommable {
public String getName();
public void setName(String s);
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-100
Programmation Java
Héritage en Java
Interface et polymorphisme
• Exemple
public class Cercle extends ObjetGraphique {
...
public void dessiner() {
// code du dessin de l’objet
}
}
public class Rect extends ObjetGraphique {
...
public void dessiner() {
// code du dessin de l’objet
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-101
Programmation Java
Héritage en Java
Interface et polymorphisme
• Polymorphisme et interfaces
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-102
Programmation Java
Héritage en Java
Attributs et méthodes statiques
(dits de classe)
• La staticité permet de définir
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-103
Programmation Java
Héritage en Java
Attributs et méthodes statiques
• Principe de la staticité
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-104
Programmation Java
Héritage en Java
Attributs et méthodes statiques
• Attributs de classe
static [visibilité] type nom [ = expression] ;
• Méthode de classe
static [visibilité] type_retour nom (liste paramètres) ;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-105
Programmation Java
Packages
Regroupement de classes
• Java propose de nombreux packages avec le JDK
- Object,
- Class, ClassLoader, Runtime, Processus, System.
• [Link] : entrées/sorties
• [Link] :
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-106
Programmation Java
Packages
Regroupement de classes
• [Link] : le réseau
- Component, Container
- Evénements
- Items graphiques : Button, Menus, etc...
- Trois autres packages complémentaires : ja-
[Link], [Link], [Link]-
fer
• [Link]
• [Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-107
Programmation Java
Packages
Regroupement de classes
• Intérêt des packages
• Organisation
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-108
Programmation Java
Packages
Utilisation
• Exemple : on place en début de fichier utilisateur
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-109
Programmation Java
Packages
Création
1. Ajouter dans chaque fichier “.java” composant le
package la ligne :
package <nom_du_package>;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-110
Programmation Java
• Pourquoi faire ?
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-111
Programmation Java
- Evénements,
- JavaBeans.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-112
Programmation Java
• Top-level :
• Anonyme
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-113
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-114
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-115
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-116
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-117
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-118
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-119
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-120
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-121
Programmation Java
Les exceptions
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-122
Programmation Java
Les Exceptions
• On ne peut éviter toute erreur
• Objectifs de ce chapitre
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-123
Programmation Java
Exceptions
L’approche maladroite
• Code non spécialisé
• Difficile à comprendre
• Difficile à maintenir
code = ouvreFichier(...);
if (code == ERREUR)
traiteErreur(code);
else {
....
Comment traiter une
erreur fatale ?
Comment reprendre la
suite du code ?Avec
setjump() et longjump()
allez....
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-124
Programmation Java
Exceptions
En java une exception est un objet en-
voyé à la JVM
• A la réception :
- Arrêt du code
- Recherche du traitement de l’erreur identifié par un
objet de la classe Exception, paramètre du bloc de
traitement
- La recherche s’effectue en local, puis remonte la
liste des appelants
- Aquittement de l’Exception et reprise du code
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-125
Programmation Java
Exceptions
Bloc try{...}, catch{...}
• C’est le bloc de traitement des exceptions
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-126
Programmation Java
Exceptions
Types d’exceptions
Table 1: différents types d’exceptions
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-127
Programmation Java
Exceptions
RuntimeExceptions
• ArithmeticException
• NullPointerException
• ClassCastException
• NegativeArraySizeException
• ArrayIndexOutOfBoundsException
• OutOfMemoryException
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-128
Programmation Java
Exceptions
• printStackTrace()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-129
Programmation Java
Exceptions
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-130
Programmation Java
Exceptions
Et si je relaye une exception jusqu’à la
JVM ?
• Traitement par défaut : affichage de la pile des ap-
pels de méthodes
• Acquittement de l’exception
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-131
Programmation Java
Exceptions
Lesquelles déclarer ?
• Les exceptions telles que ArithmeticException,
NullPointerException, ClassCastException, etc...
sont toutes des sous-classes de RuntimeExcep-
tion
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-132
Programmation Java
Exceptions
Créer une classe d’Exception
• Exception hérite de Throwable
public toString() {
return [Link]() +
[Link](valeur);
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-133
Programmation Java
Les entrées/sorties
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-134
Programmation Java
Entrées-Sorties
Terrain connu : la classe
[Link]
• Interface avec le système d’exploitation.
• 3 fichiers standards :
- [Link] : un [Link]-
Stream
- public int read() : attend la prochaine entrée et re-
tourne son code.
- public long skip(long) : se déplace d’un certain nom-
bre d’octets dans le flot. Retourne le nombre d’octets dé-
passés.
- [Link] : un [Link]
- public void print(tout type Java)
- public void println(tout type Java)
- [Link] : idem
- idem [Link]
import [Link].*;
class MonApplication {
public static void main(String[] argv){
int b, nb = 0;
try {
// lecture de caractères au clavier
while((b = [Link]()) != -1){
nb++;
[Link](c);
}
} catch(IOException e {...}
[Link](“nb = “ + nb);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-135
Programmation Java
Entrées-Sorties
Le [Link]
• Ce package fournit des classes permettant de ma-
nipuler diverses ressources.
• Mémoire
- BufferedInputStream et BufferedOutput-
Stream
- Lectures bufférisées.
- DataInputStream et DataOutputStream
- Lectures typées (utile pour lire des fichiers dont on connait la
nature exacte : 3 doubles et un entier sur chaque ligne par
exemple...)
- PushBackInputStream
- Buffer d’un octet dans lequel on peut remettre le caractère
qui vient d’être lu. Similaire au tampon de Pascal.
• Pipe
- PipedInputStream et PipedOutputStream
- Permettent à deux threads d’échanger des données.
• Lecture filtrée
- StreamTokenizer
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-136
Programmation Java
Entrées-Sorties
La classe [Link]
• Cette classe fournit de nombreuses méthodes
pour gérer des fichiers.
• Nommage
• Droits d’accès
• Autres informations
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-137
Programmation Java
Entrées-Sorties
La classe [Link]
• Répertoires
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-138
Programmation Java
Entrées-Sorties
La classe [Link]
• Classe abstraite. Fournit un constructeur par dé-
faut + ensemble de méthodes, dont read() que
toute sous-classe doit implémenter.
FileInputStream SequenceInputStream
ByteArrayInputStream
PipedInputStream
StringBufferInputStream
FilterInputStream
DataInputStream BufferedInputStream
PushBackInputStream LineNumberInputStream
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-139
Programmation Java
Entrées-Sorties
La classe [Link]
• Lecture de caractères ou d’octets sur un fichier.
• Constructeurs
- public FileInputStream(String
finename)
- public FileInputStream(File file)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-140
Programmation Java
Entrées-Sorties
La classe [Link]
FileInputStream fis;
byte[] b = new byte[1024];
// ouverture du fichier
try {
fs = new FileInputStream(“/u/I3S/buffa/.emacs”);
} catch (FileNotFoundException e) {...}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-141
Programmation Java
Entrées-Sorties
La classe [Link]
• Lecture de données typées
• Classe de “spécialisation”
• Constructeur
- public DataInputStream(InputStream)
• Méthodes de lecture
• Fermeture de flot
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-142
Programmation Java
Entrées-Sorties
La classe [Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-143
Programmation Java
Entrées-Sorties
InputStreams et URL
• Il est possible d’obtenir un InputStream à partir
d’un URL
• Exemples
InputStream is;
DataInputStream dis;
URL mon_url = new URL(getDocumentBase(),
“.emacs”);
is = mon_url.openStream();
dis = new DataInputStream(is);
while((String line = [Link]()) != EOF){
[Link](line + “\n”);
}
// on aurait pu remplacer
// is = mon_url.OpenStream() par
// is = mon_url.openConnection().getInputSTream()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-144
Programmation Java
Entrées-Sorties
[Link]
• Classe (abstraite) de base de tous les flots de sor-
tie
OutputStream
FileOutputStream
ByteArrayOutputStream
PipedOutputStream
FilterOutputStream
DataOutputStream BufferedOutputStream
PrintStream
• Méthodes fournies
- close()
- flush()
- write() : écriture d’octets
- Doit être implémenté par toute sous-classe de OutputS-
tream.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-145
Programmation Java
Entrées-Sorties
[Link]
• Ecriture de caractères dans un fichier
• Constructeurs
- public FileOutputStream(File)
- public FileOutputStream(FileDescrip-
tor)
- public FileOutputStream(String)
• Méthodes
FileOutputStream fos =
new FileOutputStream(“toto”);
String chaine = new String(“Coucou c’est moi”);
int longueur = [Link]();
byte[] buffer = new byte[l];
[Link](0, longueur - 1, buffer, 0);
for(int i = 0; i < longueur; i++)
[Link](buffer[i]);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-146
Programmation Java
Entrées-Sorties
[Link]
• Ecriture sur un flot de sortie bufférisé
• Constructeurs
- BufferedInputStream(OutputStream)
- BufferedOutputStream(OutputStream,
int size)
• Méthodes
- write(int)
- write(byte [], int offset, int length)
- Construction en précisant la taille du buffer.
- flush()
- close()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-147
Programmation Java
Entrées-Sorties
[Link]
// Ecriture
for(int i = 0; i < longueur; i++)
[Link](buffer[i]);
[Link](“\n”);
[Link]();
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-148
Programmation Java
Entrées-Sorties
[Link]
• Ecriture de données typées
• Classe de “spécialisation”
• Constructeur
- public DataOutputStream(OutputStream)
• Méthodes d’écriture
• Fermeture de flot
- Avec close()
- La fermeture d’un DataOutputStream entraîne
la fermeture de l’InputStream original.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-149
Programmation Java
Entrées-Sorties
[Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-150
Programmation Java
Entrées-Sorties
[Link]
• N’entrent pas dans le cadre de ce cours...
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-151
Programmation Java
Entrées-Sorties
Flots de caractères : nouveau dans le
JDK 1.1
• La version 1.1 du JDK introduit la notion de “flots
de caractères” (Character Streams).
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-152
Programmation Java
Entrées-Sorties
Flots de caractères : intérêt ?
• On peut échanger des données textuelles avec des
accents, des caractères bizarres (japonais ?), de
manière transparente.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-153
Programmation Java
Entrées-Sorties
Flots de caractères : noms des classes
Table 1: Correspondances entre classes travaillant en entrée sur des flots de caractères et
celles travaillant sur des flots de bytes
Classe correspondante
Flot de caractères Description
travaillant avec des bytes
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-154
Programmation Java
Entrées-Sorties
Flots de caractères : noms des classes
Table 1: Correspondances entre classes travaillant en sortie sur des flots de caractères et
celles travaillant sur des flots de bytes
Classe correspondante
Flot de caractères Description
travaillant avec des bytes
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-155
Programmation Java
Classes utilitaires,
package [Link]
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-156
Programmation Java
Le package [Link]
Des fonctionalités importantes...
• Stocker des objets dans une zone de taille variable
(tableaux, piles)
- La classe StringTokenizer
- Mécanisme Observer/observable
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-157
Programmation Java
Le package [Link]
La classe Vector
• Les tableaux java ne répondent pas forcément à
tous les besoins
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-158
Programmation Java
Le package [Link]
Création d’unVector
• A la création on indique la taille initiale et la
manière dont le Vector doit grandir lorsqu’il ne
peut plus héberger de nouveaux objets
• Constructeurs
public Vector()
public vector(int initialCapacity)
public Vector(int initialCapacity,
int capacityIncrement);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-159
Programmation Java
Le package [Link]
classe Vector : ajout et modification des
objets
• Deux manières d’ajouter un élément
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-160
Programmation Java
Le package [Link]
classe Vector : accès à un élément
• Impossible d’utiliser l’indexation comme avec les
tableaux
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-161
Programmation Java
Le package [Link]
classe Vector : recopie dans un tableau
• Utiliser copyInto()
public final synchronized void copyInto(Object[] tab);
• Un exemple :
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-162
Programmation Java
Le package [Link]
L’interface Enumeration
• Permet d’énumérer une liste d’objets (ils peuvent
donc être hétérogènes)
• Exemple d’utilisation
Enumeration e = [Link]();
while([Link]()) {
Object obj_suivant = [Link]();
// Effectuer des actions sur l’objet
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-163
Programmation Java
Le package [Link]
L’interface Enumeration
• Attention, les objets récupérés par nextEle-
ment() sont de type Object, il faudra forcément
les caster si on veut invoquer des méthodes spé-
cialisées
Enumeration e = [Link]();
while([Link]()) {
Object obj_suivant = [Link]-
ment();
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-164
Programmation Java
Le package [Link]
L’interface Enumeration
• Pour éviter de caster (ce qu n’est pas très beau)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-165
Programmation Java
Le package [Link]
classe Vector : recherche d’un élément
• On peut utiliser une Enumeration du Vector et par-
courir tous les éléments
-
- Un objet est-il présent ?
public final boolean
contains(Object obj);
- A quelle position se trouve un objet donné ?
public final int indexof(Object obj);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-166
Programmation Java
Le package [Link]
classe Vector : suppression d’éléments
• Supprimer tous les éléments
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-167
Programmation Java
Les applets
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-168
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-169
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-170
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-171
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-172
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-173
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-174
Programmation Java
import [Link];
import [Link];
public class HelloWorldApplet
extends Applet {
public void paint(Graphics gc) {
[Link](“Hello world!”,
50, 25);
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-175
Programmation Java
• update(Graphics gc)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-176
Programmation Java
...
<applet code=”[Link]”
width=300 height=200>
<H1>Votre navigateur ne supporte pas
java, désolé !</H1>
</applet>
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-177
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-178
Programmation Java
- code=”[Link]”
- Nom de la classe principale.
- width=200, height=300, taille en pixels
- hspace=10, vspace=10, en pixels
- Espace en pixel au dessus et autours de l’Applet
- codebase=”codebaseURL”
- URL de base de l’applet. Par exemple “java/classes”. Par dé-
faut, le répertoire courant.
- name=”Test_java”
- permet de nommer une Applet. Plusieurs Applets nommées
peuvent communiquer entre elles au sein d’une même page
HTML.
- align=alignement
- valeurs possibles : left, right, top, texttop, middle, absmiddle,
baseline, bottom, absbottom
- archive=”[Link]” (java 1.1)
- Nom de l’archive contenant l’ensemble des classes java de
l’Applet.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-179
Programmation Java
Applications réseau
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-180
Programmation Java
Programmation réseau
Avec Java, c’est facile !
• Ouvrir des connexions par sockets.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-181
Programmation Java
Programmation réseau
Les sockets
• Qu’est-ce qu’un socket ?
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-182
Programmation Java
Programmation réseau
Les “domaines” de socket
• Domaine de socket ?
• Le domaine Unix
- Communication inter-processus locale à une
même machine. Les deux modes de sockets
(Stream et Datagram) sont supportés. Pas de Raw
sockets.
• Le domaine Internet
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-183
Programmation Java
Programmation réseau
Le domaine Internet
• Applications TCP les plus connues
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-184
Programmation Java
Programmation réseau
TCP/UDP
• En java, on ne travaille pas au niveau TCP ou UDP,
on travaille au niveau de l’application, à l’aide des
classes du package [Link].
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-185
Programmation Java
Programmation réseau
Le modèle réseau Java
• Les sockets TCP/IP sont implémentés au travers
des classes du package [Link].
Accept() 2
Client
Retourne un objet Socket(host, port#)
Socket
OutputStream 3 OutputStream
InputStream InputStream
Close() Close()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-186
Programmation Java
Programmation réseau
Le modèle réseau Java
1. Le serveur enregistre son service sous un numéro
de port, indiquant le nombre de clients qu’il accep-
te de faire buffériser à un instant T,
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-187
Programmation Java
Programmation réseau
Principe d’un serveur TCP/IP
import [Link].*;
import [Link].*;
class simpleServer {
public static void main(String args[]) {
ServerSocket s = (ServerSocket) null;
Socket s1;
String sendString = “Message du serveur\n”;
int slength;
OutputStream s1out;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-188
Programmation Java
Programmation réseau
Principe d’un client TCP/IP
import [Link].*;
import [Link].*;
class simpleClient {
public static void main(String args[])
throws IOException {
int c;
Socket s;
InputStream sIn;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-189
Programmation Java
Programmation réseau
Remarques
• Je vous recommande d’utiliser des DataInputS-
tream et des DataOutputStream pour réaliser
l’échange de données
...
Socket s = new Socket(“[Link]”, 13);
DataInputStream dis =
new DataInputStream([Link]());
String line;
while (true) {
accepter une connexion ;
Créer un thread qui va s’occuper d’échanger les
données avec le client
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-190
Programmation Java
Programmation réseau
Utilisation des sockets Datagrams
• Utiliser les classes DatagramPacket et Data-
gramSocket.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-191
Programmation Java
Programmation réseau
Envoi d’un Datagram
...
// Machine destinataire
InetAddress address =
[Link](“[Link]”);
static final int port=4444;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-192
Programmation Java
Programmation réseau
Réception d’un Datagram
• Pour recevoir un Datagram
...
// Buffer de réception
byte[] buffer = new byte[1024];
String s;
// Paquet associé à un buffer vide pour réception
DatagramPacket p = new DatagramPacket(buffer, buf-
[Link]);
// Socket qui écoute sur le port
DatagramSocket s = new datagramSocket(port);
for(;;) {
// Attente de reception
[Link](p);
// Affichage du paquet récu
s = new String(buffer, 0, 0, [Link]());
[Link](“Paquet reçu de “ +
[Link]().getHostName() +
“ : “ + [Link]() + “ : “ + s);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-193
Programmation Java
import [Link].*;
import [Link].*;
import [Link].*;
QuoteServerThread() {
super(“QuoteServer”);
try {
socket = new DatagramSocket();
[Link](“QuoteServer listening on
port: “ + [Link]());
} catch ([Link] e) {
[Link](“Could not create datagram
socket.”);
}
[Link]();
}
...
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-194
Programmation Java
while (true) {
try {
byte[] buf = new byte[256];
DatagramPacket packet;
InetAddress address;
int port;
String dString = null;
// receive request
packet = new DatagramPacket(buf, 256);
[Link](packet);
address = [Link]();
port = [Link]();
// send response
if (qfs == null)
dString = new Date().toString();
else
dString = getNextQuote();
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-195
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-196
Programmation Java
class QuoteClient {
if ([Link] != 2) {
[Link](“Usage: java QuoteClient <hostname>
<port#>”);
return;
}
try {
// bind to the socket
socket = new DatagramSocket();
} catch ([Link] e) {
[Link](“Could not create datagram
socket.”);
}
if (socket != null) {
try {
// send request
port = [Link](args[1]);
address = [Link](args[0]);
packet = new DatagramPacket(sendBuf, 256,
address, port);
[Link](packet);
...
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-197
Programmation Java
...
// get response
packet = new DatagramPacket(sendBuf, 256);
[Link](packet);
String received = new String([Link](), 0);
[Link](“Quote of the Moment: “ +
received);
[Link]();
} catch (IOException e) {
[Link](“IOException: “ + e);
[Link]();
}
}
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-198
Programmation Java
Le multithreading
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-199
Programmation Java
Threads et MultiThreading
Objectifs
• Définir un thread
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-200
Programmation Java
Threads et MultiThreading
Programmation “parallèle”
• Processus = unité fonctionnelle
Code
Operating
Données System
Ressources
• Exécution
Processus 1
Operating
Processus 2 System
Processus 3
Temps CPU
Echange de données
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-201
Programmation Java
Threads et MultiThreading
Qu’est-ce qu’un Thread ?
• Processus “interne” à un processus
Un thread
t1
Code
t2 t3 Un processus
t4 Données
t5 t6
Ressources
t7
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-202
Programmation Java
Threads et MultiThreading
Qu’est-ce qu’un Thread ?
• Un processus comporte plusieurs threads
• Utilité
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-203
Programmation Java
Threads et MultiThreading
Un exemple
• Deux vérificateurs d’une usine doivent contôler le
contenu de sacs d’objets
// début du contrôle
[Link]();
[Link]();
}
}
class Sac {
String contenu;
int taille;
public Sac(int taille, String contenu) {
[Link] = taille;
[Link] = contenu;
}
}
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-204
Programmation Java
Threads et MultiThreading
Un exemple (suite)
class Verificateur {
private Sac sac;
private String nom;
• Résultat :
++++++++++
Gaston a terminé
----------
Robert a terminé
- C’est séquentiel ! En fait on a pas utilisé de thread
ici !
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-205
Programmation Java
Threads et MultiThreading
Mais alors, dites-nous comment faire !
• Première approche : utiliser la classe Thread
• Utilisation
- Sous-classer Thread
- Spécialiser une classe existante et enrichir son comportement.
- Associer un thread à un objet
- Définir une aggrégation ou association entre la classe à utiliser
et la classe thread.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-206
Programmation Java
Threads et MultiThreading
Solution 1 : sous-classer Thread
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-207
Programmation Java
Threads et MultiThreading
Solution 1 : sous-classer Thread
// début du contrôle
// Utilisation de la méthode start()
// héritée par la classe Verificateur.
// start() appelle run()
[Link]();
[Link]();
}
• Résultat
+-+-+-+-+-+-+-+-+-+-
Gastom a terminé
Robert a terminé
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-208
Programmation Java
Threads et MultiThreading
Solution 2 : implémenter l’interface run-
nable
• Un thread peut partager le contexte d’un objet
existant, qui à l’origine n’est pas un Thread.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-209
Programmation Java
Threads et MultiThreading
Solution 2 : un exemple
// implémentation de Runnable
public void run() {
sac monSacAVerifier;
Thread moi = [Link]();
monSacAVerifier = [Link](moi);
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-210
Programmation Java
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-211
Programmation Java
- public Thread(Runnable)
- public static Thread currentThread()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-212
Programmation Java
Threads et MultiThreading
Quelle solution choisir ?
• Sous-classer Thread
• Implémenter Runnable
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-213
Programmation Java
Threads et MultiThreading
Les états d’un Thread
Construction
Créé
start() wait()
sleep()
suspend()
Actif Endormi
Resume()
stop() stop()
Destruction
Table 1: isAlive()
créé actif endormi mort
isAlive() false true true false
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-214
Programmation Java
Threads et MultiThreading
Les états d’un Thread
• Créé
• Actif
• Endormi
• Mort
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-215
Programmation Java
Threads et MultiThreading
Priorités
• Principes
• Méthodes
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-216
Programmation Java
Threads et MultiThreading
Priorités
• Partage de la ressource CPU. Deux types de ges-
tion existent dans les OS du marché.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-217
Programmation Java
Threads et MultiThreading
Synchronisation
• Certains accés simultanés à une ressource peu-
vent être gênants.
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-218
Programmation Java
Threads et MultiThreading
Synchronisation
• Contôler l’accés à un objet
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-219
Programmation Java
Threads et MultiThreading
Daemons
• Exemple de daemons : les threads de service : gar-
gage collector, afficheur d’image, etc...
• Méthodes
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-220
Programmation Java
Threads et MultiThreading
Groupes de threads
• Groupe de threads par défaut : main
• Fonctionnement
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-221
Programmation Java
Threads et MultiThreading
Groupes de threads
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-222
Programmation Java
Threads et MultiThreading
Rendez-vous
• Exemple producteur/consommateur
Producteur
(1) (3)
(2) Consommateur
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-223
Programmation Java
Threads et MultiThreading
Rendez-vous
class Producteur extends Thread {
private Buffer buffer;
private String donnee;
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-224
Programmation Java
Threads et MultiThreading
Rendez-vous
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-225
Programmation Java
Threads et MultiThreading
Rendez-vous
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-226
Programmation Java
Threads et MultiThreading
Rendez-vous
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-227
Programmation Java
Threads et MultiThreading
Rendez-vous
• Programme principal
• Résultats :
Rndez-vous avec Jav
production terminée
ae
Consommation terminée
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-228
Programmation Java
Threads et MultiThreading
Rendez-vous
• La classe Buffer
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-229
Programmation Java
Multimédia en java,
images et sons
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-230
Programmation Java
import [Link].*;
import [Link].*;
• [Link](...)
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-231
Programmation Java
La classe Mediatracker
• Contrôle sur le chargement asynchrone des ima-
ges
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-232
Programmation Java
La classe Mediatracker
Méthodes utiles
• boolean checkAll()
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-233
Programmation Java
PixelGrabber et MemoryImageSource
Manipulation avancée d’images
• PixelGrabber permet de produire un tableau d’en-
tiers à partir d’une Image
Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-234
Programmation Java
Introduction à Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Caractéristiques de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Simplicité (apparente ?) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
I Orienté objet, distribué . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Robuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Indépendant de l’architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Sûr : le vérificateur de byte-code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Sûr : le Class Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Le code Java est mobile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Java est interprété . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Java est multithreadé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Java est dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Héritage en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Redéfinition et surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Surcharge et constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Visibilité et héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Classe abstraite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Interface et polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Attributs et méthodes statiques (dits de classe) . . . . . . . . . . . . . . . . . . 103
Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Regroupement de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Entrées-Sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Terrain connu : la classe [Link] . . . . . . . . . . . . . . . . . . . . . 135
Le [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
La classe [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137