Documente Academic
Documente Profesional
Documente Cultură
1.1.0.1 07/05/2010
LE LANGAGE JAVA
TODO :
-
1.1.0.1 07/05/2010
peignotc(at)arqendra(dot)net / peignotc(at)gmail(dot)com
Toute reproduction partielle ou intgrale autorise selon les termes de la licence Creative Commons (CC) BY-NC-SA : Contrat
Paternit-Pas d'Utilisation Commerciale-Partage des Conditions Initiales l'Identique 2.0 France, disponible en ligne
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ ou par courrier postal Creative Commons, 171 Second Street, Suite 300,
San Francisco, California 94105, USA. Merci de citer et prvenir lauteur.
1 / 59
1.1.0.1 07/05/2010
PROLOGUE............................................................................................................ 5
NOTIONS DE BASE.............................................................................................. 7
2.1
2.1.1
2.1.2
2.1.2.1
2.1.2.2
2.1.2.3
2.2
2.4.2.1
2.4.2.2
2.4.3
2.4.4
2.4.4.1
2.4.4.2
2.4.4.3
Loprateur ternaire.......................................................................................................................13
Les boucles .....................................................................................................................................13
Boucle tant que faire .................................................................................................................. 13
Boucle rpter tant que .............................................................................................................. 13
Boucle pour faire ....................................................................................................................... 14
2.7.1
2.7.2
2.7.3
2.4.1
2.4.2
2.5
2.6
2.7
2.3.1
2.3.2
2.3.3
2.3.4
2.4
Lencapsulation ......................................................................................................................................... 7
Lhritage de classe ................................................................................................................................... 8
Le polymorphisme..................................................................................................................................... 8
2.2.1
2.2.2
2.2.3
2.3
LHRITAGE ....................................................................................................... 20
3.1
3.1.1
3.1.2
3.1.3
3.2
Principes.........................................................................................................................................20
Hirarchie de classes......................................................................................................................20
Accs aux attributs et mthodes dans une relation dhritage .......................................................21
3.2.1
3.2.2
3.2.3
3.2.4
INTRODUCTION ........................................................................................................................ 28
4.1.1
4.1.2
4.1.3
4.2
4.3
4.4
La srialisation...............................................................................................................................33
Persistance .....................................................................................................................................34
GNRALITS .......................................................................................................................... 37
5.1.1
5.1.2
5.2
5.3
5.4
5.5
Dfinition........................................................................................................................................37
Fonctionnement ..............................................................................................................................37
5.3.1
5.3.2
5.3.3
Principes.........................................................................................................................................38
La balise HTML <applet> .............................................................................................................39
Exemple rcapitulatif......................................................................................................................39
LE MULTITHREADING ..................................................................................... 42
6.1
6.2
6.3
INTRODUCTION ........................................................................................................................ 42
DFINITIONS............................................................................................................................ 43
IMPLMENTATION ................................................................................................................... 44
6.3.1
6.3.2
6.4
La classe Thread.............................................................................................................................44
Linterface Runnable ......................................................................................................................45
6.4.1
6.4.2
4.5.1
4.5.2
4.4.1
4.4.2
4.4.3
4.5
4.3.1
4.3.2
1.1.0.1 07/05/2010
Cycle de vie.....................................................................................................................................46
Autres outils de gestion...................................................................................................................47
INTRODUCTION ........................................................................................................................ 48
IMPLMENTATION.................................................................................................................... 49
7.2.1
7.2.2
7.2.3
7.3
La classe Socket..............................................................................................................................49
Serveur socket.................................................................................................................................49
Client socket ...................................................................................................................................50
7.4
1.1.0.1 07/05/2010
B RFRENCE DU LANGAGE............................................................................. 57
B.1 BIBLIOTHQUES DES CLASSES JAVA ........................................................................................ 57
B.2 DITIONS DE LA PLATE-FORME JAVA....................................................................................... 57
B.3 VERSIONS DE LA PLATE-FORME JAVA...................................................................................... 58
C BIBLIOGRAPHIE ................................................................................................ 59
4 / 59
1.1.0.1 07/05/2010
0 PROLOGUE
Le contenu du prsent document se focalise principalement sur les aspects de Programmation Oriente Objet
appliqus au langage Java et tient pour acquis un certain nombre de concepts et dlments de base de la
programmation et communs diffrents langages, tels que le langage C, C++, C#, etc. (nda : voir le cours Le langage
C ou Le langage C++ du mme auteur).
La matrise de notions telles que les principes de mot-clef , d instruction , et de variable , les structures de
contrle, les tableaux, les fonctions, les pointeurs et les types de variables complexes principalement les structures
est imprative pour apprhender les nouveaux lments amens.
5 / 59
1.1.0.1 07/05/2010
1
2
3
4
5
6
7
Les concepteurs du langage Java sont James Gosling et Patrick Naughton, employs de Sun Microsystems.
La version actuelle (juillet 2009) est la 6 update 13 .
Concept repris par le langage C# et le framework .Net.
JVM : Java Virtual Machine (eng) [ Machine Virtuelle Java (fr).
Un mme code source Java, une fois compil, peut donc tre excut sous Windows, Linux, MacOS, Solaris, etc.
Applet : application graphique pouvant sexcuter dans une page web.
Appel JRE (Java Runtime Environment (eng) [ environnement dexcution Java (fr)), parfois abrg en JSE ou J2SE (Java Standard Edition /
Java2 Standard Edition (eng) [ dition Standard de Java / dition Standard de Java2 (fr)). Pour les devloppeurs, il faut se tourner vers le JDK
(Java Development Kit (eng) [ Kit de Dveloppement Java (fr)) qui comprend le JRE et lenvironnement de dveloppement.
Write once, run everywhere (eng) [ crire une fois, sexcuter partout (fr).
6 / 59
1.1.0.1 07/05/2010
2 NOTIONS DE BASE
2.1 LA PROGRAMMATION ORIENTE OBJET
Java est un langage de programmation tout objet, la syntaxe proche du C++. On ne manipule donc que des objets.
2.1.1
Le terme objet dsigne une entit informatique spcifique, qui est une reprsentation abstraite simplifie dun objet
concret et abstrait du monde rel ou virtuel. Un objet appartient une famille dobjets et possde des variables
associes et des fonctions associes ; en terminologie objet, on parle respectivement de classe (famille dobjets),
attributs 1 (variables) et mthodes (fonctions).
Lorsque lon fait rfrence une classe, le terme de membres dsigne les attributs et les mthodes de cette classe.
Ex. : Soit la classe Vehicule reprsentant la notion de vhicule du monde rel.
Vehicule
- couleur : int
- vitesse : int
+ Vehicule()
+ arreter() : void
+ demarrer() : void
Figure 2.1 : exemple dun objet (classe, attributs et mthodes, visibilit des membres)
La programmation oriente objet (POO) peut tre dfinie par les trois grands principes suivants :
Y lencapsulation ;
Y lhritage de classe ;
Y le polymorphisme.
2.1.2
2.1.2.1
Principes
Lencapsulation
Lencapsulation consiste prserver la valeur des attributs de lobjet ; ceux-ci ne sont accessibles de lextrieur de
la classe que par lintermdiaire des mthodes de la classe. Les attributs sont dits alors privs (accs direct restreint
la classe seulement) ou protgs (accs direct restreint la classe et aux ventuelles sous-classes), alors que les
mthodes sont gnralement publiques 2 (accs possible lintrieur et lextrieur de la classe).
Ex. : Seules les mthodes demarrer() et arreter() peuvent modifier lattribut vitesse.
Pour tout attribut qui doit tre accessible de lextrieur de la classe, on crit en gnral 2 mthodes spcifiques
appeles accesseurs ; on distingue les accesseurs en lecture, permettant de connatre la valeur dun attribut (prototype
usuel : type_attribut getAttribut()) et les accesseurs en criture permettant daffecter une valeur un attribut
(prototype usuel : void setAttribut(type_attribut newvaleur)).
Lattribut peut alors tre considr comme tant public, mais la diffrence par rapport une relle dfinition
publique est que les accesseurs peuvent contrler la lecture ou lcriture de lattribut (notamment viter une valeur
dcriture errone, ou bien transmettre une valeur de lecture mise lchelle, etc.)
1
2
1.1.0.1 07/05/2010
Ex. : Les attributs de la classe Vehicule sont protgs grce la visibilit prive (), alors que les mthodes sont
publiques (+). Nanmoins, pour permettre une collaboration avec lextrieur de la classe, on associe lattribut
couleur un accesseur en lecture (int getCouleur()) et un accesseur en criture (void setCouleur(int cc)).
Vehicule
- couleur : int
- vitesse : int
+
+
+
+
+
Vehicule()
arreter() : void
demarrer() : void
getCouleur() : int
setCouleur(int) : void
2.1.2.2
Lhritage de classe
Lhritage de classe permet de crer une nouvelle classe partir dune classe dj existante. Cela permet ainsi de
prciser, ou mettre jour une classe. Du fait de lhritage, la nouvelle classe possde automatiquement les mmes
membres que la classe dj existante 1, lesquels peuvent tre complts par de nouveaux attributs et nouvelles
mthodes. Dans le cadre de cet hritage, la classe dj existante est appele la super-classe, et la nouvelle classe est
appele la sous-classe.
Ex. : Soit une classe qui reprsente un vhicule, et deux autres reprsentant une voiture et un vlo. Une voiture est
une sorte de vhicule ; un vlo est aussi une sorte de de vhicule. Dans les relations Vehicule/Voiture et
Vehicule/Velo, Vehicule est donc la super-classe ; Voiture et Velo sont donc les sous-classes.
Voiture
Vehicule
#
#
#
-
couleur : int
marque : char*
modele : char*
type : char*
+
+
+
+
+
accelerer() : void
arreter() : void
demarrer() : void
Vehicule()
~Vehicule()
- puissance : int
+ fairePlein(int) : void
+ Voiture()
+ ~Voiture()
Velo
- nbVitesses : int
+ changerPneu() : void
+ Velo()
+ ~Velo()
2.1.2.3
Le polymorphisme
Le polymorphisme 2 est caractris par la dfinition de plusieurs mthodes homonymes, mais dont le comportement
et/ou la signature 3 diffrent, ou bien qui sappliquent des types dobjets distincts.
Il existe plusieurs types de polymorphismes :
Y polymorphisme ad hoc : 2 classes diffrentes possdent chacune une mthode homonyme (nom et signature
identiques) mais dont le comportement est diffrent (adapt chaque classe) ; aussi appel surcharge 4 ;
Ex. : Les classes Vehicule et Ordinateur possdent toutes les deux une mthode demarrer() ; mais les
actions de cette mthode sont diffrentes pour chacune des 2 classes (par exemple demarrer() pour
Vehicule inclut
insererClef(), etc. alors que demarrer() pour Ordinateur inclut
allumerEcran(), etc.).
Y polymorphisme dhritage : 1 sous-classe hrite dune mthode
1
2
3
4
5
6
1.1.0.1 07/05/2010
Ex. : La classe Velo hrite de la mthode demarrer() de la classe Vehicule ; mais celle-ci est redfinie
pour tre adapte la classe Velo (par exemple demarrer() pour la sous-classe Velo inclut pedaler(),
etc., alors que demarrer() pour la super-classe Vehicule inclut insererClef(), etc.).
Y polymorphisme paramtrique : 1 classe possde plusieurs dfinitions dune mthode homonyme mais dont la
Environnement de dveloppement
Pour dvelopper en Java, un diteur de texte associ un compilateur Java peut suffire. Mais on peut aussi utiliser
des outils de dveloppement, comme des AGL 2 (NetBeans, Eclipse, JBuilder, etc.) qui incluent les outils de base
ncessaires (diteur de texte et compilateur) et proposent un certain nombre de fonctionnalits qui simplifient la
construction dapplications (dbogueur, outils graphiques RAD, etc.).
Le code source Java (fichier .java) est compil dans un premier temps ; le rsultat de cette compilation est un fichier
(.class) et constitue ce quon appelle alors le bytecode 3. Ce bytecode est alors interprt par la machine cible, au
moyen de la machine virtuelle Java, propre la plate-forme en cours dutilisation sur cette machine.
Dans son exploitation gnrale, Java est donc un langage compil et interprt ; mais on peut aussi dvelopper de
manire classique pour une plate-forme spcifique, en effectuant une compilation native 4.
La cration dun fichier exploitable partir dun fichier source Java suit les tapes suivantes :
package monPackage;
public class MaClass
{
MaClasse() { ...
fichier
source Java
(.java)
101100101100100011
110110110100110
compilation
Ordinateur
interprtation
fichier
bytecode
(.class)
compilation native
Systme dexploitation
Machine
Virtuelle Java
101100101100100011
110110110100110
fichier
excutable
(.exe)
excution
2.2.2
La syntaxe Java est drive de la syntaxe C++ ; nanmoins, on note les diffrences suivantes :
Y Un fichier source Java porte lextension .java ;
5
Y Un fichier source ne contient quune seule classe et il porte le nom de la classe (NomClasse.java) ; dans un
tout objet, il ne reste plus que les variables de type primitif 6 qui ne sont pas instancis ;
7
Y La destruction des objets est ralise de manire automatique ds lors que ceux-ci ne sont plus rfrencs ;
1
2
3
4
5
6
7
1.1.0.1 07/05/2010
Y Pas de prprocesseur (#include, etc.), pas de macros, pas de variables globales, pas dhritage multiple, pas
de surcharge doprateurs 1.
Ex. :
UneClasse.java
package MonPackage;
public class UneClasse
{
private int i;
public UneClasse(int ii) // constructeur avec 1 argument de type int
{
this.i = ii; // initialisation de l'attribut i l'aide de l'argument
}
MonApplication.java
package MonPackage;
public class MonApplication
{
private int x;
private int tab[];
private UneClasse unObjet;
public MonApplication() {}
public static void main(String[] args)
{
this.x = 5; // utilisation de this car x est attribut, pas variable
tab = new int[4]; // instanciation du tableau (un tableau est un objet)
unObjet = new UneClasse(x); // instanciation d'un objet de UneClasse
unObjet.uneMethode(); // appel d'une mthode de UneClasse
System.out.println(tab.length); // affichage de la longueur du tableau
}
}
1
lexception de la surcharge de loprateur + pour la classe String, qui permet de concatner des chanes.
10 / 59
2.2.3
1.1.0.1 07/05/2010
Les classes sont regroupes en bibliothques de classes, appeles paquetages 1 ; lesquelles permettent dutiliser les
diverses ressources de la machine (capacits graphiques, rseau, base de donnes, etc.). Elles reprsentent ce quon
appelle lAPI 2 de Java. Ainsi, lorsque le langage Java subit un changement de version, cest principalement lAPI qui
est modifi, avec la mise jour et/ou le rajout de classes.
Chaque paquetage se rapporte un domaine prcis : composants graphiques, composants rseaux, etc.
LAPI de Java est hirarchis :
Y java.lang, java.util : classes de base et utilitaires du langage (importes par dfaut) ;
Y java.io : entres/sorties ;
Y java.net : rseau ;
Y java.awt, java.swing : graphique ;
Y etc.
Pour utiliser une classe, ou bien tout ou partie dun paquetage dj existant, il faut importer la/les classe(s) grce au
mot-clef import suivant la syntaxe import chemin.bibliotheque;.
Ex. : import java.awt.Button;
import java.awt.font.*;
import java.awt.*;
Toute classe appartient un paquetage. Si on nen spcifie pas un explicitement, un paquetage par dfaut est
attribu, qui correspond au nom du projet auquel appartient la classe.
On peut aussi dfinir ses propres paquetages et les utiliser par la suite dans ses propres programmes.
Le langage Java utilise les types classiques suivants, dits aussi types primitifs car non-objets :
Y boolean : boolen (true/false) ;
Y byte, short, int, long : entier sur 8, 16, 32, 64 bits ;
Y float, double : rel sur 32, 64 bits (pour float, on suffixe les littraux avec f, ex : float x =
1.4f;) ;
3
Y char : caractre sur 16 bits au standard Unicode (ex. : char c = '\u0040'; ou char c = 'A';) ;
Y void : type vide , aucun type.
Mais il existe aussi des types prdfinis objet :
Y String : chane de caractres.
2.3.2
Les constantes
Java ne possde pas de macros 4. Pour dfinir une constante, on utilise le modificateur final 5 suivant la syntaxe
final type_variable nomVariable.
Ex. : final int NB = 5;
2.3.3
Le type String reprsente une chane de caractres. Ce type est en ralit un objet et doit donc tre instanci
dynamiquement.
1
2
3
4
5
1.1.0.1 07/05/2010
Les caractres spciaux connus peuvent aussi tre utiliss : \r (retour chariot), \n (saut de ligne),
\t (tabulation), \b (retour arrire), \f (saut de page).
Le caractre \ est le caractre dchappement et permet par exemple dinsrer le caractre " (guillemet) dans une
chane.
En tant quobjet, le type String possde donc des attributs et des mthodes. On notera par exemple les mthodes
length() et equals().
2.3.4
Les tableaux
Les tableaux sont considrs comme des objets et doivent donc tre instancis dynamiquement.
Il existe deux types de dclarations possibles pour les tableaux :
Y type nom_tableau[] : classique, comme en C++ ;
Y type[] nom_tableau : le type type[] est considr comme un objet.
Ex. : int tab1[] = new int[10];
int[] tab2 = new int[10];
En tant quobjet, un tableau possde des attributs et des mthodes. On notera par exemple lattribut length, comme
les mthodes toString() et equals().
On peut videmment crer des tableaux plusieurs dimensions.
Ex. : double[][] nombres = new double[10][20];
Nb : Les objets String (objet de type String) et String[] (tableau dobjets de type String) sont deux objets
compltements diffrents ; ils nont donc pas les mmes attributs et les mmes mthodes.
2.4.1
Pour valuer une expression, on utilise un ou plusieurs oprateurs, parmi 2 types diffrents :
Y oprateurs de tests :
` == : gal ;
` != : diffrent ;
` > : strictement suprieur ;
` < : strictement infrieur ;
` >= : suprieur ou gal ;
` <= : infrieur ou gal.
Y oprateurs logiques :
` && : ET ;
` || : OU ;
` ! : NON.
Le rsultat obtenu est un boolen (true/false).
12 / 59
1.1.0.1 07/05/2010
La priorit des oprateurs est la suivante (du plus prioritaire au moins prioritaire) :
Y parenthses ;
Y incrmentation, dcrmentation ;
Y multiplication, division, modulo ;
Y addition, soustraction ;
Y comparaison ;
Y affectation.
2.4.2
2.4.2.1
Les tests
Test simple si sinon
Pour raliser un test simple si sinon , on utilise linstruction if () ventuellement associe avec
linstruction else, suivant la syntaxe :
if (expression) {
/* instructions excuter si expression vraie */
}
else {
/* instructions excuter si expression fausse */
}
2.4.2.2
Pour raliser un test multiple au cas o faire , on utilise les instructions switch () et case ventuellement
associes avec linstruction default, suivant la syntaxe :
switch (variable) {
case valeur1 : /* instructions si variable vaut valeur1 */
break;
case valeur2 : /* instructions si variable vaut valeur2 */
break;
...
default : /* instructions si variable ne vaut aucune des valeurs */
}
2.4.3
Loprateur ternaire
Loprateur ternaire peut tre utilis, la place dune structure de test base de if, pour affecter rapidement une
valeur une variable. La syntaxe est la suivante :
variable = (expression) ? valeur_si_expression_vraie : valeur_si_expression_fausse;
2.4.4
2.4.4.1
Les boucles
Boucle tant que faire
Pour raliser une rptition tant que faire avec aucune excution au minimum, on utilise linstruction
while (), suivant la syntaxe :
while (expression) {
/* instructions rpter si expression vraie */
}
2.4.4.2
Pour raliser une rptition rpter tant que avec au moins 1 excution, on utilise les instructions do et
while (), suivant la syntaxe :
do {
/* instructions rpter si expression vraie */
}
while (expression);
13 / 59
2.4.4.3
1.1.0.1 07/05/2010
Pour raliser une rptition contrle pour faire , on utilise linstruction for (), suivant la syntaxe :
for (initialisation ; expression ; modification) {
/* instructions rpter si expression vraie */
}
objet 1
objet 2
message
Figure 2.5 : envoi de message entre deux objets lors dun vnement
Dans un environnement graphique, il y a une grande quantit dvnements possibles, et un objet ne sera intress
que par une partie dentre eux. Par consquent il faut spcifier les vnements que chaque objet doit prendre en
considration ; on utilise pour cela un objet qui est appel un couteur 1.
Un mme objet peut tre intress par plusieurs vnements ; rciproquement, un mme type dvnements peut
intresser plusieurs objets diffrents.
La gestion dvnements revient donc dfinir une communication entre deux objets grce un couteur ; lun des
objets est donc metteur du message, alors que lautre est rcepteur.
Ex. : Soit un objet JButton auquel on dsire associer lvnement actionPerformed (clic sur le bouton).
public class Frame1 {
objet metteur
du message
association
dun nouvel
couteur
jButton1
vnement
gr
}
});
message
...
void jButton1_actionPerformed(ActionEvent e)
{
System.out.println("");
}
}
Il existe plusieurs types dcouteurs ; chacun dentre eux est spcialis et est dfini par une classe :
Y class ActionListener : gestion des vnements standard : clic sur un bouton, double-clic sur un
lment de liste, choix dun lment dun menu, validation dun champ texte ;
Mthode : actionPerformed().
couteur (fr) [ listener (eng) ; il faut comprendre couteur dvnements , cest--dire tre lcoute dun vnement .
14 / 59
1.1.0.1 07/05/2010
perte de focus) ;
Mthodes : focusGained(), focusLost().
Y class TextListener : gestion dun composant de type texte ;
Y
...
private void jbInit() throws Exception
{
JButton jButton1 = new JButton();
JTextField jTextField1 = new JTextField();
...
}
jbInit() (initialisation de
lIHM) est susceptible de
dclencher une exception
Le bloc catch () doit tre mentionn mme si aucun traitement particulier de lexception nest dfini
(catch (Exception e) {}).
Nb : Lors du traitement dune exception dans une mthode, on peut faire le choix suivant : soit traiter lexception l
o cela est ncessaire, en utilisant pour cela try / catch () ; soit ne pas traiter lexception directement, et laisser
alors la mthode appelante sen occuper, en le lui faisant savoir en utilisant la dclaration throws.
Ex. : Dans lexemple prcdent, il a t dcid que jbInit() ne traiterait pas lexception, et cette mthode a donc
t dclar ainsi : void jbInit() throws Exception {...}. Ainsi, cest la mthode appelant jbInit(), en
loccurrence Frame1(), de grer lexception, en utilisant try / catch ().
15 / 59
1.1.0.1 07/05/2010
Dans le cas dun bloc dinstructions ou bien dune mthode susceptible de gnrer plus dun seul type dexceptions
diffrentes, la gestion des exceptions peut se faire de 2 manires diffrentes :
Y On traite chaque exception indpendamment : on aura alors 1 bloc try {}, et autant de blocs catch () {}
Y On traite toutes les exceptions de la mme manire : on aura alors 1 bloc try {}, et 1 seul bloc catch()
{} grant tout type dexception possible (tout type dexception hrite de la classe Exception (ex. : signature
de la classe IOException : public class IOException extends Exception {...})).
Ex. :
try {
//
//
}
catch
//
//
}
On appelle application console 1 une application qui ne met en jeu quune fentre de type texte et qui pourra nous
permettre dafficher diffrents rsultats.
La fentre texte est ce quon appelle la console, qui sera donc ici une console Java.
La structure gnrale du code Java pour une application console est donc la suivante :
UneClasse.java
package MonPackage;
public class UneClasse
{
// attributs
...
// mthodes
public UneClasse() // constructeur par dfaut (sans argument)
{
...
}
public void uneMethode()
{
System.out.println("mthode uneMethode() de la classe UneClasse");
}
...
}
1
Dite aussi CUI : Console User Interface (eng) [ Interface Utilisateur Console (fr).
16 / 59
1.1.0.1 07/05/2010
MonApplication.java
package MonPackage;
public class MonApplication // classe principale
{
// attributs
...
// mthodes
public MonApplication() // constructeur par dfaut (sans argument)
{
...
}
public static void main(String[] args)
{
MonApplication monApp; // dclaration d'un objet de la classe elle-mme
monApp = new MonApplication(); // instanciation d'un objet de la classe
System.out.println("bonjour\n"); // affichage console
UneClasse unObjet;
unObjet = new UneClasse(); // instanciation d'un objet de UneClasse
unObjet.uneMethode(); // appel d'une mthode de UneClasse
...
}
}
La machine virtuelle Java excute la mthode principale main(). Celle-ci doit absolument tre publique (public),
pour pouvoir tre appele (excute) de lextrieur de la classe ; elle doit aussi absolument tre statique (static) pour
pouvoir tre appele sans que lon dispose dune instance de la classe 1 ; enfin, la signature doit absolument faire
apparatre un tableau de chanes en tant quarguments dentre (String[] arguments). La dclaration complte de
la mthode main() est donc : public static void main(String[] args).
La mthode main() excute ensuite un code qui doit alors 2 instancier un objet de la classe, afin que les mthodes
non statiques de la classe principale puissent tre invoques.
Les affichages console se font en utilisant la classe System, qui possde des mthodes statiques ; celles-ci peuvent
donc tre appeles sans disposer dune instance de cette classe. Cette classe permet notamment de grer les flux
dentres/sorties standard :
Y entre standard : clavier (System.in.*) ;
Y sortie standard : cran (System.out.*) ;
Y erreur standard : cran (System.err.*).
2.7.2
Une application graphique 3 est une application console laquelle on a rajout une interface graphique 4.
Lapplication possde alors 2 fentres :
Y fentre graphique (interface graphique) : application graphique ;
Y fentre texte (console java) : permet dafficher les messages dexceptions interceptes.
Par consquent, toute application java (graphique ou texte) comprend toujours une console, qui nest pas affiche
automatiquement dans le cas dune application graphique, mais qui est disponible si besoin est.
La partie application graphique drive 5 de la classe Frame (ou JFrame).
La structure gnrale du code Java pour une application graphique est donc la suivante :
1
2
3
4
5
Comme en Java les mthodes, et donc la mthode main(), sont dclares lintrieur de la classe, il est impossible davoir pu crer un objet
de la classe elle-mme au moment de la dfinition de la mthode main() ; celle-ci est donc dclare statique, et peut alors tre appele sans
que lon ait instanci un objet de la classe.
Entre autres.
Dite aussi GUI : Graphical User Interface (eng) [ Interface Utilisateur Graphique (fr).
Dite aussi IHM : Interface Homme-Machine.
Au sens objet.
17 / 59
1.1.0.1 07/05/2010
Cadre1.java
package MonPackage;
import java.awt.*; // importation de librairies graphique
import javax.swing.*; // importation de librairies graphique
public class Cadre1 extends Frame
{
// attributs
...
// mthodes
public Cadre1()
{
...
}
public void uneMethode()
{
...
}
...
}
MonApplication.java
package MonPackage;
public class MonApplication // classe principale
{
// attributs
...
// mthodes
public MonApplication()
{
...
}
public static void main(String[] args)
{
MonApplication monApp = new MonApplication();
Cadre1 monCadre = new Cadre1();
...
}
}
En gnral on tend respecter la sparation traitements / graphique 1, limage de la sparation fentre texte /
fentre graphique, et on utilise alors une classe (voire plusieurs), autre que linterface graphique, pour raliser les
traitements.
2.7.3
Les applets
On appelle applet une application graphique qui sexcute lintrieur de la fentre dun navigateur internet.
Pour crer une applet, il faut driver de la classe Applet.
La structure gnrale du code Java pour une applet est donc la suivante :
Modle MVC : Model View Controller (eng) [ Modle Vue Contrleur (fr), sparation des traitements et de lIHM.
18 / 59
1.1.0.1 07/05/2010
Applet1.java
package MonPackage;
import java.applet.*; // importation du paquetage applet
public class Applet1 extends Applet
{
// attributs
...
// mthodes
public void init()
{
...
}
...
}
Lorsque le navigateur charge une page HTML contenant une applet, il charge donc lapplet elle-mme, puis
instancie un objet de la classe principale (drive de la classe Applet). Cest la fentre du navigateur qui sert de
conteneur graphique lapplet.
Si on veut que lapplet puisse aussi tre excute en dehors dun navigateur web, comme une simple application
graphique, il suffit dcrire la mthode main() qui sera appele lors dune excution classique.
19 / 59
1.1.0.1 07/05/2010
3 LHRITAGE
3.1 LHRITAGE SIMPLE
3.1.1
Principes
En tant que langage objet, Java implmente le concept dhritage de classes. En revanche, contrairement au C++,
Java ne permet pas dhritage multiple, et on ne peut donc driver que dune seule classe 1.
Pour dfinir une sous-classe partir dune super-classe, on utilise le mot-clef extends, suivant la syntaxe
SousClasse
La sous-classe hrite ainsi des attributs et des mthodes de la super-classe ; les mthodes peuvent bien videmment
tre redfinies par surcharge le cas chant.
3.1.2
Hirarchie de classes
En Java, toutes les classes drivent implicitement de la classe Object, qui est appele classe-mre. Cet hritage
peut tre direct, ou bien peut provenir de plusieurs relations dhritages successives.
Object
Component
Button
File
Container
Panel
Label
Number
Double
Integer
Window
Dialog
Frame
Lensemble des classes et des relations dhritage entre ces classes forment alors une arborescence (hirarchie) au
sommet de laquelle se situe la classe Object.
Cette hirarchie unique permet de dfinir des comportements communs pour toute classe Java.
Ainsi, une classe qui nhrite apparemment daucune autre, hrite en fait implicitement de la classe Object.
1
Ceci pourrait apparatre comme une faiblesse de Java par rapport au C++. En ralit cette particularit a le mrite dviter les difficults de
programmation lies lhritage multiple ; la notion dinterface (cf. 3.2) permet de palier en partie ceci.
20 / 59
1.1.0.1 07/05/2010
Une classe quelconque cre par lutilisateur hrite donc toujours, mme indirectement, de la classe Object.
La consquence est que les mthodes 1 de la classe Object se retrouvent alors dans toute classe Java. Par exemple,
la mthode toString() est drive dans toutes les classes Java ; cette mthode affiche le nom de la classe sous forme
de chane, sauf bien videmment pour les classes qui ont redfinies cette mthode 2.
Comme le constructeur dune classe fait un appel implicite au constructeur de la classe dont il drive, une autre
consquence est que lon fera donc toujours appel, au final, au constructeur de la classe Object en enchanant les
diffrents constructeurs des relations dhritage existantes entre la classe utilisateur et la classe Object.
3.1.3
Pour tre accessible par une sous-classe, les attributs et les mthodes dune super-classe doivent tre dclares
protgs (protected : seules les sous-classes peuvent y accder), voire publics (public : tout le monde y a accs).
On peut faire appel un attribut ou bien une mthode de la super-classe en utilisant loprateur super qui
fonctionne lidentique de loprateur this.
Pour accder un attribut de la super-classe, on crit donc super.nomAttribut et pour une mthode
super.nomMethode().
Ex. :
SuperClasse.java
package MonPackage;
public class SuperClasse
{
protected int i;
public SuperClasse()
{
...
}
}
SousClasse.java
package MonPackage;
public class SousClasse extends SuperClasse // SousClasse drive de SuperClasse
{
private int i;
public SousClasse()
{
...
}
public uneMethode
{
i = 0;
this.i = 1;
super.i = 5;
}
}
1
2
1.1.0.1 07/05/2010
La premire action ralise par le constructeur dune sous-classe est dexcuter le constructeur par dfaut de la
super-classe dont il dpend, et ce de manire automatique, sans que cela soit visible dans le code ; en revanche, si un
appel explicite lune des surcharges du constructeur de la super-classe est fait, alors il ny a plus besoin dinvoquer le
super -constructeur par dfaut.
Lorsque lon dsire faire appel au constructeur de la super-classe, on crit super(). Cette mthode publique est
surcharge autant de fois que le constructeur de la super-classe est lui-mme surcharg, en respectant alors les
diffrentes signatures existantes.
Ex. :
SuperClasse.java
package MonPackage;
public class SuperClasse
{
public SuperClasse()
{
...
}
public SuperClasse(int a)
{
...
}
public SuperClasse(double db, int b)
{
...
}
}
SousClasse.java
package MonPackage;
public class SousClasse extends SuperClasse
{
public SousClasse()
{
super(); // appel implicite, donc inutile
}
public SousClasse(int aa)
{
super(aa); // appel du constructeur surcharg sinon appel implicite super()
}
public SousClasse(double ddb, int bb)
{
super(ddb, bb); // appel du constructeur surcharg (sinon appel super())
}
}
On dit quune mthode dune classe est abstraite si seul son prototype est dfini, et quaucun code nest donn. Son
implmentation complte devra en fait tre crite par chaque sous-classe qui drivera de cette classe.
Une mthode abstraite dune classe doit donc obligatoirement tre surcharge dans chaque sous-classe drive.
22 / 59
1.1.0.1 07/05/2010
La super-mthode ne constitue alors que la dfinition dun concept, que chaque sous-classe sera libre
dimplmenter selon ses besoins.
Une mthode abstraite se dclare en utilisant le mot-clef abstract.
Ex. :
Cercle
FormeGeometrique
+ calculerAire() : double
+ Cercle()
Carre
+ calculerAire() : double
+ Carre()
FormeGeometrique.java
package Geometrie;
public abstract class FormeGeometrique
{
public FormeGeometrique()
{
...
}
public abstract double calculerAire(); // dfinition du prototype uniquement
}
Cercle.java
package Geometrie;
public class Cercle extends FormeGeometrique
{
private double rayon;
public Cercle(double r)
{
this.rayon = r;
}
public double calculerAire() // implmentation de la mthode abstraite
{
return (java.lang.Math.PI * this.rayon * this.rayon);
}
}
Carre.java
package Geometrie;
public class Carre extends FormeGeometrique
{
private double cote;
public Carre(double c)
{
this.cote = c;
}
23 / 59
1.1.0.1 07/05/2010
Si une classe comprend une mthode abstraite, alors la classe elle-mme doit tre dclare abstraite (public
abstract class MaClasse { ... }).
La consquence directe du caractre abstrait de la classe est quon ne peut pas instancier dobjets de cette
classe 1. La classe est donc pleinement destine demeurer une classe concept , cest--dire une classe qui constitue
un modle pour dautres classes.
Lors de la dfinition dune sous-classe partir dune super-classe abstraite, toute mthode abstraite doit
obligatoirement tre code ; sinon elle doit tre dclare abstraite, et de fait, la classe laquelle elle appartient doit
ltre aussi. La sous-classe constitue alors elle aussi un modle pour dautres classes 2.
3.2.2
En Java, on appelle interface une classe abstraite dont toutes les mthodes sont abstraites (abstract) et tous les
attributs sont constants (final).
On dclare une interface avec le mot-clef interface, qui vient en remplacement du mot-clef class.
public interface MonInterface {
// attributs
int i = 0; // initialisation obligatoire des attributs (doit tre constant)
...
// mthodes
void uneMethode(); // dfinition du prototype des mthodes
...
}
De par sa nature, une interface a implicitement et automatiquement des attributs publics (public), statiques
(static) et constants (final), ainsi que des mthodes publiques (public) et abstraites (abstract) ; il est donc
inutile de prciser ces diffrents modificateurs.
De la mme manire, une interface ne dfinit pas de constructeur.
En gnral, on assimile une interface une classe de services, cest--dire une classe qui est utilise par dautres
classes pour implmenter une fonctionnalit quelles doivent proposer ; ces fonctionnalits sont appeles services 3.
Ex. : Une classe qui utilise linterface Runnable doit implmenter la mthode run() qui autorise la
fonctionnalit excution en tant que thread (multi-tches).
En dautres termes, une interface ne fait que reprsenter, sans limplmenter, un comportement que doit suivre
certaines classes, laissant ainsi la libert chaque classe de limplmenter selon ses besoins.
3.2.3
Implmentation
Une fois le type de service dfini pour un groupe de classes travers une interface, on utilise cette dfinition de
service en drivant de linterface.
Plus spcifiquement, on dit quune classe implmente une interface si cette classe fournit les dfinitions de toutes
les mthodes dclares dans linterface.
Pour marquer ce principe dimplmentation ralis par la sous-classe, on utilise le mot-clef implements suivant la
syntaxe public class MaClasse implements MonInterface {...}.
1
2
3
Ce qui est logique tant donn quelle possde au moins une mthode dont le code nest pas donn (la mthode abstraite).
On peut ainsi imaginer une hirarchie de classes abstraites, servant de modles lors dune implmentation.
Usuellement, le nom dune interface possde un suffixe en ible ou able, marquant ainsi la capacit de service offerte (ex. Runnable).
24 / 59
<<interface>>
MonInterface
1.1.0.1 07/05/2010
MaClasse
MonInterface.java
package MonPackage;
public interface MonInterface
{
...
}
MaClasse.java
package MonPackage;
public class MaClasse implements MonInterface
{
...
}
Une interface peut hriter dune autre interface. Cependant la limitation lhritage simple est identique celles des
classes.
Ex. :
MonInterface.java
package MonPackage;
public interface MonInterface
{
...
}
MonAutreInterface.java
package MonPackage;
public interface MonAutreInterface extends MonInterface // hritage d'interface
{
...
}
La hirarchie des relations dhritage et celle des implmentations dinterfaces sont totalement indpendantes. Ainsi,
une classe peut hrite dune autre classe et elle peut aussi, en mme temps, implmenter une ou plusieurs interfaces.
Ex. :
public class MaClasse extends SuperClasse implements MonInterface
{
...
}
De fait, le concept dinterface est souvent vu comme la possibilit de raliser un hritage multiple en Java.
25 / 59
3.2.4
1.1.0.1 07/05/2010
Soit la dfinition de linterface FormeGeometrique suivante, et des classes Cercle et Carre qui implmentent
cette interface.
Cercle
<<interface>>
FormeGeometrique
+ Cercle()
+ calculerAire() : double
+ dessiner() : void
Carre
+ calculerAire() : double
+ dessiner() : void
+ Carre()
+ calculerAire() : double
+ dessiner() : void
FormeGeometrique.java
package Geometrie;
public interface FormeGeometrique
{
public void dessiner();
public double calculerAire();
}
Cercle.java
package Geometrie;
public class Cercle implements FormeGeometrique // implmente l'interface
{
private int rayon;
public Cercle(int r)
{
this.rayon = r;
}
public void dessiner() // implmentation adapte au cercle
{
g.drawOval(0, 0, 2 * this.rayon,2 * this.rayon);
}
public double calculerAire() // implmentation adapte au cercle
{
return (java.lang.Math.PI * this.rayon * this.rayon);
}
}
Carre.java
package Geometrie;
public class Carre implements FormeGeometrique
{
private int cote;
public Carre (int c)
{
this.cote = c;
}
26 / 59
1.1.0.1 07/05/2010
On peut alors dfinir une liste de formes gomtriques diffrentes auxquelles on peut appliquer le mme traitement,
puisque toutes les formes implmentent linterface FormeGeometrique.
Ex. : Une classe Dessin, qui permet de grer un ensemble de formes gomtriques, de les dessiner, ainsi que de
calculer laire de chacune des formes.
Dessin.java
package Geometrie;
public class Dessin
{
private FormeGeometrique[] listeFormes; // dclaration d'un tableau de formes
public Dessin()
{
listeFormes = new FormeGeometrique[] { // initialisation du tableau
new Cercle(100), // Cercle est une sorte de FormeGeometrique
new Carre(300) // Carre est une sorte de FormeGeometrique
};
}
public void toutDessiner() // dessine toutes les formes
{
for(int i=0 ; i<listeFormes.length ; i++)
listeFormes[i].dessiner(); // appel de dessiner() adapte
}
public double[] toutCalculerAire() // calcule l'aire de toutes les formes
{
double[] aires = new double[listeFormes.length];
for(int i=0 ; i<listeFormes.length ; i++)
aire[i] = listeFormes[i].calculerAire();
return (aires);
}
}
listeFormes[0], bien qutant un objet dclar comme tant du type FormeGeometrique
(private FormeGeometrique[] listeFormes;), a t instanci laide du constructeur Cercle() (new
1
Cercle(100)), par consquent, il sagit bien l dune instance de la classe Cercle . Donc lorsque la mthode
dessiner() est appele pour cet objet (listeFormes[i].dessiner(); pour i = 0), on appelle bien la mthode
dessiner() de la classe Cercle(), donc celle adapte ce que reprsente lobjet.
Cest la mme chose pour i = 1, o on fait rfrence alors un objet dclar du type FormeGeometrique mais
instanci avec le constructeur Carre() ; bien videmment mmes remarques pour la mthode calculerAire().
Nb : Par souci de clart, le code des diffrentes classes donn ci-dessus a t simplifi ; par consquent il est
inexact, et ne peut pas aboutir une excution correcte.
On met ainsi en avant le fait quil est possible en POO, quun objet soit dun type X la dclaration, et dun type Y lexcution ; il suffit pour
cela que Y soit une sous-classe de X ; ex. : en Java, pour toute classe il est possible dcrire : Object monObjet = new MaClasse();.
27 / 59
1.1.0.1 07/05/2010
Notion de flux
Une application peut avoir faire appel des entits informatiques externes 1 afin de lire ou dcrire des
informations ou des donnes.
La ralisation dune action de lecture ou dcriture constitue ce quon appelle un flux.
Ex. :
Y lorsquune application sauvegarde des donnes dans un fichier, elle utilise un flux dcriture ;
Y lorsquune application lit des informations partir dune base de donnes, elle utilise un flux de lecture.
4.1.2
Dfinitions
Un flux a pour but principal de transfrer des donnes ; il sagit dun outil de communication.
Il constitue un canal de transfert de donnes unidirectionnel et squentiel entre deux entits informatiques. Dans une
communication utilisant un flux, lune est donc lmetteur des donnes, et lautre le rcepteur.
Lorsquune communication de ce type est mise en uvre par une application Java, lune de ces entits est donc un
programme Java, alors que lautre pourra tre un fichier, une base de donnes, un socket, un priphrique,
Un programme effectue une lecture dans une base de donnes.
programme
flux
dcriture
fichier
flux de
lecture
programme
Un flux peut transfrer les donnes de manire brute, soit donc octet par octet, ou bien de manire formate, en
transfrant par exemples des double, des int,
On considre que le programme Java est le point central des communications, et on peut alors parler de flux dentre
pour un flux en lecture et de flux de sortie pour un flux en criture.
4.1.3
Externes lapplication elle-mme, donc pouvant tre localises sur la mme machine, ou dautres dans un rseau informatique.
28 / 59
1.1.0.1 07/05/2010
Y flux dcriture :
Ouvrir le flux
Tant quil ya des donnes
crire les donnes
Fermer le flux
Y flux de lecture :
Ouvrir le flux
Tant quil ya des donnes
Lire les donnes
Fermer le flux
4.3.1
Pour grer des flux doctets, on dispose dun ensemble de classes drivant des 2 classes abstraites suivantes :
Y classe InputStream : dfinition des principales mthodes de gestion de flux de lecture doctets ;
Y classe OutputStream : dfinition des principales mthodes de gestion de flux dcriture doctets.
Ces 2 classes tant abstraites, elles ne peuvent donc pas tre instancies. Elles permettent de prciser des
comportements gnraux pour les classes drives.
InputStream
FileInputStream
1
2
ObjectInputStream
ByteArrayInputStream
Les flux standards sont normment utiliss dans le monde Unix, au niveau du shell.
lexception des classes de gestion de flux sur sockets, qui font partie du paquetage java.net.
29 / 59
1.1.0.1 07/05/2010
OutputStream
FileOutputStream
ObjectOutputStream
ByteArrayOutputStream
Ces classes manipulent des octets, cest--dire des donnes non formates ; elles ne sont donc pas forcment des
plus pratiques utiliser dans tous les cas.
4.3.2
Reposant sur les mmes principes que les classes InputStream et OutputStream, on dispose des classes Reader
et Writer qui ralisent des flux de caractres.
Ce sont aussi des classes abstraites qui servent donc de modles pour lensemble des classes de gestion de flux de
caractres.
Reader
InputStreamReader
StringReader
CharArrayReader
BufferedReader
CharArrayWriter
BufferedWriter
FileReader
Writer
OutputStreamWriter
StringWriter
FileWriter
Pour enregistrer des donnes, il faut dabord dterminer si lon doit manipuler des octets ou des caractres ; ce qui
revient choisir entre les classes OutputStream et Writer.
On utilise ensuite la classe hrite correspondante qui permet de grer des flux sur fichier : FileOutputStream ou
FileWriter.
FileOutputStream / FileWriter
programme
octets /
caractres
fichier
30 / 59
1.1.0.1 07/05/2010
On cre alors le flux de sortie en instanciant un objet de la classe et en prcisant en paramtre le nom du fichier
destination du flux.
Ex. : FileWriter outFile = new FileWriter("fichier.txt");
On peut ensuite crire des donnes dans le flux grce la mthode write() de la classe utilise :
Y FileOutputStream : write(byte[]) ;
Y FileWriter : write(String).
Ex. : outFile.write("ceci est un test");
Une fois toutes les donnes dsires crites dans le flux (/enregistres dans le fichier), on referme le flux en utilisant
la mthode close(), prsente dans chacune des classes OutputStream et FileWriter.
Ex. : outFile.close();
Lors du travail avec des fichiers, de nombreuses erreurs peuvent survenir (fichier protg en criture, plus despace
disque, pas de droit dcriture dans le rpertoire, ) ; il est donc ncessaire dintercepter toute erreur ventuelle
dentres/sorties (IOException).
Ex. :
try {
FileWriter outFile = new FileWriter("fichier.txt"); // ouverture du flux
outFile.write("ceci est un test"); // criture dans le flux
outFile.close(); // fermeture du flux
}
catch (IOException e) { // traitement de l'exception du type IO
System.out.println("erreur criture fichier");
}
4.4.2
Pour lire des donnes, il faut dabord savoir si lon doit manipuler des octets (InputStream) ou des caractres
(Reader). On utilise ensuite la classe hrite correspondante qui permet de grer des flux sur fichier :
FileInputStream ou FileReader.
FileInputStream / FileReader
fichier
octets /
caractres
programme
On cre alors le flux dentre en instanciant un objet de la classe et en prcisant en paramtre le nom du fichier
source du flux.
Ex. : FileReader inFile = new FileReader("fichier.txt");
On peut ensuite lire les donnes partir du flux grce la mthode read() de la classe utilise :
Y FileInputStream : read(byte[]) ;
Y FileReader : read(char[], int, int).
Ex. : char[] texte = new char[100];
Une fois toutes les donnes lues partir du flux, on referme le flux en utilisant la mthode close(), prsente dans
chacune des classes InputStream et FileReader.
Ex. : inFile.close();
31 / 59
1.1.0.1 07/05/2010
L encore, de nombreuses erreurs peuvent survenir (fichier illisible, protg en lecture, ) ; il est donc ncessaire
dintercepter toute erreur ventuelle dentres/sorties (IOException).
Ex. :
try {
char[] texte = new char[100]; // tableau pour stocker la lecture
int debut = 200; // indice de dbut de lecture
FileReader inFile = new FileReader("fichier.txt"); // ouverture du flux
inFile.read(texte, debut, texte.length); // lecture de 100 caractres
inFile.close(); // fermeture du flux
}
catch (IOException e) { // traitement de l'exception du type IO
System.out.println("erreur lecture fichier");
}
4.4.3
Cas pratique
Ces classes ne permettent pas de grer un flux directement et doivent en fait tre rattaches un flux sur fichier
prexistant 2.
BufferedOutputStream /
BufferedWriter
programme
buffer octets /
caractres
FileInputStream /
FileReader
fichier
octets /
caractres
FileOutputStream /
FileWriter
octets /
caractres
fichier
BufferedInputStream /
BufferedReader
buffer octets /
caractres
programme
En ralit, la lecture ou lcriture ne se fait pas quen une seule fois ; le buffer utilis pour lire ou crire dans le fichier a une taille prdfinie
(512 octets par dfaut) ; nanmoins lutilisation dun tel procd rduit considrablement le nombre daccs au fichier.
On dit quon ralise alors un chanage de flux.
32 / 59
1.1.0.1 07/05/2010
Ex. :
Ecriture.java
try {
FileWriter outFile = new FileWriter("fichier.txt"); // ouverture du flux
BufferedWriter out = new BufferedWriter(outFile); // chanage du flux
out.write("ligne 1"); // criture dans le flux
out.newLine(); // insertion d'un saut de ligne
out.write("ligne 2"); // criture dans le flux
out.close(); // fermeture du flux
}
catch (IOException e) {
System.out.println("erreur criture fichier");
}
Lecture.java
try {
String texte;
FileReader inFile = new FileReader("fichier.txt"); // ouverture du flux
BufferedReader in = new BufferedReader(inFile); // chanage du flux
while ((texte = in.readLine()) != null) // lecture ligne par ligne
System.out.println(texte);
in.close(); // fermeture du flux
}
catch (IOException e) {
System.out.println("erreur lecture fichier");
}
La srialisation
On appelle srialisation la gestion de flux qui lit ou crit des objets 1. Un flux dobjets est aussi un flux de donnes
(soit donc format), mais adapt aux objets.
Les informations lues ou crites sont transfres comme des sries doctets, do les termes de srialisation (criture
dun objet) et dsrialisation (lecture dun objet).
Pour pouvoir (d)srialiser un objet, il faut que celui-ci implmente linterface Serializable (paquetage
java.io) ; cette interface ne dfinit par ailleurs aucune mthode, lobjet na donc pas tre modifi pour pouvoir tre
lu ou crit dans un flux.
Pour lire ou crire des objets, on utilise alors les classes ObjectInputStream et ObjectOutputStream qui
proposent respectivement les mthodes readObject() et writeObject().
Ex. : Lecture/criture dun objet dans un fichier ; soit lobjet Etudiant suivant :
Etudiant.java
class Etudiant implements java.io.Serializable // peut tre gre par un flux
{
String nom;
float moyenne;
public Etudiant(String sonnom, float samoyenne) // constructeur
{
this.nom = sonnom;
this.moyenne = samoyenne;
}
}
1.1.0.1 07/05/2010
ObjectOutputStream
FileOutputStream
objet
programme
FileInputStream
octets
ObjectInputStream
octets
fichier
fichier
objet
programme
Serialisation.java
...
try {
FileOutputStream fos = new FileOutputStream("obj.dat"); // ouverture du flux
ObjectOutputStream oos = new ObjectOutputStream(fos); // chanage du flux
Etudiant etud1 = new Etudiant("Grard",12f); // instanciation de l'objet
oos.writeObject(etud1); // criture de l'objet dans le flux (sauvegarde)
oos.close(); // fermeture du flux
}
catch (IOException e) {
System.out.println("erreur criture objet");
}
...
Deserialisation.java
...
try {
FileInputStream fis = new FileInputStream("obj.dat"); // ouverture du flux
ObjectInputStream ois = new ObjectInputStream(fis); // chanage du flux
Etudiant e1 = (Etudiant)ois.readObject(); // relecture de l'objet (cast)
ois.close(); // fermeture du flux
}
catch (IOException e) {
System.out.println("erreur lecture objet");
}
catch (ClassNotFoundException cnfe) {
System.out.println("erreur transtypage");
}
...
4.5.2
Persistance
On dit quun objet est persistant si son tat est conserv entre deux instances dune mme application ou
dapplications diffrentes. Le principe consiste sauvegarder ltat de lobjet, gnralement dans un fichier, pour
pouvoir reconstruire ultrieurement un objet identique.
Le mcanisme de srialisation est parfaitement adapt la persistance dun objet. On peut ainsi sauvegarder dans un
fichier ltat dun objet en mmoire lors de la fermeture dune application ; cet tat est ensuite relu lors du lancement
de lapplication 1.
Ex. : Sauvegarde des paramtres de la fentre graphique.
1.1.0.1 07/05/2010
ParametresIHM.java
import java.awt.*;
class ParametresIHM implements java.io.Serializable
{
Point position;
Dimension dimensions;
public ParametresIHM(Point pos, Dimension dims)
{
this.position = pos;
this.dimensions = dims;
}
}
Cadre.java
Import java.io.*;
class Cadre extends Jframe
{
ParametresIHM params;
// constructeur rcuprant les paramtres sauvegards
// si leur valeur ne peut tre rcupre, alors des valeurs par dfaut
// sont attribues
public Cadre()
{
// relecture des paramtres partir du fichier de sauvegarde
try {
FileInputStream fis = new FileInputStream("params.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
params = (ParametresIHM)ois.readObject();
ois.close();
}
catch (IOException e) { // affectation de valeurs par dfaut en cas d'erreur
params = new ParametresIHM(new Point(0,0), new Dimension(50,50));
}
catch (ClassNotFoundException cnfe) {
System.out.println("Erreur: transtypage");
}
...
// utilisation des valeurs des paramtres rcupres
this.setLocation(params.position);
this.setSize(params.dimensions);
}
...
// sauvegarde de la valeur des paramtres de la fentre avant
// fermeture de l'application
void this_windowClosing(WindowEvent e)
{
// rcupration des valeurs courantes des paramtres
params.position = this.getLocation();
params.dimensions = this.getSize();
35 / 59
1.1.0.1 07/05/2010
36 / 59
1.1.0.1 07/05/2010
5 LES APPLETS
5.1 GNRALITS
5.1.1
Dfinition
On appelle applet une application graphique qui sexcute lintrieur de la fentre dun navigateur internet.
Pour crer une applet, il faut driver de la classe Applet contenue dans le package java.applet :
package MonPackage;
import java.applet.*; // importation du paquetage applet
public class Applet1 extends Applet // nouvel applet
{
...
}
5.1.2
Fonctionnement
Lorsque le navigateur charge une page HTML contenant une applet, il charge lapplet elle-mme, puis instancie un
objet de la classe principale (celle drive de la classe Applet). Cest alors la fentre du navigateur qui sert de
conteneur graphique lapplet.
Une applet sexcute donc sous le contrle du navigateur, et non pas sous celui de la machine virtuelle Java 1.
Une applet tant une forme dapplication graphique (fentre graphique + console), la partie graphique saffiche dans
la fentre du navigateur alors que la partie texte saffiche dans la console 2.
En ralit, tout navigateur capable dexcuter une applet fait appel une machine virtuelle Java, quelle soit intgre sous forme de plugin (et
souvent propritaire de fait, ex. : Internet Explorer), ou bien installe sur le systme comme une JVM classique (ex. : Opera).
Par dfaut, la console est gnralement invisible, mais elle peut tre affiche par simple paramtrage du navigateur.
37 / 59
1.1.0.1 07/05/2010
paint()
(re)dessiner
lapplet
start()
initialisation
de lapplet
(re)dmarrage
de lapplet
init()
stop()
start()
instanciation dun
objet Applet
constructeur()
applet mise
en pause
arrt de
lapplet
destroy()
Principes
Une fois lapplet mise au point, notamment en surchargeant les diverses mthodes hrites (init(), start(), etc.)
en fonction de ses besoins, il faut permettre de charger lapplet dans le navigateur pour quelle puisse tre excute.
Ceci ne peut pas tre fait directement, et lapplet ne peut tre charge dans le navigateur que via une page HTML. Il
faut insrer lapplet dans le code HTML, grce lutilisation de la balise <applet>.
Ex. :
Bonjour.java
package MonApplet;
import java.applet.*;
public class Bonjour extends Applet
{
public void paint(java.awt.Graphics g)
{
g.drawString("bonjour",100,100);
}
}
1
La mthode main() est utile aussi pour lcriture et la mise au point de lapplet elle-mme en phase de dveloppement.
38 / 59
1.1.0.1 07/05/2010
Applet.html
<html>
<head></head>
<body>
<applet code="MonApplet.bonjour.class" width=400 height=200>
</applet>
</body>
</html>
5.3.2
Le nom du fichier .class doit tre complet, et doit donc contenir le nom du package (avec son arborescence).
Les 3 attributs de balise code=, width= et height= sont obligatoires. Il existe par contre des attributs optionnels :
Y codebase = adresse_base_URL : prcise le chemin du fichier .class de lapplet (par dfaut cest le
chemin du document HTML qui est utilis) ;
Y alt = message : affiche un message pour les navigateurs comprenant la balise <applet> mais tant dans
limpossibilit dexcuter lapplet (problme de droits par exemple) ;
Y name = instance : prcise le nom de linstance dune autre applet de la page HTML qui peut alors tre
utilis pour tablir une communication entre les 2 applets ;
Y archive = nom_archive_jar : prcise le nom de larchive charger qui contient le fichier .class
mentionn par lattribut code= ;
Y align = left / right / top / bottom ;
Y hspace = espace_horizontal_en_pixels ;
Y vspace = espace_vertical_en_pixels.
Si on veut passer des paramtres lapplet, il faut utiliser pour cela la balise <param> suivant la syntaxe :
<param name = nom_parametre value = valeur_parametre> que lon insre entre les balises <applet>.
On rcupre alors la valeur valeur_parametre du paramtre nom_parametre dans le code de lapplet sous
forme de chane en utilisant la mthode getParameter() hrite de la classe Applet suivant la syntaxe :
String str = this.getParameter("nom_parametre");.
5.3.3
Exemple rcapitulatif
Soit une applet laquelle on va passer deux paramtres que lon va afficher lcran (en les dessinant ) :
Exemple1.java
package MonExempleApplet;
import java.awt.Graphics;
public class Exemple1 extends java.applet.Applet
{
String s1, s2;
public void init()
{
s1 = this.getParameter("chaine1");
s2 = this.getParameter("chaine2");
}
39 / 59
1.1.0.1 07/05/2010
Applet.html
<html>
<head>
<title>exemple Applet</title>
</head>
<body>
<h1>exemple Applet</h1>
<applet
code="MonExempleApplet.Exemple1.class"
width=200
height=100
alt="votre navigateur ne peut pas excuter cette applet"
align="top"
vspace=10
hspace=10
>
<param name="chaine1" value="Bonjour">
<param name="chaine2" value=" tous">
votre navigateur ne peut pas excuter d'applets Java
</applet>
</body>
</html>
code="MonApplet.bonjour.class"
width=200
height=100
archive="bonjour.jar"
>
</applet>
Larchivage sopre en ligne de commande o on utilise la commande jar, qui suit une syntaxe trs proche de la
commande darchivage tar 3. Cependant la commande jar fait plus quun simple archivage ; en effet elle rajoute un
fichier appel fichier manifest qui contient des informations sur larchive .jar cre.
Lors de larchivage sous forme darchive jar, il convient de respecter scrupuleusement larborescence mettant en
avant le nom du paquetage.
Ex. : Pour empaqueter tous les fichiers .class du sous-rpertoire MonApplet/ dans larchive bonjour.jar :
jar cfv bonjour.jar MonApplet/*.class
1
2
3
1.1.0.1 07/05/2010
Contrairement aux ides reues, lenvironnement dexcution des applets est donc extrmement scuris 2.
1
2
Mthode compile spcifiquement pour le type de processeur utilis et ntant donc pas excute par la JVM.
En comparaison, les composants ActiveX (dvelopps par Microsoft) sont nettement moins scuriss et sont susceptibles dtre gnrateur de
bugs, vecteur de trojans, etc. (voir http://www.microsoft.com/france/securite).
41 / 59
1.1.0.1 07/05/2010
6 LE MULTITHREADING
6.1 INTRODUCTION
Les ordinateurs actuels utilisent des systmes dexploitation dits multitches 1, cest--dire que lon peut excuter
plusieurs actions en mme temps : diter un fichier texte, crire des donnes sur le disque dur, effectuer des calculs
mathmatiques, etc.
Chacune de ces actions est mise en uvre par une application stocke en mmoire morte 2, et qui est charge en
mmoire vive 3 lors de son excution ; lexcution dun programme est appele tche ou processus.
En ralit, ces tches ne sont pas excutes en mme temps. En effet, un processeur ne peut grer quune seule tche
la fois un instant t. En revanche, chaque tche pouvant tre dcompose en une liste de traitements successifs, le
processeur peut sinterrompre entre deux traitements dune mme tche, et reprendre une autre tche au niveau du
traitement o il stait prcdemment interrompu 4.
Le processeur se partage ainsi entre ces diffrentes tches, en passant successivement dun traitement un autre
traitement, dune manire rpte et trs rapide : lutilisateur a ainsi limpression que plusieurs tches sexcutent en
mme temps 5 car les traitements dcomposant chacune des tches voluent en parallle ; on parle alors dexcution
pseudo-parallle 6.
monotche
temps
temps
mu ltitches
p1
p2
p1 en pause
reprise p1
reprise p2
p2 en pause
p1 en pause
reprise p2
1
2
3
4
5
6
Le premier OS multitches est UNIX, cr en 1969 par Ken Thompson ; chez Microsoft, a commence en 1993 avec Windows NT 3.1.
Par mmoire morte (=ROM), on entend tout support dinformations non volatile (disque dur, disquette, cdrom, cl usb, etc.).
Par mmoire vive, on entend tout support dinformations volatile (RAM, mmoire cache, etc.).
On parle l de multitches premptif, cest--dire que le partage du temps processeur entre les tches est gr par le systme dexploitation ;
cette notion soppose au multitches coopratif dans lequel ce sont les tches elle-mme qui se rpartissent le temps processeur.
On pourrait faire lanalogie avec le cinma, o une succession trs rapide de photos renvoie une impression de mouvement.
Pseudo-parallle, car les excutions ne se font pas rellement en parallle ; il faudrait en effet disposer de plusieurs processeurs pour cela.
42 / 59
1.1.0.1 07/05/2010
6.2 DFINITIONS
Dans le principe, le multithreading est identique au multitches 1, ceci prs que cest le processus lui-mme qui
est dcoup en sous-traitements parallles, appels threads 2, permettant ainsi au processeur de se partager entre ces
diffrents traitements.
Cependant, la diffrence du multitches, pour que le processeur gre diffrents threads, chaque application doit
avoir t dveloppe dans une optique multithreads.
Les threads dun mme processus sont internes ce processus et partagent ainsi un mme espace mmoire, un mme
code, ainsi que les mmes ressources.
multitches
processus 1
espace
mmoire p1
processus 2
ressources
p1
espace
mmoire p2
code p1
ressources
p2
code p2
processeur
multithreads
processus 1
thread 1a
espace
mmoire p1a
espace
mmoire p1
ressources
p1
code p1
ressources p1a
thread 1b
espace
mmoire p1b
ressources p1b
code p1a
code p1b
processeur
1
2
1.1.0.1 07/05/2010
6.3 IMPLMENTATION
6.3.1
La classe Thread
Pour crer un thread, il faut crire une classe qui drive de la classe Thread, contenue dans le paquetage
java.lang. On hrite ainsi de toutes les mthodes ncessaires la gestion du thread.
Le point dentre du thread est la mthode run() 1 ; celle-ci doit donc dfinir les actions raliser par ce nouveau
processus.
Pour lancer le thread au niveau du systme, et permettre ainsi son excution en parallle du reste de lapplication, il
faut appeler la mthode hrite start(), laquelle se charge alors dappeler implicitement la mthode run().
Ex. : Une application qui utilise un thread.
MonThread.java
package ExempleThread;
public class MaClasse extends Thread // nouveau thread
{
public void run() // surcharge de la mthode run()
{
...
}
...
}
Application.java
package ExempleThread;
public class Application
{
...
public static void main(String[] args)
{
MaClasse th1 = new MaClasse(); // instanciation d'un thread
th1.start(); // lancement du thread
...
}
}
Une mme application peut tre dcompose en autant de threads quil en ait besoin 2.
Ex. : Une application qui utilise 2 threads (donc 3 excutions pseudo-parallles).
ThreadA.java
package ExempleThread;
public class ThreadA extends Thread
{
public void run()
{
while (true)
System.out.println("A");
}
}
1
2
1.1.0.1 07/05/2010
ThreadB.java
package ExempleThread;
public class ThreadB extends Thread
{
public void run()
{
while (true)
System.out.println("B");
}
}
Application.java
package ExempleThread;
public class Application
{
...
public static void main(String[] args)
{
ThreadA th1 = new ThreadA();
ThreadB th2 = new ThreadB();
th1.start();
th2.start();
...
}
}
6.3.2
Linterface Runnable
Linconvnient de la mthode prcdente (drivation de la classe Thread), est que, comme lhritage multiple est
impossible en Java, on ne peut pas crer une classe multithreads qui drive dune autre classe quelconque. Pour pallier
ce problme, il faut utiliser linterface Runnable du paquetage java.lang.
La classe devant offrir le service de pouvoir tre excute en tant que thread, doit alors implmenter linterface
Runnable, qui dfinit le prototype de la mthode run(). Toute instance dune classe qui implmente cette interface
package ExempleThread;
public class MaClasse implements Runnable // classe pouvant tre "threade"
{
public void run() // implmentation de la mthode run()
{
...
}
...
}
45 / 59
1.1.0.1 07/05/2010
Application.java
package ExempleThread;
public class Application
{
...
public static void main(String[] args)
{
MaClasse mc1 = new MaClasse(); // instanciation d'un objet "runnable"
Thread th1 = new Thread(mc1); // cration dun thread sur l'instance
th1.start(); // lancement du thread
...
}
}
On peut aussi dcider de dmarrer directement le thread dans le constructeur-mme de la classe ; une simple
instanciation suffit alors pour lancer le thread.
Ex. :
MonThread.java
package ExempleThread;
public class MaClasse implements Runnable // classe pouvant tre "threade"
{
public MaClasse()
{
(new Thread(this)).start();
}
public void run() // implmentation de la mthode run()
{
...
}
...
}
Application.java
package ExempleThread;
public class Application
{
...
public static void main(String[] args)
{
MaClasse mc1 = new MaClasse(); // instanciation d'un objet "runnable"
...
}
}
Nb : Linconvnient de cette dernire solution, est quen terme de r-utilisabilit, il faut tre certain que la classe,
dans sa dfinition, adhre totalement une excution parallle 1.
Cycle de vie
En ralit, mme si on ne cre pas de thread, toute application Java contient toujours au moins un thread, appel
thread principal, qui est en fait le processus correspondant lexcution de lapplication. Les autres threads ventuels
sont appels alors threads secondaires.
1
Par exemple, un composant de type horloge permettant dafficher lheure dans une application devra toujours tre excut en parallle du
reste de lapplication, la solution est donc bien approprie ici.
46 / 59
1.1.0.1 07/05/2010
Toute excution de code Java est donc apparente un thread ; ainsi, une application prend fin lorsque tous ses
threads sont termins.
Un thread suit un cycle de vie, cest--dire que son excution suit une logique bien prcise, dcrite par le schma
suivant :
cr
(initialis)
constructeur()
start()
stop()
run() termin
arrt
(mort)
actif
(excutable)
excut
sleep() termin
resume()
notify()
stop()
endormi
sleep()
suspend()
wait()
6.4.2
Le dveloppement dune application multithreads soulve de nombreuses questions dont il faut imprativement tenir
compte :
Y dfinition de priorits et de dpendances (priorit, thread daemon) ;
Y exclusion mutuelle pour laccs une ressource partage (verrou, smaphore, etc.).
Y synchronisation entre threads (mthodes wait(), notify(), notifyAll()) ;
1
2
Dix niveaux de priorits existent en tout, inclus dans la plage [1 ; 10] (1 : MIN_PRIORITY, 5 : NORM_PRIORITY, 10 : MAX_PRIORITY).
En gnral, un thread accdant une ressource partage est positionn comme un thread daemon, afin dviter le blocage de laccs la
ressource en cas darrt ou de sortie anormale de lapplication lors dun dysfonctionnement.
47 / 59
1.1.0.1 07/05/2010
7 LES SOCKETS
7.1 INTRODUCTION
Un socket est un moyen de communication de type point--point entre deux applications diffrentes, sexcutant
gnralement chacune sur un ordinateur diffrent 1. Bas sur le protocole TCP, la fiabilit de la communication est
donc ainsi assure, tout comme la rception des donnes dans lordre de lmission.
Dans une communication par socket, on a donc une application qui est serveur, et lautre qui est cliente :
Y serveur : attend les connexions des clients, et reoit les donnes des clients, ou bien leur en transmet ;
Y client : initie une communication avec le serveur, afin de transmettre des donnes, ou bien den recevoir.
La communication par socket utilise les flux pour mettre ou recevoir les donnes.
client
serveur
connexion
adresse IP :
port :
en attente de
connexion
Les flux tant unidirectionnels, il faut crer deux flux distincts, la fois au niveau du serveur et du client, pour
mettre et recevoir des donnes 2. Si lon a uniquement besoin dmettre des donnes dans un seul sens, alors un seul
flux suffit.
Un socket utilise la notion de port de connexion du protocole TCP afin de permettre dautres communications
dtre tablies sur la mme machine ; ce port correspond un nombre entier cod sur 16 bits.
1
2
Il est cependant tout fait possible de faire communiquer 2 applications excutes sur le mme ordinateur en utilisant un socket.
Un flux en criture au niveau du serveur correspondant un flux en lecture au niveau de client, et vice-versa.
48 / 59
1.1.0.1 07/05/2010
Les ports 0 1023 sont rservs par convention 1 (appels well known ports 2) ; les ports 1024 49151 sont
enregistrs (registered ports 3) ; les ports 49152 65535 sont les ports publics et dynamiques.
7.2 IMPLMENTATION
Toutes les classes et mthodes ncessaires la gestion des sockets font partie du paquetage java.net. Une fois la
communication tablie, on utilise des flux, donc des classes du paquetage java.io.
7.2.1
La classe Socket
Pour crer un socket, il faut utiliser la classe Socket, dont voici les principales mthodes utiles :
Y Socket(InetAddress adresseIpDistante, int portDistant) : cre un nouveau socket connect
au serveur dadresse IP adresseIpDistante sur le port portDistant ;
Y Socket(String nomDistant, int portDistant) : cre un nouveau socket connect au serveur dont
le nom DNS est nomDistant sur le port portDistant ;
Y getInputStream() : InputStream : renvoie un flux de lecture associ au socket ;
Y getOutputStream() : OutputStream : renvoie un flux dcriture associ au socket ;
Y close() : void : ferme le socket.
7.2.2
Serveur socket
Le serveur socket permet de fournir un service accessible par toute machine sur le rseau. Il attend donc les
connexions des clients sur un port prcis, et rpond aux connexions inities sur ce port par les clients. Cette
rponse se traduit par lmission et/ou la rception de donnes en utilisant des flux.
Le principe du serveur est le suivant :
Y cration du serveur socket sur un port prcis ;
Y boucle sans fin ou contrle.
` attente de connexion (fonction bloquante) ;
` rcupration du socket cr par le serveur socket suite une connexion ;
` rcupration des flux dentre et/ou de sortie associs au socket ;
` lecture et/ou criture partir des flux ;
` fermer les flux ;
` fermer le socket.
Pour crer un serveur socket, on utilise la classe ServerSocket ; parmi ses mthodes, on retiendra :
Y ServerSocket(int portLocal) : cre un nouveau serveur socket en coute sur le port portLocal ;
Y accept() : Socket : attend une connexion, et une fois celle-ci tablie, renvoie le nouveau socket associ ;
Y close() : void : ferme le serveur socket.
Ex. : Un serveur socket en coute sur le port 7474.
MonServeur.java
package ExempleSocket;
import java.net.*;
import java.io.*;
public class MonServeur
{
private final int srvPort = 7474; // port local dcoute
private ServerSocket srvSock = null;
Cest lorganisme international IANA (Internet Assign Numbers Authority), charg de coordonner un certain nombre de standards sur
linternet (adressage IP, noms de domaines, etc.), qui gre ces spcifications (http://www.iana.org/assignments/port-numbers).
Exemples : ports standards multi-plateformes (FTP : 20-21, HTTP : 80, SMTP : 25, POP3 : 110, HTTPS : 443, ...), ou ports reconnus comme
tels (NetBios : 137-139, partage de fichiers et dimprimante Windows / SaMBa : 445, )
Gnralement utiliss temporairement par le systme dexploitation (aussi utilisables pour le domaine priv).
49 / 59
1.1.0.1 07/05/2010
7.2.3
Client socket
Le client socket se connecte un serveur bien prcis, connaissant son adresse IP, ou son nom DNS, et le port de
connexion. Une fois connect, il communique avec le serveur en utilisant des flux, ce qui permet dmettre ou de
recevoir des donnes.
Pour crer un client socket, il faut utiliser la classe Socket.
Ex. : Un client socket se connectant sur un serveur en coute sur le port 7474.
MonClient.java
package ExempleSocket;
import java.net.*;
import java.io.*;
public class MonClient
{
final static int portSrv = 7474; // port de connexion distant
public MonClient()
{
...
}
50 / 59
1.1.0.1 07/05/2010
Bien videmment, durant le laps de temps trs court o le thread principal lance le thread secondaire, un autre client peut ventuellement se
connecter. Ceci est palli car le serveur socket possde une file dattente, qui par dfaut est de 50 (nda : compulser les diffrentes formes du
constructeur de la classe ServerSocket pour plus de dtails).
51 / 59
1.1.0.1 07/05/2010
while (true) {
sock = this.srvSock.accept(); // attente d'une connexion
System.out.println("Connexion tablie");
new ServeurWork(sock); // lancement de la communication avec le client
}
}
public static void main(String[] args)
{
try {
MonServeur srv = new MonServeur(); // instanciation d'un serveur socket
srv.atWork(); // lancement du serveur
}
catch (IOException ioe) {
System.out.println("erreur serveur");
}
}
}
ServeurWork.java
package ExempleSocket;
import java.net.*;
import java.io.*;
public class ServeurWork implements Runnable // classe "threadable"
{
private Socket sock;
public ServeurWork(Socket sock)
{
this.sock = sock;
(new Thread(this)).start(); // dmarrage du thread
}
public void run()
{
String msg = null;
try {
InputStream is = sock.getInputStream(); // ouverture d'un flux d'entre
DataInputStream dis = new DataInputStream(is);
msg = dis.readUTF(); // lecture du flux
System.out.println("Message reu: "+msg);
OutputStream os = sock.getOutputStream(); // ouverture d'un flux de sortie
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("Message bien reu"); // criture dans le flux
System.out.println("Message envoy");
dis.close(); // fermeture du flux d'entre
dos.close(); // fermeture du flux de sortie
sock.close(); // fermeture du socket
}
catch (IOException ioe) {
System.out.println("erreur serveur thread");
}
}
}
52 / 59
1.1.0.1 07/05/2010
MonServeur.java
public void atWork() throws IOException
{
Socket sock = null;
String msg = null;
while (true) {
sock = this.srvSock.accept();
System.out.println("Connexion tablie");
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
msg = dis.readUTF();
System.out.println("Message reu: "+msg);
OutputStream os = sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("Message bien reu");
System.out.println("Message envoy");
dis.close();
dos.close();
sock.close();
}
}
MonClient.java
public void receiveFrom(String ipSrv) throws IOException
{
Socket sock = new Socket(ipSrv,portSrv);
if (sock!= null) {
OutputStream os = sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("msg " + sock.getLocalPort());
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println("rponse srv: " + dis.readUTF());
dos.close();
dis.close();
sock.close();
}
}
: Le serveur est en attente de connexion (la mthode accept() est bloquante) ; le client se connecte au
serveur lorsque quun objet socket client est instanci ; le serveur poursuit alors son excution.
: Le serveur veut lire des donnes mises par le client, en utilisant donc un flux dentre (lensemble des
mthodes du type read() des flux dentre sont bloquantes) ; le client envoie une donne au serveur, en
utilisant donc un flux de sortie (une mthode du type write()) ; la prsence de donnes dans le flux permet
alors au serveur de poursuivre son excution.
: Le client veut lire des donnes mises par le serveur ; le serveur envoie une donne au client via le flux ; le
client poursuit alors son excution.
53 / 59
1.1.0.1 07/05/2010
abstract
boolean
case
default
else
false
goto
if
long
native
package
return
short
this
void
while
assert
break
catch
do
extends
final
byte
char
double
class
const
finally
float
for
implements
import
instanceof
int
interface
new
private
null
protected
public
static
throw
volatile
strictfp
throws
super
transient
switch
true
synchronized
try
continue
Les mots-clefs sont rservs, donc inutilisables comme noms de classe, dinterface, mthode, attribut ou variable 1.
A.2 CATGORIES
A.2.1 Paquetages, classes, membres et interfaces
class
extends
implements
import
instanceof
interface
new
package
super
this
Mme si Java distingue la casse, il est dconseill dutiliser les mots-clef, mme avec une casse distincte.
54 / 59
1.1.0.1 07/05/2010
(package)
private
protected
public
final
native
static
synchronized
transient
volatile
M : mthode dont seul le prototype est dfini, doit tre implmente par
surcharge lors de la drivation ; consquence directe : classe abstraite.
C : classe contenant une ou plusieurs mthodes abstraites ; ne peut pas tre
instancie, utilisable seulement par drivation.
A : attribut constant.
M : mthode ne pouvant tre surcharge lors de la drivation.
C : classe ne pouvant tre drive.
M : mthode implmente dans un autre langage (souvent C++) et accde
via une librairie dynamique (recherche de rapidit).
A : attribut disponible mme sans disposer dinstance de la classe ; commun
tous les objets de la classe.
M : mthode disponible mme sans disposer dinstance de la classe.
C : classe interne disponible mme sans disposer dinstance de la classe.
M : mthode excutable par un seul thread la fois (applicable aussi pour un
bloc de code de la mthode plutt que la mthode entire).
A : attribut non sauvegard lors de la srialisation de lobjet (scurit).
A : attribut sauvegard directement en RAM, sans tre bufferis, assurant
ainsi la fiabilit de sa valeur instantane lors de laccs par divers membres.
Boolen (true/false).
Entier sur 1 octet.
Caractre sur 2 octets (standard Unicode).
Rel sur 8 octets.
Rel sur 4 octets.
Entier sur 4 octets.
Entier sur 8 octets.
Entier sur 2 octets.
Type vide (utilis pour les dclarations de mthodes uniquement).
55 / 59
if
return
switch
while
1.1.0.1 07/05/2010
A.2.7 Autres
const
goto
false
null
strictfp
true
56 / 59
1.1.0.1 07/05/2010
B RFRENCE DU LANGAGE
B.1 BIBLIOTHQUES DES CLASSES JAVA
LAPI 1 Java est constitu de lensemble des bibliothques des classes Java, et constitue toute la richesse du langage.
java.lang
java.util
java.io
java.text
java.math
java.awt
javax.swing
java.applet
java.net
java.sql
java.beans
java.lang.reflect
java.rmi
java.security
Servlet/JSP, etc.) ;
Y J2ME Micro Edition : sous-ensemble de classes du J2SE destines aux produits lectroniques grand public
1.1.0.1 07/05/2010
Versions et
dates de
sortie
1995
1997 (1.1.4)
1997 (1.1.5)
1998 (1.1.6)
1998 (1.1.7)
1998 (1.1.8)
1998 (1.2.0)
1999 (1.2.1)
1999 (1.2.2)
Nom de
code
Principales volutions
Sparkler
Pumpkin
Abigail
Brutus
Chelsea
Playground
(aucun)
Cricket
J2SE 1.3
1999 (1.3.0)
2000 (1.3.1)
Kestrel
Ladybird
J2SE 1.4
2001 (1.4.0)
2002 (1.4.1)
2003 (1.4.2)
Merlin
Hopper
Mantis
J2SE 5.0
2004 (1.5.0)
Tiger
Srialisation, classes
internes, JavaBeans,
archives Jar, RMI,
JDBC, internationalisation, JNI,
Swing + JFC, Java IDL
(CORBA), JDBC 2.0,
collections, compilateur
JIT, rflexion,
JNDI, HotSpot JVM,
JPDA, amlioration
performances,
JavaSound,
JAXP (XML), JDBC
3.0, journalisation,
expressions rgulires,
WebStart, JCE,
Programmation
gnrique, JAXP 1.3,
JMX management,
SASL, autoboxing,
enum, metadata,
JSE 6
JSE 7
2006 (6.0)
2010 ?
Mustang
Dolphin
Java 1.0
Java 1.1
J2SE 1.2
Version
teste
n.d.
1.1.8_10
Nombre de
paquetages
/ classes
8 / 211
22 / 477
Taille JRE /
JDK / Doc JDK
(Mo)
n.d.
6 / 20 / 12
1.2.2_17
59 / 1524
20 / 65 / 86
1.3.1_20
76 / 1840
18 / 82 / 108
1.4.2_19
135 / 2723
42 / 199 / 177
1.5.0_18
166 / 3279
70 / 189 / 224
6.0_13
203 / 3793
86 / 295 / 265
Nb : Les tests de taille ont t effectus avec la version Windows de la plate-forme ; les nombres de paquetages et
de classes ont t comptabiliss par rapport ceux rfrencs dans la documentation officielle (Doc JDK).
1
2
Les 2 versions (JRE et JDK) sont libres dutilisation, et sont tlchargeables gratuitement sur http://java.sun.com/.
Un certain nombre de navigateurs utilisent directement le JRE pour lexcution des applets (Opera, Mozilla Firefox), ce nest pas le cas de
Internet Explorer qui intgre sa propre machine virtuelle, mais que linstallation du JRE peut supplanter (hautement conseill !).
58 / 59
1.1.0.1 07/05/2010
C BIBLIOGRAPHIE
Wazir Dino, Cours Java, TS IRIS LEGT Louis-Modeste Leroy vreux, 2002 ;
Sun Microsystems, Documentation JDK API J2SE 1.4.2, http://java.sun.com/j2se/1.4.2/docs/api/index.html, 2003 ;
Doudoux Jean-Michel, Dveloppons en Java v0.80.2, http://perso.wanadoo.fr/jm.doudoux/java/tutorial/, 2004 ;
Borland, Apprendre Java avec Jbuilder 7, 2002 ;
Infini.fr, Java, http://www.infini-fr.com/Sciences/Informatique/Langages/Imperatifs/Java/java.html, 2005 ;
Clavel Gilles, Mirouze Nicolas, Munerot Sandrine, Pichon Emmanuel, Soukal Mohamed,
Java : la synthse vers la maturit avec le JDK 1.2 (2 dition), InterEditions, 1998 ;
Touravane, Introduction Java, http://pages.univ-nc.nc/~touraivane/main/Enseignement.html,
Ecole Suprieure dIngnieurs de Luminy Dpartement Gnie Bio Mdical, 1998 ;
Eteks.com, Du C/C++ Java, http://www.eteks.com/coursjava/tdm.html, 2005 ;
Hardware.fr, Forum Java, http://forum.hardware.fr/hardwarefr/Programmation/Java/liste_sujet-1.htm, 2005 ;
Niedermair Elke et Michael, Programmation Java 2, MicroApplication, 2000 ;
Delannoy Claude, Exercices en Java, Eyrolles, 2001 ;
Boichat Jean-Bernard, Apprendre Java et C++ en parallle, Eyrolles, 2000 ;
CommentaMarche.net, Java, http://www.commentcamarche.net/java/, 2005 ;
Wikipedia lencyclopdie libre, Java, http://fr.wikipedia.org/, 2009 ;
Dveloppez.com, Introduction Java, http://java.developpez.com/, 2005 ;
Oplog, Formation internet : Java, OpLog lOpportunit Logicielle, 2002 ;
Longuet Patrick, Livre dor Java votre guide complet de dveloppement, Sybex, 1996 ;
Peignot Christophe, Langage UML, http://info.arqendra.net/, 2009.
59 / 59