0% ont trouvé ce document utile (0 vote)
5 vues238 pages

Introduction à la Programmation Java

Copyright
© Attribution Non-Commercial (BY-NC)
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
5 vues238 pages

Introduction à la Programmation Java

Copyright
© Attribution Non-Commercial (BY-NC)
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Programmation Java

Programmation Java
Version.1.10 du 11/05/98

Michel Buffa, Peter Sander, Richard Grin,


Jean-Philippe Orsini

Université de Nice

Email : buffa@[Link], sander@[Link], grin@[Link],

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

- Jacques Farré (jf@[Link])


- Jacques Chazarain (jmch@[Link])
- Richard Grin (grin@[Link])
- Peter Sander (sander@[Link])
- Jean-Philippe Orsini (orsini@[Link])

 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 !

- Syntaxe proche de C++, orienté objet, d’une utilisa-


tion simple, implémentant un maximum de sécuri-
té, il permet d’exécuter des programmes au travers
d’une machine virtuelle.

• Il est fourni avec un ensemble de “packages” : les


classes de base du JDK (Java Developper’s Toolk-
it)

- Sans ces classes de base, Java n’est rien. Elles


fournissent les fonctionnalités de base (entrées/
sorties, réseau, etc...). Le langage lui-même se
trouve dans le package (ensemble de classes) ja-
[Link] !

• Java et l’internet

- Du fait de son fonctionnement au travers d’une ma-


chine virtuelle, Java est un langage “qui voyage”.

 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++ ?

Non, les suppressions évoqués précédemment rédui-


sent de moitié les erreurs les plus fréquentes du C et
du C++.
En outre, la suppression des macros, si elle peut sem-
bler une hérésie, augmente de beaucoup la lisibilité
des programmes.
L’héritage multiple au sens courant a disparu, mais
existe sous une forme différente grâce au concept
d’”interfaces”.

• Java est-t-il un beau langage ?

La notion de “beau” est subjective, mais oui, Java est


un langage extrêmement agréable à programmer et
permet dans certains cas de développer des applica-
tions beaucoup plus rapidement qu’avec d’autres lan-
gages.

• Java est peu gourmand en mémoire

- La machine virtuelle n’a besoin que de 215k pour


s’exécuter.
- Java dans une montre à quartz ? Oui, c’est possi-
ble !

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-7
Programmation Java

Introduction à Java
Orienté objet, distribué
• Orienté objet

Java reprend la technologie objet du C++ et y ajoute


quelques améliorations. Il y enlève aussi un gros mor-
ceau (l’héritage multiple, la généricité et d’autres enco-
re...) mais sans vraiment y perdre. Nous y revien-
drons...
Contrairement à C++, Java est complètement objet, ne
demeurent que quelques types primitifs (int, char) hé-
rités du C possèdant des “wrapper classes”.!

• Distribué au travers des classes du JDK


Java lui-même n’est pas distribué. En revanche, il est
fourni avec un ensemble de classes qui intègrent une
gestion plus ou moins transparente du réseau.
Par exemple, il est possible, en quelques lignes de co-
de, de récupérer un fichier au travers du protocole
HTTP ou FTP, de programmer un serveur de socket
pouvant accepter des connexions en parallèle, etc...
Ce genre de programmation est aujourd’hui un des
gros attraits de Java.

 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

Lors de la phase de compilation, Java s’assure qu’il n’y


a aucun problème, que toutes les erreurs pouvant em-
pêcher l’exécution du programme ont bien été traitées
(ouverture d’un fichier inexistant ou accès mémoire en
dehors des bornes d’un tableau par exemple).
Cette vérification permet d’éviter qu’un problème gra-
ve ne corrompe la machine virtuelle ou le système qui
l’exécute. N’oubliez pas que les programmes Java
“voyagent” d’une machine à l’autre ! Vous ne voudriez
pas qu’un programme arrive dans votre navigateur
Web et plante votre machine !

• Java fournit au travers de la machine virtuelle et du


langage

- vérification de pointeur nul,


- vérification des bornes des tableaux,
- traitement très puissant des exceptions,
- vérification du byte code (pas de virus, très difficile
de “cracker” des programmes compilés, etc...).
- hmmm... mais désassemblage assez facile avec la
release 1.0 du JDK !

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

Le compilateur Java du JDK ne fournit pas directement


du code machine exécutable, il produit un code porta-
ble, du byte-code, interprétable par la machine virtuel-
le.
Ce byte-code est indépendant de l’architecture. Cha-
que machine possédant une machine virtuelle peut
l’exécuter. Actuellement Java peut être exécuté sous
presque tous les Unix du marché, sous Windows 3.1/
95/NT, sous MacOS, dans des Net Computers (NC)
ou des systèmes embarqués possédant une puce Ja-
vaOS (téléphones portables, télévisions, etc...).

• Compilation directe possible (traduction C++ puis


compilation aujourd’hui), mais adieu la transporta-
bilité du code !

• Performances quand même excellentes depuis


l’arrivée des JITs (Just In Time compilers...)

- Compilation lors de la phase d’interprétation, com-


pilation “au vol”.
- On approche la vitesse du C/C++ optimisé, mais
on y est pas encore.

 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

Le code Java est testé plusieurs fois avant d’être exé-


cuté sur votre machine.
Le code passe par un vérificateur de byte-code. Celui-
ci teste le format des fragments de code et applique un
algorithme qui détermine leur légalité. Un code légal
ne modifie pas les pointeurs, ne viole pas les droits
d’accès aux objets et ne tente pas d’altérer les objets
ou les classes.
Une application indépendante peut se permettre plus
de choses qu’une application s’exécutant dans un na-
vigateur Web (applet). Le class loader et le security
manager sont différents dans les deux cas.

• Vérificateur de byte-code

- Le code ne cause aucun dépassement de capacité


positif ou négatif de la pile opérande,
- les types de paramètres de tous les codes opéra-
tion sont corrects,
- aucune conversion illégale de données (entiers en
pointeurs, etc...),
- les accès aux objets sont légaux (publics, privés,
protégés... nous y reviendrons !)

 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é

Les classes sont, comme nous le verrons plus tard, le


code de base servant à la construction par instancia-
tion des objets utilisés par une application.
Elles peuvent être chargées par le réseau (applets et
classes développées par l’utilisateur) ou encore loca-
les, liées à la machine virtuelle en cours d’utilisation.
Le Class Loader participe donc à la sécurisation de
Java en séparant les espaces-noms pour les classes
locales et les classes provenant du réseau. Cela limite
les possibilités de voir un virus ou une application
“cheval de troie” envahir votre machine sans prévenir!
Lorsqu’on a besoin d’une classe donnée, la recherche
est effectuée en priorité parmi les classes locales. De
cette manière, aucune classe importée ne peut se faire
passer pour une classe système, même si elle en
usurpe le nom.
Quoique...

 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

De par son indépendance vis-à-vis de l’architecture,


Java est par essence mobile. Il intègre cependant
d’autres standards de mobilité afin de faciliter le déve-
loppement d’applications portables.
Par exemple, la longueur des types de base est tou-
jours identique quelle que soit l’architecture utilisée,
les codes des caractères sont partout les mêmes, le
codage des mots de 16 ou 32 bits est le même (adieux
big et little endian !), etc...
De même, la librairie graphique, l’AWT (Abstract Win-
dow Toolkit) permet de développer des interfaces gra-
phiques sans se préoccuper du système d’exploitation
qui sera utilisé.

 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

• Celui-ci est interprété par une machine virtuelle

• Pas de phase d’édition de liens avec des librairies


existantes, c’est un garant de la portabilité du lan-
gage.

• Excellentes performances depuis peu

- Attention, le JDK proposé gratuitement par Sun est


le plus lent du marché! Tout est écrit en Java (com-
pilateur, machine virtuelle, etc...).
- Des produits infiniment plus performants, mais
commerciaux sont disponibles chez différents dé-
veloppeurs.
- Par exemple : compilation de 2 millions de lignes/
seconde sur Pentium 133 avec Symantec Café.
- L’interpréteur est remplacé par un Just In Time
Compiler (Solaris, nombreuses versions sous Win-
dows 95/NT par Symantec, Microsoft, Borland,
Netscape). 300.000 appels de méthodes/procédu-
res par seconde sur un Sun Sparc 10 avec le JIT
de Sun. Presque identique à du C/C++ natif équi-
valent.

 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

L’utilisation du multithreading permet à un seul pro-


gramme d’effectuer plusieurs activités simultanément.
Les threads, parfois appelés “processus légers” per-
mettent de développer des programmes multitâches
de manière plus simple et performante qu’avec la pro-
grammation système classique (fork() et exec()...),
dont le code est par ailleurs difficilement portable.
Les Threads faisant partie intégrante du langage Java
(jusque dans certains de ses mots-clé), ils sont plus fa-
ciles à utiliser que leurs équivalents C/C++.
Les avantages principaux du multithread sont des per-
formances plus élevées en matière d’interactivité et un
meilleur comportement en temps réel, bien que ce der-
nier soit en général dépendant du système.
Java intègre les Threads de manière transparente
(garbage collector, horloge, chargement des images
ou des sons), mais permet également au program-
meur de développer ses propres Threads de façon
très simple.
Des outils de gestion de ressources critiques (séma-
phores, moniteurs temps réels) et de synchronisation
sont également disponibles, et leur utilisation est d’une
grande simplicité.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-15
Programmation Java

Introduction à Java
Java est multithreadé
• Sous Java les Threads

- ne sont pas toujours natifs,


- sont intégrés par la machine virtuelle : garbage col-
lector, horloge...,
- sont mis à la disposition de l’utilisateur au travers
de classes et d’interfaces du JDK : Thread, Frame,
Runnable, etc...

 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

• Lorsqu’une classe inconnue dans le programme


est requise, on la recherche :

1. localement (dans le JDK local au navigateur web


ou à la machine virtuelle) et ensuite si elle n’est
pas trouvée...
2. à l’endroit d’où le programme a été chargé
Java tire au maximum parti de la technologie objet, la
machine virtuelle n’essaie pas de connecter tous les
modules composant une application avant l’exécution
(pas d’éditions de liens).
Les classes de définition des objets sont chargées si-
multanément mais indépendamment, en fonction de
leur besoin dans l’application. Si une application né-
cessite une classe non présente sur la machine qui
l’exécute, Java ira la chercher à l’endroit d’où l’applica-
tion provient.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-17
Programmation Java

Applications indépendante et applets


Objectifs de ce chapitre
• Connaître les différences entre applet et applica-
tion indépendante

• Savoir compiler du code Java et l’exécuter

• Apprendre à configurer un environnement de dé-


veloppement Java

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-18
Programmation Java

Applications indépendante et applets


application indépendante
• Comme n’importe quel autre langage, un code
Java dispose pour son exécution d’un point d’en-
trée.

• A la différence d’autres langages ce point d’entrée


possède deux composantes :

1. La machine virtuelle
2. Une méthode :
public static void main(String argv[])

... c’est le cas des applications indépendantes. C’est


en codant cette méthode que l’on a la possibilité d’in-
diquer le point de départ de toute application Java.
C’est le “programme principal” pour reprendre une an-
cienne terminologie plus tellement adaptée...
3. Remarque : en fait chaque classe peut avoir une
méthode main(), mais celle qui sera exécutée sera
celle de la classe passée en paramètre à la machine
virtuelle (la classe maître). Très utile pour debugger
les classes indépendamment : le main contient une sé-
rie de tests de validation de la classe.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-19
Programmation Java

Applications indépendante et applets


Applets
• Les applets ne sont pas des applications indépen-
dantes, elles ne possèdent pas forcément de mé-
thode main().

• Les applets doivent être exécutées au travers d’un


browser (Netscape, Internet Explorer...).

• Il y a plusieurs points d’entrée d’exécution dans


une applet, et la méthode main() n’en fait pas par-
tie !

• En réalité, le browser contient en interne :

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

Applications indépendante et applets


Applets
• Mais alors, où commence l’exécution de mon ap-
plet ?

Il a été défini une liste de méthodes qui sont utilisées


comme différents points d’entrées, en fonction du cy-
cle de vie de l’applet : init(), start(), stop(),
destroy()...

• Pourquoi plusieurs points d’entrée ? Qu’est-ce


que le cycle de vie d’une Applet ?

Une Applet est un programme qui s’exécute dans un


browser, son utilisation dépend du bon vouloir de l’uti-
lisateur du browser. Ce dernier peut revenir sur une
page et masquer momentanément la page contenant
l’applet. Dans ce cas, il faut arrêter les threads qui tour-
nent, stopper les animations, le son, etc... Si l’utilisa-
teur revient dans la page, il faut relancer les threads ar-
rêtés, d’où les méthodes stop() et start().
Nous verrons le détail de ces méthodes et du cycle de
vie des applets dans le chapitre qui leur est consacré.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-21
Programmation Java

Applications indépendante et applets


Résumé
• Une application indépendante Java

- ...possède un point d’entrée unique, la méthode


main(), de prototype :
public static void main(String argv[])
- ...est exécutée directement par la machine virtuelle
Java.

• Une applet Java

- ...est exécutée par un browser,


- ...ne dispose pas de point d’entrée main(),
- ... dispose de points d’entrée appelés sous le con-
trôle de l’application indépendante embarquée par
le browser.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-22
Programmation Java

Créer une application Java


Les bases à connaître
• L’entité de base de tout code Java est la classe

• Tout fichier source doit contenir une seule classe


publique

• Tout fichier source doit porter le nom de la classe


publique qu’il contient, suivi du suffixe .java

• Une classe peut contenir uniquement des données


(attributs) et/ou des méthodes

• Une méthode peut contenir uniquement des don-


nées et/ou du code.
public class HelloWorld {
// déclaration de données globales
int donneeGlobale;

// 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

Créer une application Java


Les bases à connaître
En Java, tout se trouve dans une classe. Il ne peut y
avoir de déclarations ou de code en dehors du corps
d’une classe.
La classe elle-même ne contient pas directement du
code. Une classe contient des déclarations de varia-
bles globales, que l’on appelle des “attributs”, et des
méthodes (équivalents des fonctions).
Les “attributs” sont visibles par toutes les méthodes de
la classe qui peuvent les utiliser. Ces attributs seront
“possédés” par chaque objet instance de la classe.
Le code se trouve exclusivement dans le corps des
méthodes, mais ces dernières peuvent aussi contenir
des déclarations de variables locales (visibles unique-
ment dans le corps de la méthode).
Pour que votre code soit réutilisable, pour augmenter
sa lisibilité et sa localisation et pour faciliter la compila-
tion et le chargement “au vol” des classes, il ne peut y
avoir qu’une seule classe publique par fichier source.
En effet, une application étant composée d’un ensem-
ble de classes, nous avons vu que ces dernières sont
chargées par la machine virtuelle lorsqu’on en a be-
soin. Pour pouvoir retrouver rapidement les classes à
charger, il est indispensable de retrouver le nom du fi-
chier à partir du nom de la classe.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-24
Programmation Java

L’environnement de développement Java


Variables d’environnement
• Trois variables d’environnement sont très impor-
tantes

1. CLASSPATH : chemin de recherche des classes


de base.
2. JAVA_HOME : répertoire de base de l’installation
du JDK
3. PATH : doit contenir le répertoire contenant le
compilateur java (javac), la machine virtuelle (ja-
va), le debugger (jdb), etc... En général
$JAVA_HOME/bin

• Ces variables sont souvent positionnées automati-


quement lors de l’installation d’une IDE (symantec
café, etc...), qui inclue le JDK.

• Sous Unix, les positionner !

• Les browsers incluant leur propre machine virtuelle


et leurs propres classes repositionnent le CLASS-
PATH. Si l’installation est bien réalisée, ceci est fait
de manière transparente.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-25
Programmation Java

L’environnement de développement Java


Compilation
• Compilation à l’aide du JDK. Attention, avec une
IDE, se référer à la documentation spécifique, la
procédure est certainement différente.

- Dans une fenêtre de commande (shell Unix ou fenê-


tre MS/DOS) :
javac [Link]
Si la compilation s’est bien passée, on devrait obtenir un
fichier :
[Link]

• Sinon... erreurs de compilation !

Le compilateur indique précisément la ligne à laquelle


l’erreur s’est produite. Le message est en général expli-
cite :

[Link] Method printl([Link]) not found


in class [Link].
[Link](“Hello World”);

Nous avons ici les informations suivantes :


1. Erreur à la ligne 9,
2. L’erreur a eu lieu dans l’appel de Sys-
[Link](...)
3. Visiblement, la méthode printl() n’existe pas.
En effet la bonne méthode s’appelle println().

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-26
Programmation Java

L’environnement de développement Java


Compilation
• Exécution du code avec le JDK (IDEs voir la docu-
mentation spécifique)

- Dans une fenêtre de commande (shell Unix ou fenê-


tre MS/DOS) :
java HelloWorld

• Attention au CLASSPATH si l’erreur est du style :

Can’t find class HelloWorld


ou bien...
Can’t find class [Link]
Cette erreur signifie que la machine virtuelle n’a pas pu
trouver la classe [Link] dont elle avait
besoin pour exécuter l’application.
L’erreur classique est que la variable CLASSPATH n’in-
clut pas le répertoire courant dans le chemin de recher-
che des classes.
Une autre possibilité est que vous avez essayé d’exécu-
ter un code qui n’a pu être compilé correctement (aucun
fichier .class généré)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-27
Programmation Java

L’environnement de développement Java


Premier exercice
• Créez l’application HelloWorld !

1. Editez le fichier source [Link] à


l’aide d’un éditeur de texte,
2. Créez une classe publique HelloWorld conte-
nant une méthode main() affichant le texte “Hello
world!”,
3. Compilez le fichier source. En cas de problème vé-
rifiez que votre environnement est bien initialisé,
4. Exécutez l’application,
5. Modifiez légèrement l’application en introduisant
par exemple des erreurs, et recommencez les éta-
pes 1 à 4,
6. Bon, il est temps d’apprendre les différents élé-
ments de base du langage Java, sa syntaxe, etc...
de manière à développer des application plus évo-
luées !

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-28
Programmation Java

Eléments traditionnels du langage


Objectifs de ce chapitre
• Connaître l’architecture élémentaire d’un pro-
gramme Java

• Assimiler la structure lexicale du langage

• Savoir utiliser les types offerts par Java

• Lister les instructions du langage

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-29
Programmation Java

Eléments traditionnels du langage


Introduction
• Java est orienté objet

Java a toutes les caractéristiques d’un langage objet;


il permet de définir des classes comportant des des-
criptions d’attributs (variables) et d’opérations (métho-
des) utilisables sur des objets.
Les objets communiquent entre eux et réagissent aux
événements issus de leur environnement par le biais
de messages.
Le langage est enrichi par un ensemble de classes
fournies en standard avec le JDK. Elles fournissent en
particulier les fonctionnalités réseau, temps réel, en-
trées/sorties, mathématiques, etc... Ainsi que les élé-
ments d’interface graphique.

• Java est fortement typé


Toute donnée manipulée par Java doit être typée. Le
type peut être soit un type de base (int, float, char, boo-
lean...) soit un nom de classe du JDK ou créée par l’uti-
lisateur.

• Java est déclaratif

Tout objet ou variable doit être déclaré avant d’être


manipulé. La déclaration comporte de manière classi-
que un type et l’identificateur de donnée.
int nb = 10;

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-30
Programmation Java

Eléments traditionnels du langage


Introduction
• Java est structuré

- Structuré en packages (ensembles de classes),


classes et méthodes.
- Lors de l’exécution, les instructions de contrôle de
flot (branchements, boucles...) sont elles mêmes
structurées (emboîtement possible).
for (i=0; i < 10; i++) {
if (i == 5) {
[Link](“milieu!”);
}
}

• Java est... beau !

Après avoir programmé en C, en C++ ou en bien


d’autres langages, passer à Java n’est pas très diffici-
le. En revanche le contraire est souvent pénible car
Java est très agréable et permet de développer vite et
simplement des applications complexes.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-31
Programmation Java

Eléments traditionnels du langage


Architecture d’un programme Java
• Programme Java = ensemble de classes pouvant
être regroupées en packages

Java est un langage orienté objet. Le composant de


base d’un programme Java est donc la classe, qui agit
comme modèle permettant de “fabriquer” des objets.
Les classes peuvent être regroupées en modules ap-
pelés packages. Les fonctionnalités spécifiquement
objet de Java seront étudiées dans un autre chapitre.

• Classe = attributs + méthodes

Un classe comporte un ensemble de définitions d’attri-


buts et un ensemble de méthodes que l’on pourra uti-
liser sur tous les objets de cette classe.

• Méthode = unique unité de code

Le code source d’un programme Java doit se situer


uniquement à l’intérieur du corps des méthodes (à l’ex-
ception de certains codes statiques, comme nous le
verrons plus tard).

• Une classe publique par fichier. Le fichier porte le


nom de la classe suivi du suffixe “.java”

Chaque classe publique, c’est-à-dire destinée à pou-


voir être utilisée par les objets d’une autre classe quel-
conque, doit être définie dans un fichier .java qui porte
son nom.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-32
Programmation Java

Eléments traditionnels du langage


Architecture d’un programme Java
• Exemple : fichier [Link]

public class Point {


// Les attributs
private int x;
private int y;
// Les méthodes
public void setXY(int px, int py) {
x = px;
y = py;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-33
Programmation Java

Eléments traditionnels du langage


Architecture d’un programme Java
• Rappels :

- Une application indépendante Java possède un


point d’entrée : la méthode main()
public class MonApplication {
...
public static void main(String argv[]) {
// code de départ de l’application
...
}
}
- La méthode main() d’une applet java est incluse
dans le browser, les applets ne possèdent pas de
point d’entrée main().

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-34
Programmation Java

Eléments traditionnels du langage


Structures lexicales
• Jeu de caractère ASCII classique

Le jeu de caractères utilisé lors de l’écriture d’un sour-


ce Java est le code ASCII habituel.

• 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

Eléments traditionnels du langage


Structures lexicales
• Commentaires d’une seule ligne

// Ceci est un commentaire d’une ligne


int x = 10; // centre du cercle

• Commentaires sur plusieurs lignes

/* Ceci est un long commentaire qui


s’étale sur plusieurs lignes... */
Les commentaires s’emploient de la même manière
qu’en C++, soit avec // en début de ligne, soit en enca-
drant le commentaire entre /* et */
Les commentaires peuvent être placés à n’importe
quel endroit du source.

• Documentation automatique par javadoc


/** Cette méthode permet de faire le
* ...traitement suivant ... blah blah..
*...
*/
Javadoc est un utilitaire très pratique permettant de
générer automatiquement une documentation au for-
mat HTML à partir des commentaires définis comme
ci-dessus.
Il existe de nombreux mots-clé que l’on peut insérer
dans le commentaire, pour spécifier l’auteur, le rôle de
la méthode, etc... on peut insérer du HTML...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-36
Programmation Java

Eléments traditionnels du langage


Types élémentaires

Table 1: Types élémentaires de 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)

Les types Java sont indépendants du compilateur et


de la plate-forme d’exécution. Ils sont intégrés aux
spécifications du langage, ce qui garantit une parfaite
portabilité du byte-code.
Les valeurs numériques entières sont représentées
pas byte, short, int et long, les réelles par float et dou-
ble.
Un boolean n’est pas considéré comme une valeur nu-
mérique. Ses seules valeurs possibles sont true et fal-
se.
Les caractères ne sont plus représentés sur 8 bits
mais sur 16 par l’intermédiaire du code unicode. Ceci
permet de représenter potentiellement tous les alpha-
bets de la planète, en particulier nos alphabets accen-
tués.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-37
Programmation Java

Eléments traditionnels du langage


Chaînes de caractères
• En C

- Calcul des longueurs de chaînes,


- gestion de la fin de chaîne (caractère de code AS-
CII zéro),
- pas de vérification de débordements.

• En C++

- Utilisation de bibliothèques pas toujours portables


ni standards (bien qu’il existe un simili standard).

• En Java

- String et StringBuffer sont deux classes


fournies avec le JDK permettant un traitement très
riche des chaînes de caractères.
String nom = “toto”;
Pas de marqueur de fin de chaîne, pas de calcul de la
longueur lors de la création, vérification des déborde-
ments, puissants mécanismes de conversion des ty-
pes.
String permet de représenter des chaînes constan-
tes, StringBuffer de taille variables.
Etudiées en détail dans la suite du cours.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-38
Programmation Java

Eléments traditionnels du langage


Variables et attributs
• Déclaration

int x;
float f;
char a;

• Déclaration avec initialisation

int x = 123; // initialisation


float f = 0.0;
String toto = “toto”;
Tous les objets doivent être déclarés avant d’être utili-
sés. Syntaxe :
<type> <identificateur> [ = expression];

L’expression optionnelle permet d’affecter une valeur


lors de l’initialisation.
Table 1: Valeurs par défaut des types de base, pour les attributs d’une classe

Type Valeur par défaut

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

Eléments traditionnels du langage


Variables
• Initialisation : contrôle du compilateur

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

Eléments traditionnels du langage


Variables
• Transmission des variables par valeur

- Tous les attributs et variables possédant un type


de base (int, char...) sont transmis par valeur.
- Dans ce cas, un paramètre de méthode contient di-
rectement la valeur qu’on lui assigne. On effectue
une copie de la valeur de la variable transmise. On
ne modifie donc pas l’original.
int valeur = 10;
Point p = new Point();
[Link](valeur); // valeur non
// modifiable

• Transmission des variables par référence

- Toutes les instances d’objets Java sont transmises


par référence (par adresse).
- Dans ce cas, la variable représente seulement le
moyen d’accéder à l’objet et non pas l’objet direc-
tement. Elle contient donc l’adresse mémoire de
l’objet. La particularité d’une référence par rapport
à un pointeur est de ne permettre d’accéder qu’à la
donnée qu’elle pointe.
- Ce mode de gestion permet un partage aisé d’ob-
jets au sein d’une application ainsi que l’assurance
d’avoir des performances optimales lors du passa-
ge de gros objets en paramètres.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-41
Programmation Java

Eléments traditionnels du langage


Variables
• Transmission des variables par référence (suite)

- Java ne permet pas de choisir le mode de passage


en paramètre des objets, comme en C++ par
exemple. Mais en imposant une solution unique
simple et efficace, les concepteurs de Java préten-
dent garantir l’homogénéité de la programmation
et faciliter la maintenance d’une application. Ca se
discute...
- Pour résumer, en Java on distingue deux sortes
d’objets
1. Les objets primitifs (int, char, etc...)
2. Les objets référencés (tous les autres, atten-
tion, ceux de la classe String en font partie !)

• Possibilité de forcer les paramètres en


constantes : les rendre non modifiables

public class myClass {


public methode1(final int x) {
int y = x + 2;
x = x + 3;
Autorisé
}
Interdit !
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-42
Programmation Java

Eléments traditionnels du langage


Variables
• Blocs et visibilité : structuration

// début du premier bloc


{
int i = 10;
...
// début du second bloc
{
int i = 0;
int j = 20;
...
}
// Fin du second bloc
// j n’est plus visible
}
// fin du premier bloc
Produit à la compilation
[Link]: 7: Variable ‘i’ is already defined in this method
int i = 0;
1 error

• Java n’autorise pas la redéfinition au sein d’un bloc


d’une variable déjà visible. Le compilateur produit
donc une erreur.

- Amélioration de la lisibilité et diminution des erreurs.


Pas d’ambiguïté lors de l’utilisation d’une variable.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-43
Programmation Java

Eléments traditionnels du langage


Tableaux
• En Java les tableaux sont des objets référencés.
Le type tableau est assimilable à une classe

- Ils gèrent leur taille, on peut y accéder au travers


de l’attribut length
int[] t = new int[10];
...
int longueur = [Link];
// longueur vaut maintenant 10
- Contrôle dynamique des débordements. Un dé-
passement de capacité produit une exception.

• Déclaration d’un tableau

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

Eléments traditionnels du langage


Tableaux
• Point controversé

int tab[10]; // ne compile pas

• Pourquoi ne peut-on pas avoir ?

int tab[10];
- Ce serait bien que ça compile, non ?

• Ou bien

int tab[] = new int(10);

• Les tableaux et la présence de types primitifs tels


que int, char etc... est un gros point de controver-
se.

• Rappel : on ne peut pas faire

int x = new int(3);

• Mais on peut faire

int x = [Link](“12”);

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-45
Programmation Java

Eléments traditionnels du langage


Tableaux
• Allocation et initialisation

int tab1[] = new int[10];


int mat[][] = new int[4][5];
int tab2[] = {1,2,3,4}
- Un tableau n’est pas un type élémentaire. Une va-
riable de type tableau est donc une référence sur
un tableau. pour créer ce tableau nous utilisons
l’opérateur new. C’est une allocation dynamique.
- il faut fournir la taille de la première des dimensions
d’un tableau alloué par new.
int tab[][] = new int[4][];
- Il est également possible de créer le contenu d’un
tableau lors de la déclaration en fournissant la liste
complète de ses éléments.
- Depuis le JDK1.1, on peut créer le contenu d’un ta-
bleau lors de toute affectation (tableaux anony-
mes)
String voitures = new String[]
{”Renault”, ”peugeot”};

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-46
Programmation Java

Eléments traditionnels du langage


Tableaux
• Utilisation

int tab1[] = new int[10];


...
// utilisations correctes
tab1[0] = 100;
tab1[1] = 200;
// mais ceci n’est pas correct
tab1[10] = 1000;
La compilation produit le message suivant :

[Link]: 10 at Tab-
[Link]([Link])

- En Java les tableaux sont toujours indexés par des


int et le premier élément commence à l’indice 0.
- tab[[Link] - 1] est le dernier élément du tableau
- Si le tableau est alloué avec une taille inférieure à
zéro ou si on tente d’accéder un élément ne se
trouvant pas entre le premier et le dernier élément
compris, une exception est générée.
- N.B : [Link] est manipulé comme une variable

• Les chaînes de caractères ne peuvent être manipu-


lées comme des tableaux de caractères (oubliez le
C et le C++ !)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-47
Programmation Java

Eléments traditionnels du langage


Expressions
• Opérandes : représentés par des variables ou des
littéraux

int i = 2;
int resultat = 3 * i;

• Opérateurs

- Java impose une parfaite identité de types des opé-


randes d’un opérateur binaire. Contrairement à C et
à C++, il n’y a presque aucune conversion implicite
de type.
int x, y=6;
float z=3.14f;
...
x = z/y;
...génère le message suivant à la compilation :
[Link]: Incompatible type for =. Explicit
cast needed to convert float to int.
x = z/y;
1 error

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

Eléments traditionnels du langage


Expressions
• Les casts implicites apparaissent quelquefois
dans les expressions numériques, lorsqu’il n’y a
aucun risque de perte de précision

int i = 2;
double d = 4;
... Ces exemples marchent
d = i;

double d1 = 8;
int i = 2;
double d2 = d1/i;

• Jamais de cast implicite si perte de précision !

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-49
Programmation Java

Eléments traditionnels du langage


Ordre d’évaluation des opérateurs

Table 1: Ordre d’évaluation

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

Eléments traditionnels du langage


Ordre d’évaluation des opérateurs
• Remarque importante relative au tableau précé-
dent :

...
if ((x != 0) && (y/x == 2)) {
....

• ... ne produit pas d’erreur si x vaut zéro

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-51
Programmation Java

Eléments traditionnels du langage


if...else
• Le branchement conditionnel en Java s’effectue
exclusivement à partir d’une expression booléen-
ne.

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

Eléments traditionnels du langage


expression conditionnelle
• Autre formulation “héritée” du C (pas forcément
une bonne chose !)
int x := (expression_booléenne ? si vrai : si faux)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-53
Programmation Java

Eléments traditionnels du langage


switch
• Débranchement multiple

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

Eléments traditionnels du langage


switch
• Un exemple

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

Eléments traditionnels du langage


boucle for
• Syntaxe

for(init; test; incrément){


instructions;
}

• 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

Eléments traditionnels du langage


boucle for
• Déclaration de variables dans la boucle for

- Il est possible de déclarer une ou plusieurs varia-


bles dans la partie init de la boucle for. Dans ce
cas la visibilité de ces variables est limitée au bloc
d’instructions lié à la boucle.
for(int i = 0; i < 10; i++) {
instructions;
}

Visibilité de i

• Etiquettes

- Les instructions break et continue peuvent être


exécutées avec des étiquettes afin de permettre
des ruptures de séquences sur plusieurs niveaux
d’emboîtement de boucles. A EVITER !
fori: for(int i=0; i < 10; i++){
...
for(int j=0; j < 4; j++){
...
if(...)
continue fori;
if(...)
break fori;
}
}
 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-57
Programmation Java

Eléments traditionnels du langage


while et do...while
• Syntaxe

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

• Il est possible d’utiliser des étiquettes pour faire


des ruptures de séquence avec plusieurs niveaux
d’emboîtements. La syntaxe est la même que celle
employée page précédente avec la boucle for.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-58
Programmation Java

Concepts objets de Java


Objectifs de ce chapitre
1. Connaître les concepts de la programmation par
objet et les mettre en oeuvre avec Java

2. Créer une classe avec des attributs et des métho-


des

3. Instancier des objets et leur envoyer des messa-


ges

4. Définir un graphe d’héritage

5. Créer une classe abstraite

6. Définir et utiliser des interfaces

7. Regrouper des classes en packages

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-59
Programmation Java

Concepts objets de Java


Définition d’un objet
• Qu’est-ce qu’un objet ?

- Un ensemble de données (attributs) et d’actions


(méthodes) formant un tout indépendant.
- Les attributs décrivent l’état de l’objet.
- Les méthodes permettent de faire “vivre” l’objet (en
lui faisant effectuer des actions et peut-être chan-
ger son état).
- C’est... “l’instanciation d’une classe” (pages sui-
vantes)

• Exemple d’objet : un bouton poussoir dans une in-


terface graphique

- Attributs : une image, un label, une couleur de


fond, une police de caractères, etc...
- Méthodes : se dessiner, réagir quand on clique
dessus.

• Autre exemple : un pacman

- Attributs : couleur, vitesse, direction du déplace-


ment, état (mort, vivant), etc...
- Méthodes : se dessiner, avancer, manger les pas-
tilles,...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-60
Programmation Java

Concepts objets de Java


Définition d’un objet
• Un objet peut être

- une valeur (instance) d’un type abstrait, une “repré-


sentation” d’une classe.
- une abstraction d’un objet physique du monde réel,
c’est-à-dire dont on a retenu uniquement les carac-
téristiques intéressantes lors de la modélisation.

• Un objet est caractérisé par

- Un ensemble d’attributs typés et nommés repré-


sentant ses propriétés statiques. Ces attributs por-
tent des valeurs attachées à l’objet. L’ensemble de
ces valeurs à un instant donné constitue l’état de
l’objet à cet instant,
- Un ensemble de méthodes définissant son com-
portement et ses réactions aux stimulations exter-
nes. Ces méthodes implémentent les algorithmes
invocables sur cet objet,
- Une identité qui permet de le distinguer des autres
objets, de manière unique.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-61
Programmation Java

Concepts objets de Java


Définition d’une classe
• Qu’est-ce qu’une classe ?

- C’est un modèle de définition pour les objets


- en termes d’attributs,
- en termes de méthodes.
- Les objets sont des représentations dynamiques
(instanciation), “vivantes”, du modèle défini pour
eux au travers de la classe.

• Exemple : la classe Cercle

public class Cercle {


int rayon;
int epaisseur_trait;
... // autres attributs
...
}

Instanciation, même attributs


mais de valeurs différentes

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-62
Programmation Java

Concepts objets de Java


Définition d’une classe
• Une classe définit les modèles des objets qui en
seront instanciés

- dans la classe sont définis des attributs et des mé-


thodes qui seront présents dans chaque objet qui
sera instancié de la classe considérée. Dans
l’exemple de la page précédente, on définit une
classe Cercle, contenant entre autres un attribut
rayon et un attribut epaisseur_trait. Chaque cercle
instancié de cette classe possédera son propre
rayon et sa propre épaisseur du trait.

• Les méthodes définies dans la classe existent de


même pour chaque objet et ont un comportement
identique dans chaque objet tout en y étant locali-

- Supposons que la classe Cercle fournisse la mé-


thode changeRayon(int new_rayon), permettant
de modifier la valeur de l’attribut rayon. Si un des
cercles fait appel à cette méthode, il changera son
propre rayon, pas celui des autres cercles dont
il ignore probablement l’existence.
int rayon = 50;
Cercle c = new Cercle(rayon);
[Link]();
[Link](rayon+10);
[Link]();

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-63
Programmation Java

Concepts objets de Java


Définition d’une classe
• Instanciation. Mais que cela signifie-t-il exacte-
ment ?

- la création d’un objet à partir d’une classe est ap-


pelé instanciation. Cet objet est une instance de
sa classe.
- Une instanciation se décompose en trois phases
1. Création et initialisation des attributs en mémoi-
re, à l’image d’une structure.
2. Appel de méthodes particulières, les construc-
teurs, définies dans la classe, dont l’étude est fai-
te un peu plus loin...
3. Renvoi d’une référence sur l’objet (son identité)
maintenant créé et initialisé.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-64
Programmation Java

Concepts objets de Java


Encapsulation
• L’encapsulation est la possibilité de ne montrer de
l’objet que ce qui est nécessaire à son utilisation,
les avantages en sont :

- Simplification de l’utilisation des objets,


- Meilleure robustesse du programme,
- Simplification de la maintenance globale de l’appli-
cation.

public class Cercle {


private int cx, cy;
int rayon;
int epaisseur_trait;
... // autres attributs
...
void move(int dx, int dy) {
cx +=dx;
cy +=dy;
}
}
= Visible de l’extérieur
= privé, visible uniquement par les méthodes de la classe où ils sont déclarés

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-65
Programmation Java

Concepts objets de Java


Encapsulation
• Gestion de la visibilité des objets

- L’encapsulation permet d’offrir aux utilisateurs


d’une classe la liste des méthodes et éventuelle-
ment des attributs utilisables depuis l’extérieur.
- Cette liste de services exportables est appelé l’in-
terface de la classe et elle est composée d’un en-
semble de méthodes et d’attributs dits publics.
- Les méthodes et attributs réservés à l’implémenta-
tion des comportements internes à l’objet sont dits
privés. Leur utilisation est exclusivement réservée
aux méthodes définies dans la classe courante.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-66
Programmation Java

Concepts objets de Java


Encapsulation : avantages
1. Simplification de l’utilisation des objets.
Pour utiliser un objet, inutile de connaître son implé-
mentation, la connaissance de son interface suffit. Par
exemple, il est inutile de savoir que les coordonnées
du centre du cercle sont stockées dans deux variables
cx et cy, qui sont de type int.

2. Meilleure robustesse du programme


Une fois un objet testé et développé, un “bug” ne peut
pas être généré par du code extérieur à l’objet.
Par exemple, si on tente par erreur de mettre une va-
leur de type int dans la variable cx ou cy, ce ne sera
pas permis.
Nous somme donc obligé d’appeler la méthode publi-
que move(int dx, int dy). Si un bug apparaît,
c’est alors dans l’objet qu’il faut le chercher (notre mé-
thode publique est-elle capable de traiter ce type d’er-
reur ?)

3. Simplification et maintenance de l’application


En fonction de ce que nous avons dit précédemment,
ce point en est une conséquence logique.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-67
Programmation Java

Concepts objets de Java


Héritage et polymorphisme
• L’héritage permet de créer des classes par combi-
naison de classes déjà existantes
Class ObjetGraphique {
int x, y;

void setXY(int, int);


Point getXY();
void Dessiner()
}

Héritage
Partie héritée de
ObjetGraphique
Class Cercle extends ObjetGraphique{
float rayon; int x, y;

void Dessiner(); void setXY(int, int);


} Point getXY();
void Dessiner()

Partie héritée de
ObjetGraphique
Class Rect extends ObjetGraphique{ int x, y;
int width, height;

void Dessiner(); void setXY(int, int);


} Point getXY();
void Dessiner()

Ce dont dispose l’objet


r1, instance de Rect
int x, y;
int width, height;
Rect r1 = new Rect();
void setXY(int, int);
Point getXY();
void Dessiner()

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-68
Programmation Java

Concepts objets de Java


Héritage et polymorphisme
• Définition de l’héritage

- Lorsqu’une classe hérite d’une autre classe, elle


bénéficie automatiquement de ses définitions d’at-
tributs et de méthodes. Elle peut y ajouter ses pro-
pres définitions, ce qui permet facilement de cons-
tituer un ensemble fonctionnellement plus riche.
- Les liens d’héritage spécifient une hiérarchie de
classe qui peut être constituée par une démarche
de spécialisation, ou au contraire de généralisa-
tion.

• Définition du polymorphisme

- Lorsqu’un objet est instancié d’une classe, il peut


être vu comme instance de n’importe laquelle des
classes héritées par la classe dont il est instancié.
- En fait l’instance d’un tel objet est toutes les clas-
ses à la fois. Le rectangle r1 est à la fois un objet
de la classe Rect et un objet de la classe Ob-
jetGraphique.
- Le polymorphisme permet donc d’écrire :
ObjectGraphique r = new Rect();

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-69
Programmation Java

Concepts objets de Java


Héritage et polymorphisme, surcharge
et redéfinition
• Définition de la redéfinition (redéfinir une méthode
héritée)

- Lorsqu’un attribut ou une méthode ont été définis


dans une classe et sont redéfinis dans une classe
dérivée (qui en hérite), les éléments visibles sont
ceux redéfinis dans la classe dérivée. Les élé-
ments de la classe de base (héritée) sont alors
masqués.
Class Rect extends ObjetGraphique {

void move(int dx, int dy);


...
}
Class Cercle extends ObjetGraphique{

void move(int dx, int dy);


...
}
- On peut avoir les mêmes méthodes move() dans
des classes héritant les unes des autres. Dans ce
cas, c’est la classe la plus dérivée de l’objet qui dé-
termine la méthode à exécuter, sans que le pro-
grammeur ait à faire des tests sur le type de l’objet
à traiter.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-70
Programmation Java

Concepts objets de Java


Héritage et polymorphisme, surcharge,
redéfinition
• Définition de la surcharge

- La surcharge est la capacité des objets d’une


même hiérarchie de classes à répondre différem-
ment à une méthode de même nom, mais de pa-
ramètres différents. Par exemple, la classe Rect
peut avoir plusieurs méthodes move() acceptant
des paramètres différents en nombre et/ou en ty-
pes. En fonction du type et du nombre de paramè-
tres lors de l’appel, la méthode correspondante
sera choisie.
Class Rect extends ObjetGraphique {

void move(int dx, int dy);


void move(int vitesse);
void move(boolean direction);
...
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-71
Programmation Java

Concepts objets de Java


Modularité
• Découpage en sous-systèmes

- Ne pas lier les classes les unes avec les autres.


- Utiliser la généricité des abstractions.

• Réutilisabilité et évolutivité

- Documenter et homogénéiser l’interface publique


des classes d’un même module.

• Un système est dit modulaire s’il est découpé en


sous-systèmes possédant les caractéristiques
suivantes
- Forte cohérence interne
- Vos classes doivent être validées indépendamment du code
qui les exécute. Tous les éléments (méthodes et attributs) qui
en font partie et qui peuvent remettre la cohérence de son
fonctionnement en cause doivent être isolés de l’extérieur et
se trouver dans la partie privée de la classe.
- Les méthodes publiques de l’interface de votre classe doi-
vent permettre l’accès sous contrôle à ces éléments lorsque
c’est nécessaire. Ces méthodes seront alors le seul point
d’entrée dans votre classe pour le monde extérieur.
- Faible couplage avec les autres sous-systèmes
- Voir page suivante...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-72
Programmation Java

Concepts objets de Java


Modularité
- Faible couplage avec les autres sous-systèmes
- Utilisez la généricité issue des abstractions. Cela évite
qu’une classe soit liée à une autre classe, mais permet de la
lier à un modèle de classe (classe abstraite ou interface, voir
plus loin...)
- Exemple : supposons une classe FeuilleDePapier. Si
nous décidons que cette classe ne sait gérer que des Rec-
tangles ou des Cercles, le jour où nous créerons une
classe Triangle, nous devrons modifier la classe
FeuilleDePapier si nous voulons qu’elle gère aussi les
instances de Triangle.
- Si au contraire, nous définissions que FeuilleDePapier
gère uniquement des ObjetsGraphiques, alors aucune
modification ne sera requise si Triangle hérite de Ob-
jetGraphique, ce qui est logiquement le cas.
- la modularité permet de réutiliser des modèles
d’analyse et de conception ainsi que du code et fa-
vorise l’évolutivité

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-73
Programmation Java

Concepts objets de Java


Utilisation des classes, visibilité
• Exemple des ObjetGraphique, sans héritage

public class Cercle {


// attributs privés à notre classe
private int x, y;
private float rayon;
// interface publique
// Les constructeurs
public Cercle(int cx, int cy,
float r) {
x = cx;
y = cy;
rayon = r;
}
public Cercle() {
x = 10;
y = 10;
rayon = 10f;
}
public void Dessine() {
[Link](“ici je
dessine un cercle”);
}
public void modifieRayon(float r) {
rayon = r;
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-74
Programmation Java

Concepts objets de Java


Utilisation des classes, visibilité
• Attributs

[visibilité] type nom [= expression] ;


- visibilité peut avoir l’une des valeurs suivan-
tes :
1. private : l’attribut est inaccessible à l’extérieur
de la classe,
2. public : l’attribut est manipulable à l’extérieur,
3. les autres valeurs seront étudié avec l’héritage...
- expression permet de fournir une valeur par dé-
faut à l’attribut lors de la création de l’objet.

• Méthodes
[visibilité] [type retour] nom (liste paramètres);

- visibilité a le même comportement que pour


les attributs,
4. type retour peut être : un type élémentaire ou
un tableau, une classe, rien dans le cas d’un
constructeur (page suivante), ou d’une méthode
renvoyant le type void.
5. liste paramètres peut être : liste de paramè-
tres typés et nommés séparés par des virgules,
cette liste pouvant être vide.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-75
Programmation Java

Concepts objets de Java


Constructeurs de classe
• Définition

- Un constructeur est une méthode particulière appe-


lée dans la phase d’instanciation d’un objet par
Java :
Cercle c = new Cercle(20, 20, 10.0);
Cercle c2 = new Cercle();
- Un constructeur porte le nom de la classe,
- il ne possède pas de type de retour,
- il peut possèder un nombre quelconque de paramè-
tres,
- une classe peut avoir plusieurs constructeurs dont
le nombre et le type de paramètres diffèrent (sur-
charge).
public Cercle(int cx, int cy, float r){
x = cx;
y = cy;
rayon = r;
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-76
Programmation Java

Concepts objets de Java


Constructeurs de classe
• Comportement et rôle du constructeur

- Le constructeur est appelé au moment de la créa-


tion de l’objet (instanciation). Sa finalité est d’initia-
liser cet objet en fonction de paramètres fournis par
l’utilisateur.
- Si vous ne créez pas de constructeur, Java en
créera un pour vous de manière implicite, n’accep-
tant aucun paramètre.
- Attention, si vous créez au moins un constructeur
acceptant des paramètres et aucun constructeur
n’acceptant pas de paramètres, votre classe n’a
plus de constructeur par défaut !
- Si en première instruction de votre constructeur,
vous n’appelez pas un constructeur de la classe
père (avec super(...), voir plus loin), le cons-
tructeur par défaut de la classe père est appelé.
- Attention, si la classe père n’a pas de constructeur
par défaut, cela produit une erreur de compilation.
- La libération des ressources mémoire est prise en
charge par le garbage-collector. En revanche, il
existe une méthode optionnelle finalize() qui est
appelée durant la phase de destruction de l’objet,
si elle existe. Cette méthode est optionnelle et n’est
utile que dans le cas de la gestion de ressources
spécifiques telles fichiers, sockets, etc...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-77
Programmation Java

Concepts objets de Java


Instanciation
• Pour instancier un objet

1. Déclarer une variable de la classe que l’on désire


instancier. Cette variable est une référence sur
l’objet que l’on va créer. Java y stockera l’adres-
se de l’objet.
Cercle c;
2. Allouer la mémoire nécessaire à l’objet et l’initia-
liser. cette opération se fait par l’intermédiaire de
l’opérateur new auquel on passe l’appel au cons-
tructeur de la classe désirée.
c = new Cercle(23, 24, 40.0);
Remarque : on peut faire les deux étapes en même
temps :
Cercle c = new Cercle(23, 24, 40.0);

• L’objet est détruit lorsque plus personne ne le ré-


férence (sortie d’un bloc de visibilité, etc...)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-78
Programmation Java

Concepts objets de Java


Utiliser un objet
• Envoi de message
Cercle c = new Cercle(0,0,10.0);
[Link](50.0);
[Link]();

- Envoi de message : invocation d’une méthode sur


un objet particulier. Syntaxe :
[receveur.] méthode(liste paramètres);
- receveur = objet sur lequel on invoque la métho-
de. L’objet doit exister (avoir été alloué par new
préalablement).
- receveur est optionnel si l’envoi de message est
écrit dans le corps d’une méthode de la classe du
receveur.
- méthode = nom de la méthode invoquée.

Cette méthode doit faire partie de l’interface publi-


que du receveur, si l’invocation est extérieure à la
classe.
- liste paramètres est une liste de paramètres
effectifs correspondants aux paramètres formels
spécifiés dans la déclaration de la méthode.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-79
Programmation Java

Concepts objets de Java


Utiliser un objet
• Accès à un attribut

// Si x et y étaient des attributs


// publics de Cercle
Cercle c = new Cercle();
c.x = 100;
c.y = 100;
- Syntaxe d’accès à un attribut :
[receveur.] nom_attribut;
- receveur est optionnel si l’accès à l’attribut est réa-
lisé dans le corps d’une méthode de la classe du
receveur.
- Peut être utilisé en partie gauche ou droite d’une
affectation
c.x = 100;
val_x = c.x;
- L’attribut doit être public si on y accède de l’exté-
rieur de la classe.
Il est préférable de fournir des méthodes d’accès aux
attributs afin de respecter les principes d’encapsula-
tion et de ne pas rendre le code utilisateur trop dépen-
dant des types des attributs ni de risquer de voir un
code utilisateur compromettre l’intégrité de l’objet

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-80
Programmation Java

Concepts objets de Java


Composition d’objets
• Agrégation

public class Cercle {

private Point origine;


private float rayon;
public Cercle(int cx, int cy,
float r) {
origine = new Point(cx, cy);
rayon = r;
}
}
Avec :
public class Point {

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

Concepts objets de Java


liens entre objets
• Agrégation

- Une instance de Cercle est propriétaire de son


instance de Point référencée par l’attribut ori-
gine (mais elle peut éventuellement la partager).

Le constructeur de Cercle doit prendre en charge


la construction et l’allocation de l’attribut origine,
en appelant le constructeur de sa classe.
- origine, de la classe Point, est un sous-objet
du Cercle.
- Lorsque le garbage-collector détruira le Cercle, il
détruira également tous les sous-objets propriété
exclusive du Cercle, donc le Point origine. La
raison en est uniquement le fait que la destruction
de l’objet Cercle entraînera la perte de l’unique
référence sur l’objet Point origine.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-82
Programmation Java

Concepts objets de Java


liens entre objets
• Associations et usage de this

- Supposons qu’un Cercle possède une référence


sur la Fenêtre graphique à laquelle il est attaché
public class Cercle {

private Point origine;


private float rayon;
private Fenetre fenetre = null;
...
public void placer(Fenetre f) {
if(fenetre != null)
[Link](this);
fenetre = f;
[Link](this);
}
}
class Fenetre {
private Liste cercles;
...
public void ajouter(Cercle c){...}
public void enlever(Cercle c){...}
}

Fenetre principale = new Fenetre(...);


Cercle c1 = new Cercle(0, 0, 10.0);
Cercle c2 = new Cercle(100, 100, 10.0);
[Link](principale);
[Link](principale);

Devient this dans le corps de placer()

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-83
Programmation Java

Concepts objets de Java


liens entre objets
• Association et usage de this

- Le this permet à un objet d’obtenir une référence


sur lui-même. Ceci est très utile lorsqu’un objet a
besoin de laisser “une carte de visite” à un autre
objet pour lui dire “c’est moi qui t’ai contacté, voici
par quelle référence tu peux m’utiliser”.

• Avec l’exemple, voici ce qui se produit :

1. Cercle définit un attribut fenetre qui va per-


mettre à chaque instance de référencer sa fenê-
tre (celle où il est affiché).
2. Dans ce cas, un Cercle n’est pas propriétaire
de la fenêtre dans laquelle il se trouve. Le cons-
tructeur de Cercle n’est pas responsable de la
création de la fenêtre. Celle-ci est créée indépen-
damment en dehors de la classe Cercle.
3. L’attribut fenetre de Cercle est mis à jour par
la méthode placer()
4. Fenetre possède une liste de Cercles. La mé-
thode placer() gère la suppression du cercle
dans l’ancienne fenêtre et l’ajout dans la nouvel-
le, en invoquant ajouter() et enlever() de
la classe Fenetre. Ces méthodes prennent en
paramètre un Cercle. Celui-ci n’est autre que le
receveur de la méthode placer(), référencé
par this.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-84
Programmation Java

Concepts objets de Java


Exemple de this explicite
• Une utilisation très courante de this :

public class Cercle {


int rayon;

public Cercle(int rayon) {


[Link] = rayon;
}
}

 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

• Une classe ne peut hériter que d’une seule classe

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

classe Cercle hérite de ObjetGraphique


Attributs
Float rayon Point origine

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

méthode redéfinie méthodes héritées

 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>

• Permet de définir un lien d’héritage entre deux


classes

<base> est le nom de la super-classe ou classe de ba-


se, <dérivée> est le nom de la sous-classe ou classe
dérivée.
Le lien d’héritage est obligatoirement simple. L’hérita-
ge multiple est cependant partiellement réalisable à
l’aide du concept d’interface qui sera étudié plus tard.
class ObjetGraphique {
private Point origine;
public ObjetGraphique(int x, int y) {
origine = new Point(x, y);
}
...
}

class Cercle extends ObjetGraphique {


private float rayon;
public Cercle(int x, int y, float r) {
super(x, y);
rayon = r;
}
...
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-87
Programmation Java

Héritage en Java
Introduction
• Attributs privés

L’attribut origine de ObjetGraphique n’est pas


accessible dans le code de Cercle car déclaré en pri-
vé. Cacher ainsi les attributs des classes est recom-
mandé car le code demeure plus portable.

• Construction des classes

- Lorsqu’on construit une instance de Cercle on


obtient un objet dont une partie est construite grâce
à la définition de Cercle et une partie grâce à la
définition de la super-classe ObjetGraphique.
- Il faut donc que le constructeur de la sous-classe
fasse appel au constructeur de la super-classe.
Cela se fait en appelant la méthode super().
- Si on n’appelle pas le constructeur de la super-
classe, le constructeur par défaut est utilisé.

• Lorsque dans un constructeur on invoque un


constructeur de la classe mère -avec super() -, ce
doit nécessairement être dans la première instruc-
tion !

 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

class Cercle extends ObjetGraphique {


private float rayon;
...
public Cercle(int x, int y, float r)
{...}
public Cercle() {...}
...
}

 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

class Cercle extends ObjetGraphique {


private float rayon;
...
public Cercle(int x, int y,
float r{
...
}
public Cercle() {
this(50, 50, 10.0f);
...
}
...
}

 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

- la redéfinition d’une méthode d’une classe consiste


à fournir dans une sous-classe une nouvelle implé-
mentation de la méthode. Cette nouvelle implé-
mentation masque alors complètement celle de la
super-classe
- La re-déclaration doit être strictement identique à
celle de la superclasse : même nom, même para-
mètres, type de retour co-variant.
- Grâce au mot-clé super, la méthode redéfinie
dans la sous-classe peut réutiliser du code écrit
dans la méthode de la super-classe, qui n’est plus
visible autrement.
- super à un sens uniquement dans une méthode
(comme le mot-clé this).

• Surcharge

- Le mécanisme de surcharge permet de réutiliser le


nom d’une méthode déjà défini, pour une autre mé-
thode qui en différera par ses paramètres.
- La méthode surchargée doit conserver la même
“intention sémantique” (souhaitable mais pas for-
cé).
- La surcharge peut se faire sur une méthode définie
localement ou héritée.

 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;
...
}

• friendly (par défaut)

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

- public vis-à vis du package


- private vis-à-vis du reste.
- Un source utilisateur ne faisant pas partie du pac-
kage ne pourra pas référencer des attributs ou mé-
thodes friendly. Bon pour l’encapsulation.

• Protected

- public vis-à-vis de la classe, de ses sous-classes


ET du package, private vis-à-vis du reste,
- dans des classes qui ne sont pas dérivées, les at-
tributs et les méthodes protégées ne sont pas ma-
nipulables,
- dans une classe dérivée une méthode protected
héritée est redéfinissable,
- dans une classe dérivée, une variable protected
héritée n’est manipulable que
- directement ou avec [Link],
- au travers d’objets instanciés à partir de classes dérivées de
la classe mère, pas directement au travers d’une instance de
la classe mère. Voir exemple page suivante
- on peut dire que public donne l’interface pour les
“utilisateurs” et protected décrit le matériel que
peut utiliser en plus le “développeur de sous-clas-
ses”.

 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; }

public class A { public class B


extends A {
protected int x; Package P3;
public test() {
protected f() {}; public class C
} a = new A(); extends B {
b = new B(); }
c = new C();
d = new D();
Marche !
this.x = 0;
Marche pas ! b.x = 0;
c.x = 0;

a.x = 0;

this.f();
b.f();
c.f();
package P4;
a.f();
public class D
d.x = 0;
extends A {
} }

• a.f() et a.x ne sont pas acceptés car a n’est pas


une instance d’une classe dérivée de la classe
courante, c’est à dire une instance de la classe B
(polymorphisme: les instances de C sont aussi des
instances de B)

• Mais super.x marche (car x et super.x, c’est la


même chose ici) ! Bien que A soit égal à super !

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-94
Programmation Java

Héritage en Java
Visibilité et héritage
• final

- Un attribut final doit être initialisé à la déclaration


et est invariable. Il ne peut être surchargé, il de-
vient une constante.
- Un paramètre d’une méthode peut être final.
Dans ce cas, il est assimilé à une constante dans
le corps de la méthode. Aucun affectation ne pour-
ra être effectuée sur l’objet, il est inmodifiable.
- Une méthode final ne peut être surchargée.
Gros gain de performance à l’exécution !

L’adresse de la méthode est connue à la compila-


tion.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-95
Programmation Java

Héritage en Java
Classe abstraite
• Utilité

- Définir des concepts incomplets, qui devront être


implémentés dans les sous-classes.
- Factoriser le code.

• 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

- Regrouper certaines caractéristiques communes à


ses sous-classes et définir un comportement mini-
mal commun.
- Une classe comportant au moins une méthode
abstraite est abstraite. Dans ce cas, le mot-clé abs-
tract doit être ajouté devant la définition de la clas-
se.
- Une classe abstraite ne peut être instanciée, puis-
qu’elle n’est pas complètement définie.
- Le compilateur vérifie que toutes les méthodes
abstraites sont implémentées par toutes les sous-
classes (sauf si la sous-classe est elle-même abs-
traite).
- Il est recommandé de mettre un maximum de code
dans une classe abstraite ! C’est ça la
factorisation du code !

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-97
Programmation Java

Héritage en Java
Interface
• Définition

- une classe Fenetre gère une liste d’instances qui


doivent au minimum posséder la méthode dessi-
ner() pour pouvoir s’afficher dans la fenêtre.
- On définit ce “comportement minimal” dans une
interface, si on ne veut pas que ce comporte-
ment soit lié uniquement à une classe et à ses
sous-classes, comme dans l’exemple précédent,
avec la classe abstraite ObjetGraphique.
interface Dessinable {
public void dessiner();
}

• Utilisation

- Pour pouvoir mettre un Cercle dans une Fene-


tre et que celle-ci soit en mesure de le dessiner, il
faut :
class Cercle extends ObjetGraphique
implements Dessinable {
public void dessiner() {
// code du dessin de l’objet
}
}
- Un cercle peut maintenant être utilisé partout où on
attend un objet Dessinable, puisqu’on est sûr
qu’il saura se dessiner.
 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-98
Programmation Java

Héritage en Java
Interface
• Spécification formelle de classe

- Une interface définit un ensemble de services que


les classes se réclamant de cette interface devront
implémenter (sauf si elles sont abstraites).
- L’implémentation d’une interface est libre.
- Une classe peut implémenter plusieurs interfaces.
- Les interfaces peuvent se construire par héritage.
- Une interface peut être utilisée comme un type.
- Une interface permet à une classe de s’intéresser
uniquement à certaines caractéristiques d’un objet.
- Lorsqu’on examine une classe implémentant une
ou plusieurs interfaces, on est sûr que le code d’im-
plémentation est dans le corps de la classe. Excel-
lente localisation du code (défaut de l’héritage mul-
tiple, sauf si on hérite que de classes abstraites)

• Une interface peut être vue comme une classe abs-


traite dont toutes les méthodes sont abstraites,
mais le mot clé abstract n’apparaît jamais (exem-
ple page suivante).

 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);
}

• Attention, ne pas confondre le concept d’interface


dont nous parlons ici, avec l’interface publique
d’une classe, qui de façon globale, indique l’en-
semble des attributs et méthodes publiques d’une
classe.

 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
}
}

public class Fenetre {


private Vector figures;
public void ajouter(Dessinable o) {...}
public void enlever(Dessinable o) {...}
public void dessiner() {
int n = [Link]();
Dessinable o;
for(int i = 0; i < n; i++) {
o = (Dessinable)
([Link](i));
[Link]();
}
}
}

• Très utile lorsqu’on manipule des Vector (listes d’Ob-


jects)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-101
Programmation Java

Héritage en Java
Interface et polymorphisme
• Polymorphisme et interfaces

public class ObjetGraphique


implements Dessinable {
private Point origine;
private Fenetre fenetre;
...
public void placer(Fenetre f) {
if(fenetre != null)
[Link](this);
fenetre = f;
[Link](this);
}
}
- Les classes Cercle et Rect sont des ObjetGra-
phique qui implémentent l’interface Dessina-
ble.
- La Fenetre est capable de représenter graphi-
quement tout objet conforme à l’interface Dessi-
nable.
- Pour cela, elle gère une liste d’objets de type Des-
sinable, grâce à un Vector et aux méthodes
ajouter() et enlever(). Vector est une clas-
se du package [Link] permettant de gérer
des listes d’objets quelconques.

 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

- Des attributs partagés par toutes les instances de


la classe.
- Des méthodes non liées à une instanciation.
public class ObjetGraphique
implements Dessinable {
private Point origine;
static public int nbObjets = 0;
...
public ObjetGraphique(int x, int y) {
origine = new Point(x, y);
nbObjets++;
}
static public int nombre() {
return nbObjets;
}
}
- nbObjets est un attribut statique, visible par tous
les objets instanciés.
Cercle c = new cercle(0, 0, 10.0);
ObjetGraphique f = new
ObjetGraphique(10, 20);
[Link]([Link]());
[Link]([Link]);

 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é

- La staticité permet de définir des attributs ou des


méthodes qui ne sont pas liés à une instance d’ob-
jet. On les référence par rapport à la classe. on dis-
pose alors...
- Pour les attributs : d’attributs uniques, partagés par
tous les objets en fonction du rang de visibilité. Par
exemple un attribut statique privé ne sera partagé
que par les instances de la même classe.
[Link]([Link]);
- Pour les méthodes : de méthodes dont l’exécution
se lance à partir de la classe.
[Link]([Link]());
- Ici out est une variable static de la classe Sys-
tem, elle même dérivée de PrintStream.
println() est une méthode public de la classe
PrintStream.
- System et PrintStream seront étudiées en dé-
tail dans le chapitre consacré aux entrées/sorties.

 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] ;

- Attaché à une classe donnée. Est à la classe ce


qu’un attribut est à un objet.
- Utilisable et accessible en fonction du rang de visi-
bilité qui lui est affecté.

• Méthode de classe
static [visibilité] type_retour nom (liste paramètres) ;

- Les méthodes statiques ne peuvent accéder qu’à


des attributs statiques, en fonction de leur rang de
visibilité.
- Ne peuvent pas accéder à une référence this, puis-
que non liées à une instance d’objet.

 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

• [Link] : classes de base du langage

- Object,
- Class, ClassLoader, Runtime, Processus, System.

• [Link] : classes utilitaires

- structures de données : Vector, Enumeration, Has-


htable, Dictionary, properties, Stack, BitSet.
- mécanismes de dépendance : Observable, Obser-
ver.
- gestion des dates : Date, Calendar, Gregorianca-
lendar, Timezone.
- divers : Random, StringTokenizer, Locale, Resour-
ceBundle, etc...
- Evénements : Eventlistener, EventObject,

• [Link] : entrées/sorties

- Nombreuses classes... voir chapitre dédié.

• [Link] :

- BigDecimal, BigInteger (calculs de grande préci-


sion)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-106
Programmation Java

Packages
Regroupement de classes
• [Link] : le réseau

- URL, Socket, SocketServer, etc...

• [Link] : librairie graphique

- Component, Container
- Evénements
- Items graphiques : Button, Menus, etc...
- Trois autres packages complémentaires : ja-
[Link], [Link], [Link]-
fer

• [Link] : classe Applet

• [Link]

- Remote Method Invocation, applications distri-


buées.

• [Link]

- Signatures digitales, contrôle d’accès, etc...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-107
Programmation Java

Packages
Regroupement de classes
• Intérêt des packages

- Facilite le développement de bibliothèques et de


modules autonomes.
- Les classes d’un même package travaillent con-
jointement sur un même domaine.
- Le package offre un niveau de protection supplé-
mentaire pour les attributs et les méthodes grâce
aux modes protected et friendly.

• Organisation

- Les classes d’un package se trouvent dans un ré-


pertoire décrit par le nom du package.
- Ainsi les classes du package [Link] se trouvent
dans un sous-répertoire java/lang accessible par la
variable d’environnement CLASSPATH.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-108
Programmation Java

Packages
Utilisation
• Exemple : on place en début de fichier utilisateur

import [Link]; // (1)


import [Link].*; // (2)
import ObjetGraphique; // (3)
class Cercle {
// (4)
private [Link] origine;
...
}
1. Utilisation de la classe Vector du package ja-
[Link].
2. Importation de toutes les classes du package ja-
[Link].
3. Importation d’une classe définie localement et
n’appartenant à aucun package.
4. Accès à une classe en utilisant le nom complet
du package.

 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>;

2. Compiler les sources du package avec l’option -d


(pour destination) si on ne désire pas que les fi-
chiers “.class” se trouvent au même endroit que
les fichiers source.
javac -d $HOME/nom_du_package <classe>.java

• Lorsque le source ne contient pas de nom de pac-


kage, la classe est placée dans un package par dé-
faut, sans nom. Son répertoire est celui du fichier
source.

• Pour accéder au package nouvellement crée, ajou-


ter son chemin d’accès dans la variable CLASS-
PATH.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-110
Programmation Java

Les classes intérieures (inner classes)


Une classe définie dans une autre
classe ?
• Nouveau dans le JDK 1.1. Une classe intérieure est
une classe définie à l’intérieur d’une autre classe.

• Pourquoi faire ?

- Un objet d’une classe intérieure peut accéder à


l’implémentation de l’objet qui l’a créé, y compris à
ses attributs private.
- Il existe des classes intérieures anonymes (ano-
nymous) qui sont très pratiques lorsqu’on veut dé-
finir des callbacks “au vol”.
- Les classes intérieures sont cachées des autres
classes d’un même package (sauf si elles sont
static, nous y reviendrons).
- Les classes intérieures sont très pratiques lors-
qu’on écrit des programmes qui utilisent le nou-
veau modèle de gestion des évènements du JDK
1.1

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-111
Programmation Java

Les classes intérieures


• Nouveauté dans le JDK 1.1

- En Java1.0 toutes les classes sont top-level...


- ...et il n’y a que des classes au top-level !

• Les classes intérieures du JDK 1.1 seront souvent


liées aux...

- Evénements,
- JavaBeans.

• ...mais elles peuvent être employées n’importe où.

• Améliorent la cohérence de la syntaxe

- Régularisation des règles du contexte (scope),


- généralisation aux classes.
public class Toto {
...
class Titi {
...
}
...
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-112
Programmation Java

Les classes intérieures


Plusieurs types
• Une classe intérieure peut être de plusieurs types

• Top-level :

- Elle peut faire partie d’un package (comme en java


1.0).
- Elle peut être déclarée en static et donc devenir un
membre statique d’une autre classe, comparable
aux méthodes et variables statiques.

• Membre d’une autre classe

- Dans ce cas, on peut la comparer aux méthodes et


variables d’instances.

• Locale à une autre classe


- Comparables aux méthodes et variables locales

• Anonyme

- Comportement particulièrement adaté

 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

- Plus de mémoire libre


- mauvais URL
- division par zéro
- ...

• Certaines erreurs sont prévisibles

- Charger un fichier inexistant


- Lire une image dans un format inconnu
- ...

• Objectifs de ce chapitre

- Lister les différents mécanismes de traitement


d’erreur
- Comprendre les principes de programmation par
exceptions
- Savoir lever et traiter une exception
- Connaître les types d’exceptions que le JDK peut
lever
- Créer de nouvelles classes d’exceptions

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-123
Programmation Java

Exceptions
L’approche maladroite
• Code non spécialisé

- Traitement d’erreurs mélangé dans le code

• Renvoi de conditions d’erreur

- Comment renvoyer condition et résultat ?

• Difficile à comprendre

- Modélisation des différents types d’erreur ?

• Difficile à maintenir

- Séparer le code de détection d’erreur du code de


traitement de l’erreur
- Comment traiter les erreurs fatales ?

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

• Structures spécialisées try{}, catch{}, finally{},


throw()
try{ // A l’interieur de Divise...
k = Divise(i, 0) ...
} i /= j
catch(Exception e) { // Code jamais exécuté
// traitement de ....
// l’exception ....
} ...
.....

Traitement de l’erreur Sortie immédiate


local du code, création
d’un objet de la
classe Exception

 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

• Le try{....} délimite la partie du code que vous dési-


rez surveiller

• Un ou plusieurs catch(TypeException excep-


tion){...} permettent de récupérer la main

- Plusieurs catch(){...} pour spécialiser le traitement


- L’objet de la classe Exception contient de nom-
breuses méthodes et attributs renseignant l’erreur
catch(NullPointerException e){
...
}
catch(OutOfMemoryException e) {
...
}
finally{
// on passe toujours ici !
}
etc... suite du code

• Pas comme dans un switch {...} : on ne peut passer


que dans un seul catch{}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-126
Programmation Java

Exceptions
Types d’exceptions
Table 1: différents types d’exceptions

Type Définir Lever Traiter Déclarer


Error NON NON OUI NON
RuntimeException NON (*) OUI OUI NON
Utilisateur OUI OUI OUI OUI

• Error = erreurs imprévues (InternalErrorException)

• RuntimeException = exceptions liées à la machine


virtuelle (NullpointerException)

• Utilisateur = exceptions définies par le program-


meur, propres à son application (AlienKilledEx-
ception)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-127
Programmation Java

Exceptions
RuntimeExceptions
• ArithmeticException

- Erreurs mathématiques, division par zéro, etc...

• NullPointerException

• ClassCastException

- Tentative de conversion d’un type vers un autre


non valide

• NegativeArraySizeException

- On créée un tableau de taille négative ? Tssst...

• ArrayIndexOutOfBoundsException

- Accès à un élément d’un tableau qui est en dehors


des bornes

• OutOfMemoryException

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-128
Programmation Java

Exceptions

Méthodes de la classe Exception


• toString()

- Existe pour presque tous les objets Java


catch(ArithmeticException e) {
[Link](“exception : “ +
[Link]() + “ rencontrée “);
}

• printStackTrace()

- Imprime l’ensemble des appels ayant conduit à la


levée de l’exception
- Appelée par défaut lors de l’acquittement d’une ex-
ception par java
catch(ArithmeticException e) {
[Link]()
}
AFFICHE LES INFORMATIONS SUIVANTES :
[Link]: / by zero
at [Link]([Link]: 25)
at [Link]([Link]: 140)
......

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-129
Programmation Java

Exceptions

Méthodes de la classe Exception


• A l’aide du mot-clé throws dans le prototype d’une
méthode
public void methode1() throws [ClasseException] {
...
}

• A partir du moment où une méthode lève une ex-


ception, deux possibilité d’utilisations dans la mé-
thode appelante

1. On utilise un bloc try{}


public void methode2() {
try{
methode1();
catch(Exception e) {
// traitement...
}
}
2. La méthode appelante relaye l’exception
public void methode2() throws [ClasseException] {
methode1();
...
}

 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

• Cool.... comparer ce mécanisme à des codes binai-


res par exemple !

 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

• On n’a pas besoin de déclarer les exceptions de la


classe RuntimeException, car elles sont liées au
langage (package [Link])

• Toutes les autres exceptions doivent être décla-


rées

 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

- Throwable : être levées et attrapées + méthodes


informatives comme printStackTrace(), toString()

• Il faut sous-classer Exception

- Mécanisme permettant de décrire l’exception


public class MonException extends Exception {
private int valeur;

public MonException(String info, int valeur) {


super(info);
[Link] = valeur;
}

public toString() {
return [Link]() +
[Link](valeur);
}
}

• Penser à modéliser les exceptions en même temps


que le reste de l’application

 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.

• Fichiers (Classe [Link])

- Classes FileInputStream, FileOutput-


Stream et RandomAccessFile.

• 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

- String getName(), String getPath(),


String getAbsolutePath(), String get-
Parent(), boolean renameTo(File
newName)...

• Droits d’accès

- boolean exists(), boolean canWrite(),


boolean canRead()...

• Autres informations

long length(), long lastModified(),


boolean delete()...

File f = new File(“[Link]”);


[Link](“[Link] : “ + [Link]() +
“ “ + [Link]());
if([Link]()){
[Link](“fichier existe, droits = “+
[Link]() + “ “ + [Link]() + “ “ +
[Link]());
...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-137
Programmation Java

Entrées-Sorties
La classe [Link]
• Répertoires

- boolean mkdir(), String[] list()

File f = new File(“/u/I3S/buffa”, “.emacs”);


// ou bien
File home = new File(“/u/I3S/buffa”);
File f = new File(rep, “.emacs”);

 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.

• C’est la classe de base de tous les flots d’entrée


InputStream

FileInputStream SequenceInputStream
ByteArrayInputStream
PipedInputStream
StringBufferInputStream
FilterInputStream

DataInputStream BufferedInputStream

PushBackInputStream LineNumberInputStream

• Infos sur quelques sous-classes

- SequenceInputStream : permet de travailler


avec une énumération d’InputStreams comme s’il
s’agissait d’un seul.
- StringBufferInputStream : lecture de
chaînes de caractères.
- ByteArrayInputStream : lecture de tableaux
d’octets.
- FilterInputStream : encapsule une instance
d’InputStream et fournit des méthodes de filtrage.

 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.

• Fermeture du fichier implicite (garbage collecting)


ou par la méthode close().

• Constructeurs

- public FileInputStream(String
finename)
- public FileInputStream(File file)

• Méthodes (renvoient -1 en fin de fichier)

- int read() : lit un octet.


- int read(byte[] taboctets) : remplit
taboctets si possible. taboctets doit être alloué
avant.
- int read(byte[] taboctets, int offset,
int nb) : lit nb octets et les met dans taboctets à
partir de l’indice offset.

 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) {...}

// lecture des données


try {
int i = [Link](b);
} catch (IOException e) {...}

// utilisation des caractères lus


String s = new String(b, 0);

 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

- Portabilité (un entier est de même taille partout).

• Classe de “spécialisation”

- Possibilité de transformer en DataInputStream


n’importe quel InputStream.

• Constructeur

- public DataInputStream(InputStream)

• Méthodes de lecture

- byte readByte(), short readShort(),


char readChar(), int readInt(), float
readFloat()...
- Mais aussi readLine(), avec la fin de la ligne
marquée par \n, \r, \r\n ou EOF.
- ...

• Fermeture de flot

- La fermeture d’un dataInputStream entraîne la


fermeture de l’InputStream original.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-142
Programmation Java

Entrées-Sorties
La classe [Link]

// Ouverture d’un fichier


FileInputStream fis;
fis = new FileInputStream(“[Link]”);
// spécialisation !
DataInputStream dis = new DataInputStream(fis);
String ligne = new String();
// lecture des données
while((ligne = [Link]()) != null){
[Link](ligne+"\n");
}
// fermeture du fichier. Ferme aussi fis !
[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

- Créer un objet de la classe URL,


- obtenir un stream sur cet URL...
- ...ou ouvrir une connexion sur l’URL et obtenir un
stream à partir de la connexion.

• 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

• PrintStream : sorties de données typées autres


que des bytes

- [Link] est un 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

- Ouverture du fichier à la construction


- Le sécurity manager est appelée à chaque ouverture d’un fi-
chier.
- Méthodes d’écriture d’octets.
- Fermeture explicite avec close()ou implicite.

• Constructeurs

- public FileOutputStream(File)
- public FileOutputStream(FileDescrip-
tor)
- public FileOutputStream(String)

• Méthodes

- public void write(int)


- public void write(byte [])

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é

- Spécialisation à partir de n’importe quel flot de sor-


tie.
- Ecriture sur disque explicite par flush() ou clo-
se().

• 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]

// Ouverture d’un fichier pour écriture en mode


// bufférisé
FileOutputStream fos =
new FileOutputStream(“[Link]”);
BufferedOutputStream bos =
new BufferedOutputStream(fos);

// Préparation des données à écrire


String chaine = “coucou c’est moi”;
int longueur = [Link]();
byte[] buffer = new byte[longueur];
[Link](0, longueur - 1, buffer, 0);

// 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

- Portabilité (un entier est de même taille partout)

• Classe de “spécialisation”

- Possibilité de transformer en DataOutput-


Stream n’importe quel OutputStream.
Conseillé : prendre un BufferedOutputStream

• Constructeur

- public DataOutputStream(OutputStream)

• Méthodes d’écriture

- byte writeByte(), short writeShort(),


char writeChar(), int writeInt(),
float writeFloat(), writeDouble(),
writeBytes(), writeChars(), writeU-
TF()

• 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]

FileOutputStream fos = new


FileOutputStream(”[Link]”);
BufferedOutputStream bos =
new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
[Link](“Position “);
[Link](10.0);
[Link](12.0);
[Link](7.0);
[Link](“\n”);
...

 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).

• Dans les anciennes version, les entrées/sorties ne


travaillaient qu’avec des bytes, au travers des
classes InputStream et OutputStream.

• Les flots de caractères sont similaires mais au lieu


de travailler sur des données de 8 bits, elles mani-
pulent des caractères au format unicode (16 bits).

• Ceci est réalisé au travers de deux classes et de


leurs sous-classes: les classes Reader et Wri-
ter, qui supportent globalement les mêmes opé-
rations que les classes InputStream et OutputS-
tream.

• Les principales fonctionnalités existants sur les


flots d’octets sont disponibles sur les flots de ca-
ractères, au suffixe des noms de classes près

- FileReader <-> FileInputStream


- PushbackReader <-> PushbackInputStream

 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.

• Les classes InputStreamReader et OutputS-


treamWriter se chargent de l’encodage et du dé-
codage, car en fait, ce sont quand même des bytes
qui circulent.

• Plus efficaces que les anciens InputStream et


OutputStream qui sont implémentés pour tra-
vailler byte par byte.

• Les InputStreamReader et OutputStreamWri-


ter sont bufférisés en standard.

• Les plus utilies : InputStreamReader, Buffe-


redReader, FileReader, PrintWriter et
FileWriter.

 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

Reader Classe abstraite pour les flots InputStream


de caractères en entrée
BufferedReader Bufférise les entrées, ligne BufferedInputStream
par ligne
LineNumberReader Garde la trace du nombre de LineNumberInputStream
lignes lues
CharArrayReader Lit un tableau de caractères ByteArrayInputStream
InputStreamReader Transforme un flot de bytes Pas d’équivalence
en caractères unicode
FileReader Transforme des bytes lus FileInputStream
depuis un fichier en cara-
ctères unicode
FilterReader Classe abstraite pour filtrer FilterInputStream
des caractères en entrée
PushbackReader Lecture de caractères avec PushbackInputStream
un coup d’avance
PipedReader Lit depuis un PipeWriter PipedInputStream
StringReader Lit depuis une chaîne de StringBufferInputStream
caractères

 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

Writer Classe abstraite pour les flots outputStream


de caractères en sortie
BufferedWriter Bufférise les sorties, ligne BufferedOutputStream
par ligne
CharArrayWriter Ecrit un tableau de cara- ByteArrayOutputStream
ctères
OutputStreamWriter Transforme un flot de cara- (Pas d’équivalence)
ctères en flot de bytes
FileWriter Transforme un flot de cara- FileOutputStream
ctères en fichier de bytes
PrintWriter Ecrit des valeurs et des PrintStream
objets dans un Writer
PipedWriter Ecrit dans un PipeReader PipedOutputStream
StringWriter Ecrit dans une chaîne de (Pas d’équivalence)
caractères

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

- Les classes Vector et Stack

• Associer deux objets à l’aide de tables de hash-co-


de, de dictionnaire et de “tables de propriétésé”

- les classes HashTable, Dictionary et Pro-


perty

• Découper une chaîne de caractères en mots (to-


kens)

- La classe StringTokenizer

• Faire en sorte qu’un objet soit averti lorsqu’un


autre objet change

- 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

- Lorsqu’on ne sais pas combien d’objets on veut


stocker dans le tableau
- on peut créer un tableau très grand, mais ce n’est
pas une méthode très “propre”

• Solution : la classe Vector

- Un Vector se comporte comme un tableau : il


contient plusieurs objets (de la classe Object)
- On accède à ses éléments à l’aide d’un index
- Ils grossissent automatiquement lorsqu’il n’y a plus
assez de place pour contenir de nouveaux objets
- Ils proposent des méthodes pour ajouter ou enle-
ver un éléments situé à un endroit quelconque

 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

- Ces deux informations sont facultatives, mais at-


tention à la perte de performance si on laisse java
décider tout seul !

• Constructeurs
public Vector()
public vector(int initialCapacity)
public Vector(int initialCapacity,
int capacityIncrement);

• Si on ne précise pas d’incrément de capacité, le


Vector double sa taille à chaque dépassement

• Il est conseillé d’indiquer une taille initiale

 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

1. à la fin d’un Vector avec la méthode :


public final synchronized void addElement(Object
newElement);
2. entre deux éléments avec :
public final synchronized void insertElement(Object
newElement, int index) throws
ArrayIndexOutOfBoundsException;

...le paramètre index indique la position dans le Vec-


tor où le nouvel élément doit être inséré.
Si la position est incorrecte, l’exception ArrayIn-
dexOutOfBoundsException est levée

• Remplacer un objet situé à une position donnée


par un autre
public final synchronized void setElementAt(Object obj,
int index) throws ArrayIndexOutOfBoundsException;
- Fonctionne comme insertElement() sauf qu’au lieu
que les éléments à droite du Vector se décalent
pour laisser la place au nouvel élément, ici l’élé-
ment est remplacé.

 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

- Vector v = new Vector();


- [Link](new PacMan());
- v[0].display(); // interdit !

• Il faut utiliser des méthodes spécialisées


public final synchronized Object elementAt(int index)
throws ArrayIndexOutOfBoundsException;

public final synchronized Object firstElement() throws No


SuchElementException;

public final synchronized Object lastElement() throws No


SuchElementException;

• On peut tester si un vector est vide avec la métho-


de isEmpty()

public final boolean isEmpty();

• Taille d’un vector

public final int size();

 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 :

Object tab = new


Object([Link]());
[Link](tab);

• Effectuer une action sur tous les éléments d’un


Vector

- La méthode elements() de la classe Vector


renvoie un objet de type Enumeration, qui per-
met d’accéder aux éléments de manière séquen-
tielle
- Voir pages suivantes...

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

• Le plus souvent utilisé en collaboration avec la clas-


se Vector, car la méthode elements() de cette der-
nière retroune une Enumeration

• Deux méthodes principales

- public abstract boolean hasMoreEle-


ments() :renvoie true lorsqu’il reste des éléments à
énumérer, false sinon
- public abstract Object nextElement()
throws NoSuchElementException : retourne le
prochain objet et avance d’un cran dans l’énumération

• 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

Vector v = new Vector();


[Link](new Personne(”Michel”,
”Buffa”, 32);
[Link](new Personne(”Peter”,
”Sander”, 41);

Enumeration e = [Link]();
while([Link]()) {
Object obj_suivant = [Link]-
ment();

// Effectuer des actions sur l’objet


(Personne)obj_suivant.getName();
}

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

- Si on ne gère que des objets de la même classe


MyClass dans le Vector (donc dans son énuméra-
tion correspondante) : dériver la classe Vector et
ré-implémenter la méthode elements() pour qu’elle
renvoie une Enumeration d’objets de type My-
Class. Il faudra pour cela ré-implémenter une inter-
face Enumeration.
- Si on gère des objets de classes différentes mais
possèdant tous des méthodes précises (ils implé-
mentent donc une ou plusieurs interfaces), on peut
dériver Vector de la même manière pour qu’il gère
des objets des interfaces implémentées par les ob-
jets.

• Travail utile que si on a des besoins répétés et très


spécialisés.

 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

- Fastidieux, peu performant

• Il existe des méthodes spécialisées

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

- Un objet est peut-être présent plusieurs fois, je


veux la position de sa première occurence, en par-
tant de la position startIndex :
public final synchronized int indexOf(Object obj,
int startIndex) throws
ArrayIndexOutOfBoundsException;
- Idem, mais avec la dernière occurence :
public final int
lastIndexOf(Object obj);
public final synchronized int lastDIindexOf(Object obj,
int startIndex) throws
ArrayIndexOutOfBoundsException;

 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

public final synchronized void


removeAllElements();

• Supprimer un élément spécifique

public final synchronized boolean


removeElement(Object obj);
- Attention, le premier appel supprime la première
occurence de l’objet.

• Supprimer un élément à une position donnée


public final synchronized boolean
removeElementAt(Object obj, int index)
throws ;ArrayIndexOutOfBoundsException

 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

Introduction aux Applets


Objectifs de ce chapitre
• Apprendre ce qu’est une Applet et ce qui la diffé-
rencie d’une application,

• Etudier les points d’entrée d’exécution d’une Ap-


plet et son cycle de vie,

• Manipuler les classes de bases nécessaires au co-


dage d’une Applet

• Définir les codes HTML nécessaires pour charger


et exécuter une Applet dans une page HTML, pas-
sage de paramètres depuis la page.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-169
Programmation Java

Qu’est-ce qu’une Applet


Rappels
• Une Applet est une application java exécutée dans
un navigateur Web.

• Elle ne possède pas de point d’entrée main(), car


celui-ci se trouve déjà dans le navigateur.

• D’autres points d’entrée existent :

- public void init();


- public void start();
- public void stop();
- public void destroy();
- public void paint(Graphic g);
- ...

• Il s’agit d’une application indépendante, interpré-


tée par la machine virtuelle du navigateur.

• Le programmeur d’Applets dispose d’un ensemble


de classes pour les implémenter.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-170
Programmation Java

Composantes de base d’une Applet


Créer une Applet
• Il suffit d’hériter de la classe [Link]-
plet

• Et surcharger les méthodes init(), start(),


etc...
import [Link].*;
public class MonApplet extends Applet {
// surcharge des méthodes de notre
// choix
public void init() {
[Link](“Init appelée
par le navigateur”);
}
public void start() {
[Link](“Start appelée
par le navigateur”);
}
public void stop() {
[Link](“Stop appelée
par le navigateur”);
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-171
Programmation Java

Composantes de base d’une Applet


La classe Applet
• Par héritage, la classe MyApplet est devenue une
Applet

- Ma classe est donc appartient donc à toutes les


classes de l’arbre d’héritage de la classe Applet
[Link]
|
+----[Link]
|
+----[Link]
|
+----[Link]
|
+----[Link]
|
+----MyApplet

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-172
Programmation Java

Composantes de base d’une Applet


La classe Applet
• De quoi hérite MyApplet :

- Object : la classe de base de tout objet java.


- Component : cette classe définit un composant
graphique au plus haut niveau.
- Container : un composant graphique pouvant in-
clure d’autre composants (Component). Notre ap-
plet est un Component, elle pourra donc contenir
des objects graphiques.
- Panel : un habillage de Container permettant de
“placer” les objets inclus de manière intelligente.
- Applet : complémente ce qui précède pour fournir
les prototypes des points d’entrée appelés par le
navigateur web.
- MyApplet : ah, ça dépend de ce qu’on va y mettre
!

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-173
Programmation Java

Les méthodes de la classe Applet


Implémentées dans Applet
• public void init()

- Appelée à l’initialisation de l’Applet par le naviga-


teur. Elle n’est eécutée qu’une seule fois. On met
dans init() toutes les opérations qui doivent être
réalisées préalablement à l’exécution de l’Applet.
par exemple, pour une applet de jeu, il faudra char-
ger tous les graphismes et les sons avant de dé-
marrer l’animation.

• public void start()

- Appelée par le navigateur chaque fois qu’il doit dé-


marrer l’Applet. Soit après l’appel à init(), soit après
un appel à stop() et l’arrivée d’un événement ap-
proprié.

• public void stop()

- Appelé chaque fois que le navigateur arrete l’exé-


cution de l’Applet (l’utilisateur a changé de page
web, il a icônifié le navigateur, etc...) penser à arrê-
ter les tâches de fond, les musiques dans ce cas-
là !
- Lorsque la page web apparaît à nouveau ou que le
navigateur est désicônifié, start() est appelée.

• public void destroy() : avant la mort du navigateur

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-174
Programmation Java

Les méthodes de la classe Applet


Méthodes graphiques et classe Graphics
• Le contexte graphique est indispensable à l’exécu-
tion de toute manipulation graphique.

• Il est transmis sous la forme d’un objet, instance de


la classe Graphics.

• Ce contexte est transmis par le navigateur, au travers


de méthodes dédiées.

• Il n’est valable que le temps d’exécution de la métho-


de car il n’est qu’une copie du contecte graphique
que vous partagez avec le navigateur.

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

Les méthodes de la classe Applet


Les méthodes graphiques
• public void repaint()

- Provoque le rafraîchissement de votre programme


graphique.
- Provoque l’appel asynchrone de la méthode
paint() par l’AWT.
- Ne pas la surcharger !!!

• update(Graphics gc)

- Appelée par le navigateur chaque fois qu’un bout


de votre application doit être re-dessiné. Cette mé-
thode effectue les opérations suivantes :
- Dessine un rectangle de la couleur du fond sur la zone à re-
dessiner,
- Appelle la méthode paint()
- Si vous surchargez cette méthode, n’oubliez pas
que par défaut, elle n’est pas vide ! (On peut avoir
besoin de la surcharger, pour des besoins de per-
formances graphique)

• public void paint(Graphics gc)

- C’est là que doit se faire les opérations de dessin


de votre application. Cette méthode ne doit jamais
être appelée par le programmeur, elle est appelée
automatiquement par l’AWT (lors d’un repaint(),
d’une dé-icônification, etc...)

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-176
Programmation Java

Les méthodes de la classe Applet


Exécuter une Applet
• Une Applet s’exécute au travers d’un navigateur

• On indique le nom de la classe principale, la taille


et les paramètres de l’Applet dans une page HTML

...
<applet code=”[Link]”
width=300 height=200>
<H1>Votre navigateur ne supporte pas
java, désolé !</H1>
</applet>

• Quand on développe des Applet, les tester à l’aide


de l’AppletViewer, un outil dédié à l’exécution
d’Applets, livré avec le JDK.

• Inconvénient : ne permet de voir que l’Applet, pas


la page HTML qui va autours.

> appletviewer [Link]

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-177
Programmation Java

Les méthodes de la classe Applet


Le tag <applet>
• Passage de paramètres à l’Applet

- Dans la page HTML


<applet ...liste de paramètres...>
<param name=nbPacman value=”4”>
<param name=imgFond value=”[Link]”>
</applet>

• Récupération des paramètres

- Dans le fichier java


...
int nbPacman;
public void init() {
String param1 = getParameter(“nbPacman”);
if(param1 == null) {
nbPacman = 0;
}
else {
try {
nbPacman = [Link](“param1”);
catch(NumberFormatException e) {}
}
}
...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-178
Programmation Java

Les méthodes de la classe Applet


Le tag <applet>
• Syntaxe du tag <applet>

<applet ...liste de paramètres...>


Texte au cas ou le navigateur ne com-
prend pas java
</applet>

• Paramètres du tag <applet>

- 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.

• Créer un code serveur sous TCP/IP.

• Créer un code client sous TCP/IP.

• Idem sous UDP.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-181
Programmation Java

Programmation réseau
Les sockets
• Qu’est-ce qu’un socket ?

- Point d’entrée entre deux applications du réseau.


- Pour les applications : descripteurs de fichiers.
- Echange des données à l’aide des mécanismes
d’entrées/sorties déjà étudiés.

• Différent types de sockets

1. Stream Socket (TCP)


- Permettent d’établir une communication en mode connecté.
Si la connexion est interrompue, les applications en sont in-
formées.
2. Datagram Socket (UDP)
- Communication en mode non connecté (Datagramme). Les
données sont envoyées sous la forme de paquets indépen-
dants de toute connexion. Plus rapide mais moins fiable que
le mode TCP : aucune garantie que les paquets sont distri-
bués correctement.
3. Raw Sockets
- Permettent un accès direct aux couches les plus basses de
la programmation réseau. Très bas niveau. Utilisés pour le
debugging de protocoles. Non implémentés en Java.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-182
Programmation Java

Programmation réseau
Les “domaines” de socket
• Domaine de socket ?

- Les sockets ont été créés pour être aussi généri-


ques que possible en terme de communication in-
ter-processus.
- Organisés dans deux domaines permettant de dé-
finir entre eux la manière de communiquer : Unix et
Inet (Internet).
- Ces deux domaines permettent de définir si la
communication est locale ou si elle opère sur le ré-
seau entre deux systèmes différents.

• 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

- Communication à travers le réseau,


- tous modes de sockets supportés,
- une fois la connexion établie, les données peuvent
être lues ou écrites comme dans un fichier.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-183
Programmation Java

Programmation réseau
Le domaine Internet
• Applications TCP les plus connues

- FTP, SMTP, TELNET, etc...

• Applications UDP les plus connues

- Simple Network Management Protocol (SNMP).


- Trivial File Transfer Protocol (TFTP), version Data-
gramme de FTPD, utilisée pour le boot par le ré-
seau.

• Les Raw Sockets permettent d’accéder à ICMP (In-


ternet Control Message Protocol) et sont utilisés
pour des manipulations de bas niveau.

- La commande “ping” utilise ICMP...

 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].

• Les classes URL, URLConnection, Socket, et


SocketServer utilisent TCP.

• Les classes DatagramPacket et DatagramSer-


ver utilisent UDP.

• Il n’est pas possible aujourd’hui de travailler en


ICMP en Java.

• Certaines classes du package non documenté ja-


[Link] permettent de faire du ftp.

 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].

• Principe de fonctionnement d’un modèle client-


serveur :

Serveur Enregistrer ce service


Attendre une connexion
ServerSocket(port#, du client
1
nb_cnx)
Utiliser le socket

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,

2. il se met en attente par la méthode accept() de


son instance de ServerSocket,

3. le client peut alors établir une connexion en de-


mandant la création d’un socket à destination du
serveur pour le port sur lequel le service a été en-
registré,

4. le serveur sort de son accept() et récupère un


Socket de communication avec le client,

5. ils peuvent alors utiliser des InputStream et Out-


putStream pour échanger des données.

 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;

// Enregistrer le service sur le port 5432,


// Autoriser 5 demandes simultanées.
try {
s = new ServerSocket(5432, 5);
} catch(IOException e) {}

// reboucler sur l’acceptation de toute


//connexion entrante
while(true) {
try {
// Attendre la connexion du client
s1 = [Link]();

// Extraire un stream du socket


s1out = [Link]();

// Envoyer les données


slength = [Link]();
for(i = 0; i < slength; i++)
[Link]((int)[Link](i));

// Fermer la connexion (Socket), mais pas le


// service (ServerSocket)
[Link]();
} catch(IOException e) {}
}
}

 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;

// Se connecter sur la machine “serveur”,


// port 5432
s = new Socket(“serveur”, 5432);

// Acquerir un InputStream, lire les infos


// en provenance du serveur
sIn = [Link]();
while((c = [Link]()) != -1) {
[Link]((char) c);

// Lorsque EOF est atteint, fermer la


// connexion
[Link]();
}
}

 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((line = [Link]()) != null)


[Link](line);
...

• L’exemple précédent accepte plusieurs con-


nexions simultanées, mais ne traite qu’un client à
la fois, les autres sont mis en attente

• Corriger cette limitation : utiliser les threads !

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.

• Ces objets sont initialisés différemment selon


qu’ils sont utiliser pour envoyer ou recevoir des
paquets.

• Envoi d’un Datagram :

1. Créer un DatagramPacket, en spécifiant les


données à envoyer, leur longueur, la machine ré-
ceptrice et le port,
2. utiliser la méthode sent(DatagramPaquet)
de la classe DatagramSocket. Le constructeur
de ce dernier ne prend pas d’arguments, toutes
les informations se trouvent dans le paquet en-
voyé.

 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;

// Création du message à envoyer


String s = new String(“coucou”);
int longueur = [Link]();
byte[] message = new byte[longueur];
[Link](0, longueur, message, 0);

// Initialisation du paquet avec toutes les infos


DatagramPacket p = new DatagramPacket(message,
longueur, address, port)

// Création du socket et envoi du paquet


DatagramSocket s = new DatagramSocket();
[Link](p);
...

 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

1. Créer un DatagramSocket qui écoute sur le


bon port du host destinataire,
2. créer un DatagramPacket avec un buffer suffi-
samment grand pour recevoir les paquets en-
voyés par le serveur,
3. utiliser la méthode receive() (bloquante) de la
classe DatagramPaquet.

...
// 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

Un exemple tiré du tutorial de Sun


Implémentation d’un protocole en UDP

import [Link].*;
import [Link].*;
import [Link].*;

class QuoteServerThread extends Thread {


private DatagramSocket socket = null;
private DataInputStream qfs = null;

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

Un exemple tiré du tutorial de Sun


Implémentation d’un protocole en UDP
public void run() {
if (socket == null)
return;

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

[Link](0, [Link](), buf, 0);


packet = new DatagramPacket(buf, [Link],
address, port);
[Link](packet);
} catch (IOException e) {
[Link](“IOException: “ + e);
[Link]();
}
}
}
...

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-195
Programmation Java

Un exemple tiré du tutorial de Sun


Implémentation d’un protocole en UDP
protected void finalize() {
if (socket != null) {
[Link]();
socket = null;
[Link](“Closing datagram socket.”);
}
}

private void openInputFile() {


try {
qfs = new DataInputStream(new
FileInputStream(“[Link]”));
} catch ([Link] e) {
[Link](“Could not open quote file.
Serving time instead.”);
}
}

private String getNextQuote() {


String returnValue = null;
try {
if ((returnValue = [Link]()) == null) {
[Link]();
[Link]();

// we know the file has at least one


// input line!
returnValue = [Link]();
}
} catch (IOException e) {
returnValue = “IOException occurred in
server.”;
}
return returnValue;
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-196
Programmation Java

Un exemple tiré du tutorial de Sun


Implémentation d’un protocole en UDP
import [Link].*;
import [Link].*;
import [Link].*;

class QuoteClient {

public static void main(String[] args) {


int port;
InetAddress address;
DatagramSocket socket = null;
DatagramPacket packet;
byte[] sendBuf = new byte[256];

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

Un exemple tiré du tutorial de Sun


Implémentation d’un protocole en UDP

...
// 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

• Comprendre l’utilité du multithreading

• Connaître les deux types de threads utilisables en


Java

• Définir les différents états d’un thread et les mé-


thodes permettant de modifier ces états

• Déterminer la priorité d’un thread

• Connaître les différentes possibilités de synchro-


nisation de 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

• Inconvénients d’un processus

- Coûteux en mémoire (code + données non parta-


gés),
- lancement lent (taille, charge de l’OS),
- partage des ressources systèmes difficile...

 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 partage les données, le code et les res-


sources de son processus

• Il peut disposer de ses données propres

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

• Les threads partagent code, données, ressources,


mais peuvent disposer de leurs propres données

• Ils peuvent s’exécuter en parallèle (OS dépen-


dant...)

• Avantages des threads sur les processus

- Légèreté (“light weight process” ou “processus lé-


ger”) grâce au partage des données.
- Ceci implique des meilleures performances au lan-
cement et en exécution.
- Partage des ressources système du processus
(très pratique, ne serait-ce qu’au niveau des en-
trées/sorties).

• Utilité

- Puissance de la modélisation : le monde est “mul-


tithread” !
- Puissance d’exécution grâce au paraléllisme.
- Simplicité d’utilisation : un Thread est un Objet
Java : attributs, méthodes, encapsulation, réutilisa-
tion...

 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

public class Thread1 {


public static void main(String args[]) {
Sac plus = new Sac(10, “+“);
Sac moins = new Sac(10, “-“);
Verificateur Gaston =
new Verificateur(“gaston“, plus);
Verificateur Robert =
new Verificateur(“robert“, moins);

// 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;

public Verificateur(String nom, Sac sac) {


[Link] = nom;
[Link] = sac;
}

public void run() {


for(int i = 0; i < [Link]; i++) {
[Link]([Link]);
}
[Link](“\n“ + nom + “a terminé“);
}
}

• 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

- [Link] est la classe d’implémentation


d’un thread
- création, destruction,
- gestion de l’état,
- synchronisation,
- etc...
- Le code d’une instance de Thread s’exécute paral-
lèlement au code des threads déjà existants

• 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

class Verificateur extends Thread {


private Sac sac;
private String nom;

public Verificateur(String nom, Sac sac) {


[Link] = nom;
[Link] = sac;
}

public void run() {


for(int i = 0; i < [Link]; i++) {
[Link]([Link]);
try {
sleep(100);
} catch(Exception e) {}
}
[Link](“\n“ + nom + “a terminé“);
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-207
Programmation Java

Threads et MultiThreading
Solution 1 : sous-classer Thread

public static void main(String args[]) {


Sac plus = new Sac(10, “+“);
Sac moins = new Sac(10, “-“);
Verificateur Gaston =
new Verificateur(“gaston“, plus);
Verificateur Robert =
new Verificateur(“robert“, moins);

// début du contrôle
// Utilisation de la méthode start()
// héritée par la classe Verificateur.
// start() appelle run()
[Link]();
[Link]();
}

- start() rend la main de suite après son appel

• 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.

• Cet objet doit implémenter l’interface Runnable.

• L’exemple suivant montre également comment as-


socier plusieurs Threads à un seul objet.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-209
Programmation Java

Threads et MultiThreading
Solution 2 : un exemple

class Verificateurs extends toto implements


Runnable {
private SacVector sacVect;
private int IndexSacCourant = 0;

public void gereNouveauSac(Sac sacAGerer) {


Thread unVerificateur = new Thread(this);
[Link](sacAGerer, unVerificateur);
[Link]();
}

// implémentation de Runnable
public void run() {
sac monSacAVerifier;
Thread moi = [Link]();
monSacAVerifier = [Link](moi);

for(int i = 0; i < [Link]; i++)


[Link]([Link]);
[Link](“\n“ + nom + “a terminé“);
[Link](monSac);
}
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-210
Programmation Java

- Les éléments en italiques sont supposés définis


dans la classe SacVector.
- [Link](sacAGerer, unVerificateur) associe
un sac avec un thread,
- [Link](moi) retourne le sac corespon-
dant au Thread passé en paramètre,
- [Link](monSac) gère le fait que le
sac ait été contrôlé. Par exemple : l’ôte du vecteur et le trans-
met.

• On utilise le constructeur de code en passant en


paramètre l’objet dont on veut paralléliser le code
(this).

• Ce paramètre doit implémenter Runnable, c.a.d


que l’objet courant doit implémenter la méthode
run().

• Lorsque le thread est lancé par start() une entité


exécutable supplémentaire est lancée pour l’objet,
utilisant son code et ses attributs, ayant pour point
d’entrée la méthode run().

• A un instant t, un nombre quelconque de threads


peuvent être associés à une instance de Verifica-
teur. Ils partagent tous le même SacVector.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-211
Programmation Java

• Méthodes essentielles liées à cette technique

- public Thread(Runnable)
- public static Thread currentThread()

• Attention : lorsque l’on est dans le code de la mé-


thode run(), this retourne une référence sur le Ve-
rificateur, quelque soit le Thread qui exécute cette
méthode. Si on veut récupérer une référence sur le
Thread lui-même, il faut utiliser [Link]-
rentThread().

• La pile d’un Thread étant locale, toute variable


créée dans run() est unique par Thread, en revan-
che, tous les attributs de la classe sont partagés
par les threads.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-212
Programmation Java

Threads et MultiThreading
Quelle solution choisir ?
• Sous-classer Thread

- Lorsqu’on désire paralélliser une classe qui n’héri-


te pas déjà d’une autre classe

• Implémenter Runnable

- Lorsque la super classe est imposée (exemple :


une applet que l’on désire paralélliser),
- Ou lorsqu’un partage de contexte est requis par un
nombre quelconque de threads (cf l’exemple des
verificateurs).
- En général, le démarrage du ou des threads asso-
ciés à l’objet est effectué par l’objet lui-même
(new Thread(this)).start();

 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éé

- Créé comme n’importe quel objet Java.

• Actif

- Dans cet état lorsque après la création, il est activé


par start(), qui lance run().
- Ou encore lorsqu’il est réactivé par un resume().
- Il est alors ajouté à la liste des threads actifs qui
sont exécutés en temps partagés.

• Endormi

- sleep(long millisecondes) endort le thread


pendant l’intervalle de temps spécifié.
- suspend() endort un thread et resume() pourra
le réactiver.
- Une entrée/sortie bloquante (ouverture de fichier,
entrée clavier) endort et réveille un thread.

• Mort

- Quand run() a terminé son exécution.


- Par un appel explicite à stop().

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-215
Programmation Java

Threads et MultiThreading
Priorités
• Principes

- Java offre la possibilité de fixer les priorités des dif-


férents threads d’un processus.
- Niveaux de priorités absolus (gestion simplifiée).
- Seuls les threads à l’état actif s’exécutent et peu-
vent partager le CPU.
- Le partage de temps entre threads d’une même
priorité dépend de l’OS.
- Les threads actifs de plus hautes priorité se parta-
gent le CPU (si l’OS le permet).

• Méthodes

- void setPriority(int) modifie la priorité du


receveur. Le paramètre appartient à l’intevalle
[MIN_PRIORITY, MAX_PRIORITY]. Dans le cas
contraire IllegalArgumentException est le-
vée.
- int getPriority() permet de connaître la
priorité d’un thread.
- Le niveau de priorité “normal” est donné par la
constante NORM_PRIORITY.

 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é.

• Time-slicing : la ressource CPU est partagée équi-


tablement entre threads de même priorité.
- Le système répartit équitablement le CPU entre
processus de même priorité. Ils s’éxécutent en pa-
rallèle...

• Préemption : le partage du CPU doit être géré par


l’utilisateur.

- Le premier thread du groupe des threads à priorité


égale monopolise le CPU. Il faut qu’il le cède soit
involontairement, soit volontairement, pour que les
autres threads puissent s’exécuter.
- Involontairement sur Entrée/sortie,
- implicitement sur passage à l’état endormi par
wait(), sleep() ou suspend(),
- volontairement par appel à la méthode statique
yield(). Cette méthode ne permet cependant
pas à un thread de priorité inférieure de s’exécuter.
Seul un thread de priorité égale peut prendre la
main.

 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.

• Gérer les concurrences d’accés à une méthode

- Cela se fait en déclarant la méthode synchroni-


zed :

public synchronized void maMethode() {


...
}

- Lorsqu’un thread exécute cette méthode sur un ob-


jet, un autre thread ne peut pas l’exécuter pour le
même objet.
- En revanche, il peut exécuter cette méthode pour
un autre objet.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-218
Programmation Java

Threads et MultiThreading
Synchronisation
• Contôler l’accés à un objet

- Déclarer l’objet synchronized

public void maMethode() {


...
synchronized(objet) {
[Link]();
}
...
}

- L’accès à l’objet passé en paramètre de syn-


chronized(Object obj) est réservé à un
thread et un seul.

• Pour éviter une dégradation des performances il


faut que les sections critiques soient courtes et
utilisées à bon escient.

 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...

• En général ils ont une faible priorité, et tournent au


sein d’une boucle infinie.

• Arrêt implicite lorsque le programme se termine.

• Méthodes

- setDaemon() : permet de déclarer un thread


comme un daemon
- isDaemon() : permet de savoir si un thread est un
daemon

• Les daemons ne sont pas étudiés plus en détail


dans ce cours...

 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

• Arborescence de Threads et de ThreadGroups

- La classe ThreadGroup permet de constituer une


arborescence de Threads et de ThreadGroups
- Elle offre des méthodes de manipulation récursi-
ves d’un ensemble de threads telles que resu-
me(), stop(), suspend()...
- Comporte des méthodes qui agissent seulement
sur les Threads créés ensuite dasn un groupe :
setDaemon(), setMaxPriority()...

• Fonctionnement

- La machine virtuelle crée au minimum un groupe


de threads appelé main.
- Par défaut tout thread appartient au même groupe
que son père.
- Possibilté de spécifier un ThreadGroup à la cons-
truction d’un Thread, main si on ne précise pas.
- Tout thread est capable de connaître son thread-
Group par getThreadGroup().

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-221
Programmation Java

Threads et MultiThreading
Groupes de threads

public static void main(String args[]) throws


InterruptedException {
Verificateur Gaston =
new Verificateur(“gaston“,
new Sac(10,”+”));
Verificateur Robert =
new Verificateur(“robert“,
new Sac(10,”-”));
// Création du groupe des vérificateurs
ThreadGroup lesVerificateurs =
new ThreadGroup(“Verificateurs“);
Thread t1 = new Thread(lesVerificateurs,
Gaston);
Thread t2 = new Thread(lesVerificateurs,
Robert);
// Lancements individuels
[Link]();
[Link]();
...
// Opérations sur le groupe
[Link]();
...
[Link]();
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-222
Programmation Java

Threads et MultiThreading
Rendez-vous
• Exemple producteur/consommateur

1. Le producteur empile les données dans le buffer.


2. Le consommateur demande au buffer une infor-
mation.
3. Lorsqu’une information est disponible, il la prend.

Producteur

(1) (3)

(2) Consommateur

• Le producteur et le consommateur sont deux


threads qui s’exécutent en parallèle.

• Ils prossèdent chacun leur propre rythme de pro-


duction et de consommation.

• Si le buffer est vide, le consommateur est mis en


attente jusqu’à ce que le producteur dépose quel-
que chose.

 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;

public producteur(Buffer buffer,


String donnee){
[Link] = buffer;
[Link] = donnee;
}

public void run() {


for(int i = 0; i < [Link]; i++) {
// Dépôt des données
[Link]([Link](i));
try {
// rythme de production aléatoire
sleep((int) ([Link]() * 25));
} catch(Exception e) {}
}
[Link](“Production terminée“);
}

• Run() dépose chaque caractère de la chaîne don-


nee en activant la méthode poser() du buffer

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-224
Programmation Java

Threads et MultiThreading
Rendez-vous

class Buffer extends [Link] {


public synchronized void poser(char donnee) {
// Attente tant que le buffer est plein
while(full()) {
try {
// Mise en attente
wait();
} catch (Exception e) {//traite e}
}

// Il y a une place libre


push(new Character(donnee));
// Fin de la mise en attente
notify();
}

• La classe Buffer étend [Link] qui implé-


mente une pile First In Last Out (FILO)

• Si le buffer est plein, la méthode poser():

- Met le thread appelant en attente avec wait(),


- Le libère avec notify() quand un espace est di-
ponible, c’est-à dire quand le consommateur est
venu prendre un élément.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-225
Programmation Java

Threads et MultiThreading
Rendez-vous

class Consommateur extends Thread {


private Buffer buffer;
private int nb;

public consommateur(Buffer buffer, int nb) {


[Link] = buffer;
[Link] = nb;
}

public void run() {


// boucle de lecture des données
for(int i = 0; i < nb; i++) {
char car = [Link]();
[Link](car);
try {
// rythme de consommation aléatoire
sleep((int) ([Link]() * 500));
catch(Exception e) {}
}
[Link](“\n terminée“);
}
}

- La méthode run() du consommateur effectue une itération


pour prendre des caractères dans le buffer.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-226
Programmation Java

Threads et MultiThreading
Rendez-vous

class Buffer extends [Link] {


public synchronized char prendre() {
// Attente tant que le buffer est vide
while(empty()) {
try {
// Mise en attente
wait();
} catch (Exception e) {}
}
// Libération du buffer
notify();
// Retour de la donnée
return((Character) pop()).charValue();
}

• Si le buffer est vide, le buffer met le consommateur


(thread appelant) en attente jusqu’à ce que le pro-
ducteur pose un nouvel élément. Il le libère alors
par notify().

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-227
Programmation Java

Threads et MultiThreading
Rendez-vous
• Programme principal

public class ProdCons {


public static void main(String argv[]) {
String donnee = “Rendez-vous avec java“;
Buffer buffer = new Buffer();
Producteur producteur =
new Producteur(buffer, donnee);
Consommateur conso =
new Consommateur(buffer,
[Link]());
[Link]();
[Link]();
}
}

• Résultats :
Rndez-vous avec Jav
production terminée
ae
Consommation terminée

• Le “n” de “rendez” a été produit avant que le “e”


ne soit consommé.

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-228
Programmation Java

Threads et MultiThreading
Rendez-vous
• La classe Buffer

class Buffer extends [Link] {


public synchronized void poser(char donnee) {
// Attente tant que le buffer est plein
while(full) {
try {
wait(); // mise en attente
} catch(Exception e) {}
}
// il y a une place libre
push(new Character(donnee));
notify(); // fin de mise attente
}

public synchronized char prendre() {


// attente tant que le buffer est vide
while(empty);
try {
wait(); // mise en attente
} catch(Exception e) {// traite e}
}
notify(); // libération
// retour de la donnée
return ((Character)pop()).charValue();
}
public boolean full() { return(size() == 2); }
public boolean empty() { return(size == 0); }
}

 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

Afficher une image


Principe de base

import [Link].*;
import [Link].*;

public class monApplet extends Applet {


private Image im;

public void init() {


im = getImage(getDocumentBase(),
“images/[Link]”);
}

public void paint(Graphics g) {


[Link](im, 25, 25, this);
}

• getImage(...) ne charge pas l’image !

- Création de l’objet Image

• [Link](...)

- lance un thread de chargement de l’image la pre-


mière fois qu’elle est invoquée
- Génère des repaint() tant que l’image n’est pas ar-
rivée. Pas super...

 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

• Offre des méthodes permettant de savoir si une ou


plusieurs images sont totalement chargées, s’il n’y
a pas eu d’erreurs, etc...
Composant sur
public void init() { lequel se fait
l’affichage de
images = new Image[10]; l’image
MT = new Mediatracker(this);
for(int i = 0; i < 10; i++) {
images[i] = getImage(getDocumentBase(),
“images/im” + i + “.gif”);
[Link](images[i], i);
}
Identificateur
try { pour le tracking
[Link]();
} catch(InterruptedException e) {}
// phase de chargement terminée, attention
// les images ne sont pas forcément arrivées...
...
}
public void paint (Graphics g) {
if([Link](index, false) &&
[Link]) {
[Link](images[index]);
}

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-232
Programmation Java

La classe Mediatracker
Méthodes utiles
• boolean checkAll()

- renvoie true si toutes les images sont chargées en


mémoire

• int statusId(int id, boolean to_reload)

- Renvoie l’état du chargement de l’image i

• boolean checkId(int id)

- Renvoie true so l’image i est chargée en mémoire

• boolean waitForId(int id)

- Attend que l’image i soit chargée

• boolean isErrorId(int id)

- Renvoie true si une erreur est intervenue lors du


chargement de l’image i

 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

• MemoryImageSource réalise l’opération inverse

• Utiles pour la synthèse d’image ou pour faire des


effets spéciaux (dissolve, fading, etc...)
im1 = getImage(getDocumentBase(), “[Link]”);
int w = [Link](this);
int h = [Link](this);
int pixels[] = new int[w *h];
PixelGrabbler pg;
pg = new PixelGrabbler(im1, 0, 0, w, h,
pixels, 0, w)
try {
// remplissage du tableau de pixels
[Link]();
catch(InterruptedException e) {}
// manipulation du tableau pixels
eclaircit(pixels);
// recopie dans l’image
MemoryImageSource im =
new MemoryImageSource(w, h, pixels,
0, w);
im2 = createImage(mem);

 Michel Buffa , Peter Sander, Richard Grin 1996, 1997, 1998 Java-234
Programmation Java

Tables des matières


Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

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

Applications indépendante et applets . . . . . . . . . . . . . . . . . . . . . . . . . 18


Objectifs de ce chapitre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Application indépendante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Les bases à connaître . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Variables d’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Premier exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Eléments traditionnels du langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29


Objectifs de ce chapitre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Architecture d’un programme Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Structures lexicales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Types élémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Chaînes de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Variables et attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Ordre d’évaluation des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
if...else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
expression conditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
boucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
while et do...while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Concepts objets de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59


Objectifs de ce chapitre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Définition d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Définition d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

 Michel Buffa , Peter Sander, Richard Grin 1996 Java-2


Programmation Java

Définition d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63


Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Héritage et polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Héritage et polymorphisme, surcharge et redéfinition . . . . . . . . . . . . . 70
Modularité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Utilisation des classes, visibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Constructeurs de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Instanciation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Utiliser un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Composition d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Liens entre objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Exemple de this explicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

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

Les classes intérieures (inner classes) . . . . . . . . . . . . . . . . . . . . . . . . . 111


Une classe définie dans une autre classe ? . . . . . . . . . . . . . . . . . . . . . . 111
Plusieurs types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Les Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123


L’approche maladroite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
En java une exception est un objet envoyé à la JVM . . . . . . . . . . . . . . 125
Bloc try{...}, catch{...} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Types d’exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
RuntimeExceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Méthodes de la classe Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Et si je relaye une exception jusqu’à la JVM ? . . . . . . . . . . . . . . . . . . 131
Lesquelles déclarer ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Créer une classe d’Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Entrées-Sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Terrain connu : la classe [Link] . . . . . . . . . . . . . . . . . . . . . 135
Le [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
La classe [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

 Michel Buffa , Peter Sander, Richard Grin 1996 Java-3


Programmation Java

La classe [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139


La classe [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
La classe [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
InputStreams et URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
[Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
[Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
[Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
[Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
[Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Flots de caractères : nouveau dans le JDK 1.1 . . . . . . . . . . . . . . . . . . . 152
Flots de caractères : intérêt ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Flots de caractères : noms des classes . . . . . . . . . . . . . . . . . . . . . . . . . 154

Le package [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157


Des fonctionalités importantes... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
La classe Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Création d’unVector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
classe Vector : ajout et modification des objets . . . . . . . . . . . . . . . . . . 160
classe Vector : accès à un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
classe Vector : recopie dans un tableau . . . . . . . . . . . . . . . . . . . . . . . . 162
L’interface Enumeration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
classe Vector : recherche d’un élément . . . . . . . . . . . . . . . . . . . . . . . . 166
classe Vector : suppression d’éléments . . . . . . . . . . . . . . . . . . . . . . . . 167

Introduction aux Applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169


Objectifs de ce chapitre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Q Rappels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Créer une Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
La classe Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Les méthodes Implémentées dans Applet . . . . . . . . . . . . . . . . . . . . . . 174
Méthodes graphiques et classe Graphics . . . . . . . . . . . . . . . . . . . . . . . 175
Les méthodes graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Exécuter une Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Le tag <applet> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Programmation réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181


Avec Java, c’est facile ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Les sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Les “domaines” de socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Le domaine Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
TCP/UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Le modèle réseau Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Principe d’un serveur TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Principe d’un client TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
P Utilisation des sockets Datagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
P Envoi d’un Datagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Réception d’un Datagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

 Michel Buffa , Peter Sander, Richard Grin 1996 Java-4


Programmation Java

Implémentation d’un protocole en UDP . . . . . . . . . . . . . . . . . . . . . . . . 194

Threads et MultiThreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200


Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Programmation “parallèle” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Qu’est-ce qu’un Thread ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
T Un exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
T Mais alors, dites-nous comment faire ! . . . . . . . . . . . . . . . . . . . . . . . . 206
Solution 1 : sous-classer Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Solution 2 : implémenter l’interface runnable . . . . . . . . . . . . . . . . . . . 209
Solution 2 : un exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Quelle solution choisir ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Les états d’un Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Priorités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Daemons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Groupes de threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Rendez-vous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

Afficher une image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231


Principe de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

La classe Mediatracker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233


Méthodes utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

PixelGrabber et MemoryImageSource . . . . . . . . . . . . . . . . . . . . . . . . 234


Manipulation avancée d’images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234

Tables des matières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

 Michel Buffa , Peter Sander, Richard Grin 1996 Java-5

Vous aimerez peut-être aussi