0% ont trouvé ce document utile (0 vote)
423 vues

Programmation Java FR

Programmation Java Fr

Transféré par

Jean claude onana
Copyright
© © All Rights Reserved
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)
423 vues

Programmation Java FR

Programmation Java Fr

Transféré par

Jean claude onana
Copyright
© © All Rights Reserved
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
Vous êtes sur la page 1/ 142

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Un livre de Wikilivres.

Une version jour et ditable de ce livre est disponible sur Wikilivres,


une bibliothque de livres pdagogiques, l'URL :
http://fr.wikibooks.org/wiki/Programmation_Java
Vous avez la permission de copier, distribuer et/ou modifier ce document selon les
termes de la Licence de documentation libre GNU, version 1.2 ou plus rcente
publie par la Free Software Foundation ; sans sections inaltrables, sans texte de
premire page de couverture et sans Texte de dernire page de couverture. Une
copie de cette licence est inclue dans l'annexe nomme Licence de
documentation libre GNU .

1 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Introduction
Introduction au langage Java
Le 23 mai 1995, Sun Microsystems prsentait une nouvelle plateforme, compose d'un langage de programmation et
d'une machine virtuelle. Java tait n.
L'histoire de Java commence en fait en 1991, lorsque Sun dcide de lancer un projet destin anticiper l'volution de
l'informatique, confi James Gosling, Patrick Naughton et Mike Sheridan. Ce projet, appel Green Project (en
anglais projet vert ), eu comme rsultat une plate-forme baptise Oak (en anglais chne ), indpendante du
systme, oriente objet et lgre. Oak tait initialement destine la tlvision interactive. Il a t renomm en Java
pour de simples raisons de droit d'auteur.
Lorsqu'il est rvl en 1995, Java profite de l'essor d'Internet en permettant l'un des premiers mcanismes
d'interactivit au niveau du poste client : l'appliquette (applet) Java.
Langage orient objet d'usage gnraliste, Java est enrichi par des bibliothques, des outils et des environnements trs
diversifis, standardiss par le Java Community Process (JCP), consortium charg de l'volution de Java. Ce
consortium regroupe des entreprises, comme Sun, IBM, Oracle, Borland, BEA, des organismes de normalisation,
comme le NIST, des organismes du monde Open Source, comme la Fondation Apache et le JBoss Group, et des
particuliers.
Il est possible d'utiliser Java pour crer des logiciels dans des environnements trs diversifis :
applications sur client lourd (JFC) ;
applications Web, ct serveur (servlets, JSP, Struts, JSF) ;
applications rparties (EJB) ;
applications embarques (J2ME) ;
applications sur carte puce (JavaCard).
Ces applications peuvent tre enrichies par de nombreuses fonctionnalits :
accs des bases de donnes (JDBC et JDO) ;
accs des annuaires (JNDI) ;
traitements XML (JAXP) ;
connexion des ERP (JCA) ;
accs des traitements en d'autres langages (JNI) ;
services web (JAX-RPC, JAXM, JAXR) ;
multimdia (Java Media) ;
tlphonie (JTAPI) ;
tlvision interactive (Java TV).
Ceci n'est bien sr qu'un petit chantillon. Il existe bien d'autres bibliothques.

Historique de Java
1991 : Dbut du projet Oak, qui donnera naissance Java.
Et 1992 : premire prsentation interne des possibilits de Oak. Un appareil appel Star Seven permet de
visualiser une animation montrant Duke, l'actuelle mascotte de Java.
1994 : Dveloppement de HotJava, un navigateur internet entirement crit en Java.
23 mai 1995 : Lancement officiel de Java 1.0
23 janvier 1996 : Lancement du JDK 1.0.
29 mai 1996 : Premire confrence JavaOne. Java Media et les servlets y sont notamment annoncs.
16 aot 1996 : Premires ditions des livres Java Tutorial et Java Language Specification par Sun et AddisonWesley.
Septembre 1996 : Lancement du site Web Java Developer Connection Web.

2 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

16 octobre 1996 : Spcification des JavaBeans.


11 janvier 1997 : Lancement des JavaBeans.
18 fvrier 1997 : Lancement du JDK 1.1.
28 fvrier 1997 : Netscape annonce que Communicator supporte dsormais Java.
4 mars 1997 : Lancement des servlets.
10 mars 1997 : Lancement de JNDI.
5 juin 1997 : Lancement de Java Web Server 1.0.
5 aot 1997 : Lancement de Java Media et de Java Communication API.
Mars 1998 : Lancement des JFC et notamment de Swing.
8 dcembre 1998 : Lancement de Java 2 et du JDK 1.2.
4 mars 1999 : Support XML.
27 mars 1999 : Lancement de la machine virtuelle HotSpot.
2 juin 1999 : Lancement des JSP.
15 juin 1999 : Formalisation des environnements J2ME, de J2SE et J2EE ; Lancement de Java TV.
Aot 1999 : Lancement de Java Phone.
8 mai 2000 : Lancement de J2SE 1.3.
9 mai 2002 : Lancement de J2SE 1.4.
24 novembre 2003 : Lancement de J2EE 1.4.
30 septembre 2004 : Lancement de J2SE 1.5, nomm galement J2SE 5.0 ou Tiger .
11 dcembre 2006 : Lancement de JavaSE 6, nomm galement Mustang .
13 novembre 2006 : Passage de Java, cest--dire le JDK (JRE et outils de dveloppement) et les environnements
Java EE (dj sous licence CDDL) et Java ME sous licence GPL. Java devient donc un logiciel libre.
27 janvier 2010 : Sun Microsystem est rachet par Oracle. Dsormais, Java est maintenu par la socit Oracle.
28 Juillet 2011 : Lancement de JavaSE 7, nomm galement Dolphin .
18 mars 2014 : Lancement de JavaSE 8, nomm galement Kena .

Prsentation du langage
Java est un langage typ et orient objet. Il est compil et bas sur une architecture logicielle trs particulire
ncessitant une machine virtuelle Java. Il utilise les notions usuelles de la programmation oriente objet : la notion de
classe, d'encapsulation, d'hritage, d'interface, de virtualit, de gnricit, Il est accompagn d'un ensemble norme
de bibliothques standard couvrant de trs nombreux domaines, notamment des bibliothques graphiques. C'est un
langage qui prsente d'excellentes proprits de portabilit du code. Son gros point faible est une relative lenteur,
surtout si on le compare des langages comme le C++. Cependant, ce dfaut a t rsolu en grande partie par
l'introduction de la technologie JIT (compilateur Just-In-Time, en anglais juste temps ), qui compile le code la
premire excution, permettant une excution quasiment aussi rapide qu'en C/C++.

3 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Machine virtuelle
Introduction la machine virtuelle Java
Le langage Java utilise une notion extrmement importante en informatique : la notion de machine virtuelle. Cette
machine virtuelle est compose de trois parties, et est souvent fournie avec l'OS, ou facilement installable comme un
logiciel normal.
Sur les ordinateurs, la mme machine virtuelle est capable de lancer :
des applications indpendantes (standalone en anglais), lances et fonctionnant comme toute application installe sur
la machine,
des applets, partir d'une page HTML (internet, rseau local ou en local sur la machine). Pour cela, il faut que le
navigateur possde une extension permettant d'utiliser une machine virtuelle Java pour l'excution de ces applets.

Environnement d'excution
Le langage Java est un langage orient objet qui doit tre compil. Cependant, le compilateur Java ne produit pas
directement un fichier excutable, mais du code intermdiaire sous la forme d'un ou plusieurs fichiers dont l'extension
est .class ; ce code intermdiaire est appel bytecode. Pour excuter le programme, il faut utiliser la machine
virtuelle Java qui va interprter le code intermdiaire en vue de l'excution du programme.
Il ne s'agit pas d'une compilation normale, car le compilateur ne produit pas du code comprhensible directement par le
microprocesseur, ni d'un langage interprt, car il y a tout de mme la notion de compilation, mais une situation
intermdiaire entre un langage interprt et un langage compltement compil.
En d'autres termes, un programme Java, une fois compil en code intermdiaire, n'est comprhensible que par la
machine virtuelle, qui va traduire la vole (interprtation) les instructions excutes en code comprhensible par la
machine physique.
Depuis Java SE 1.3, les machines virtuelles d'Oracle contiennent un interprteur capable d'optimiser le code appel
HotSpot.
L'interprteur effectue plusieurs tches :
vrification du code intermdiaire ;
traduction en code natif (spcifique la plateforme, au systme d'exploitation) ;
optimisation.
Outre un interprteur, l'environnement d'excution fournit galement :
un noyau multitches pour les machines virtuelles fonctionnant sur des systmes monotches (green virtual
machines) ;
un bac sable (sandbox) pour l'excution de processus distants.

Chargeur de classe
Le chargeur de classe charge les classes ncessaires l'excution, alloue l'espace mmoire ncessaire et tablit les liens
entre elles (linkage). Le chargeur de classe connait la structure d'un fichier .class.

Gestionnaire de mmoire
Le gestionnaire mmoire assure les services lis la mmoire, en particulier :
un ramasse-miette (garbage collector) ;
une protection mmoire mme sur les machines dpourvues d'unit de gestion mmoire (MMU).

4 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Avantage de l'utilisation de la machine virtuelle


L'utilisation d'une machine virtuelle a l'norme avantage de garantir une vraie portabilit. Il existe des machines
virtuelles Java pour de trs nombreux environnements : Windows, MacOS, Linux et autres.
Ces machines virtuelles sont capables d'excuter exactement le mme code intermdiaire (les mmes fichiers Java en
bytecode) avec une totale compatibilit. C'est l une situation unique et assez remarquable qui a fait le succs de ce
langage.
La machine virtuelle Java n'est pas uniquement dveloppe sur des ordinateurs classiques, une multitude d'appareils
disposent d'une machine virtuelle Java : tlphones portables, assistants personnels (PDA)

Les interfaces de programmation (API) Java : des fonctionnalits normes


La machine virtuelle Java possde un ensemble de bibliothques extrmement compltes : des bibliothques
graphiques, des bibliothques systmes, etc...
Toutes ces bibliothques sont totalement portables d'un environnement un autre.
La machine virtuelle Java offre donc un vritable systme d'exploitation virtuel, qui fonctionne au dessus du systme
d'exploitation, de la machine cible et le masque totalement aux applications.

La lenteur de Java
Le gros point faible du concept de machine virtuelle est que le code intermdiaire (bytecode) est interprt par la
machine virtuelle. Ceci entrane une baisse importante des performances des programmes.
Toutefois avec les machines virtuelles actuelles, cet argument n'a plus autant de poids. La technique appele
compilation juste temps (JIT : Just-In-Time) est employe par la machine virtuelle quand une mthode est
appele. Cette technique consiste compiler la vole la mthode appele (la premire fois) en code natif directement
excutable par le processeur.
Toute mthode s'excute ainsi aussi rapidement que du code natif.

Processeur Java
Un processeur Java est l'implmentation matrielle d'une machine virtuelle Java. C'est dire que les bytecodes
constituent son jeu d'instruction.
Actuellement, il y a quelques processeurs Java disponibles :
en:picoJava, premire tentative de construction d'un processeur par Sun Microsystems,
aJ100 (http://www.ajile.com/) [archive] de aJile. Disponibles sur cartes Systronix
(http://jstamp.systronix.com/) [archive],
Cjip (http://www.imsystech.com/) [archive] (Imsys Technologies),
Komodo (http://ipr.ira.uka.de/komodo/komodoEng.html) [archive] : micro-controlleur Java multi-thread pour la

5 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

recherche sur la planification temps-rel,


FemtoJava (http://www.inf.ufrgs.br/~lse/) [archive] : projet de recherche,
ARM926EJ-S : processeur ARM pouvant excuter du bytecode java,

6 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Bases du langage
Un programme Java est une suite d'instructions excutes de manire squentielle. D'une manire gnrale, les
instructions sont spares par des points-virgules ; .
Ces instructions s'excutent de gauche droite et de haut en bas. Elles peuvent tre organises dans des blocs.

Point d'entre du programme


Tout programme Java contient au moins une classe [1] , nomme par convention avec une majuscule contrairement aux
mthodes. De plus, il ncessite un point d'entre. Pour un programme simple, le point d'entre est la mthode "main"
qui doit tre publique, statique et situe dans une classe qui elle mme doit tre publique (d'o les mots-cls public et
static) :
public class ClassTest {
public static void main(String args[]) {
// Instructions du programme
}
}

L'argument args de cette mthode contient les paramtres passs au programme par la ligne de commande.
D'autres types de programmes, comme les applets, les servlets ou encore les applications Android, utilisent d'autres
mthodes comme point d'entre.

Blocs d'instructions
Un bloc d'instructions est une suite d'instructions commenant par une accolade ouvrante ( { ) et se terminant par une
accolade fermante ( } ).
Un bloc d'instructions est considr comme une seule instruction par les instructions for, while, if, else et case. Nous
dtaillerons cela plus loin.
Ce bloc dlimite galement la porte des variables. Toute variable dclare dans ce bloc n'est accessible qu' partir de
ce bloc, et n'existe que durant l'excution du bloc.

Commentaires
Pour plus de dtails voir : Programmation Java/Commentaires.
Les commentaires sont, en programmation informatique, des portions du code source ignores par le compilateur. Ils
sont trs pratiques pour prciser quelque chose ou pour "mettre de cot" du code sans le supprimer. Java permet
d'insrer des commentaires en utilisant deux syntaxes diffrentes :
La squence // permet d'insrer un commentaire sur une seule ligne, qui se termine donc la fin de la ligne.
La squence /* permet d'insrer un commentaire sur plusieurs lignes. La squence */ marque la fin du commentaire.
En d'autres termes, tout ce qui est situ entre /* et */ est considr comme faisant partie du commentaire.
Exemple :
// Commentaire sur une ligne
public class /* un commentaire au milieu de la ligne */ Exemple {
/*
Commentaire sur
plusieurs lignes
...

7 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

*/
public static void main(String[] args) {
}
}

Commentaire Javadoc
Les commentaires normaux sont totalement ignors par le compilateur Java.
En revanche, certains commentaires sont interprts par le gnrateur automatique de documentation Javadoc.
Ces commentaires commencent par la squence /** et se terminent par */. Le contenu dcrit l'entit qui suit (classe,
interface, mthode ou attribut), suivi d'une srie d'attributs dont le nom commence par un arobase @.
La documentation gnre tant au format HTML, il est possible d'insrer des balises dans la description.
Exemple :
/**
Une classe pour illustrer les commentaires Javadoc.
@author Moi :-)
*/
public class Exemple {
/**
Une mthode <b>main</b> qui ne fait rien.
@param args Les arguments de la ligne de commande.
*/
public static void main(String[] args) {
}
}

En fait, il existe un attribut Javadoc qui est pris en compte par le compilateur : l'attribut @deprecated. Cet attribut
marque une classe, une mthode ou une variable comme obsolte. Ce qui signifie que si une autre classe l'utilise un
avertissement est affich la compilation de cette classe.
Exemple :
/**
Une mthode obsolte. Il faut utiliser get() la place.
@deprecated
*/
public Object getElement(int index)
{ ... }
/**
Une nouvelle mthode.
*/
public Object get(int index)
{ ... }

Cet attribut permet de modifier une bibliothque de classe utilise par plusieurs applications, en la laissant compatible
avec les applications utilisant l'ancienne version, mais en indiquant que les anciennes classes / mthodes / variables ne
doivent plus tre utilises et pourraient ne plus apparatre dans une version ultrieure.

Rfrences
1. Kathy Sierra, Bert Bates, Java : tte la premire (https://books.google.fr/books?id=n79bw0RFNUIC&pg=PA39&
dq=%22Un+programme+Java+est+un+ensemble+de+classes+%28ou+au+moins+une+classe%29.%22&hl=fr&
sa=X&ved=0ahUKEwimiam8lcHKAhWE0xQKHVfRB_sQ6AEIKDAA#v=onepage&
q=%22Un%20programme%20Java%20est%20un%20ensemble%20de%20classes

8 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

%20%28ou%20au%20moins%20une%20classe%29.%22&f=false) [archive ], O'Reilly Media, Inc., 2004

9 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Premier programme
Premier programme
Le fichier source
Ce programme doit tre crit dans le fichier Exemple.java.
public class Exemple {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

Explications sur le langage


Ce programme est le classique Hello world. Comme son nom l'indique, ce programme va afficher la phrase "Hello
world" l'cran. Analysons-le ligne par ligne :
public class Exemple {

Cette ligne dclare une classe publique que nous appelons Exemple.
Un fichier .java ne peut contenir qu'une seule classe publique et le fichier doit porter le nom de cette classe. Ainsi, le
fichier de ce premier exemple s'appellera obligatoirement Exemple.java (en respectant la classe).
Ce systme de nommage permet au compilateur et l'interprteur de trouver les fichiers correspondant une classe.
public static void main(String[] args) {

Cette ligne dclare une mthode appele main. Cette mthode est le point d'entre du programme (la mthode appele
lorsqu'il sera excut).
Elle prend en argument un tableau de chanes de caractres (String[] args) et ne retourne rien (void).
Cette mthode est publique et statique, ce qui sera expliqu plus loin.
System.out.println("Hello world!");

Cette dernire instruction invoque la mthode println de l'objet out se trouvant dans la classe System en lui passant
en argument la chane Hello world!. L'excution de cette mthode aura pour rsultat l'affichage de Hello world!.
Cette ligne peut sembler obscure pour l'instant. Les dtails seront abords par la suite.

Compilation du fichier source


Nous allons prsenter la compilation de notre programme en utilisant le compilateur gratuit Java trs rpandu nomm
Javac, disponible gratuitement auprs d'Oracle. Cependant, il faut savoir qu'il existe aussi de nombreux
environnements de dveloppement Java permettant de taper, compiler, excuter ou dbuguer des programmes dans ce
langage.
Tapez le programme prcdent et sauvegardez le dans un fichier Exemple.java (pour la raison explique
prcdemment) et tapez dans une fentre :

10 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Invite de commande DOS


> javac Exemple.java
> dir
Exemple.class
Exemple.java
>

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Terminal Unix
$ javac Exemple.java
$ ls
Exemple.class
Exemple.java
$

Le compilateur Javac a produit le fichier Exemple.class, contenant le code intermdiaire. Ce fichier n'est normalement
pas ditable [1] , ce qui peut garantir le copyright.

En cas de problmes...
Voici les points vrifier selon le type de problme :
Le systme indique que le compilateur est introuvable
1. Vrifiez que vous avez install un kit de dveloppement Java (le JDK) et pas simplement un environnement d'excution (JRE)
qui ne comporte pas les outils de compilation.
2. Vrifiez que le chemin du rpertoire bin contenant le compilateur javac (javac.exe sous Windows) est dans la liste de la
variable d'environnement PATH.
Le compilateur se lance mais affiche une erreur de classe non trouve
1. Si la classe ne dclare aucun paquetage (package), vrifiez que vous lancez la commande depuis le rpertoire o se trouve le
fichier source (*.java). Changez de rpertoire si ncessaire avant de recommencer.
2. Sinon, vous devez lancer la commande depuis le rpertoire parent du paquetage racine, en donnant le chemin relatif du fichier
source depuis ce rpertoire parent.
3. Dans les deux cas ci-dessus, en plus de changer de rpertoire courant, il peut tre ncessaire d'ajouter le chemin de ce
rpertoire dans le classpath. Cela peut tre fait soit dans la ligne de commande avec l'option -classpath (ou -cp), soit dans
la variable d'environnement CLASS_PATH.
Le compilateur se lance mais affiche une erreur de syntaxe
1. Vrifiez le contenu du fichier source. Pour compiler les exemples de ce livre, le mieux est de faire un copier-coller complet du
code.
2. Assurez-vous de compiler le bon fichier source et pas un autre.

Excution du programme
Java est une machine virtuelle java fournie par Oracle et disponible pour de nombreux environnements.
Pour excuter notre code intermdiaire, il faut taper :
java Exemple

L'excution du programme affiche dans une fentre console la fameuse phrase Hello world!.

En cas de problmes...
Voici les points vrifier selon le type de problme :
Le systme indique que la commande java est introuvable
1. Vrifiez que vous avez install un kit de dveloppement Java (le JDK).
2. Vrifiez que le chemin du rpertoire bin contenant l'interprteur java (java.exe sous Windows) est dans la liste de la variable
d'environnement PATH.
L'interprteur se lance mais affiche une erreur de classe non trouve
1. Vrifiez que vous avez compil le fichier source *.java (voir section prcdente) sans erreur, c'est--dire que vous avez obtenu
un fichier compil *.class.
2. Si la classe ne dclare aucun paquetage (package), vrifiez que vous lancez la commande depuis le rpertoire o se trouve le
fichier compil (*.class). Changez de rpertoire si ncessaire avant de recommencer.

11 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

3. Sinon, vous devez lancer la commande depuis le rpertoire parent du paquetage racine, en donnant le nom complet de la classe
(incluant le nom du paquetage).
4. Dans les deux cas ci-dessus, en plus de changer de rpertoire courant, il peut tre ncessaire d'ajouter le chemin de ce
rpertoire dans le classpath. Cela peut tre fait soit dans la ligne de commande avec l'option -classpath (ou -cp), soit dans
la variable d'environnement CLASS_PATH.
L'interprteur se lance mais rien ne s'affiche, ou le comportement n'est pas le mme
1. Vrifiez le contenu du fichier source. Pour compiler les exemples de ce livre, le mieux est de faire un copier-coller complet du
code.
2. Assurez-vous de lancer la bonne classe principale et pas une autre.

Voir aussi
(anglais) http://docs.oracle.com/javase/tutorial/getStarted/index.html

Rfrences
1. http://www.jmdoudoux.fr/java/dej/chap-decompil.htm
Cette page fait partie du livre Programmation

12 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Types de base
Les types de base ou types primitifs de Java sont lists dans le tableau suivant :
Types primitifs de Java
Type

Taille

Syntaxe

2 octets
'caractre'
16 bits

char

Description

Intervalle

Une unit de code, suffisant


reprsenter un grand
nombre de point de code, et
'\u0000' '\uFFFF'
mme un caractre Unicode
(UTF-16)
'b' '\u250C'

byte

1 octet
8 bits

Un nombre entier de 8 bits


(soit un octet) sign

short

2 octets
16 bits

Un nombre entier de 16 bits


sign entre -32 768 et
-32768 32767
+32 767

int

4 octets
[+|-]chiffres...
32 bits

Un nombre entier de 32 bits


sign entre -2 147 483 648 -2147483648 2147483647
et +2 147 483 647

8 octets
[+|-]chiffres...L
64 bits

Un nombre entier de 64 bits


sign entre
-9223372036854775808L
-9 223 372 036 854 775 808
9223372036854775807L
et
+9 223 372 036 854 775 807

long

[+|-][chiffres].

4 octets
[chiffres]
32 bits

float

[E[+|-]chiffres]F

Un nombre virgule
flottante de 32 bits sign
(simple prcision)

Un nombre virgule
flottante de 64 bits sign
[E[+|-]chiffres][D] (double prcision)

[+|-][chiffres].

8 octets
double
[chiffres]
64 bits

boolean

1 octet false|true

Une valeur logique

-128

127

de

(Float.MIN_VALUE)
(Float.MAX_VALUE),

0.0F,

(Float.NEGATIVE_INFINITY),
(Float.POSITIVE_INFINITY),
pas un nombre (Float.NaN).

de

(Double.MIN_VALUE)
(Double.MAX_VALUE),

0.0D,

(Double.NEGATIVE_INFINITY),
(Double.POSITIVE_INFINITY),
pas un nombre (Double.NaN).
false

(faux) ou true (vrai)

Remarques :
Une constante numrique de type entier est considre comme tant de type int. Il faut ajouter le suffixe L pour
avoir une constante de type long.
Une constante numrique de type dcimal est considre comme tant de type double. Il faut ajouter le suffixe F
pour avoir une constante de type float. Il existe galement un suffixe D pour double mais son utilisation est
optionnelle.
String est le seul type non-primitif (donc absent du tableau) dont les instances possdent une syntaxe littrale :
"caractres..."

13 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Caractres pour char et String


Les caractres spciaux suivants peuvent tre utiliss pour les valeurs littrales des types char et String :
(ou \u000D)
Retour chariot (carriage Return),
\n (ou \u000A)
Nouvelle ligne (New line),
\f (ou \u000C)
Nouvelle page (Feed page),
\b (ou \u000C)
Retour arrire (Backspace),
\t (ou \u0009)
Tabulation (Tab),
\r

\"

Guillemet (pour qu'il soit inclus au lieu de marquer la fin de la chane de caractres),
\'

Apostrophe (pour qu'il soit inclus au lieu de marquer la fin du caractre),


\OOO

Caractre 8 bits dont le code OOO est spcifi en octal (jusqu' 3 chiffres),
\xXX

Caractre 8 bits dont le code XX est spcifi en hexadcimal (jusqu' 2 chiffres),


\uXXXX

Caractre 16 bits (UTF-16) dont le code XXXX est spcifi en hexadcimal (jusqu' 4 chiffres).
Cette squence d'chappement peut galement tre utilise en dehors des chanes et caractres dans le code
source :
\u0070ublic \u0063lass UneClasse ... /* <- public class UneClasse ... */

Cette fonctionnalit du langage est cependant rserver au cas d'utilisation de code Java externe o les
identificateurs de classe, attributs ou mthodes utilisent des caractres non supports (par exemple, en Japonais)
par le clavier du dveloppeur.

Variables et classes
Les classes de base comme String ne sont pas des variables primitives, il est ais de les confondre mais les
conventions habituelles d'criture permettent de distinguer les deux types de donnes. Les types de variables primitives
sont toujours crits en minuscules, par contre les noms des classes ont en principe leur premier caractre en majuscule.
Aussi lorsque vous rencontrez un Boolean, ce n'est pas un type de base mais bien une classe. En effet les variables
primitives peuvent tre encapsules, et Java fournit d'ailleurs pour tous les types primitifs des classes d'encapsulation
appeles wrappers.
Ceci peut tre utile dans certains cas pour bnficier de certaines caractristiques de leur classe mre Object. Par
exemple, la pose d'un verrou de synchronisation (instruction synchronized) ne peut se faire que sur un objet.

Les emballages de types primitifs


Une classe d'emballage (wrapper en anglais) permet d'englober une valeur d'un type primitif dans un objet. La valeur
est stocke sous la forme d'un attribut. Chaque classe permet de manipuler la valeur travers des mthodes
(conversions, ...).
pour char
pour byte
Short pour short
Long pour long
Integer pour int
Float pour float
Double pour double
Character

Byte

14 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Boolean

15 sur 142

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

pour boolean

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Oprateurs
Les oprateurs
Voici une liste des oprateurs utilisables en Java, avec leur signification et leur associativit, dans l'ordre de leur
valuation (du premier au dernier valu) et le type de donnes auquel chaque oprateur s'applique :

16 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Oprateur

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Description

Type

()

Appel de mthode

classes et objets

[]

Elment d'un tableau

tableaux

Membre d'une classe ou d'un objet

classes et objets

.
++

Incrmentation post ou pr-fixe

--

Dcrmentation post ou pr-fixe

double
byte char short int long float
double
byte char short int long float

Positif

Ngation

byte short int long float double

Non logique

boolean

Non binaire

byte char short int long

Conversion de type

tous

Multiplication

Division

Modulo (reste de la division entire)

Addition

de gauche
droite

byte char short int long float

(type)

Associativit

double

de droite
gauche

byte char short int long float


double
byte char short int long float
double

de gauche
droite

byte char short int long


byte char short int long float
double
String (concatnation)

byte char short int long float


double

<<

Dcalage de bit vers la gauche

byte char short int long

>>

Dcalage de bit vers la droite


(signe conserv)

byte char short int long

>>>

Dcalage de bit vers la droite


(signe dcal)

byte char short int long

<

<=

>

Infrieur
Infrieur ou gal
Suprieur

>=

Suprieur ou gal

==

Egal

!=

17 sur 142

Soustraction

Diffrent

de gauche
droite

de gauche
droite

byte char short int long float


double
byte char short int long float
double
byte char short int long float

de gauche
droite

double
byte char short int long float
double
byte char short int long float
double objet
byte char short int long float

de gauche
droite

double objet

&

ET binaire

byte char short int long boolean

de gauche
droite

OU exclusif binaire

byte char short int long boolean

de gauche
droite

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

OU binaire

byte char short int long boolean

de gauche
droite

&&

ET logique

boolean

de gauche
droite

||

OU logique

boolean

de gauche
droite

?:

Oprateur ternaire de condition

boolean ?

Affectation

tous

tous : tous

de droite
gauche

byte char short int long float

Addition et affectation

+=

double
String (concatnation)

-=

Soustraction et affectation

*=

Multiplication et affectation

/=

Division et affectation
Modulo et affectation

%=

byte char short int long float


double
byte char short int long float
double
byte char short int long float
double
byte char short int long float
double

<<=

Dcaler gauche et affectation

byte char short int long

>>=

Dcaler droite (except signe) et


affectation

byte char short int long

Dcaler droite (signe aussi) et


affectation

byte char short int long

&=

ET binaire et affectation

byte char short int long boolean

^=

OU exclusif binaire et affectation

byte char short int long boolean

|=

OU binaire et affectation

byte char short int long boolean

Enchanement d'expressions

tous

>>>=

de droite
gauche

de gauche
droite

Chaque case de la colonne associativit regroupe les oprateurs de mme priorit.

Expressions
short

et byte

Java effectue une conversion en valeur de type int de manire implicite sur les valeurs de type short et byte ds
qu'une opration est effectue, ce qui peut donner des rsultats non conforme ce que l'on pourrait attendre (dtails
(http://linformalibre.f2lt.fr/index.php?title=Particularit%C3%A9_des_Op
%C3%A9rations_Binaires_sur_les_bytes_et_les_shorts_en_Java) [ archive]).

Expressions boolennes
Les expressions boolennes employant les oprateurs ET logique (&&) et OU logique (||) sont values de manire
paresseuse. C'est dire que l'valuation s'arrte aussitt que le rsultat est dtermin.
Exemple avec l'oprateur ET logique (vrai si les deux oprandes sont vrais), si le premier oprande est faux le rsultat
est faux et le deuxime oprande n'est pas valu. Si le deuxime oprande est le rsultat de l'appel une mthode,

18 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

cette mthode ne sera pas appele :


String s = getText();
if ((s!=null) && (s.length()>0))
// si s vaut null, la longueur n'est pas teste sinon cela provoquerait une exception.
{ /*...*/ }

Parfois ce comportement n'est pas dsirable. Dans ces cas-l, il faut utiliser les oprateurs binaires quivalents ET (&)
et OU (|).
Le remplacement dans l'exemple prcdent serait cependant une erreur :
String s = getText();
if ((s!=null) & (s.length()>0))
// si s vaut null, la longueur est tout de mme teste et provoque donc une exception !
{ /*...*/ }

Savoir si une racine carre est entire


La fonction calculant les racines carres pouvant trouver des nombres virgules, voici une courte technique pour
savoir s'il s'agit d'un entier :
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
double r = (double)Math.sqrt(n);
return (r*r == n);
}

19 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Conditions
En Java, les squences d'instructions if...else et switch..case permettent de formuler des traitements conditionnels.

Instructions if...else
L'instruction if permet d'excuter une instruction (ou un bloc d'instructions) si une condition est remplie :
if (condition) {
// instructions excuter
}

L'instruction else complte l'instruction if. Elle permet d'excuter une instruction si la condition indique par le if n'est
pas remplie :
if (condition) {
// instructions excuter
} else {
// instructions excuter si la condition n'est pas remplie
}

On peut aussi enchaner les tests conditionnels les uns la suite des autres :
if (condition1) {
// bloc1
} else if (condition2) {
// bloc2
} else {
// bloc3
}

Instructions switch...case
La squence d'instructions switch permet d'excuter diffrentes instructions (ou blocs d'instructions) en fonction d'une
liste de cas. L'instruction default permet de dfinir un cas par dfaut.
switch (expression)
{
case constante1:
// instructions excuter
break;
case constante2:
// instructions excuter
break;
// ...
default:
// instructions excuter
break;
}

L'instruction break sert sortir du test. Dans le cas contraire, les instructions du case suivant seraient galement
excutes. Pour plus de prcision, voir la section suivante (itration).
Remarque : le dernier break est facultatif (qu'il s'agisse de la clause default dans le cas prcdent, ou d'une clause
case). Cependant ajouter ce dernier break amliore la maintenabilit du code en cas d'ajout d'un nouveau cas (case ou
default) ou de dplacement du dernier cas.

20 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Attention : l'instruction switch ne fonctionne que sur des types simples : int, short, byte et char, ainsi que sur les
wrappers correspondants (Integer, Short, Byte et Character).
Dans les versions rcentes de Java, le switch accepte aussi le type numration enum (depuis JDK 6) et le type String
(depuis JDK 7).

21 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Itrations
Java offre deux instructions permettant de raliser des traitements itratifs : while, for. De plus les instructions break
et continue permettent d'altrer le droulement des boucles.

Instruction while
L'instruction while continue d'excuter le traitement situ dans la boucle tant que la condition indique est vrifie :
while (condition) {
// instructions excuter
}

Une autre forme du while value la condition la fin de chaque cycle, plutt qu'au dbut. Le bloc d'instruction est
donc toujours excut au moins une fois :
do {
// instructions excuter
} while (condition);

Instruction for
L'instruction for permet d'excuter un traitement de manire rptitive, mais en spcifiant diffremment la condition
d'arrt.
l'intrieur des parenthses se trouvent trois blocs d'instructions spars par un point-virgule. L'excution de la boucle
for commence par excuter le premier bloc, qui sert gnralement initialiser une variable. Ensuite le second bloc est
excut (la condition). Si la condition retourne la valeur boolenne true, le corps de la boucle for est excut (le bloc
d'instruction entre accolade). Sinon l'excution de la boucle for se termine. Si le corps de la boucle a t excut, le
troisime bloc est excut (incrmenter une variable en gnral) et le processus recommence : la condition est value,
etc.
Voici un exemple typique d'une boucle for qui dfini un compteur pour excuter la boucle i fois. En d'autres termes, le
traitement est effectu tant que le compteur n'a pas atteint une limite :
for (int i=0 ; i<limite ; i=i+increment) {
// instructions excuter
}

Environnement concurrentiel
L'accs aux donnes par l'intermdiaire des itrateurs est par essence squentiel, deux threads ne peuvent bien sur pas
utiliser le mme itrateur, un objet ne peut pas fournir un itrateur plusieurs threads. Il est conseill d'utiliser dans ce
cas les classes spcialises de java.util.concurrent

Sauts dans le code


Java permet de faire des sauts dans le code lors de l'excution d'une boucle, c'est en gnral une mauvaise ide et il
faut, autant que possible viter de recourir ces pratiques. Il s'agit des instructions break qui permet de sortir
immdiatement de la boucle (c'est--dire de sauter immdiatement la premire instruction qui suit la boucle) ou de
l'instruction continue qui permet de ne pas excuter le reste de l'itration en cours, c'est--dire de sauter

22 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

immdiatement au bloc d'incrmentation et une nouvelle valuation de la condition.

Pour les collections


Le chapitre Collections montrera que ce type d'objet possde sa propre itration : pour chaque objet d'une collection.

23 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Tableaux
Un tableau est un ensemble index de donnes d'un mme type. L'utilisation d'un tableau se dcompose en trois
parties :
Cration du tableau
Remplissage du tableau
Lecture du tableau

Cration d'un tableau


Un tableau se dclare et s'instancie comme une classe :
int monTableau[ ] = new int[10];

ou
int [ ] monTableau = new int[10];

L'oprateur [ ] permet d'indiquer qu'on est en train de dclarer un tableau.


Dans l'instruction prcdente, nous dclarons un tableau d'entiers (int, integer) de taille 10, c'est--dire que nous
pourrons stocker 10 entiers dans ce tableau.
Si [ ] suit le type, toutes les variables dclares seront des tableaux, alors que si [ ] suit le nom de la variable, seule
celle-ci est un tableau :
int [] premierTableau, deuxiemeTableau;
float troisiemeTableau[], variable;

Dans ces quatre dclarations, seule variable n'est pas un tableau.

Remplissage d'un tableau


Une fois le tableau dclar et instanci, nous pouvons le remplir :
int [] monTableau = new int[10];
monTableau[5] = 23;

L'indexation dmarre partir de 0, ce qui veut dire que, pour un tableau de N lments, la numrotation va de 0 N-1.
Dans l'exemple ci-dessus, la 6me case contient donc la valeur 23.
Nous pouvons galement crer un tableau en numrant son contenu :
int [] monTableau = {5,8,6,0,7};

Ce tableau contient 5 lments.


Lorsque la variable est dj dclare, nous pouvons lui assigner d'autres valeurs en utilisant l'oprateur new :

24 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

monTableau = new int[]{11,13,17,19,23,29};

Lecture d'un tableau


Pour lire ou crire les valeurs d'un tableau, il faut ajouter l'indice entre crochets ([ et ]) la suite du nom du tableau :
int [] monTableau = {2,3,5,7,11,23,17};
int nb;
monTableau[5] = 23;
nb = monTableau[4];

// ->
// 11

2 3 5 7 11 23 17

L'indice 0 dsigne le premier lment du tableau.


L'attribut length d'un tableau donne sa longueur (le nombre d'lments). Donc pour un tableau nomm monTableau
l'indice du dernier lment est monTableau.length-1.
Ceci est particulirement utile lorsque nous voulons parcourir les lments d'un tableau.
for (int i = 0; i < monTableau.length; i++) {
int element = monTableau[i];
// traitement
}

Les tableaux en Java 5


Java 5 fournit un moyen plus court de parcourir un tableau.
L'exemple suivant ralise le traitement sur monTableau :
for (int element : monTableau){
// traitement
}

Attention nanmoins, la variable element contient une copie de monTableau[i]. Avec des tableaux contenant des
variables primitives, toute modification de element n'aura aucun effet sur le contenu du tableau.
// Vaine tentative de remplir tous les lments du tableau avec la valeur 10
for(int element : monTableau){
element=10;
}
// La bonne mthode :
for(int i=0; i < monTableau.length; i++){
monTableau[i]=10;
}

Tableaux plusieurs dimensions


En Java, les tableaux plusieurs dimensions sont en fait des tableaux de tableaux.
Exemple, pour allouer une matrice de 5 lignes de 6 colonnes :
int[][] matrice=new int[5][];

25 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

for (int i=0 ; i<matrice.length; i++)


matrice[i]=new int[6];

Java permet de rsumer l'opration prcdente en :


int[][] matrice=new int[5][6];

La premire version montre qu'il est possible de crer un tableau de tableaux n'ayant pas forcment tous la mme
dimension.
On peut galement remplir le tableau la dclaration et laisser le compilateur dterminer les dimensions des tableaux,
en imbriquant les accolades :
int[][] matrice =
{
{ 0, 1, 4, 3 } , // tableau [0] de int
{ 5, 7, 9, 11, 13, 15, 17 } // tableau [1] de int
};

Pour dterminer la longueur des tableaux, on utilise galement l'attribut length :


matrice.length
matrice[0].length
matrice[1].length

//
//
//

2
4
7

De la mme manire que prcdement, on peut facilement parcourir tous les lments d'un tableau :
int i, j;
for(i=0; i<matrice.length; i++) {
for(j=0; j<matrice[i].length; j++) {
//Action sur matrice[i][j]
}
}

La classe Arrays
La classe Arrays du package java.util possde plusieurs mthodes de gestion des tableaux de types de base, et
d'objets :
la mthode asList convertit un tableau en liste,
la mthode binarySearch effectue la recherche binaire d'une valeur dans un tableau,
la mthode equals compare deux tableaux (longueur et contenu),
la mthode fill remplit un tableau avec la valeur donne,
la mthode sort trie un tableau dans l'ordre croissant de ses lments.
Exemple de source :
import java.util.*;
public class ArrayExample {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int numNoms = getInt("Nombre d'entres du tableau ?");
String[] noms = new String[numNoms];
for (int i = 0; i < noms.length; i++) {

26 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

noms[i] = getString("Entre n" + (i+1));


}
for (int i = 0; i < noms.length; ++i) {
System.out.println(noms[i]);
}
}
public static int getInt(String prompt) {
System.out.print(prompt + " ");
int entier = input.nextInt();
input.nextLine(); // Get rid of this line
// so that getString won't read it
return entier;
}
public static String getString(String prompt) {
System.out.print(prompt + " ");
return input.nextLine();
}
}

Copie d'un tableau


La copie d'un tableau implique la copie de ses lments dans un autre tableau. Dans le cas d'un tableau d'objets, seules
les rfrences ces objets sont copies, aucun nouvel objet n'est cr.
La mthode arraycopy de la classe System permet de copier tout ou partie d'un tableau vers un autre tableau dj
allou.
Comme toutes les classes, les tableaux drivent de la classe java.lang.Object. Les mthodes de la classe Object sont
donc utilisables :
int[] premiers = { 2, 3, 5, 7, 11 };
System.out.println( premiers.toString() ); // Par dfaut <type>@<hashcode>, exemple : [I@a108298c

La copie intgrale d'un tableau dans un nouveau tableau peut donc se faire en utilisant la mthode clone(). La valeur
retourne par cette mthode tant de type Object, il faut la convertir dans le type concern.
Exemple:
int[] nombres
int[] copie =
nombres[1]=4;
// tandis que

27 sur 142

= { 2, 3, 5, 7, 11 };
(int[]) nombres.clone();
// nombres contient 2 4 5 7 11
copie contient toujours 2 3 5 7 11

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Commentaires
Un commentaire permet d'insrer du texte qui ne sera pas compil ni interprt. Il sert ajouter du texte au code
source.
Il est utile pour expliquer ce que fait le code source :
expliquer le choix technique effectu : pourquoi tel algorithme et pas un autre, pourquoi appeler telle mthode, ...
expliquer ce qui devra tre fait par la suite (liste de chose faire) : amlioration, problme corriger, ...
donner les explications ncessaires la comprhension du code pour le reprendre soi-mme plus tard, ou pour
d'autres dveloppeurs.
Il peut aussi tre utilis pour que le compilateur ignore une partie du code : code temporaire de dbogage, code en
cours de dveloppement, ...
Il est galement utile pour la documentation des classes.

Syntaxe
Les commentaires en Java utilisent la mme syntaxe qu'en C++.
Un commentaire de fin de ligne commence par un double slash et se termine au retour la ligne.
Exemple :
// Un commentaire pour donner l'exemple
int n = 10; // 10 articles

Un commentaire sur plusieurs lignes est encadr par slash + toile, et toile + slash.
Exemple :
/*
Ceci est un commentaire
sur plusieurs lignes.
*/
/*
Code de dbogage dsactiv :
int a=10;
while (a-->0) System.out.println("DEBUG: tab["+a+"]="+tab[a]);
*/

Documentation des classes


Java permet de documenter les classes et leurs membres en utilisant une syntaxe particulire des commentaires.

Syntaxe
Un commentaire de documentation est encadr par slash-toile-toile et toile-slash (soit /** ... */). La documentation
est au format HTML.
Exemple :
/**

28 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Une classe pour donner un <b>exemple</b> de documentation HTML.


*/
public class Exemple {
/** ...Documentation du membre de type entier nomm exemple... */
public int exemple;
}

Le commentaire de documentation se place juste avant l'entit commente (classe, constructeur, mthode, champ).
Dans un commentaire de documentation, la premire partie est un texte de description au format HTML. La seconde
partie est une liste d'attributs spciaux dont le nom commence par un arobase (@). Ces derniers sont interprtables par
le compilateur et appels annotations.
Exemple pour la mthode suivante :
/**
Obtenir la somme de deux entiers.
@param a Le premier nombre entier.
@param b Le deuxime nombre entier.
@return La valeur de la somme des deux entiers spcifis.
*/
public int somme(int a, int b) {
return a + b;
}

Obtenir la somme de deux entiers.

Description de la mthode somme.


@param a Le premier nombre entier.

Attribut de description du paramtre a de la mthode.


@param b Le deuxime nombre entier.

Attribut de description du paramtre b de la mthode.


@return La valeur de la somme des deux entiers spcifis.

Attribut de description de la valeur retourne par la mthode.


Voici une liste non exhaustive des attributs spciaux :
Attribut et syntaxe

Dans un commentaire de
...

Description

@author auteur

classe

Nom de l'auteur de la classe.

@version version

classe

Version de la classe.
Marquer l'entit comme obsolte (ancienne version), dcrire
pourquoi et par quoi la remplacer.

@deprecated
description

classe, constructeur,
mthode, champ

@see rfrence

classe, constructeur,
mthode, champ

Si l'entit marque comme obsolte par cet attribut est utilise,


le compilateur donne un avertissement.
Ajouter un lien dans la section "Voir aussi".

@param description de
constructeur et mthode
l'id

Dcrire un paramtre de mthode.

@return description

mthode

Dcrire la valeur retourne par une mthode.

@exception
description du type

constructeur et mthode

Dcrire les raisons de lancement d'une exception du type


spcifi (clause throws).

Documentation

29 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Le JDK fournit un outil nomm javadoc qui permet de gnrer la documentation des classes correctement
commentes.
La commande javadoc sans argument donne la syntaxe complte de la commande.
Exemple : pour une classe nomme Exemple dfinie dans un package nomm org.wikibooks.fr dans le fichier
C:\ProgJava\org\wikibooks\fr\Exemple.java :
package org.wikibooks.fr;
/**
Une classe d'exemple.
*/
public class Exemple {
/**
Obtenir la somme de deux entiers.
@param a Le premier nombre entier.
@param b Le deuxime nombre entier.
@return La valeur de la somme des deux entiers spcifis.
*/
public int somme(int a, int b) {
return a + b;
}
}

La documentation peut tre gnre dans un rpertoire spcifique (C:\ProgDoc par exemple) avec la commande
suivante :

javadoc -locale fr_FR -use -classpath C:\ProgJava -sourcepath C:\ProgJava -d C:\ProgDoc org.wikibooks.

Les options de cette commande sont dcrits ci-dessous :


-locale fr_FR

La documentation est en franais.


-use

Crer les pages sur l'utilisation des classes et paquetages (packages).


-classpath C:\ProgJava

Le chemin des classes compiles (*.class).


-sourcepath C:\ProgJava

Le chemin des classes sources (*.java).


-d C:\ProgDoc

Le chemin o la documentation doit tre gnre.


org.wikibooks.fr

Le nom du paquetage (package) documenter. Il est possible de spcifier plusieurs paquetages, ou un ou


plusieurs noms de classe pour ne documenter que celles-ci.
La page de description d'un paquetage copie le texte de description partir d'un fichier nomm package.html qui doit
se situer dans le rpertoire correspondant. Dans notre exemple, il faut documenter le paquetage dans le fichier
C:\ProgJava\org\wikibooks\fr\package.html.
Dans les versions rcentes de Java, le fichier package.html peut tre remplac par un fichier Java spcial nomm
package-info.java contenant uniquement la dclaration du paquetage (package) prcde d'un commentaire de
documentation.
Exemple (C:\ProgJava\org\wikibooks\fr\package-info.java) :
/**
Ce paquetage fictif sert illustrer le livre sur Java

30 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

de <i>fr.wikibooks.org</i>.
*/
package org.wikibooks.fr;

31 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Les classes en Java


La notion de classe constitue le fondement de la programmation oriente objet. Une classe est la dclaration d'un type
d'objet.
En Java, les classes sont dclares l'aide du mot-clef class, suivi du nom de la classe dclare, suivi du corps de la
classe entre accolades. Par convention, un nom de classe commence par une majuscule.
public class MaClasse
{
// corps de la classe
}

Le fichier contenant cette dclaration doit avoir pour extension .java. Un fichier peut contenir plusieurs dclarations
de classes (ce n'est pas recommand, il faut partir du principe 1 classe = 1 fichier, pour des problmes vidents de
relecture du code, devoir modifier du code o plusieurs classes sont crites dans un seul fichier est le meilleur moyen
de faire n'importe quoi), mais il ne peut contenir qu'au plus une classe dite publique (dont le mot-clef class est prcd
de public, comme dans l'exemple ci-dessus). Le fichier doit obligatoirement porter le mme nom que cette classe
publique : dans l'exemple ci-dessus, il faudrait donc sauver notre classe dans un fichier nomm MaClasse.java.
Un fichier .java peut commencer par une ou plusieurs dclarations d'import. Ces imports ne sont pas indispensables,
mais autorisent en particulier l'accs aux classes prdfinies sans avoir spcifier leur chemin d'accs complet dans les
collections de classes prdfinies (organises en packages). Dans le code ci-dessous, on souhaite par exemple utiliser
la classe prdfinie Vector (un type de donnes comparable des tableaux dont la taille peut varier dynamiquement).
Dans la sous-collection de classes prdfinies "java", cette classe se trouve dans la sous-collection "util" (ou encore :
cette classe est dans le package "java.util").
Sans import, il faut spcifier le nom complet de la classe (packages inclus) :
public class MaClasse
{
// ...
public static void main(String[] args)
{
// sans l'import :
java.util.Vector v = new java.util.Vector();
// ...
}
}

Avec import, seul le nom de la classe (sans packages) utilise est ncessaire :
import java.util.Vector;
public class MaClasse
{
// ...
public static void main(String[] args)
{
// avec l'import :
Vector v = new Vector();
// ...
}
}

Quand plusieurs classes du mme package sont utilises, l'import peut utiliser le caractre toile. Une classe peut donc
avoir une longue liste d'import :
import java.util.Vector;

32 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

import java.util.ArrayList;
import java.util.HashMap;
public class MaClasse
{
// ...
public static void main(String[] args)
{
Vector
v = new Vector();
ArrayList a = new ArrayList();
HashMap
m = new HashMap();
}
}

ou une liste plus courte :


import java.util.*;
public class MaClasse
{
// ...
public static void main(String[] args)
{
Vector
v = new Vector();
ArrayList a = new ArrayList();
HashMap
m = new HashMap();
}
}

Enfin, la dfinition d'une classe peut aussi tre prcde d'une (et une seule) dclaration de package, qui indique quel
emplacement se trouve le fichier dans l'arborescence des rpertoires d'un projet Java. Par exemple, si la racine de notre
projet Java est le rpertoire /home/user/monProjet/ (ou c:\Mes documents\monProjet\ sous Windows) et que notre
classe se trouve dans le sous-rpertoire org/classes/ (soit, respectivement /home/user/monProjet/org/classes/ et c:\Mes
documents\monProjet\org\classes\) nous aurons une dclaration du package de la forme :
package org.classes;
public class MaClasse
{
// contenu de la classe
}

Important
Le package java.lang est automatiquement import dans tous les
programmes, il permet d'utiliser les types primitifs.

Instanciation d'une classe


Un objet peut tre vu comme un ensemble de donnes regroupes la manire des structures de C ou des
enregistrements de Pascal. Une classe dfinit un modle d'objet. Chaque objet cr partir d'une classe est appel
instance de cette classe. L'ensemble de donnes internes d'un objet - les champs de cet objet - est spcifi par sa
classe. Une classe peut en outre contenir : d'une part, des constructeurs - du code destin l'initialisation de ses
instances au moment de leur cration ; d'autre part des mthodes - du code destin la gestion des donnes internes de
chacune de ses instances. On dit que ces mthodes sont invocables sur les objets.
Les objets se manipulent l'aide de variables appeles rfrences. Une rfrence vers un objet est l'analogue d'un
pointeur vers celui-ci, au sens usuel de la notion de pointeur dans les langages impratifs tels que C - on dit que cette
rfrence pointe sur l'objet, ou encore qu'elle rfrence cet objet. Notez que par abus de langage, mais par abus de
langage seulement, on confond en pratique une rfrence vers un objet et l'objet lui-mme. On parlera ainsi de "l'objet

33 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

r"

plutt que de "l'objet rfrenc par r" ou "l'objet point par r". Pour autant, une rfrence vers un objet n'est pas
l'objet lui-mme : une rfrence peut ne pointer vers aucun objet - en particulier si elle est dclare sans tre initialise,
ou si on lui affecte la valeur de rfrence nulle, note null ; elle peut pointer successivement vers des objets
diffrents au cours du temps ; d'autre part, deux rfrences distinctes peuvent pointer vers le mme objet - les champs
de l'objet sont alors accessibles, et les mthodes de sa classe deviennent invocables via l'une ou l'autre de ces deux
rfrences, avec le mme effet.
Le type d'une rfrence spcifie la (ou mme les) classe(s) des objets sur lesquels elle est susceptible de pointer. Une
rfrence dclare de type "rfrence vers MaClasse", o MaClasse est le nom d'une classe, est susceptible de pointer
vers n'importe quelle instance de MaClasse.
MaClasse r; // dclaration d'une rfrence de type "rfrence vers MaClasse"
/* instructions diverses */
r = new MaClasse(); // cration d'une instance de MaClasse, puis rfrencement par r de l'objet cre.

On peut dclarer une rfrence et lui faire immdiatement rfrencer une nouvelle instance, cre dans cette
dclaration :
MaClasse r = new MaClasse(); // on cre une instance de MaClasse, que l'on rfrence par r

34 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Membres
Introduction
Les membres d'une classe sont les mthodes (traitements) et attributs (donnes) qui en font partie.
Exemple :
public class Horloge
{
// Dfinition des attributs
int heures;
int minutes;
int secondes;
// Dfinition des mthodes
public void definitHeure()
{
heures = 12;
minutes = 30;
secondes = 30;
}
public void incrementeHeure()
{
secondes++;
if (secondes==60)
{
secondes=0;
minutes++;
if (minutes==60)
{
minutes=0;
heures++;
if (heures==24)
{
heures=0;
}
}
}
}
protected void afficheHeure()
{
System.out.println("Il est "+heures+":"+minutes+":"+secondes);
}
public static void main (String[] args)
{
Horloge montre = new Horloge(); // Nouvelle instance de la classe
// Accs aux membres de la classe de l'objet avec le caractre point : <objet>.<membre>
montre.definitHeure();
for (int i=0 ; i<10 ; i=i+1)
{
montre.incrementeHeure();
montre.afficheHeure();
}
}
}

Dans cet exemple, la classe Horloge contient trois attributs servant reprsenter l'heure (heures, minutes et secondes)
et trois mthodes (definitHeure qui initialise, incrementeHeure, qui augmente l'heure d'une seconde, et afficheHeure,
qui affiche l'heure).
On distingue parmi les mthodes une catgorie particulire, les constructeurs.

35 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Dclaration
Attribut
La dclaration d'un attribut se fait de la manire suivante :
modificateurs type nom;

Constructeur
La dclaration d'un constructeur se fait de la manire suivante :
modificateur d'accs nomDeLaClasse(type et nom des paramtres ventuels) { corps du
constructeur }

Mthode
La dclaration d'une mthode se fait comme suit :
modificateurs typeDeRetour nom(type et nom des paramtres ventuels) { corps de la mthode }

Mthode nombre de paramtres variable


Java 5 introduit un mcanisme permettant d'crire des mthodes acceptant un nombre variable d'arguments
("varargs"), alors qu'il fallait passer par un tableau ou autre artifice similaire auparavant. La syntaxe est trs similaire
la syntaxe utilise pour la fonction printf en C, ce qui a permis d'ajouter une mthode printf dans la classe
PrintStream, ce qui permet de faire System.out.printf("what ever %d",5);
Exemple :
public class Message
{
public void message(String recette, String... arguments)
{
System.out.print("Ingrdients : \n");
for (String s : arguments)
System.out.println(s);
}
public static void main (String[] args)
{
Message menu = new Message();
menu.message("djeuner","ail","oignon","chalote");
}
}

Bloc d'initialisation
Une classe peut comporter un ou plusieurs blocs d'instructions servant initialiser toute instance de la classe, ou
initialiser des membres statiques si le bloc est dclar statique (static).
Exemple :
public class ImageFile

36 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

{
final int MAX_SIZE; // final -> variable initialise une seule fois

// Bloc d'initialisation
{
int maxsize;
try
{
maxsize = Integer.parseInt(System.getProperty("file.maxsize"));
}
catch(Exception ex) // proprit "file.maxsize" non dfinie (NullPointerException) ou n'est pa
{
maxsize = 1000; // valeur par dfaut
}
MAX_SIZE = maxsize; // variable initialise une seule fois
}
ImageFile(File f){ /* ... */ }
ImageFile(File f, int width){ /* ... */ }
ImageFile(File f, int width, int height){ /* ... */ }
}

Les instructions contenues dans les blocs d'initialisation sont appeles avant les instructions du constructeur utilis. Un
bloc d'initialisation permet donc de :
grer les exceptions (contrairement une affectation dans la dclaration de la variable membre),
viter la duplication du code dans les diffrents constructeurs.
La classe peut aussi comporter des blocs d'initialisation statiques, qui sont des blocs d'instructions prcds du
modificateur static, et qui sont excuts au chargement de la classe, juste aprs l'initialisation des attributs statiques.
Exemple :
public class Exemple
{
static
{
System.out.println("La classe Exemple est charge");
}
}

Un bloc d'initialisation statique permet de :


grer les exceptions (contrairement une affectation dans la dclaration de la variable membre),
charger la bibliothque native implmentant les mthode natives de la classe.

37 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Modificateur
Modificateurs d'accs
En Java, la dclaration d'une classe, d'une mthode ou d'un membre peut tre prcde par un modificateur d'accs.
Un modificateur indique si les autres classes de l'application pourront accder ou non la classe/mthode/membre
(qualifi par la suite d' item ).
Ces modificateurs sont au nombre de quatre :
public : toutes les classes peuvent accder l'item
protected : seules les classes drives et les classes du mme package peuvent accder l'item
private : l'item est seulement accessible depuis l'intrieur de la classe o il est dfini.
(par dfaut) : sans modificateur d'accs, seules les classes du mme package peuvent accder l'item.
L'utilisation des modificateurs permet au programmeur de contrler la visibilit des diffrents items et permet
d'empcher que des actions illgales soient effectues sur les items.

abstract
Le modificateur abstract indique qu'une classe ou mthode est abstraite.

final
Ajout devant un attribut, il le rend immuable, ds lors qu'il est initialis (autrement dit, il n'est pas obligatoire de
l'initialiser ds la dclaration, contrairement d'autres langages). Pour les types primitifs, final fige la valeur, pour les
objets, final fige la rfrence, et non la valeur de la rfrence (i.e. seule l'instanciation est fige).
Devant une variable locale (dans une mthode, donc), il a le mme comportement que pour un attribut.
Devant une mthode, il indique que cette mthode ne peut pas tre modifie dans une classe drive. Les mthodes
static et private sont implicitement final.
Devant une classe, il indique que cette classe ne peut pas avoir de sous-classe.

static
Le modificateur static indique, pour une mthode, qu'elle peut tre appele sans instancier sa classe (syntaxe :
Classe.methode()).
Pour un attribut, qu'il s'agit d'un attribut de classe, et que sa valeur est donc partage entre les diffrentes instances de
sa classe.
De plus, il est possible de dclarer dans une classe un bloc d'initialisation statique, qui est un bloc d'instruction prcd
du modificateur static.

synchronized
Le modificateur synchronized indique que la mthode ne peut tre excute que par un thread la fois. Le verrou ne
s'active que pour l'objet sur lequel la mthode a t appele (une mme mthode synchronized peut tre excute en
mme temps par deux threads diffrents sur deux objets diffrents).

transient
38 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Le modificateur transient indique que lors de la srialisation de l'objet, cet attribut n'est pas srialis et donc il est
ignor. Cela signifie que lorsque l'on dsrialise l'objet, l'attribut portant le modificateur transient n'est pas dfini
dans l'objet dsrialis. Il s'agit en gnral d'attributs qui peuvent tre recalculs partir des autres attributs de l'objet.

native
Ce modificateur permet d'indiquer que cet item est dfini dans une bibliothque externe crite dans un autre langage
de programmation, utilisant l'API JNI.

strictfp
Pour une mthode, une classe ou une interface, le modificateur strictfp (abrviation de strict floating point) force la
JVM valuer les oprations virgules flottantes (sur les double et float) conformment la spcification Java,
c'est--dire de la gauche vers la droite. Cela permet d'avoir un comportement identique d'une JVM une autre et
d'viter certains dpassements de valeur limite pour les rsultats intermdiaires.

volatile
Pour une variable, le modificateur volatile force la JVM, avant et aprs chaque utilisation de la variable, la
rafrachir partir de la mmoire principale au lieu d'utiliser un cache local. Cela permet de synchroniser la valeur de la
variable entre plusieurs threads.

39 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Hritage
L'hritage, l'un des mcanismes les plus puissants de la programmation oriente objet, permet de reprendre des
membres d'une classe (appele superclasse ou classe mre) dans une autre classe (appele sous-classe, classe fille ou
encore classe drive), qui en hrite. De cette faon, on peut par exemple construire une classe par hritage successif.
En Java, ce mcanisme est mis en uvre au moyen du mot-cl extends
Exemple :
public class Vehicule
{
public int vitesse;
public int nombre_de_places;
}
public class Automobile extends Vehicule
{
public Automobile()
{
this.vitesse = 90;
this.nombre_de_places = 5;
}
}

Dans cet exemple, la classe Automobile hrite de la classe Vehicule, ce qui veut dire que les attributs vitesse et
nombre_de_places, bien qu'tant dfinis dans la classe Vehicule, sont prsents dans la classe Automobile. Le
constructeur dfini dans la classe Automobile permet d'ailleurs d'initialiser ces attributs.
En Java, le mcanisme d'hritage permet de dfinir une hirarchie de classes comprenant toutes les classes. En
l'absence d'hritage indiqu explicitement, une classe hrite implicitement de la classe Object. Cette classe Object est
la racine de la hirarchie de classe.

La classe Object
Au moment de l'instanciation, la classe fille reoit les caractristiques qui peuvent tre hrites de sa super-classe, qui
elle-mme reoit les caractristiques qui peuvent tre hrites de sa propre superclasse, et ce rcursivement jusqu' la
classe Object.
Ce mcanisme permet de dfinir des classes gnriques rutilisables, dont l'utilisateur prcise le comportement dans
des classes drives plus spcifiques.
Il faut prciser que, contrairement C++, Java ne permet pas l'hritage multiple, ce qui veut dire qu'une classe drive
toujours d'une et d'une seule classe.

Hritage d'interface
L'hritage d'interface est aussi possible en Java. la diffrence des classes, l'hritage multiple est autoris, ce qui veut
dire qu'une interface peut hriter d'autant d'autres interfaces que dsir.
L'hritage d'interface se fait avec le mot cl extends, puisque c'est une interface qui "tend" une interface existante.
Les diffrentes interfaces hrites sont spares par une virgule.
L'hritage multiple pour une classe (via les interfaces) se fait avec le mot-cl implements. Exemple :
public interface InterfaceA {
public void methodA();
}

40 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

public interface InterfaceB {


public void methodB();
}
public interface InterfaceAB extends InterfaceA, InterfaceB {
public void otherMethod();
}
public class ClassAB implements InterfaceAB{
public void methodA(){
System.out.println("A");
}
public void methodB(){
System.out.println("B");
}
public void otherMethod(){
System.out.println("blablah");
}

Excution de cet exemple avec BlueJ.

public static void main(String[] args) {


ClassAB classAb = new ClassAB();
classAb.methodA();
classAb.methodB();
classAb.otherMethod();
}
}

Le mot-cl super
Le mot-cl super permet d'accder aux membres de la super-classe d'une classe, de la mme manire que l'on accde
aux attributs de la classe elle-mme l'aide du mot-cl this.
Exemple :
public class Avion extends Vehicule
{
public Avion()
{
super();
}
}

Dans cet exemple, le constructeur de la classe Avion fait appel au constructeur de la classe Vehicule.
Ce mot-cl permet galement d'accder explicitement aux membres de la classe de base, dans le cas, par exemple, o il
existe dj un membre portant ce nom dans la classe (surcharge de mthode, ...).
Exemple :
public class Vehicule
{
// ...
public void rouler() throws Exception
{
position += vitesse;
}
}
public class Avion extends Vehicule
{
// ...
public void rouler() throws Exception
{

41 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

if (altitude>0)
throw new Exception("L'avion en vol ne peut rouler");
else super.rouler();
}
}

Lien externe
L'hritage en Java (http://www.commentcamarche.net/java/javaherit.php3) [ archive]

42 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Encapsulation
En Java, comme dans beaucoup de langages orients objet, les classes, les attributs et les mthodes bnficient de
niveaux d'accessibilit, qui indiquent dans quelles circonstances on peut accder ces lments.
Ces niveaux sont au nombre de 4, correspondant 3 mots-cls utiliss comme modificateurs : private, protected et
public. La quatrime possibilit est de ne pas spcifier de modificateur (comportement par dfaut).

Comportement par dfaut


Si aucun modificateur n'est indiqu, l'lment n'est accessible que depuis les classes faisant partie du mme package.
Exemple :
package com.moimeme.temps;
class Horloge
{
// corps de la classe
}
public class Calendrier
{
void ajouteJour()
{
// corps de la methode
}
int mois;
// suite de la classe
}

La classe Horloge, la mthode ajouteJour et l'attribut mois ne sont accessibles que depuis les classes faisant partie du
package com.moimeme.temps.

Modificateur "private"
Un attribut ou une mthode dclare "private" n'est accessible que depuis l'intrieur mme de la classe.

Modificateur "protected"
Un attribut ou une mthode dclare "protected" est accessible uniquement aux classes d'un package et ses
sous-classes mme si elles sont dfinies dans un package diffrent.

Modificateur "public"
Une classe, un attribut ou une mthode dclare "public" est visible par toutes les classes et les mthodes.

En rsum
Le tableau rsume les diffrents mode d'accs des membres d'une classe.

43 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Modificateur du membre

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

private

aucun protected public

Oui

Oui

Oui

Oui

Accs depuis une classe du mme package Non

Oui

Oui

Oui

Accs depuis une sous-classe

Non

Non

Oui

Oui

Accs depuis toute autre classe

Non

Non

Non

Oui

Accs depuis la classe

44 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Polymorphisme
Le polymorphisme veut dire que le mme service, aussi appel opration ou mthode, peut avoir un comportement
diffrent selon les situations.

Polymorphisme paramtrable
Plusieurs signatures pour une mme mthode
On peut donner une mme mthode, plusieurs signatures pour implmenter des comportements diffrents selon les
types des paramtres passs. La signature d'une mthode est compose du nom de celle ci, de sa porte, du type de
donne qu'elle renvoie et enfin du nombre et du type de ses paramtres.
public class A {
private int a;
public A() { //constructeur 1
System.out.println("Cration de A");
}
public A(int a) { //constructeur 2 par surcharge
this.a = a;
System.out.println("Cration de A");
}
public int getter() {
return this.a;
}
public void setter(int a) {
this.a = a;
}
public static void main(String[] args) {
A premiera = new A(); //construction par 1
A seconda = new A(1); //construction par 2
}
}

Proposer le passage d'un nombre inconnu de paramtres


Dans la signature d'une mthode , on peut prciser qu'il est possible de passer plus de 1 paramtre du mme type en
suffixant le type du paramtre avec ... .
// supposons la mthode suivante :
public String concatenation(String... elements) {
// pour l'implementation, il faut considrer le paramtre comme un tableau
String resultat = "";
for (String element : elements) {
resultat += element;
}
return resultat;
}
// elle peut tre appele ainsi
concatenation("abc", "de", "f"); // renvoie "abcdef"

Polymorphisme d'hritage

45 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

En redfinissant une mthode dans une sous-classe, on peut spcialiser le comportement d'une mthode.
public class B extends A {
private int b;
public B() {
super();
System.out.println("Cration de B");
}
public B(int a, int b){
super(a);
this.b = b;
System.out.println("Cration de B");
}
public int getter() {
return this.b;
}
public void setter(int a, int b) {
super.setter(a);
this.b=b;
}
public static void main(String[] args) {
B ob1 = new B(10,20);
((A) ob1).getter(); // par trans-typage, appel de la mthode getter de la classe A
}
}

46 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Classes abstraites
Une classe abstraite se trouve mi-chemin entre les interfaces et les classes.
Les classes abstraites, comme les interfaces, ne sont pas instanciables.
Les classes abstraites sont dclares par le modificateur abstract.
Il y a plusieurs intrts dfinir des classes abstraites :
pour interdire l'instanciation d'une classe ;
pour faire de la factorisation de code en ne donnant qu'une implmentation partielle.

Exemple
public interface Chien {
void vieillir();
void aboyer();
}

On sait que la mthode vieillir sera implmente de la mme manire quelle que soit l'implmentation de Chien. Plutt
que d'implmenter cette interface chaque fois, on va factoriser le code dans une classe abstraite et tendre cette
classe quand le besoin s'en fait sentir. On cre donc une classe AbstractChien qui n'implmente que la mthode vieillir
de notre interface, les autres tant laisses abstract.
package cours;
public abstract class AbstractChien implements Chien {
//Champs
//On met les champs en protected pour que les classes filles
//puissent les manipuler directement
protected int age;
protected String couleur;
//Constructeur
//Pourra tre utilis par les classes filles pour initialiser les champs.
public AbstractChien(int age, String couleur) {
this.age = age;
this.couleur = couleur;
}
// Mthode
//On donne l'implmentation qui est commune tous les chiens
public void vieillir() {
age ++;
}
//Cette mthode n'est dfinie que par les classes filles
//Elle est donc laisse abstract.
public abstract void aboyer();
}

47 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Interfaces
Prsentation
Liste de mthodes dont on donne seulement la signature
Reprsente un "contrat", ce qu'on attend d'un objet
Peut tre implmente par une ou plusieurs classes qui doivent donner une implmentation pour chacune des
mthodes annonces (et ventuellement d'autres).
Une classe peut implmenter plusieurs interfaces (permettant un hritage multiple, en les sparant par des virgules
aprs le mot implements).
Toutes les mthodes d'une interface sont implicitement abstraites.
Une interface n'a pas de constructeurs
Une interface ne peut avoir de champs sauf si ceux-ci sont statiques.
Une interface peut tre tendue par une ou plusieurs autre(s) interface(s).
En fait, une interface est une classe abstraite dont toutes les mthodes sont abstraites et dont tous les attributs sont
constants (des constantes, voir le mot-cl final).

Exemple
//Dfinition de l'interface
package cours;
public interface Vehicule {
void rouler();
void freiner();
}

On a dfini ici ce qu'on attend d'un objet de type vhicule.


On peut maintenant donner une ou plusieurs implmentations de cette interface grce l'utilisation du mot clef
implements :
package cours;
public class Velo implements Vehicule {
//Champs
private String marque;
private int rayonRoue;
//Constructeurs
public Velo(String marque, int rayonRoue)
{
this.marque = marque;
this.rayonRoue = rayonRoue;
}
//Methodes
public void rouler() {
//Coder ici la manire dont le vlo roule
}
public void freiner() {

48 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

//Coder ici la manire dont le vlo freine


}
//Autres mthodes propres Velo
}

package cours;
public class Auto implements Vehicule {
//Champs
private String marque;
private int poids;
//Constructeurs
public Auto(String marque, int poids)
{
this.marque = marque;
this.poids = poids;
}
//Methodes
public void rouler() {
//Coder ici la manire dont l'auto roule
}
public void freiner() {
//Coder ici la manire dont l'auto freine
}
//Autres mthodes propres Auto.
}

Dans cet exemple, nous avons donn deux implmentation de Vehicule.


Consquences :
Ces 2 objets peuvent tre vus comme des vhicules, c'est ce qu'on appelle le polymorphisme.
Partout o on attend un objet de type Vehicule, on peut mettre un de ces deux objets.
Par ce biais, on introduit une couche d'abstraction dans notre programmation ce qui la rend beaucoup plus flexible.

Discussion
Si, par exemple, nous avions une classe Personne possdant une mthode conduire(Vehicule v), on peut alors crire :

Personne p = new Personne();


p.conduire(new Velo()); //comme la mthode attend un Vehicule en argument, on peut passer tout objet i
p.conduire(new Auto()); //idem

On peut "instancier" un Vehicule par le biais de ses implmentations :


Vehicule v = new Auto();
Vehicule t = new Velo();

Dans ce cas v et t sont vus comme des Vehicule et, par consquent, on ne peut appeler sur ces objets que les mthodes
dfinies dans l'interface Vehicule.

49 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Classes internes
Une classe interne est dclare l'intrieur d'une autre classe. Elle peut donc accder aux membres de la classe
externe.

Classe interne statique


Une classe interne statique ne peut accder qu'aux membres statiques de sa classe contenante, reprsente par
ClassExterne dans l'exemple suivant :
public class ClasseExterne
{
private int compteur = 0;
private static String nom = "Exemple";
static class ClasseInterne
{
private int index = 0;
public ClasseInterne()
{
System.out.println("Cration d'un objet dans "+nom);
// compteur ne peut tre acced
}
}
}

La compilation du fichier ClasseExterne.java produit deux fichiers compils :


contient la classe ClasseExterne uniquement
ClasseExterne$ClasseInterne.class contient la classe ClasseInterne
ClasseExterne.class

Classe interne non statique


Une classe interne non statique peut accder aux membres statiques de la classe ainsi qu'aux membres de l'objet qui l'a
cre. En fait, le compilateur cre un membre supplmentaire dans la classe interne rfrenant l'objet qui l'a cr.
Une telle classe interne peut-tre dclare de manire globale dans l'objet; elle sera accessible par l'ensemble des
mthodes de l'objet. Elle peut aussi tre dclare de manire locale une mthode de l'objet. Elle sera alors accessible
depuis cette seule mthode.
Exemple (Classe non statique globale) :
public class ClasseExterne
{
private int compteur = 0;
class ClasseInterne
{
private int index = 0;
public ClasseInterne()
{
compteur++;
}
}
}

Depuis la classe interne, dans le cas o plusieurs variables ou mthodes portent le mme nom dans la classe interne et
la classe externe, le pointeur this seul dsigne l'instance de la classe interne, tandis que le pointeur this prcd du
nom de la classe externe dsigne l'instance de la classe externe.

50 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

public class ClasseExterne


{
private int compteur = 10;
class ClasseInterne
{
private int compteur = 0;
public void count()
{
this.compteur++; // -> 1
ClasseExterne.this.compteur--; // -> 9
}
}
}

Classe anonyme
Une classe peut tre dclare au moment de l'instanciation de sa classe parente. On parle alors de classe anonyme.
Exemple :
public class ClasseExterne {
Bissextile b = new Bissextile() {
public boolean evaluer(annee) {
if ((annee%4==0 && annee%100!=0) || annee%400==0) {
return true;
} else {
return false;
}
}
};
public static void main(String args[]) {
long an = Long.parseLong(args[0]);
if (b.evaluer(an)) {
System.out.println("L'anne entre est bissextile");
} else {
System.out.println("L'anne entre n'est pas bissextile");
}
}
}

La classe Bissextile est ici la classe mre d'une classe anonyme. Cette classe sera automatiquement nomme par le
compilateur ClasseExterne$1. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa dclaration.
Cette mthode de cration de sous-classe peut galement s'appliquer aux interfaces. En utilisant la syntaxe suivante, la
classe anonyme cre implmente l'interface spcifie :
new Interface()
{
...implmentation des mthodes de l'interface...
}

Remarques :
Une classe anonyme est implicitement considre comme final (et ne peut donc pas tre abstract, abstraite).
Une classe anonyme ne peut pas contenir de constructeur. Le constructeur appel est celui qui correspond
l'instruction d'instanciation. Toutefois, elle peut avoir des blocs d'initialisation.
Une classe anonyme ne possde pas d'identificateur et ne peut donc tre instancie qu'une seule fois (d'o son nom).

51 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Transtypage
Le transtypage (ou cast) est la conversion d'une expression d'un certain type en une expression d'un autre type.

Transtypage implicite
On peut affecter un champ ou une variable d'un type donn une expression de type moins lev dans la hirarchie
des types. De mme, une mthode ou un constructeur attendant un argument d'un type donn peut recevoir en
argument effectif une expression de type moins lev que celui indiqu dans sa dclaration. L'expression fournie sera
dans ce cas automatiquement convertie en le type attendu, sans que l'utilisateur ait besoin d'expliciter cette conversion.
Toute tentative de conversion implicite d'un type vers un type qui n'est pas plus haut dans la hirarchie des types
dclenchera une erreur au moins l'excution, ou ds la compilation si elle est dtectable statiquement.
Cas des types primitifs
Dans le cas des types primitifs, la hirarchie est la suivante : byte est plus bas que short, short plus bas que int, char
plus bas que int, int plus bas que long, long plus bas que float, float plus bas que double. Le type boolean est
incomparable avec les autres types de base. On peut par exemple assigner une variable de type float une expression
de type int gale 3 : l'expression 3 sera, avant affectation, convertie en float (3.0). Cette forme de conversion est
rversible : on peut, aprs passage de int float, reconvertir l'expression de type float rsultante en int par une
conversion explicite (voir ci-dessous) et retrouver la mme valeur.
int n;
float f;
n = 3;
f = n; // 3 est converti en 3.0

Le type dtermin statiquement pour les arguments d'oprateurs arithmtiques est le premier type partir de int dans
lequel peuvent tre convertis les types de tous les arguments. Les expressions constantes sont d'autre part types
statiquement en le premier type partir de int permettant leur reprsentation.
short s;
s = 15;

// <-- erreur gnre, 15 est typ statiquement de type int


// s = (short) 15; fonctionne (conversion explicite)
s = s + s ; // <-- erreur gnre, chaque sous-expression est convertie en int
// et l'expression s + s est type de type int.
// s = (short) (s + s) fonctionne
int n;
long l = 10L;
n = s;
// correct : conversion implicite
n = n + l;
// <-- erreur gnre, la sous-expression gauche est convertie en long

Typage par suffixe

Par dfaut les entiers sont typs en Integer mais un suffixe peut les spcifier Long :
class Suffixes {
public static void main(String[] args)
Object n = 1;
System.out.println(n.getClass());
n = 1L;
System.out.println(n.getClass());
n = 1.1;
System.out.println(n.getClass());
n = 1.1F;
System.out.println(n.getClass());
}
}

52 sur 142

{
// Integer
// Long
// Double
// Float

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Cas des types rfrences


La classe d'un objet ne peut videmment tre convertie : durant toute sa dure de vie, il s'agit toujours de la classe dans
laquelle est dfini le constructeur employ lors de sa cration. Le type d'une rfrence peut en revanche tre converti
selon les rgles suivantes :
Si A est anctre de la classe B, alors toute expression de type "rfrence vers B" peut tre implicitement convertie en
le type "rfrence vers A".
Si I est une interface implmente par la classe B, toute expression de type "rfrence vers B" peut tre
implicitement convertie en le type "rfrence vers I".
Si J est une interface tendant l'interface I, toute expression de type "rfrence vers J" peut tre implicitement
convertie en le type "rfrence vers I".
Dans l'exemple ci-dessous, on fait pointer trois rfrences a, i, j, b, c vers un mme objet de classe C :
class A { ... }
interface I { ...
interface J { ...
class B extends A
class C extends B
...
A
I
J
B
C

a;
i;
j;
b;
c;

//
//
//
//
//

de
de
de
de
de

c = new C();

type
type
type
type
type

}
}
implements I { ... } // implmente I, descendante de A
implements J { ... } // implmente I et J, descendante de A et B

"rfrence
"rfrence
"rfrence
"rfrence
"rfrence

vers
vers
vers
vers
vers

A"
I"
J"
B"
C"

// l'oprateur new renvoie une rfrence de type "rfrence vers C"


// vers l'objet cr, de classe C

// la suite d'affectations suivante est valide


i = c; // C implmente I
j = c; // C implmente J
b = c; // B est anctre de C
i = b; // B implmente I
a = b; // A est anctre de B
a = c; // A est anctre de C
// chaque affectation ci-dessous dclenchera statiquement une erreur
j = b // <-- B n'implmente pas J
i = j // <-- J n'est pas une extension de I
b = a // <-- B n'est pas anctre de A

La mme rgle permet de convertir toute rfrence en une rfrence de type Object :
class A extends ... implements ... { ... } // extends Object implicite
...
Object o = new A();

Visibilit des champs et mthodes aprs transtypage, liaison dynamique


Soit r une rfrence de type "rfrence vers X", pointant vers un certain objet de classe C. D'aprs les rgles ci-dessus,
X est donc soit une classe (concrte ou abstraite) anctre de C, soit une interface implmente par C :
Les seuls champs accessibles via r sont ceux visibles dans X (dclars dans X ou hrits, et visibles dans le contexte
de r). La valeur lie r.champ est celle lie this.champ dans X.
class A {
int x = 0:
int y = 1;

53 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

}
class B extends A {
int x = 2; // redfinition du champ x
int z = 3; // nouveau champ
// le champ y est hrit
}
...
B b = new B();
A a = b;
// les expressions suivantes sont valides
... a.x...
// la valeur est celle du champ a de A, soit 0
... b.x...
// la valeur est celle du champ a de B, soit 2
... a.y...
// valeur 1
... b.y...
// y est hrit, valeur 1
... b.z...
// valeur 3
// l'expression suivante est invalide
... a.z...
// l'objet possde bien un champ z, mais il n'est
// pas visible dans A

Seules les mthodes dont le nom est visible (par dclaration ou par hritage) dans X sont invocables sur r.
L'implmentation excute lors d'une invocation de la forme r.mthode(..) sera l'implmentation de la mthode de
mme nom et de mme signature dans la classe de l'objet, et non l'implmentation vue dans X. Le nom de la
mthode est dit li dynamiquement l'implmentation de cette mthode dans la classe de l'objet.
class A {
void m() {
System.out.println ("implmentation de m dans A");
}
}
class B extends A {
// la mthode m est hrite
// nouvelle mthode :
void n() {
System.out.println ("implmentation de n dans B");
}
}
class C extends B {
// la mthode n est hrite
// redfinition de m
void m() {
System.out.println ("implmentation de m dans C");
}
}
...
A a = new A();
a.m(); // affiche "implmentation de m dans A"
...
B b = new B();
b.m(); // affiche "implmentation de m dans A" (hritage)
b.n(); // affiche "implmentation de n dans B"
a = b;
a.m(); // affiche "implmentation de m dans A"
a.n(); // <--- erreur : la mthode n n'est pas visible dans A
...
C c = new C();
c.m(); // affiche "implmentation de m dans C"
c.n(); // affiche "implmentation de n dans B" (hritage)
b = c;
b.m(); // affiche "implmentation de m dans C" (liaison dynamique)
b.n(); // affiche "implmentation de n dans B"
a = c;
a.m(); // affiche "implmentation de m dans C" (liaison dynamique)
a.n(); // <--- erreur : la mthode n n'est pas visible dans A

Cas des conversions vers String

54 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Toute expression peut tre convertie implicitement (ou explicitement) dans le type "rfrence vers String". Dans le cas
o cette expression n'est pas statiquement constante, il y a alors cration dynamique d'un objet de classe String
reprsentant la valeur de cette expression, et l'expression rsultant devient une rfrence vers cet objet.

Transtypage explicite
Le type d'une expression peut galement tre explicitement converti avec la syntaxe suivante :
(nouveau_type)expression

O expression est l'expression convertir. S'il s'agit d'une expression compose, il faut l'encadrer par des
parenthses. La conversion explicite d'une expression doit tre utilise chaque fois que l'on souhaite convertir une
expression dans un type qui n'est pas plus haut dans la hirarchie des types. Dans le cas des types numriques, cette
conversion n'est sans pertes que si le type cible permet de reprsenter la mme valeur. Dans le cas contraire, la valeur
choisie dpend du type initial et du type cible. Dans le passage de float int, la valeur choisie est par exemple la valeur
entire de la valeur initiale :
int n;
float f;
n
f
f
n
f
n

=
=
=
=
=
=

3;
n;
f + 1;
(int) f;
f + 1.5;
(int) f;

//
//
//
//
//

f vaut 3.0
conversion de 1 en 1.0 et somme : f vaut 4.0
n vaut 4
f passe 5.5
5.5 est arrondi en 5 : n vaut 5.

Pour les types de rfrences, la conversion est libre : une rfrence de type quelconque peut tre explicitement
convertie en toute rfrence dont le type permet de manipuler l'objet rfrenc, selon les rgles ci-dessus. La
non-validit de cette conversion n'est en gnral pas dtectable avant l'excution :
interface I { ... }
class A { ... }
class B extends A implements I { ... }
class C { ... }
...
Object o = new B(); // l'objet cr est de classe B
I i = (I) o; // valide : B implmente I
A a = (A) o; // valide : A est anctre de B
B b = (B) a; // valide
C c = (C) o; // invalide : C n'est pas anctre de B

Ces conversions "descendantes" sont bien sr propices aux erreurs. L'oprateur instanceof permet de vrifier la
validit d'une conversion avant de l'effectuer :
if (r instanceof C) {
c = (C) r;
// action sur les instances de C
...
}
else {
// action sur les instances d'une autre classe
...
}

L'oprateur instanceof et les conversions supportent galement les tableaux ( partir d'un objet de type Object) :
Object r = getObject();

55 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

if (r instanceof int[]) {
int[] valeurs = (int[]) r;
...
}
else {
...
}

Autoboxing
Java 5 introduit un mcanisme permettant la simplification du transtypage, appel autoboxing. Ce mcanisme permet
d'utiliser indiffremment les types primitifs et les classes wrappers. Exemple :
Avant Java 5, il fallait crire :
List integers = methodeRenvoyantDesIntegers();
for(i=0;i<integers.size();i++) {
Integer integer = (Integer)integers.get(i);
int actuel = Integer.parseInt(integer);
methodNecessitantUnInt(actuel);
}

Alors qu'avec Java 5, il n'est plus ncessaire de passer par parseInt() :


List integers = methodeRenvoyantDesIntegers();
for(i=0;i<integers.size();i++) {
int actuel = (Integer)integers.get(i);
methodNecessitantUnInt(actuel);
}

On voit que les int et les Integer sont utiliss indiffremment.


Toutefois, il n'est pas possible de dclarer un type gnrique avec un type primitif. Il faut utiliser la classe englobante
correspondante.
Exemple :
ArrayList<Integer> counters = new ArrayList<Integer>();
counters.add(500);
int n = counters.get(0);

Les limites de l'autoboxing est qu'il ne concerne que chaque type primitif et sa classe englobante respective. Par
exemple le code suivant renvoie l'erreur inconvertible types en voulant passer du String au Float :
public static void main(String[] args) {
for(int i = 0; i < args.length; i++) {
System.out.println((Float)args[i]);
}
}

Il faut donc crire [1] :


public static void main(String[] args) {
for(i=0;i<integers.size();i++) {
System.out.println((Float.valueOf(args[i])).floatValue());
}

56 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Rfrences
1. http://docs.oracle.com/javase/tutorial/java/data/converting.html

57 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Types gnriques
Dfinition
Les gnriques (de l'anglais generics) sont des classes qui sont typs au moment de la compilation. Autrement dit, ce
sont des classes qui utilisent des typages en paramtres. Ainsi une liste chaine, qui peut contenir des entiers, des
chaines ou autres pourra tre type en liste de chaine ou liste d'entier et ceci permettra au programmeur de ne pas
crire systmatiquement des transtypages, mthode qui pourrait s'avrer dangereuse, ce sera le compilateur qui
vrifiera la cohrence des donnes.
Java 5 a introduit un principe de type gnrique, rappelant les templates (modles) du C++, mais le code produit est
unique pour tous les objets obtenus partir de la mme classe gnrique.
Avant java 5 :
public class MaListe
{
private LinkedList liste;
public setMembre(String s)
{
liste.add(s);
}
public int getMembre(int i)
{
return (Int)liste.get(i);
}
}

Le transtypage est obligatoire, LinkedList manipule des objets Object, ici le compilateur ne peut dtecter de problme,
problme qui ne surviendra qu' l'excution (RunTimeError).
Dans la version avec gnriques, on n'a plus besoin d'utiliser le transtypage donc le compilateur dclenchera deux
erreurs durant la compilation, une sur la mthode, l'autre sur l'ajout d'un entier.
public class Famille < MaClasse >
{
private LinkedList < MaClasse > liste;
public setMembre(MaClasse m)
{
liste.add(m);
}
public MaClasse getMembre(int i)
{
return liste.get(i);
}
public Int getInt(int i)
{
return liste.get(i);
}

//premire erreur

Utilisation :
Famille<String> famille = new Famille<String>();
famille.setMembre("essai");
famille.setMembre(210);
//seconde erreur

58 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Il est important de comprendre que dans la dclaration de la classe le paramtre plac entre les caractres < et >
reprsente bien une classe qui ne sera dtermine que lors de la dclaration de la cration de l'objet. Aussi une erreur
de typage sera produite la compilation si les types utiliss par les mthodes ne sont le ou les types attendus. Dans cet
exemple, l'erreur sera signale sur le second ajout.
Dans la dclaration de la classe, la liste membre est dclare ne pouvant contenir que des objets de classe MaClasse.
L'identifiant MaClasse n'est pas une classe existante dans le packages et il est prfrable qu'il ne le soit pas pour
qu'aucune confusion ne soit faite, c'est la dclaration de l'objet Famille que l'identifiant MaClasse sera rsolu.
Il est videmment possible d'utiliser un objet d'une classe hritant de celle utilise pour paramtrer le type gnrique.
Ceci permet de plus d'assurer la compatibilit ascendante avec les versions antrieures de Java : si aucune classe de
paramtrage n'est indique, la classe par dfaut est java.lang.Object.

Plusieurs paramtres
De la mme faon que pour les classes bases sur les List, les dclarations de vos classes peuvent utiliser ces
gnriques. Cela permet de rendre le code plus souple et surtout rutilisable dans des contextes trs diffrents.
Plusieurs paramtres, spars par des virgules, peuvent tres utiliss entre les caractres < et >.
public class ListeDeTruc<Truc, Bidule>
{
private LinkedList < Truc > liste;
private ArrayList <Bidule> tableau;
public void accumule(Truc m)
{
liste.add(m);
}
public Bidule recherche(int i)
{
return tableau.get(i);
}
}

Dclaration possible :
ListeDeTruc<String,Integer> liste1 = new ListeDeTruc<String,Integer>();
ListeDeTruc<Thread,Date> liste2 = new ListeDeTruc<Thread,Date>();

Gnriques et hritages
Lorsqu'un type de base doit rpondre des spcifications prcises, il est possible d'crire des choses du genre :
public class ListeDeTruc<Truc extends Bidule, MaList<String>> implements Moninterface<Chose>

En revanche, crer une classe qui hrite de ces objets est plus dlicat. Ici Chose et Bidule sont des classes existantes,
Truc ne sera rsolu qu'au moment de la dclaration de l'objet ListeDeTruc.
L'utilisation du mot clef super est possible dans une classe hritant d'une classe gnrique.

Tableau de gnriques
La dclaration d'un tableau d'objets dont le type est gnrique peut se faire sans dclencher ni erreur, ni avertissements
et sans utiliser l'annotation @SuppressWarnings("unchecked"), en utilisant <?> :

59 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

ArrayList<?>[] namelists = new ArrayList<?>[5];

Conventions sur les noms des types


Bien qu'il soit tout fait possible d'utiliser n'importe-quel identifiant suivant la convention de nommage des classes, il
est plutt recommand d'utiliser un identifiant compos d'une seule lettre selon la convention [1] :
<E>
<K>

Element , utilis abondamment pour le type des lments d'une collection ;


et <V>
Key , pour respectivement le type des cls et celui des valeurs d'une Map ou similaires ;

<N>

Number ;
<T>

Type ;
etc.
second, troisime, ime type.

<S>, <U>, <V>

Limitations
Malgr la similitude de syntaxe, les types gnriques en Java sont diffrents des patrons (templates en anglais) du C++.
Il faut plutt les voir comme un moyen d'viter de faire une conversion entre java.lang.Object et le type spcifi de
manire implicite.
Parmi les limitations :
il n'est pas possible d'implmenter plusieurs fois la mme interface avec des paramtres diffrents,
il n'est pas possible de crer deux versions surcharges d'une mthode (deux mthodes portant le mme nom) l'une
utilisant la classe Object et l'autre utilisant un type gnrique.

Rfrences
1. Type Parameter Naming Conventions (http://download.oracle.com/javase/tutorial/java/generics
/gentypes.html) [archive]

60 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Instanciation et cycle de vie


L'instruction new
L'instruction new permet d'instancier une classe en utilisant l'un des constructeurs de la classe.
Par exemple pour crer un objet de type MaClasse, on crit :
MaClasse cl = new MaClasse("hello");

Les constructeurs
Un constructeur est une mthode particulire de la classe appele lors de la cration d'une instance de la classe. Son
rle est d'initialiser les membres de l'objet juste cr. Un constructeur a le mme nom que sa classe et n'a pas de valeur
de retour.
Dans l'exemple suivant la classe MaClasse dispose de deux constructeurs, l'un ne prenant aucun paramtre et l'autre
prenant un paramtre de type String :
public class MaClasse
{
// Attributs
private String name;
// Constructeurs
public MaClasse()
{
name = "defaut";
}
public MaClasse(String s)
{
name = s;
}
}

Toute classe possde un constructeur. Cependant, il n'est pas obligatoire de dclarer un constructeur pour une classe.
En effet, si aucun constructeur n'est dclar dans une classe, un constructeur sans paramtre est ajout de manire
implicite. Celui-ci ne fait rien.

Nettoyage
Ramasse-miettes (Garbage Collector)
Le ramasse-miettes garde un compteur du nombre de rfrence pour chaque objet. Ds qu'un objet n'est plus
rfrenc, celui-ci est marqu. Lorsque le ramasse-miettes s'excute (en gnral quand l'application ne fait rien), les
objets marqus sont librs.
Son excution se produit toujours un moment qui ne peut tre dtermin l'avance. Il s'excute lors des vnements
suivants :
priodiquement, si le processeur n'est pas occup,
quand la quantit de mmoire restante est insuffisante pour allouer un nouveau bloc de mmoire.
Il est donc recommand de librer toute rfrence (affecter null) des objets encombrants (tableaux de grande taille,

61 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

collection d'objets, ...) ds que possible, ou au plus tard juste avant l'allocation d'une grande quantit de mmoire.
Exemple : Pour le code suivant, il faut 49 152 octets disponibles, le ramasse-miettes ne pouvant rien librer durant
l'allocation du deuxime tableau.
byte[] buffer = new byte[16384];
// -> 1. allocation de 16384 octets
//
2. affecter la rfrence la variable buffer
// ...
buffer = new byte[32768];
// -> 1. allocation de 32768 octets
//
2. affecter la rfrence la variable buffer

Une fois le code corrig, il ne faut plus que 32 768 octets disponibles, le ramasse-miettes pouvant librer le premier
tableau avant d'allouer le deuxime.
byte[] buffer = new byte[16384];
// -> 1. allocation de 16384 octets
//
2. affecter la rfrence la variable buffer
// ...
buffer = null; // Le ramasse-miettes peut librer les 16384 octets du tableau si besoin.
buffer = new byte[32768];
// -> 1. allocation de 32768 octets
//
2. affecter la rfrence la variable buffer

Finalisation
Lors de la libration des objets par le ramasse-miettes, celui-ci appelle la mthode finalize() afin que l'objet libre
les ressources qu'il utilise.
Cette mthode peut tre redfinie afin de librer des ressources systmes non Java. Dans ce cas, la mthode doit se
terminer en appelant la mthode de la classe parente :
super.finalize();

Reprsentation des objets dans la mmoire


La pile
Cette section est vide, pas assez dtaille ou incomplte.

Le tas
Objets dans la pile
Constantes et membres static
Attributs

62 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

this
Le mot-cl this dsigne, dans une classe, l'instance courante de la classe elle-mme. Il est utilis diffrentes fins
dcrites dans les sections suivantes.

Rendre Univoque
Il peut tre utilis pour rendre le code explicite et non ambigu.
Par exemple, si dans une mthode, on a un paramtre ayant le mme nom qu'un attribut de la classe dont la mthode
fait partie, on peut dsigner explicitement l'attribut grce this :
public class Calculateur
{
protected int valeur;
public void calcule(int valeur)
{
this.valeur = this.valeur + valeur;
}
}

Dans cet exemple, la mthode calcule additionne le paramtre valeur l'attribut valeur et stocke le rsultat dans
l'attribut valeur. L'attribut a t dsign explicitement par le mot-cl this, dsignant l'instance de la classe, prfix au
nom de l'attribut.

S'auto-dsigner comme rfrence


Le mot-cl this peut tre utilis pour passer une rfrence l'instance elle-mme comme paramtre d'une mthode.
Par exemple : s'enregistrer comme couteur d'vnement :
source.addListener(this);

Dsigner l'instance de la classe qui encadre


Dans le cas de classes imbriques, c'est--dire qu'une classe interne utilise l'instance de la classe externe, le mot-cl
this prfix du nom de la classe externe permet de dsigner l'instance de la classe externe. S'il n'est pas prfix, il
dsigne l'instance de la classe interne.
Exemple :
public class Livre
{
String titre = "Le livre";
class Chapitre
{
String titre = "Chapitre 1";
public String toString()
{
return
Livre.this.titre +
// "Le livre"
"/" +
this.titre ;
// "Chapitre 1"
// ou
Chapitre.this.titre ; // "Chapitre 1"

63 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

}
// -> "Le livre/Chapitre 1"
}
}

64 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Objets comparables et cls


Certaines collections d'objets ncessitent l'utilisation de classes dont les instances sont comparables pour pouvoir trier
la collection. De plus, pour utiliser une instance d'une classe comme cl dans les tables associatives, la classe doit
possder des proprits supplmentaires.

Objets comparables
Pour utiliser un objet dans une collection trie, on peut :
soit utiliser des lments instances d'une classe comparable,
soit spcifier un comparateur d'lments au constructeur de la collection.

interface Comparable
Une classe implmente l'interface java.lang.Comparable en ajoutant la mthode suivante :
int compareTo(Object o)

ou (Java 5+) interface Comparable<T> :


int compareTo(T o)

Dans cette mthode l'objet this est compar l'objet o. Cette mthode doit retourner le signe de la soustraction
virtuelle this - o. C'est dire :
-1 si this < o
0 si this == o
+1 si this > o
Cette mthode doit avoir les proprits suivantes, pour toutes instances de la classe nommes o1, o2 et o3 :
o1.compareTo(o1) == 0,
o1.compareTo(o2) == - o2.compareTo(o1),
o1.compareTo(o2) > 0

et o2.compareTo(o3) > 0 implique o1.compareTo(o3) > 0.

De plus, pour utiliser une instance de la classe dans une collection, le comportement de cette mthode doit tre
consistant avec celle de la mthode equals :
Pour toute instance de la classe nomms o1 et o2, les deux expressions boolennes o1.compareTo(o2)==0 et
retournent la mme valeur,
La comparaison avec null doit lancer une exception NullPointerException.

o1.equals(o2)

Comparateur (Comparator)
L'interface java.util.Comparator permet de rendre comparable des instances dont la classe n'implmente pas
l'interface java.lang.Comparable vu prcdemment. Une classe implmentant cette interface doit dclarer deux
mthodes :
int compare(Object o1, Object o2)
int equals(Object o)

ou (Java 5+) interface Comparator<T> :

65 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

int compare(T o1, T o2)


int equals(Object o)

La mthode equals compare les comparateurs (eux-mmes) this et o.


La mthode compare compare les deux objets spcifis et retourne le signe de la soustraction virtuelle o1 - o2,
comme expliqu dans la section prcdente. C'est--dire :
-1 si o1 < o2
0 si o1 == o2
+1 si o1 > o2

Cl de table associative
Pour utiliser une instance de classe comme cl d'une table associative (Map en anglais), la classe doit possder les
proprits suivantes :
La classe doit possder une mthode equals cohrente,
La classe doit possder une mthode hashCode cohrente.
Dans le cas contraire (par dfaut), il est toujours possible d'utiliser des instances de la classe comme cl, mais il faudra
utiliser cette instance seulement. C'est dire que pour retrouver une valeur dans une table associative, il ne sera pas
possible d'utiliser une autre instance dont les attributs sont gaux ceux de l'instance utilise pour raliser l'association.
Exemple : un tableau d'entiers utilis comme cl.
int[] key1 = { 1, 2 };
int[] key2 = { 1, 2 }; // mme contenu que key1
HashMap hmap = new HashMap();
// association key1 -> chane de caractre
hmap.put(key1, "Valeur pour la suite (1,2)");
// tentative pour retrouver la valeur
String s1 = (String)hmap.get(key1); // retourne "Valeur pour la suite (1,2)"
// tentative pour retrouver la valeur
String s2 = (String)hmap.get(key2); // retourne null

La tentative choue car un tableau n'a pas toutes les proprits ncessaires. La mthode equals est correcte, mais la
mthode hashCode retourne deux valeurs diffrentes.

Mthode equals
Une classe doit implmenter la mthode equals de manire cohrente, cest--dire, pour toutes instances de la classe
nommes o1, o2 et o3 :
o1.equals(o1) == true,
o1.equals(o2) == o2.equals(o1),
o1.equals(o2)

et o2.equals(o3) implique o1.equals(o3).

Mthode hashCode
Pour utiliser une classe comme cl d'une table associative, il faut que la classe implmente la mthode hashCode de
manire cohrente. Pour comprendre cela, il faut aborder le fonctionnement interne des tables associatives indexe par
des objets :

66 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

1. Les mthodes de la table associative appellent la mthode hashCode de la cl pour obtenir un entier,
2. Cet entier est transform en index dans un tableau par reste de la division par la taille du tableau,
3. Ce tableau contient une liste de cls compares avec celle fournie la mthode appele en utilisant la mthode
equals vue auparavant.
Il est donc essentiel que la mthode hashCode ait les proprits suivantes :
Cette mthode doit toujours retourner la mme valeur si l'objet n'a pas t modifi,
Pour deux objets gaux (mthode equals retourne true), la mthode hashCode doit retourner deux valeurs gales.
C'est dire, pour toute instance de la classe nomms o1 et o2, o1.equals(o2) implique o1.hashCode() ==
o2.hashCode(),
Il est recommand que pour deux objets diffrents, la mthode hashCode retourne deux valeurs distinctes.

Objets utilisables comme cl


Comme expliqu dans la section d'introduction, il est possible d'utiliser n'importe quel type d'objet condition d'utiliser
exactement la mme instance, ou bien que la classe possde des mthodes equals et hashCode cohrentes, comme la
classe java.lang.String par exemple.
String key1 = "Cl de test";
String key2 = "Cl" + " de " + "test";
HashMap hmap = new HashMap();
// association key1 -> chane de caractre
hmap.put(key1, "Valeur pour la cl");
// tentative pour retrouver la valeur
String s1 = (String)hmap.get(key1); // retourne "Valeur pour la cl"
// tentative pour retrouver la valeur
String s2 = (String)hmap.get(key2); // retourne "Valeur pour la cl"

67 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

numrations
Java 5 introduit une nouvelle structure de donnes appele numrations. Cette structure permet de contenir une srie
de donnes constantes ayant un type sr, ce qui veut dire que ni le type, ni la valeur relle de chaque constante n'est
prcis. Il est possible de comparer des valeurs d'une numration entre elles l'aide des oprateurs de comparaison et
de l'instruction switch.
Exemple :
enum Animal { KANGOUROU, TIGRE, CHIEN, SERPENT, CHAT };
class Test
{
public static void main(String[] args)
{
String aniMsg;
Animal bebete = Animal.TIGRE;
switch(bebete)
{
case KANGOUROU :
aniMsg = "kangourou";
break;
case TIGRE :
aniMsg = "tigre";
break;
case CHIEN :
aniMsg = "chien";
break;
case SERPENT :
aniMsg = "serpent";
break;
case CHAT :
aniMsg = "chat";
break;
}
System.out.println("L'animal est un "+aniMsg);
}
}

Membres
Les numrations sont en fait compiles sous forme de classes, ventuellement internes.
Une numration peut donc avoir des constructeurs et mthodes. Ses constructeurs sont obligatoirement privs car
aucune nouvelle instance ne peut tre cre.
enum Animal
{
// Il faut appeler l'un des constructeurs dclars :
KANGOUROU("kangourou", false),
TIGRE("tigre", false),
CHIEN("chien", true),
SERPENT("serpent", false, "tropical"),
CHAT("chat", true); // <- NB: le point-virgule pour mettre fin la liste des constantes !
// Membres :
private final String environnement;
private final String nom;
private final boolean domestique;
Animal(String nom, boolean domestique)
{ this(nom, domestique, null); }

68 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Animal(String nom, boolean domestique, String environnement)


{
this.nom = nom;
this.domestique = domestique;
this.environnement = environnement;
}
public String getNom(){ return this.nom; }
public String getEnvironnement(){ return this.environnement; }
public boolean isDomestique(){ return this.domestique; }
};
class Test
{
public static void main(String[] args)
{
Animal bebete = Animal.TIGRE;
System.out.print("L'animal est un "+bebete.getNom());
System.out.print(bebete.isDomestique()?" (domestique)":" (sauvage)");
String env = bebete.getEnvironnement();
if (env!=null)
System.out.print(" vivant dans un milieu "+env);
System.out.println();
}
}

Mthodes utiles
Les numrations possdent des mthodes communes.
ordinal()

Obtenir l'index de la valeur selon l'ordre de dclaration (premier = 0).


Exemple :
Animal.CHIEN.ordinal() /* -> 2 */

name()

Obtenir le nom de la valeur.


Exemple :
Animal.CHAT.name() /* -> "CHAT" */

valueOf(String s)

(mthode statique) Obtenir la valeur dont le nom est spcifi en paramtre.


Exemple :
Animal.valueOf("CHAT") /* -> Animal.CHAT */

values()

(mthode statique) Obtenir un tableau contenant toutes les valeurs dclares.


Exemple :
Animal.values()[2] /* -> Animal.CHIEN */

Les numrations implmentent l'interface java.lang.Comparable et possde donc les mthodes equals et compare
pour comparer deux valeurs (ordonnes selon ordinal() par dfaut).

Ensemble de valeurs numres


69 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Les ensembles (set en anglais) font partie des classes de collection de l'API Java. Il existe une classe spcifique pour
les ensembles de valeurs numres nomme EnumSet. Cette classe hrite de la classe abstraite
java.util.AbstractSet.
Voir les ensembles.

70 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Exceptions
Une exception est un signal qui se dclenche en cas de problme. Les exceptions permettent de grer les cas d'erreur
et de rtablir une situation stable (ce qui veut dire, dans certains cas, quitter l'application proprement). La gestion des
exceptions se dcompose en deux phases :
La leve d'exceptions,
Le traitement d'exceptions.
En Java, une exception est reprsente par une classe. Toutes les exceptions drivent de la classe Exception qui drive
de la classe Throwable.

Leve d'exception
Une exception est leve grce l'instruction throw :
if (k<0)
throw new RuntimeException("k ngatif");

Une exception peut tre traite directement par la mthode dans laquelle elle est leve, mais elle peut galement tre
envoye la mthode appelante grce l'instruction throws ( ne pas confondre avec throw) :
import java.io.IOException;
public void maMethode(int entier) throws IOException
{
//code de la methode
}

Dans cet exemple, si une exception de type IOException est leve durant l'excution de maMethode, l'exception sera
envoye la mthode appelant maMethode, qui devra la traiter.
Certaines exceptions sont leves implicitement par la machine virtuelle :
quand une rfrence nulle est drfrence (accs un membre),
quand l'indice d'un tableau dpasse sa capacit,
ArithmeticException quand une division par zro a lieu.
NullPointerException

ArrayIndexOutOfBoundsException

Celles-ci n'ont pas besoin d'tre dclares avec l'instruction throws car elles drivent de la classe RuntimeException,
une classe d'exceptions qui ne sont pas censes tre lances par une mthode code et utilise correctement.

Traitement d'exception
Le traitement des exceptions se fait l'aide de la squence d'instructions try...catch...finally.
L'instruction try indique qu'une instruction (ou plus gnralement un bloc d'instructions) susceptible de lever des
exceptions dbute.
L'instruction catch indique le traitement pour un type particulier d'exceptions. Il peut y avoir plusieurs instructions
catch pour une mme instruction try.
L'instruction finally, qui est optionnelle, sert dfinir un bloc de code excuter dans tous les cas, exception leve
ou non.
Il faut au moins une instruction catch ou finally pour chaque instruction try.
Exemple :

71 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

public String lire(String nomDeFichier) throws IOException


{
try
{
// La ligne suivante est susceptible de lever une exception
// de type FileNoFoundException
FileReader lecteur = new FileReader(nomDeFichier);
char[] buf = new char[100];
// Cette ligne est susceptible de lever une exception
// de type IOException
lecteur.read(buf,0,100);
return new String(buf);
}
catch (FileNotFoundException fnfe)
{
fnfe.printStackTrace(); // Indique l'exception sur le flux d'erreur standard
}
finally
{
System.err.println("Fin de mthode");
}
}

Le bloc catch (FileNotFoundException fnfe) capture toute exception du type FileNotFoundException (cette
classe drive de la classe IOException).
Le bloc finally est excut quelque soit ce qui se passe (exception ou non).
Toute autre exception non capture (telle IOException) est transmise la mthode appelante, et doit toujours tre
dclare pour la mthode, en utilisant le mot cl throws, sauf les exceptions drivant de la classe RuntimeException.
S'il n'y avait pas cette exception la rgle, il faudrait dclarer throws ArrayIndexOutOfBoundsException chaque
fois qu'une mthode utilise un tableau, ou throws ArithmeticException chaque fois qu'une expression est utilise,
par exemple.

Classes et sous-classes d'exception


L'hritage entre les classes d'exceptions peut conduire des erreurs de programmation. En effet, une instance d'une
sous-classe est galement considre comme une instance de la classe de base.

Ordre des blocs catch


L'ordre des blocs catch est important : il faut placer les sous-classes avant leur classe de base. Dans le cas contraire le
compilateur gnre l'erreur exception classe_exception has already been caught.
Exemple d'ordre incorrect :
try{
FileReader lecteur = new FileReader(nomDeFichier);
}
catch(IOException ioex) // capture IOException et ses sous-classes
{
System.err.println("IOException catched :");
ioex.printStackTrace();
}
catch(FileNotFoundException fnfex) // <-- erreur ici
// FileNotFoundException dj captur par catch(IOException ioex)
{
System.err.println("FileNotFoundException catched :");
fnfex.printStackTrace();
}

L'ordre correct est le suivant :

72 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

try{
FileReader lecteur = new FileReader(nomDeFichier);
}
catch(FileNotFoundException fnfex)
{
System.err.println("FileNotFoundException catched :");
fnfex.printStackTrace();
}
catch(IOException ioex) // capture IOException et ses autres sous-classes
{
System.err.println("IOException catched :");
ioex.printStackTrace();
}

Sous-classes et clause throws


Une autre source de problmes avec les sous-classes d'exception est la clause throws. Ce problme n'est pas dtect
la compilation.
Exemple :
public String lire(String nomDeFichier) throws FileNotFoundException
{
try
{
FileReader lecteur = new FileReader(nomDeFichier);
char[] buf = new char[100];
lecteur.read(buf,0,100);
return new String(buf);
}
catch (IOException ioe) // capture IOException et ses sous-classes
{
ioe.printStackTrace();
}
}

Cette mthode ne lancera jamais d'exception de type FileNotFoundException car cette sous-classe de IOException
est dj capture.

Relancer une exception


Une exception peut tre partiellement traite, puis relance. On peut aussi relancer une exception d'un autre type, cette
dernire ayant l'exception originale comme cause.
Dans le cas o l'exception est partiellement traite avant propagation, la relancer consiste simplement utiliser
l'instruction throw avec l'objet exception que l'on a captur.
Exemple:
public String lire(String nomDeFichier) throws IOException
{
try
{
FileReader lecteur = new FileReader(nomDeFichier);
char[] buf = new char[100];
lecteur.read(buf,0,100);
return new String(buf);
}
catch (IOException ioException) // capture IOException et ses sous-classes
{
// ... traitement partiel de l'exception ...
throw ioException; //<-- relance l'exception

73 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

}
}

Une exception d'un autre type peut tre leve, par exemple pour ne pas propager une exception de type SQLException
la couche mtier, tout en continuant arrter l'excution normale du programme :
...
catch (SQLException sqlException) // capture SQLException et ses sous-classes
{
throw new RuntimeException("Erreur (base de donnes)...", sqlException);
}
...

La pile d'appel est remplie au moment de la cration de l'objet exception. C'est dire que les mthodes
printStackTrace() affiche la localisation de la cration de l'instance.
Pour mettre jour la pile d'appel d'une exception pr-existante (rutilisation pour viter une allocation mmoire, ou
relancer une exception), la mthode fillInStackTrace() peut tre utilise :
...
catch (IOException ioException) // capture IOException et ses sous-classes
{
// ... traitement partiel de l'exception ...
ioException.fillInStackTrace(); // <-- pile d'appel mise jour pour pointer ici
throw ioException;
// <-- relance l'exception
}
...

Catgorie d'objet lanc


Le chapitre traite des exceptions, mais en fait tout objet dont la classe est ou drive de la classe Throwable peut tre
utilis avec les mots-cls throw, throws et catch.

Classes drives de Throwable


Il existe deux principales sous-classes de la classe Throwable :
signale une erreur dans l'application,
signale une erreur plus grave, souvent au niveau de la machine virtuelle (manque de ressource, mauvais
format de classe, ...).
Exception

Error

Crer une classe d'exception


Il est galement possible d'tendre une classe d'exception pour spcialiser un type d'erreur, ajouter une information
dans l'objet exception, ...
Exemple :
public class HttpException extends Exception
{
private int code;
public HttpException(int code,String message)
{
super(""+code+" "+message);
this.code=code;
}
public int getHttpCode()
{return code;}

74 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Une instance de cette classe peut ensuite tre lance de la manire suivante :
public void download(URL url) throws HttpException
{
...
throw new HttpException ( 404, "File not found" );
}

et capture comme suit :


try
{
download( ... );
}
catch(HttpException http_ex)
{
System.err.println("Erreur "+http_ex.getHttpCode());
}

Voir aussi
Liste des exceptions (https://docs.oracle.com/javase/6/docs/api/java/lang/Exception.html) [archive]

75 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Extensions
Les extensions, ou packages, permettent de grouper ensemble des classes rattaches, la manire des dossiers qui
permettent de classer des fichiers.

Utilisation
Le fichier inclure dans une extension doit contenir le mot-cl 'package' suivi du nom de l'extension.
Ce nom peut tre compos de plusieurs mots spars par un point ( . ).

Exemple
pour inclure la classe Toto dans l'extension 'mesPackages.sousPackage1', crire au dbut du fichier Toto.java :
package mesPackages.sousPackage1;
// ne pas oublier le point-virgule en fin de ligne

La structure des rpertoires doit suivre le nom de l'extension, c'est--dire que le fichier Toto.java doit se situer dans un
sous-rpertoire mesPackages/sousPackage1/Toto.java.
Lorsqu'ensuite on dsire utiliser la classe Toto depuis une autre classe, il faudra au pralable crire :
import mesPackages.sousPackage1.Toto;

ou
import mesPackages.sousPackage1.*;
// importation de toutes les classes
// de l'extension mesPackage.sousPackage1

ou utiliser directement une rfrence l'extension :


mesPackages.sousPackage1.Toto toto
= new mesPackages.sousPackage1.Toto();

Remarques
En Java, les programmeurs attribuent gnralement un nom qui commence par une minuscule pour une extension, et
un nom qui commence par une capitale pour une classe.
Les bibliothques Java destines tre distribues regroupent leurs classes dans une ou plusieurs extensions dont le
nom est normalement prcd par un nom de domaine (dans l'ordre inverse), par exemple :
package org.wikibooks.exemple;

Compilation
L'utilisation d'une extension ncessite une structure des rpertoires correspondant au nom de l'extension.
Par exemple, le fichier Toto.java dfinit la classe Toto de l'extension org.wikibooks.exemple dbute par :

76 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

package org.wikibooks.exemple;
class Toto ...

et doit se situer dans le rpertoire org/wikibooks/exemple.


Supposons que le chemin du fichier soit /home/me/javaprog/org/wikibooks/exemple/Toto.java. La compilation
se fait en spcifiant le chemin du package racine (rpertoire parent de org) comme classpath, et en spcifiant ensuite le
chemin relatif ce rpertoire :
javac -classpath /home/me/javaprog org/wikibooks/exemple/Toto.java

Quand un programme Java utilise cette classe, il doit tre compil et excut en spcifiant /home/me/javaprog
(package racine) pour le paramtre classpath, et le nom de la classe doit inclure le nom du package :
java -classpath /home/me/javaprog org.wikibooks.exemple.Toto

Import statique
Pour utiliser les membres statiques publiques d'une classe, il faut nommer la classe o ils sont dfinis.
Exemple 1 :
double r = Math.cos(Math.PI * theta);

L'import statique permet d'importer les membres statiques d'une classe afin de ne pas nommer la classe en question.
Exemple 1 :
// importer le membre statique PI seulement
import static java.lang.Math.PI;
...
double r = Math.cos(PI * theta);

Exemple 2 :
// importer tous les membres statiques de la classe java.lang.Math
import static java.lang.Math.*;
...
double r = cos(PI * theta);

L'abus d'import statique n'est pas conseill car le code ne contient plus de rfrence la classe dfinissant le membre
statique utilis. Il ne faut l'utiliser que si les membres statiques d'un petit nombre de classes sont utiliss frquemment.

Importation de packages de .jar


Pour importer un package d'un fichier .jar, il faut s'assurer que le fichier est dans le classpath courant ( compile- et
execution-time). Ensuite, l'import se droule comme si le .jar tait dcompress.
Par exemple, pour compiler et lancer une classe d'un projet du dossier parent (contenant deux rpertoires : /source et
/libraries) compiler :

77 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

$ javac -classpath libraries/lib.jar source/MainClass.java

Puis le lancer :
$ java -classpath libraries/lib.jar source/MainClass

Cela ncessite que MainClass soit le package par dfaut, ou un package appel source, ce qui n'est pas trs explicite.

78 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Classes de base
Java est livr avec un ensemble de bibliothques de base proposant des classes qui s'avrent vite ncessaire. Tout
programmeur Java doit avoir un bonne connaissance de toutes les possibilits offertes par ces composants. Il n'est pas
ncessaire d'apprendre quoi que ce soit mais simplement d'avoir une ide gnrale de ce qui est disponible pour savoir
quelles parties de la bibliothque utiliser pour rsoudre un problme donn.
Dornavant, vous aurez toujours besoin d'avoir avoir la documentation complte (http://docs.oracle.com/javase/7/docs
/api/index.html) [archive] sous le coude, via Internet ou sur votre ordinateur.

Extension java.lang
L'extension (le package) java.lang est l'extension de base de Java. Il n'est mme pas ncessaire de faire un import de
cette extension : il est implicite.
Cette extension regroupe les classes concernant les types (Boolean, Byte, Character, Short, Integer, Long, Float,
Double, String), les classes (Object classe de base de toutes les autres, Class), les threads (Thread, ThreadGroup),

Les chanes de caractres


Les chanes de caractres ne sont pas des types primitifs et sont des instances de la classe java.lang.String. Les
constantes sont entoures de guillemets.
Exemple :
String message = "Test des chanes de caractres";

La concatnation se fait avec l'oprateur + :


String message = "Test des chanes de caractres"
+ " et de la concatnation";

La concatnation d'une chane de caractres avec un type primitif ajoute sa reprsentation nominale (dcimal pour les
types entiers, le caractre pour char, "true" ou "false" pour boolean) :
int a = 100;
String message = "A vaut " + a;

// A vaut 100

La concatnation d'une chane de caractres avec un objet appelle sa mthode toString() retournant une chane de
caractres :
Object o=new Object();
String message = "L'objet " + o;

// L'objet java.lang.Object@1fe081a3

Par dfaut, la mthode toString() dfinie dans la classe java.lang.Object retourne le nom de la classe de l'objet,
suivi du caractre arobase @, suivi de la valeur retourne par la mthode hashCode() en hexadcimal.
La mthode length() permet d'obtenir la longueur d'une chane de caractres :
String message = "Test des chanes de caractres";
System.out.print ( "Le message contient " );

79 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

System.out.print ( message.length() );
System.out.println( " caractres" );

Equivaut :
System.out.print ( "Le message contient " );
System.out.print ( "Test des chanes de caractres".length() );
System.out.println( " caractres" );

Nous pouvons utiliser des guillemets l'intrieur d'une chaine de caractres en utilisant le caractre d'chappement \
String ma_string = "le mot \"mot\" contient 3 lettres";

Nous pouvons galement utiliser des caractres spciaux tels que \n (nouvelle ligne), \t (tabulation) pour formater la
sortie.
String ma_string_formatee = "colonne 1\tcolonne 2\nvaleur 1\tvaleur 2\n"

Enfin, nous pouvons afficher des caractres particuliers (tels les caractres accentus, par exemple) en utilisant le
prfixe \u suivi du code Unicode du caractre sur 4 chiffres hexadcimaux :
String chaine_unicode = "\u002D"; // le signe moins -

Cependant, la squence \u est galement utilisable en dehors des chanes de caractres pour encoder le code source.
Exemple :
int a = 200 \u002D 50; // le signe moins - -> 150

quivaut :
int a = 200 - 50; // 150

Extension java.io
Cette extension concerne les flux d'entres et sorties en gnral (fichiers, rseau, buffer).
Les deux classes abstraites InputStream et OutputStream grent les entres et sorties binaires, utilisant des tableaux
d'octets.
Les sous-classes de celles-ci sont plus spcialises :
et FileOutputStream grent les fichiers,
ByteArrayInputStream et ByteArrayOutputStream lisent/crivent depuis/vers un tableau d'octets.
FileInputStream

Les classes Reader et Writer utilisent les tableaux de caractres.


Leurs sous-classes sont galement plus spcialises :
et FileWriter grent les fichiers,
StringReader et StringWriter lisent/crivent depuis/vers une chane de caractres.

FileReader

80 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Extension java.nio
Cette section est vide, pas assez dtaille ou incomplte.

Extension java.text
Cette section est vide, pas assez dtaille ou incomplte.

Extension java.util
Cette extension contient les classes permettant la gestion de collections (liste chanes, table de hachage, tableau
extensible, ). Elle contient galement une classe de gnrateur alatoire (classe Random), deux classes grant le
lancement de tches priodiques ou un moment donn (Timer et TimerTask), la gestion des dates (Date, Calendar,
GregorianCalandar),

Extension java.net
Cette extension contient les classes permettant de communiquer travers un rseau en utilisant des sockets TCP ou
UDP. Il existe galement des classes pour grer les adresses IP (version 4 et 6).
Cette section est vide, pas assez dtaille ou incomplte.

Extension java.awt
Cette extension regroupe les classes graphiques de base.
Les composants graphiques utilisent les composants natifs de la platforme de lancement. Ils sont nomms
Heavyweight, par opposition Lightweight qui dsigne les sous-classes de la classe Component. Bien que beaucoup
plus rapide, il tend tre remplac par swing, bien plus fourni.

Extension javax.swing
C'est une extension de classe graphique trs fournie.
Les composants sont entirement dvelopps en Java partir de la classe java.awt.Component. Quelle que soit la
plateforme de lancement de l'application, ils ont donc le mme comportement et la mme apparence, qui peut d'ailleurs
tre configure.

81 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Collections
Les collections en Java sont des classes permettant de manipuler les structures de donnes usuelles : listes, vecteurs,
files, piles, etc. Une manire standard de reprsenter une structure de donne en Java consiste regrouper dans une
interface l'ensemble des noms des oprations appliquables sur celle-ci (ajout, suppression, effacement, etc.), c'est-dire l'ensemble des oprations mentionnes dans le type de donnes abstrait implment par cette structure (sa
spcification, indpendamment du choix d'implmentation). Cette interface sera implmente par chaque classe
reprsentant cette sorte de structure : par exemple, l'interface List regroupe un ensemble de noms de mthodes
gnriques permettant la manipulation de listes, et est implmente la fois par les classes concrtes ArrayList
(implmentation des listes par tableaux extensibles) et LinkedList (implmentation des listes par chanage).
Les interfaces et classes cites dans les exemples ci-dessous sont livres dans le SDK standard. Elles se trouvent dans
le package java.util.

Utilisation
List<String> ma_liste = new LinkedList<String>();

Dans cet exemple, List est une interface qui implmente les listes (collection d'lments ordonns, ventuellement
rpts), on a choisi d'utiliser une liste chane pour reprsenter la liste en mmoire. LinkedList est la classe dont les
lments de la collection seront des instances.

Listes (List)
Cette interface est implmente par un certain nombre de collections, et garantit que ces classes implmenteront
l'ensemble des mthodes. Elle drive de l'interface Collection. Les lments sont indexs (i.e. numrots de la mme
faon qu'un tableau est indic).

Mthodes sur les listes


Mthode [1]

Type

Rle

boolean add(int index, Object o)

Ajouter un objet l'index indiqu.

boolean addAll(int index, Collection c)

Ajouter tous les objets d'une autre collection l'index indiqu.

Object

get(int index)

Retourner l'objet l'index indiqu.

int

indexOf(Object o)

Retourner le premier index de l'objet indiqu.

int

lastIndexOf(Object o)

Retourner le dernier index de l'objet indiqu.

Object

remove(int index)

Supprimer l'objet l'index indiqu.

Object

set(int index, Object o)

Remplacer l'objet l'index indiqu. L'objet prcdent est


retourn.

int

size()

Retourner le nombre d'lments de la liste.

List

subList(int fromIndex,int
toIndex)

Retourner une sous-liste de celle-ci.

Les diffrentes implmentations


On peut utiliser des tableaux redimensionnables (ArrayList) ou des listes chanes (LinkedList)
Listes chanes (LinkedList)

82 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Cette classe implmente l'interface List en chanant les lments (liste doublement chane).
Les mthodes ajoutes sont :
void addFirst(Object o)

Ajoute un lment en dbut de liste.


void addLast(Object o)

Ajoute un lment en fin de liste.


Object getFirst()

Retourne l'lment en dbut de liste.


Object getLast()

Retourne l'lment en fin de liste.


Object removeFirst()

Supprime et retourne l'lment en dbut de liste.


Object removeLast()

Supprime et retourne l'lment en fin de liste.


Tableau redimensionnable (ArrayList)
Cette classe est un tableau dont la taille croit lorsque des lments sont ajouts.
Tableau redimensionnable (Vector)
Cette classe est un tableau dont la taille croit lorsque des lments sont ajouts. Cette classe implmente les mthodes
de l'interface List et les suivantes :
int indexOf(Object o,int index)

Retourne l'index de l'objet indiqu, en partant de l'index indiqu.


int lastIndexOf(Object o,int index)

Retourne l'index de l'objet indiqu, en partant de l'index indiqu et en allant vers le dbut (index 0).
void setSize(int newSize)

Tronquer/Agrandir le vecteur la taille indique.


Cette classe a t cre avant la classe ArrayList. Elle est synchronise : durant l'appel une mthode de cette classe
par un thread, un autre thread ne peut modifier le tableau.

Files (Queue)
Files avec priorits (PriorityQueue)
Pour utiliser une file avec priorits, les lments doivent tre des instances d'une classe qui implmente l'interface
Comparator. Il faudra crire la mthode int compare(Object, Object) qui compare les deux instances et renvoie un
entier.
Si vous ne voulez ou ne pouvez pas modifier la classe qui dcrit les lments. Vous pouvez crer, dans la classe o vous
utilisez votre file avec priorit, une classe interne qui hrite de la classe des lments et implmente l'interface
Comparator. Exemple, si vous voulez crer une file avec priorit de Bidules :
import mon_package.Bidule;
public class MaClasseQuiUtiliseUneFileDeBidules
{
/**
* Classe permettant de crer une file avec priorit de Bidules
*
*/
public class ComparableBidule implements Comparator<Bidule>

83 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

{
public int compare(Bidule b1, Bidule b2)
{
// On retourne le signe de la soustraction
// Si b1 < b2 (ou b1 classer avant b2)
// Si b1 == b2 (ou b1 quivaut b2)
// Si b1 > b2 (ou b1 classer aprs b2)
...
}

abstraite b1 - b2
---> retourner -1
---> retourner 0
---> retourner +1

}
public void une_methode()
{
PriorityQueue<ComparableBidule> f = new LinkedList<ComparableBidule>();
Bidule b = new Bidule();
f.add(b)
}
}

Piles (Stack)
Une pile contient une liste d'objets. Il est possible d'ajouter un objet au sommet de la pile (empiler, ou push en anglais),
et de retirer l'objet situ au sommet de la pile (dpiler, ou pop en anglais).
Exemple: En partant d'une pile vide, on effectue les oprations suivantes :
tat de la pile
(vide)

Opration
empiler A

A
empiler B
A B
empiler C
A B C
dpiler -> C
A B
dpiler -> B
A
empiler D
A D

La classe Stack est une implmentation de pile qui drive de la classe Vector et ajoute les mthodes suivantes pour
grer les objets comme une pile :
boolean empty()

Retourne vrai si la pile est vide.


Object peek()

Retourne l'objet au sommet de la pile sans l'enlever.


Object pop()

Retourne et enlve l'objet au sommet de la pile.


Object push(Object o)

Ajoute l'objet au sommet de la pile.


int search(Object o)

Retourne l'index de l'objet depuis le sommet de la pile (1 = sommet de la pile, -1 = non trouv).

Ensembles (Set)
Conformment l'ide mathmatique, les ensembles reprsentent plusieurs lments non tris, sans rptitions. Les
ajouts d'lments dj prsents sont donc ignors. Un lment est dj prsent si un tests equals sur un des lments de
l'ensemble renvoie vrai.

84 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Cette interface est implmente par un certain nombre de collections, et garantit que ces classes implmenteront
l'ensemble des mthodes. Elle drive de l'interface Collection, sans ajouter de nouvelles mthodes. Elle sert
seulement indiquer informellement que la collection implmentant cette interface ne contient aucun doublon d'objet
(objets compars par la mthode equals). Cette interface correspond donc aux ensembles mathmatiques.

Les diffrentes implmentations


La classe HashSet implmente l'interface Set en utilisant une table de hachage.
TreeSet utilise un un arbre de recherche. Pour pouvoir utiliser un TreeSet, il faut que les lments soit
comparables. Cette fonction est plus lente que HashSet [2] .
LinkedHashSet diffre de HashSet car il maintient une liste doublement lie travers toutes ses entres, permettant
de retrouver l'ordre d'insertion (mais pas pour les rinsertions).

Ensembles tris (SortedSet)


Les ensembles tris sont identiques aux ensembles simples except qu'ils peuvent tre tris par dfaut leur cration
selon un tri dit naturel ou qu'un motif de tri a t appliqu. La mthode comparator() de cette interface permet de
retourner le motif de tri utilis ou retourne null si le tri est effectu de faon naturel en fonction du type des donnes.
Range view

Permet des oprations sur les plages d'ensembles tris.


Endpoints

Renvoie le premier ou dernier lment d'un ensemble tri.


Comparator access

Renvoie le comparateur utilis pour classer l'ensemble.

Tableaux associatifs (Map)


Cette interface est implmente par les collections qui associent une cl un objet. L'accs aux objets est donc
effectu par une cl unique.
Il est possible d'utiliser n'importe quelle instance de classe comme cl. Cependant si cette classe ne possde pas les
proprits ncessaires, il faut utiliser exactement la mme instance pour accder une valeur (voir Objets comparables
et cls).
Les principales mthodes de cette interface sont :
void clear()

Vider la collection.
boolean containsKey(Object key)

Teste si la cl existe, c'est dire associe une valeur.


boolean containsValue(Object value)

Teste si la valeur existe.


Set entrySet()

Retourne l'ensemble des associations cls-valeurs.


Set keySet()

Retourne l'ensemble des cls.


Collection values()

Retourne la collection de valeurs.


Object put(Object key, Object value)

Associe la cl la valeur spcifie, et retourne la valeur prcdemment associe.


boolean putAll(Map m)

Ajouter tous les objets d'une autre collection celle-ci.


Object get(Object key)

Retourne la valeur associe la cl spcifie, ou null si non trouv.


Object remove(Object key)

85 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Supprime l'objet associ la cl, et retourne cet objet.


boolean isEmpty()

Tester si la collection est vide.


int size()

Retourne le nombre de cls.

Les implmentations
La classe Hashtable implmente l'interface Map de manire synchronise.
La classe HashMap implmente l'interface Map, et permet d'utiliser la cl null.

Les tableaux tris (SortedMap)


Exactement comme SortedSet :
Range view

Permet des oprations sur les plages de tableaux tris.


Endpoints

Renvoie le premier ou dernier lment d'un tableau tri.


Comparator access

Renvoie le comparateur utilis pour classer le tableau.

Parcourir une collection


Les itrateurs
Les itrateurs sont des outils puissants pour parcourir le contenu d'une collection.
List<String> ma_liste = new LinkedList<String>();
ma_liste.add("Bonjour");
ma_liste.add(" le ");
ma_liste.add("monde");

Iterator<String> it = ma_liste.iterator(); // On paramtre Iterator par le type des lments de la col


while (it.hasNext()) {
System.out.println(it.next()); // Affiche "Bonjour le monde"
}

Attention, l'appel de next() renvoie l'lment courant dans le parcours et passe l'itrateur l'lment suivant.
Pour pouvoir itrer sur une collection, il faut qu'elle soit itrable, c'est dire qu'elle hrite de Iterable. C'est le cas la
plupart du temps mais il y a des exceptions (HashMap).
L'utilisation des itrateurs requiert la classe Iterator dfinie dans le package java.util.

Boucles for each


// Parcours d'une collection
Collection<ObjetX> collection = ......;
for(ObjetX objetX : collection){
objetX.methodeY(p1,p2);
}

Attention aux parcours des Map

86 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Le code suivant convient tout a fait si vous avez besoin de parcourir les cls de la Map sans vous proccuper des
valeurs
Map<Key, Value> map;
for (Key key : map.keySet()) {
// ...
}

Le code suivant est proscrire si vous parcourrez l'ensemble des cls et des valeurs qui leurs sont associes
for (Key key : map.keySet()) {
// l'appel de get engendre un temps coteux en accs chaque itration
Value value = map.get(key);
}

Dans le cas prcdent, prfrez le code suivant


for (Map.Entry<Key, Value> entry : map.entrySet()) {
Key key = entry.getKey();
Value value = entry.getValue();
// ...
}

Interface commune
La plupart des structures voques ci-dessus implmentent l'interface Collection et possdent donc un ensemble de
mthodes communes. Les principales mthodes sont :
boolean add(Object o)

Ajouter un objet la collection.


boolean remove(Object o)

Retirer un objet de la collection.


boolean contains(Object o)

Tester si la collection contient l'objet indiqu.


boolean addAll(Collection c)

Ajouter tous les objets d'une autre collection celle-ci.


boolean removeAll(Collection c)

Retirer tous les objets d'une autre collection de celle-ci.


boolean retainAll(Collection c)

Retirer tous les objets qui ne sont pas dans la collection spcifie de celle-ci. la fin les deux collections
contiennent les mmes objets.
boolean containsAll(Collection c)

Tester si la collection contient tous les objets de la collection indique.


void clear()

Vider la collection.
boolean isEmpty()

Tester si la collection est vide.


Iterator iterator()

Retourne un itrateur permettant de faire une boucle sur tous les objets contenus dans la collection.
int size()

Retourne le nombre d'objets de la collection.


Object[] toArray()

Convertit la collection en tableau d'objets.


Object[] toArray(Object[] a)

Convertit la collection en tableau d'objets de classe spcifie. Si le tableau fourni n'est pas assez grand, un
nouveau tableau est allou en utilisant la mme classe d'lment.

87 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Tableau rcapitulatif
Implmentations
Interface
Liste (List)

Tableau dynamique Chanage


ArrayList, Vector

Arborescence [3] Table de hachage

LinkedList

Ensemble (Set)

TreeSet

HashSet

File (Queue)
Tableau associatif (Map)

HashMap

Synchronisation
Si une collection est accde par plusieurs threads, il faut utiliser la synchronisation afin que les modifications soient
cohrentes, c'est dire excutes sans tre interrompues par une modification effectue par un autre thread.
Une collection synchronise garantit que l'appel d'une mthode de la collection sera effectue sans qu'aucun autre
thread ne modifie cette collection entre-temps. Pour obtenir une collection synchronise, vous devez appeler une
mthode de la classe Collections, dont le nom dpend du type de collection :
type variable = Collections.synchronizedtype( new type(...) );

Exemple :
Set myset = Collections.synchronizedSet( new HashSet() );

Cependant, le thread peut tre interrompu entre deux appels de mthode. Dans ce cas, vous devez synchroniser
l'ensemble des instructions appelant les mthodes de la collection (mot-cl synchronized). Voir le chapitre "Threads
et synchronisation". Autrement dit, les listes ne sont pas thread-safe, aucune mthode n'est atomique. Les sources de
ces classes sont d'ailleurs consultables si vous avez accs au JDK.
La solution prcdente peut rsoudre tous les problmes de synchronisation, par exemple celui ci :
Map<String,String> map=new HashMap<String,String>();
map.put("toto", "valeur exemple 1");
map.put("titi", "valeur exemple 1");

...
synchronized {
if (!map.containsKey("titi"))
bd.put("titi", "valeur exemple 3");
}

Une modification ne peut peut avoir lieu, par un autre thread, entre le containsKey et le put. Mais cette solution est
peut efficace en ralit du fait car elle contraint protger tous les accs la liste en lecture comme en criture. Alors
que les accs en lectures multiples n'ont pas tre bloquant, seulement ceux en criture.
La solution la plus efficace est d'utiliser les listes de la bibliothque java.util.concurrent qui possde un putIfAbsent. En
outre, les mthodes de cette bibliothque peuvent tre considres comme toujours plus rapide en mode multi-thread
que celle d'une liste synchronise,

Classes squelettes
88 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Une interface possde souvent une longue srie de mthodes implmenter. Certaines sont implmentes
gnralement de la mme manire par beaucoup de classes.
Plutt que de rpter le code de ces mthodes dans les diffrentes implmentations, il est prfrable de rassembler leur
code dans une classe abstraite (car toutes les mthodes de l'interface ne sont pas implmentes).
Les classes de l'API Java utilisent de telles classes dont drivent les diffrentes implmentations.
Ces classes sont :
pour l'interface Collection,
pour l'interface List,
AbstractSequentialList pour l'interface List,
AbstractSet pour l'interface Set,
AbstractMap pour l'interface Map.
AbstractCollection

AbstractList

Elles ne sont pas instanciables directement car abstraites, mais servent de classes de base. Il est utile de connatre ces
classes pour rechercher dans la documentation, ou raliser une implmentation alternative celle propose par l'API.

Notes
1. http://docs.oracle.com/javase/7/docs/api/java/util/List.html
2. http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html
3. L'utilisation des arbres de recherche requiert que les lments soient triables (sortable)

89 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Annotations
Un nouveau principe introduit par Java 5 est la gestion des mta-donnes grce un mcanisme appel annotations.
Ces annotations sont ajoutes dans le code devant les classes et leurs membres (mthodes et champs) pour :
Ajouter des informations de documentation supplmentaires aux commentaires Javadoc,
Ajouter des contraintes de compilation (voir @Override par exemple),
Associer des mta-donnes qui peuvent tre retrouves par rflexion.
Malgr la similarit de syntaxe (arobase + nom) et de nom (@deprecated par exemple), il ne faut pas les confondre
avec les commentaires Javadoc qui ne sont utiliss que par l'outil javadoc du JDK. De plus, une annotation correspond
un type de donnes (comme les classes, interfaces et numrations). Ceci explique que la documentation d'un
package possde une section supplmentaire nomme Annotation Types pour les annotations dfinies dans le
package.

Fonctionnement
Toute entit (classe, interface, mthode ou champ) peut tre prcde d'une ou plusieurs annotations contenant des
mta-donnes renseignant le compilateur ou l'application elle-mme. Ces annotations sont accessibles l'excution, en
utilisant la rflexion, partir de nouvelles mthodes de la classe java.lang.Class.

Syntaxe
La syntaxe d'une annotation est la suivante :
@annotation-type[ (name=value) * ]

La liste des paramtres entre parenthse est optionnelle (vide par dfaut). Elle contient une srie de valeurs associes
un nom de champ dfinit par l'annotation.
Exemple 1 :
@Author(
name = "Moi",
date = "02/01/2009"
)
class MyClass() { }

Exemple 2 :
@Override
void uneMethode() { }

Annotations existantes
Beaucoup d'annotations compltent les balises spciales pour la documentation Javadoc.

@Deprecated
java.lang.Deprecated

Cette annotation marque une entit obsolte. Son utilisation gnre un avertissement la compilation, contrairement

90 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

au tag @deprecated des commentaires Javadoc.

@Override
java.lang.Override

Cette annotation marque une mthode redfinie.


Il ne s'agit pas d'une annotation de documentation mais d'un ajout de contrainte vrifie la compilation : une
mthode marque avec cette annotation doit obligatoirement tre une mthode redfinie de la classe mre. Dans le
cas contraire (mthode non dfinie dans la classe mre), le compilateur gnre une erreur annotation type not
applicable to this kind of declaration.
partir de Java 6, cette annotation peut aussi tre utilise pour les mthodes implmentant une interface.

@SuppressWarnings
java.lang.SuppressWarnings

Cette annotation signale au compilateur de supprimer certains avertissements la compilation de l'entit.


Exemple 1 : pour supprimer les avertissements d'utilisations de mthodes obsoltes :
@SuppressWarnings("deprecation")
void uneMethode() { methodeObosolete(); }

Exemple 2 : pour supprimer les avertissements d'utilisations de mthodes obsoltes et d'utilisation de mthodes sans
vrification de types (une version de la mthode avec types gnrique est prfrable afin que le type d'lment soit
vrifi) :
@SuppressWarnings({"unchecked", "deprecation"})
void uneMethode()
{
Vector v=new Vector();
methodeObosolete();
}

Crer de nouvelles annotations


La cration est similaire celle d'une interface.

Syntaxe
@interface identifiant {
type champ() [ default valeur ];
}

Exemple de dfinition:
@interface InfoClasse
{
String auteur();
int revision() default 1;
String[] references();

91 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Exemple d'utilisation:
@InfoClasse( auteur="Moi", references={"Reference1","Reference2"} )
class UneClasse { }

Cette nouvelle annotation peut elle-mme tre tague avec des annotations du package java.lang.annotation
indiquant l'utilisation qui en est faite.

Documentation pour Javadoc


Si l'annotation dfinit des informations afficher dans la documentation gnre par Javadoc, la dfinition de
l'annotation doit utiliser l'annotation @Documented (java.lang.annotation.Documented).
Correction de l'exemple prcdent :
@Documented
@interface InfoClasse
{
String auteur();
int revision() default 1;
String[] references();
}

Informations disponibles l'excution


Pour que les informations d'une annotation soient disponibles l'excution, il faut annoter sa dfinition avec
@Retention(RetentionPolicy.RUNTIME).

Exemple :
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationPourExecution
{
// lments d'information disponibles l'excution
}

Restreindre l'utilisation d'une annotation


La dfinition d'une annotation peut tre annote avec @Target pour spcifier avec quels types d'lments l'annotation
peut tre utilise.
La classe java.lang.annotation.ElementType dfinit les diffrents types qu'il est possible d'annoter.
Exemple :
import java.lang.annotation.*;
@Target(ElementType.ANNOTATION_TYPE)
@interface PourAutreAnnotation
{
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@interface InfoMembreOuType

92 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

{
// Type = class/interface/enum
}

Accs aux annotations d'une classe


L'API de rflexion de Java permet d'accder aux annotations d'une classe, mthode ou champ.
Exemple :
import java.lang.annotation.*;
// ...
Class clas = objet.getClass(); // ou partir d'une classe connue :
Annotation[] annotations = clas.getAnnotations();

UneClasseConnue.class

for (Annotation annotation : annotations)


{
if (annotation instanceof InfoClasse)
{
InfoClasse info_classe = (InfoClasse) annotation;
System.out.println("auteur : " + info_classe.auteur());
System.out.println("revision : " + info_classe.revision());
}
}

93 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Entres Sorties
Les oprations d'entres-sorties concernent la lecture (entre) et l'criture (sortie) de donnes travers diffrents types
de flux...
En Java, les oprations d'entres-sorties de base sont gres par les classes du package java.io. Ces classes obissent
au patron de conception dcorateur. Ces objets sont souvent crs au sein d'objets correspondant au patron de
conception fabrique.

Flux d'entre-sortie
Le package java.io possde deux classes principales :
InputStream

: cette classe abstraite dfinit les fonctions de lecture (entre ou input en anglais),
: cette classe abstraite dfinit les fonctions d'criture (sortie ou output en anglais).

OutputStream

Ces deux classes abstraites dfinissent des fonctions bas-niveau et sont implmentes dans diffrentes sous-classes
concrtes. Trois types de flux sont possibles, les flux sur fichiers, les flux sur tubes, et les flux sur zones de mmoire.
Par exemple on a :
: lecture d'un fichier,
FileOutputStream : criture d'un fichier.
FileInputStream

La classe java.net.Socket possdent des mthodes retournant des instances concrtes des classes InputStream et
OutputStream pour lire et crire depuis/vers la socket TCP.
java.io.InputStream

La classe java.io.InputStream possdent des mthodes lisant une srie d'octets (byte).
InputStream.read(): lit

un byte

InputStream.read(byte[] b): lit b.length

bytes.

InputStream.read(byte[] b, int off, int len): lit len

bytes, et les dpose commencer b[off].

java.io.OutputStream

La classe java.io.OutputStream possde des mthodes crivant une srie d'octets (byte).
OutputStream.write(): crit

un byte

OutputStream.write(byte[] b): crit b.length

bytes.
OutputStream.write(byte[] b, int off, int len): crit len bytes, commencer b[off].
java.io.PrintStream

La classe java.io.PrintStream hrite de la classe java.io.OutputStream, et permet d'afficher tous les types de
donnes sous forme textuelle.
La sortie standard et l'erreur standard impriment sur la console et sont des instances de la classe
java.io.PrintStream.
Exemple :
system.out.println("Bonjour !"); // Affiche une chane avec retour la ligne
int count = 100;
system.out.print(count); // Affiche un entier sans retour la ligne

94 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

system.out.print(' ');

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

// Affiche un caractre

Tout objet peut tre affich car les mthodes print et println appellent la mthode ToString() dfinie dans la
classe java.lang.Object racine de l'arbre hirarchique de tous les types d'objets.
Exemple :
class NombreComplexe
{
double n_real, n_img;
public NombreComplexe(double r, double i)
{
this.n_real = r;
this.n_img = i;
}
public String toString()
{
return n_real + " + i*"+n_img;
}
}
NombreComplexe a = new NombreComplexe(1.0, 0.5);
system.out.println(a); // Appelle println(Object) pour afficher :
//
1.0 + i*0.5

La mthode toString() est galement appele implicitement lors de la concatnation de chanes de caractres :
String resultat = "Solution complexe :" + a;
// -> Solution complexe : 1.0 + i*0.5

Il est donc important que cette mthode n'ait aucun effet de bord (modification d'un objet, synchronisation, ...).

Lecture-criture haut niveau


Le package java.io possde des classes permettant la lecture et l'criture de diffrents types de donnes.

Reader, Writer, PrintStream


Cette section est vide, pas assez dtaille ou incomplte.

Exemple concret de flux


Fichiers textes
Cette section est vide, pas assez dtaille ou incomplte.

Images
import javax.imageio.ImageIO;
ImageIO.read(imgage);
ImageIO.write(imgage, "jpg", new File(filename));

95 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Cette section est vide, pas assez dtaille ou incomplte.

Consoles
Cette section est vide, pas assez dtaille ou incomplte.

Rseaux
Cette section est vide, pas assez dtaille ou incomplte.

96 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Processus lgers et synchronisation


Les processus lgers (threads), ou fils d'excution, permettent l'excution de plusieurs tches en mme temps.

Qu'est ce qu'un processus lger ?


Un processus lger est un contexte d'excution d'une application. Ce processus possde sa propre pile et pointeur
d'excution.
Une application en cours d'excution (un processus) peut avoir plusieurs sous-processus lger. Tous les processus
lgers d'un mme processus partagent la mme zone de donnes. Ce qui veut dire que toute variable membre d'une
classe est modifiable par n'importe quel processus lger. Il faut donc un moyen de synchroniser l'accs aux variables
(voir paragraphe Synchronisation).
Par dfaut, une application possde un seul processus lger, cr par le systme. Cependant, en Java, d'autres
processus lgers sont crs quand l'application utilise une interface graphique, notamment un processus lger grant la
boucle de lecture des messages systmes.

Processus lger courant


En Java, tout processus lger est reprsent par un objet de classe Thread. Le processus lger courant est retourn par
la mthode statique currentThread de la classe Thread.
La classe Thread possde quelques mthodes statiques agissant sur le processus lger courant :
la mthode sleep(long millis) permet de suspendre le processus lger durant le temps donn en millisecondes;
la mthode yield() permet de laisser les autres processus lgers s'excuter;
la mthode interrupted() teste si le processus lger courant a t interrompu ;
la mthode dumpStack() affiche la pile d'appel du processus lger courant (dverminage, ou dbuggage en
franglais).

Crer un processus lger


La classe Thread peut tre drive pour crer un autre processus lger. Dans ce cas, il faut surcharger la mthode
run() pour y mettre le code excut par le processus lger.
Exemple :
public class MyThread extends Thread
{
public void run()
{
System.out.println("Un nouveau processus lger");
Thread.sleep(1000); // suspendu pendant 1 seconde
System.out.println("Fin du nouveau processus lger");
}
}

Il est alors cr et dmarr de la manire suivante :


MyThread myth=new MyThread();
System.err.println("Dmarrer le processus lger ...");
myth.start();
System.err.println("Le processus lger est dmarr.");

Il n'est pas toujours possible d'tendre la classe Thread car Java n'autorise qu'une classe de base. Mais il est permis

97 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

d'utiliser plusieurs interfaces. L'interface Runnable permet de rsoudre le problme.


Par dfaut, la mthode run() de la classe Thread appelle la mthode run() de l'interface Runnable pass en
paramtre du constructeur.
Exemple :
public class MyClass extends AnotherClass
implements Runnable
{
public void run()
{
System.out.println("Un nouveau processus lger");
Thread.sleep(1000); // suspendu pendant 1 seconde
System.out.println("Fin du nouveau processus lger");
}
}

Le processus lger est alors cr et dmarr de la manire suivante :


MyClass myclass=new MyClass ();
Thread th=new Thread(myclass); // <-- processus lger cr
System.err.println("Dmarrer le processus lger ...");
th.start();
System.err.println("Le processus lger est dmarr.");

Actions sur un processus lger


Cycle de vie d'un processus lger
Un processus lger possde diffrents tats grs par le systme :
tat prt : le processus est prt tre excut,
tat suspendu : le processus est suspendu (attente d'une ressource),
tat excution : le processus est en cours d'excution,
tat termin : le processus a achev son excution ou a t interrompu.

InterruptedException
Cette classe d'exception est lance par les mthodes de la classe Thread et celle de la classe Object demandant la
suspension pour un temps indtermin du processus lger courant (attente en gnral).
Cette exception est lance quand le processus lger en attente est interrompu. Capturer cette exception permet
d'interrompre l'attente, et librer des ressources pour terminer proprement.

Attendre la fin d'un processus lger


La mthode join() de la classe Thread peut tre appele pour attendre la fin d'un processus lger.
Exemple :
th.join(); // InterruptedException capturer

Interrompre un processus lger


La mthode interrupt() de la classe Thread peut tre appele pour interrompre un processus lger. Cette mthode

98 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

provoque le lancement d'une exception de type InterruptedException quand le processus appelle une mthode
d'attente.

Synchronisation
La synchronisation devient ncessaire quand plusieurs processus lgers accdent aux mmes objets.

mot-cl synchronized
Le mot-cl synchronized permet un accs exclusif un objet.
La syntaxe est la suivante :
... code non protg ...
synchronized(objet) {
... code protg ...
}
... code non protg ...

Le code protg n'est excut que par un seul processus lger la fois, tant qu'il n'a pas termin le bloc d'instruction.
Durant l'excution de ce code protg par un processus lger, un autre processus lger ne peut excuter celui-ci, mais
peut excuter un autre bloc synchronized si celui-ci n'utilise pas le mme objet et qu'il n'est pas dj en cours
d'excution.
Le mot-cl synchronized peut galement tre utilis dans la dclaration des mthodes :
public synchronized void codeProtege() {
... code protg ...
}

est quivalent :
public void codeProtege() {
synchronized(this)
{
... code protg ...
}
}

Pour une mthode statique (mthode de classe) :


public class MyClass {
public synchronized static void codeProtege() {
... code protg ...
}
}

est quivalent :
public class MyClass {
public static void codeProtege() {
synchronized(MyClass.class) {
... code protg ...
}
}
}

99 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Attente et signal
Quand le mot-cl synchronized ne suffit pas (par exemple, permettre l'accs deux processus lgers simultanment
au lieu d'un seul), il est possible de suspendre un processus lger et le rveiller.
La classe Object possde les mthodes suivantes :
suspend le processus courant jusqu' ce que la mthode notify() ou notifyAll() de cet objet soit
appele ;
wait(long timeout) suspend le processus courant jusqu' ce que la mthode notify() ou notifyAll() de cet
objet soit appele, ou bien que le temps indiqu soit coul ;
notify() rveille l'un des processus en attente de cet objet,
notifyAll() rveille tous les processus en attente de cet objet.
wait()

Pour appeler l'une de ces quatre mthodes, il faut possder l'objet. Ce qui signifie utiliser l'instruction synchronized.
Dans le cas contraire, l'exception suivante est leve :
java.lang.IllegalMonitorStateException: current thread not owner

Exemple :
synchronized(myobj)
{
myobj.wait();
}

Comme ces mthodes sont dfinies dans la classe Object, il est possible de les utiliser avec n'importe quel type d'objet,
et donc les chanes de caractres et les tableaux.

Une bibliothque spcialise


Il est trs courant d'tre amen protger l'accs une variable pour juste par exemple, une incrmentation sous
condition, comparer et changer deux valeurs, chercher et ajouter. Ces mthodes sont qualifies d'atomiques. La
solution la plus efficace consiste utiliser les classes de la bibliothque java.util.concurrent. Ces classes disposent de
mthodes considres comme toujours plus rapides en mode multi-thread que celles d'une liste synchronise, prenons
par exemple le cas des listes :
String str;
Map<String,String> map=new HashMap<String,String>();
map.put("toto", "valeur exemple 1");
map.put("titi", "valeur exemple 1");
...
synchronized { str=map.get("tutu");}

...
synchronized {
if (!map.containsKey("titi"))
bd.put("titi", "valeur exemple 3");
}

Un autre thread ne peut pas effectuer de modification entre containsKey et put, du fait du verrou pos par l'instruction
synchronized. Mais cette solution est en ralit peu efficace car elle contraint le plus souvent protger tous les accs
la liste, en lecture comme en criture, alors que les accs en lectures multiples n'ont pas tre bloquants, seuls ceux
en criture devant l'tre. La classe ConccurentHashMap possde un putIfAbsent. Il est possible de rimplanter cette
caractristique via la synchronisation sur deux valeurs, mais les classes fournies par java.util.concurrent sont, elles,

100 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

exemptes de bugs.
Si la classe de liste ne vous satisfait pas, la pose de verrou via la classe ReentrantReadWriteLock est extrmement
simple.

101 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Mthodes natives
Une classe peut possder des mthodes natives. Une mthode native n'est pas implmente en Java mais dans un autre
langage de programmation (C ou C++ le plus souvent).
Le mot-cl native marque les mthodes natives d'une classe Java. Elles n'ont pas de corps d'implmentation (comme
les mthodes abstraites).
L'outil javah du JDK permet de gnrer l'en-tte C/C++ (*.h) correspondant aux mthodes natives d'une classe.
Pour plus de dtails, voir Dvelopper en Java/Faire appel du code natif.

102 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Rflexion
La rflexion (reflection en anglais) permet l'introspection des classes, c'est--dire de charger une classe, d'en crer une
instance et d'accder aux membres statiques ou non (appel de mthodes, lire et crire les attributs) sans connatre la
classe par avance.
Java possde une API permettant la rflexion. Elle sert notamment grer des extensions (plug-in en anglais) pour une
application.

L'API de rflexion
Le package java.lang possde trois classes utilises pour l'utilisation dynamique des classes :
java.lang.Class

Cette classe permet d'accder aux caractristiques d'une classe, ses membres (mthodes et attributs), la
classe mre.
java.lang.ClassLoader

Cette classe permet de grer le chargement de classe. Il existe des sous-classes dont notamment
java.net.URLClassLoader permettant de charger des classes en les cherchant dans une liste d'URLs (donc de
fichiers JAR et rpertoires galement, en convertissant le chemin du fichier ou rpertoire en URL).
java.lang.Package

Cette classe permet d'accder aux informations d'un package (informations de version, annotations, ...).
Les autres classes utiles sont dfinies dans le package java.lang.reflect et permettent d'accder aux dtails d'une
classe. Les principales classes sont les suivantes :
java.lang.reflect.Constructor

Rfrence un constructeur d'une classe.


java.lang.reflect.Method

Rfrence une mthode d'une classe.


java.lang.reflect.Field

Rfrence un champs d'une classe.


java.lang.reflect.Modifier

Attributs et mthodes statiques pour dcoder les modificateurs des membres (public, private, protected, static,
abstract, final, native, ...).
Les classes reprsentant des membres d'une classe (Constructor, Method, Field) implmentent toutes l'interface
java.lang.reflect.Member comportant les mthodes suivantes :
Class getDeclaringClass()

Retourne la classe dfinissant ce membre.


String getName()

Retourne le nom.
int getModifiers()

Retourne les modificateurs (public, protected, private, static, final, ...).


boolean isSynthetic()

Teste si ce membre a t gnr par le compilateur.

Charger une classe dynamiquement


La classe java.lang.Class possde deux mthodes statique pour obtenir une classe (aprs chargement si
ncessaire) :
static Class forName(String name)

Cette mthode quivaut appeler la seconde mthode avec pour paramtres : (name, true,
this.getClass().getClassLoader()).

103 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

static Class forName(String name, boolean initialize, ClassLoader loader)

Charge la classe dont le nom complet (incluant les packages) est spcifi, en utilisant l'instance du chargeur de
classe fourni. Le paramtre initialize vaut true pour initialiser la classe (appeler le bloc d'initialisation
statique), ou false pour ne pas l'initialiser.
Il est galement possible d'obtenir une java.lang.Class de manire statique :
partir d'un objet en appelant la mthode getClass(),
partir d'une rfrence la classe en utilisant le champ class.
Exemple :
package org.wikibooks.fr;
public class Exemple
{
String nom;
public String getNom()
{ return nom; }
}
...
Class c = Class.forName("org.wikibooks.fr.Exemple"); // sans rfrence statique la classe
// ou
Class c = org.wikibooks.fr.Exemple.class; // rfrence statique la classe
// ou
Class c = new Exemple().getClass(); // rfrence statique la classe

Liste des membres d'une classe


Les mthodes suivantes permettent de lister les membres d'une classe :
getConstructors()

Cette mthode retourne un tableau de java.lang.reflect.Constructor contenant tous les constructeurs


dfinis par la classe.
getMethods()

Cette mthode retourne un tableau de java.lang.reflect.Method contenant toutes les mthodes dfinies par
la classe.
getFields()

Cette mthode retourne un tableau de java.lang.reflect.Field contenant tous les attributs dfinis dans la
classe.
Les mthodes ci-dessus retournent les membres publics de la classe, comprenant galement ceux hrits des classes
mres. Il existe une variante "Declared" de ces mthodes retournant tous les membres (publics, protgs, privs)
dclars par la classe uniquement (les membres hrits sont exclus).
Au lieu de lister tous les membres, puis en rechercher un en particulier, il est possible d'utiliser les mthodes
spcifiques de recherche d'un membre prcis d'une classe (publics et hrits, ou bien "Declared" pour tous ceux
dclars par la classe seule) :
getConstructor(Class... parameterTypes)
getDeclaredConstructor(Class... parameterTypes)

Cette mthode retourne le constructeur dclar avec les paramtres dont les types sont spcifis.
getMethod(String name, Class... parameterTypes)
getDeclaredMethod(String name, Class... parameterTypes)

Cette mthode retourne la mthode portant de nom spcifi et dclare avec les paramtres dont les types sont
spcifis.
getField(String name)
getDeclaredField(String name)

Cette mthode retourne l'attribut portant de nom spcifi.

104 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Les membres retourns par toutes ces mthodes peuvent tre d'instance ou statiques.
La mthode getAnnotations() retourne un tableau de java.lang.Annotation contenant toutes les annotations
associes la classe.

Instancier une classe et appel un constructeur


La mthode newInstance() de la classe java.lang.Class permet de crer une nouvelle instance de la classe, en
appelant le constructeur sans paramtre de la classe (qui doit donc en possder un) :
Class c = Class.forName("org.wikibooks.fr.Exemple");
Object o = c.newInstance();

// quivaut

new org.wikibooks.fr.Exemple();

Une classe comme celle ci-dessous peut ne pas avoir de constructeur sans paramtres :
package org.wikibooks.fr;
public class Livre
{
String titre;
int nb_pages;
public Livre(String titre, int nb_pages)
{
this.titre = titre;
this.nb_pages = nb_pages;
}
}

Dans ce cas, il faut d'abord obtenir le constructeur, puis l'appeler :

Class c = Class.forName("org.wikibooks.fr.Livre"); // Accs la classe Livre


Constructor constr = c.getConstructor(String.class, int.class); // Obtenir le constructeur (String, in
Object o = constr.newInstance("Programmation Java", 120); // -> new Livre("Programmation Java", 120);

Pour les versions de Java antrieures 5.0 o l'auto-boxing n'existe pas, et o il faut explicitement utiliser des
tableaux :

Class c = Class.forName("org.wikibooks.fr.Livre"); // Accs la classe Livre


Constructor constr = c.getConstructor(new Class[]{ String.class, Integer.TYPE }); // Obtenir le constr
Object o = constr.newInstance(new Object{ "Programmation Java", Integer.valueOf(120) }); // -> new Liv

Appel une mthode


L'appel une mthode de la classe est bas sur le mme principe que l'appel un constructeur vu juste avant.
Cependant, pour obtenir la rfrence une mthode, il faut spcifier le nom. Lors de l'invocation de la mthode, il faut
spcifier l'instance (l'objet) auquel s'applique la mthode (null pour une mthode statique).
Exemple :
package org.wikibooks.fr;
public class Livre
{
String titre;
int nb_pages;

105 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

public Livre(String _titre, int _nb_pages) {


this.titre = _titre;
this.nb_pages = _nb_pages;
}
public int getNombreDeFeuilles(int pages_par_feuille)
{
return (nb_pages+pages_par_feuille-1)/pages_par_feuille;
}
}
...
Class c = Class.forName("org.wikibooks.fr.Livre"); // Accs la classe Livre

Constructor constr = c.getConstructor(String.class, int.class); // Obtenir le constructeur (String, in


Object o = constr.newInstance("Programmation Java", 120); // -> new Livre("Programmation Java", 120);

Method method = c.getMethod("getNombreDeFeuilles", int.class); // Obtenir la mthode getNombreDeFeuill


int nb_feuilles = (int)method.invoke(o, 2); // -> o.getNombreDeFeuilles(2);

Accs un attribut
L'accs un attribut se fait en appelant les mthodes sur l'instance de java.lang.reflect.Field obtenu auprs de la
classe.
Exemple :
package org.wikibooks.fr;
public class Livre
{
public String titre;
public int nb_pages;
public Livre(String _titre, int _nb_pages) {
this.titre = _titre;
this.nb_pages = _nb_pages;
}
}
...
Class c = Class.forName("org.wikibooks.fr.Livre"); // Accs la classe Livre

Constructor constr = c.getConstructor(String.class, int.class); // Obtenir le constructeur (String, in


Object o = constr.newInstance("Programmation Java", 120); // -> new Livre("Programmation Java", 120);
Field f_titre = c.getField("titre"); // Obtenir l'attribut titre
String titre_du_livre = (String)f_titre.get(o); // -> o.titre
f_titre.set(o, "Java"); // -> o.titre = "Java";

Exemple concret : un gestionnaire d'extensions


Chaque extension d'une classe lui ajoute des mthodes.

106 sur 142

Cette section est vide, pas assez dtaille ou incomplte.

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Regex
Syntaxe
Expressions rationnelles courantes
Caractre

Type

Explication

Point

n'importe quel caractre

[...]

classe de caractres tous les caractres numrs dans la classe

[^...]

classe complmente Tous les caractres sauf ceux numrs

circonflexe

marque le dbut de la chaine, la ligne...

dollar

marque la fin d'une chaine, ligne...

barre verticale

alternative - ou reconnat l'un ou l'autre

(...)

parenthse

utilise pour limiter la porte d'un masque ou de l'alternative

astrisque

0, 1 ou plusieurs occurrences

le plus

1 ou plusieurs occurrence

interrogation

0 ou 1 occurrence

Les expressions rationnelles en Java ncessitent le package java.util.regex.


Elles proposent les mmes constructeurs spciaux que le C++, soit X une expression :
(?:X) : groupe non capturant
(?>X) : groupe non capturant indpendant
(?=X) : avec lookahead positif
(?!X) : avec lookahead ngatif
(?<=X) : avec lookbehind positif
(?<!X) : avec lookbehind ngatif

Recherche
La classe Pattern offre la fonction matches qui renvoie si une expression est trouve dans une chaine.
Le mot prcdant un autre :
import java.util.regex.Pattern;
public class Regex {
public static void main(String[] args) {
String chaine1 = "Test regex Java pour Wikibooks francophone.";
System.out.println(Pattern.matches("[a-z]* Wikibooks",chaine1));
}
}
// Affiche : "pour Wikibooks"

Remplacement
La classe Matcher permet de trouver tous les rsultats des expressions (fonction find) et de les stocker dans un groupe
de rsultat.
Afficher ce qui est entre les balises HTML :
import java.util.regex.Pattern;

107 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

import java.util.regex.Matcher;
public class Regex {
public static void main(String[] args) {
String chaine = "Test regex Java pour <balise1>Wikibooks</balise1> francophone.";
Pattern p = Pattern.compile("<.*>(.*)<.*>");
Matcher m = p.matcher(chaine);
while(m.find())
System.out.println(m.group(1));
}
}
// Affiche "Wikibooks"

Rfrences
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

108 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Conclusion
Conclusion
Vous avez appris, au travers de la lecture de ce livre, les fondements du langage Java. La matrise de ces notions est
indispensable pour produire des applications ou des bibliothques convenables. Nanmoins, si vous voulez pleinement
profiter des nombreuses autres possibilits offertes par Java, il faut ds maintenant se pencher sur les nombreuses
facettes de Java.
Elles sont notamment prsentes dans le wikilivre Dvelopper en Java qui propose de dcouvrir de nombreux
outils, bibliothques, techniques et pratiques spcifiques Java.

109 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

JDK
Le JDK est un ensemble d'outil permettant de dvelopper en Java.
Pour obtenir la liste des options d'un outil, il suffit de lancer l'outil sans aucun argument.

Compiler le code
javac est le compilateur qui convertit le code source .java en fichier .class (contenant le bytecode Java).
Supposons que vous avez
un dossier src qui contient vos sources (tous vos fichiers .java).
un dossier bin o vous placerez tous les fichiers compils (les fichier .class correspondant)
# compile seulement la classe Exemple et place le rsultat dans bin
javac -d bin src/Exemple.java
# compile toutes les sources trouves dans src et les place dans bin
javac -d bin src/**/*.java

Si la compilation choue parce que votre code utilise des classes que javac ne connait pas (erreur Unable to find
symbol), vous devez prciser javac un classpath comme expliqu plus loin.

Lancer l'application
permet une dans lancer une application java en ligne de commande, il faut passer en paramtre le nom complet
(pleinement qualifi) de la classe.
java

java org.wikibooks.fr.Exemple argument_1 argument_2

La ligne de commande ci-dessus appel la mthode public static void main(String[] args) de la classe Exemple du
package org.wikibooks.fr avec args, un tableau deux lments : "argument_1" et argument_2".
javaw permet une application java sans console (interface graphique seule).
javaw org.wikibooks.fr.Exemple

Une archive java (*.jar) avec l'option -jar, un petit fichier (appel Manifest ) contenu dans le jar indique lui-mme
le nom de la classe principale lancer.
java -jar chemin/vers/le/fichier.jar

Prciser le CLASSPATH
Dans toutes les commandes ci-dessus, il faut permettre java de trouver tous les fichiers compils ncessaire
l'excution du code (les fichiers *.class gnrs avec javac). Pour cela, il faut prciser java les rpertoires ou
celui-ci pourra trouver tout a.
Pour cela, il faut dfinir ce qu'on appelle le CLASS PATH , c'est une simple chaine qui dfinit plusieurs chemins
pour trouver des .class spars par ":". Les chemins peuvent tre des chemins vers des fichiers .jar ou vers des
rpertoires contenant des fichiers .class. Il y a deux faon de prciser le CLASSPATH java, la premire est d'utiliser
le paramtre -classpath de ligne de commande.

110 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

java -classpath chemin/vers/une/premiere/bibliotheque.jar:chemin/vers_une_autre/bibliotheque.jar:bin o

Ici, java essaiera de trouver le fichier Exemple.class dans les deux jars donns puis dans le dossier bin. Si le fichier
n'est trouv dans aucun de ces lments, il y aura une erreur (Class not found exception).
La seconde faon de prciser le CLASSPATH est de dfinir une variable d'environnement systme. Sous linux,
export CLASSPATH="chemin/vers/une/premiere/bibliotheque.jar:chemin/vers_une_autre/bibliotheque.jar"

Attention ne pas confondre java -jar fichier.jar et java -cp fichier.jar, la premire commande permet de
lancer le programme qui se trouve dans fichier.jar et fonctionne ; la seconde prcise que des classes peuvent tre
charge depuis fichier.jar mais oublie de prciser quelle classe il faut lancer : java indiquera qu'un paramtre est
manquant. Enfin, sachez que vous pouvez remplacer -classpath par -cp .

jar
L'outil jar permet de regrouper les classes (fichiers *.class) et ressources d'une application en une seule archive
excutable. Cette archive est au format ZIP mais possde l'extension .jar. Dans cette archive, un rpertoire spcial
situ la racine nomm META-INF contient des fichiers d'information et de configuration pour la machine virtuelle
Java, dont notamment le fichier MANIFEST.MF (fichier manifest, MF = Meta File).
Une archive JAR peut tre excutable si la classe principale (contenant une mthode statique nomme main) de
l'application est spcifie dans ce fichier MANIFEST.MF. Dans ce cas, l'application peut se lancer avec la commande
suivante :
java -jar chemin_de_l_archive.jar ...arguments passs l'application si besoin...

Ce fichier manifest est au format texte. Exemple :


Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 19.1-b02 (Sun Microsystems Inc.)
Main-Class: org.wikibooks.fr.ApplicationExemple
Class-Path: .

Il possde diffrents champs. Chaque champ possde un nom, suivi de deux-points et de sa valeur. Si une valeur est
longue, elle peut tre rpartie sur plusieurs lignes, chaque ligne additionnelle commenant alors par au moins un
caractre espace.
Pour plus de dtails sur les fichiers manifest voir http://docs.oracle.com/javase/tutorial/deployment
/jar/manifestindex.html
Attention !
Le champ Class-Path dans une archive JAR diffre du paramtre classpath
pass aux outils Java :
Il ne peut contenir que des chemins relatifs d'autres archives Java (*.jar) ; les
rpertoires ne sont pas supports ;
Le sparateur est un caractre espace. Les fichiers rfrencs ne peuvent donc
en contenir dans leur nom.

111 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Pour crer une archive JAR partir d'un rpertoire contenant les classes et ressources (les sous-rpertoires devant
correspondre aux packages), et d'un fichier texte pour le fichier manifest :
jar cfm mon_archive.jar mon_manifest.txt -C repertoire .

Peu importe le nom du fichier manifest et son extension spcifis, il sera renomm MANIFEST.MF.
Les arguments de la commande sont dcrits ci-dessous :
cfm
Une srie de caractres dont le premier spcifie l'action principale :
c Crer une archive (Create).
t Afficher le contenu de l'archive (Table of content).
x Extraire les fichiers de l'archive (eXtract files).
u Mettre jour l'archive existante (Update archive).
Les caractres suivants donne l'ordre des arguments qui suivent :
f Le nom du fichier archive (archive File).
m Le nom du fichier manifest utiliser (Manifest file).
mon_archive.jar
Le nom du fichier archive.
mon_manifest.txt
Le nom du fichier manifest utiliser.
-C repertoire
Prcise le chemin du rpertoire pour les chemins relatifs
.
Inclus le fichier spcifi (. dsignant le rpertoire courant sous la plupart des systmes d'exploitation).
Eclipse possde une interface interactive pour gnrer un fichier JAR partir des classes d'un projet Java, ou d'une
configuration d'excution.

javadoc
L'outil javadoc est le gnrateur de documentation, qui gnre automatiquement de la documentation partir des
commentaires du code source.
Voir le chapitre sur les commentaires pour plus de dtails sur l'outil et son utilisation.

jdb
Cette section est vide, pas assez dtaille ou incomplte.
le dbogueur

javah
javah permet de gnrer un fichier d'en-tte C (*.h) contenant la dclaration des fonctions correspondantes aux
mthodes natives de la classe compile spcifie.
javah -classpath directory-list classname

Voir Dvelopper en Java/Faire appel du code natif.

112 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

javap
javap permet de lister les membres et dsassembler la classe compile spcifie.
javap -c -classpath directory-list classname

Voir Dvelopper en Java/La machine virtuelle Java (JVM)#Le byte code.

113 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Paramtrer la JVM
La machine virtuelle Java dsigne l'environnement d'excution d'un programme Java. Il est possible d'adapter cet
environnement suivant les besoins : utilisation de la mmoire, configuration du rseau, etc.
Il existe 2 possibilits de paramtrage de cet environnement :
1. au moment du lancement du programme Java (et de la JVM)
2. au cours de l'excution d'un programme Java
L'action de paramtrer la machine virtuelle reprsente le changement d'tat d'un paramtre systme. Dans un premier
temps les paramtres les plus utiliss sont lists. Ensuite, les deux possibilits de paramtrage sont exposes.

Liste des paramtres de la machine virtuelle Java (JVM)


Paramtres du proxy
Nom du
paramtre [1]

Description

http.proxyHost

le nom du serveur proxy

http.proxyPort

le port du proxy (valeur par dfaut:80)

http.nonProxyHosts

liste des htes qui doivent tre accds directement, sans passer par le proxy. Il s'agt d'une
liste d'expressions rgulires spares par '|'. Tous les htes correspondant l'une de ces
expressions seront accds par une connexion directe sans passer par le proxy

http.proxyUser

le nom d'utilisateur utilis pour le proxy

http.proxyPassword

le mot de passe utilisateur utilis pour le proxy

Paramtres de la mmoire
Le paramtrage de la mmoire se fait au lancement d'un programme Java grce aux arguments suivants :
Nom du paramtre

Description

-Xms

allocation mmoire initiale

-Xmx

allocation mmoire maximum

-Xmn

allocation mmoire pour les programmes fils ( confirmer?)

Exemple pour lancer un programme Java en allouant 256 Mo :


java -Xms256M -Xmx256M monProgrammeJava

Modification d'un paramtre de la JVM


Au lancement d'un programme Java, il est possible de positionner un ou plusieurs paramtres systme de la manire
suivante :

$ java -D<nom du paramtre1>=<valeur du paramtre1> -D<nom du paramtre2>=<valeur du paramtre2> monPr

114 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Exemple pour positionner le proxy utiliser


$ java -Dhttp.proxyHost=monproxy -Dhttp.proxyPort=3128 monProgrammeJava

dans cet exemple, le proxy utilis sera l'hte "monproxy" sur le port 3128
Au sein d'un programme Java, il est possible de changer l'tat d'un paramtre systme de la manire suivante :
System.getProperties().put("http.proxyHost", "monproxy");
System.getProperties().put("http.proxyPort", "3128");
System.getProperties().put("http.proxyUser", "toto");
System.getProperties().put("http.proxyPassword", "totoisback");

dans cet exemple, le proxy utilis sera l'hte "monproxy" sur le port 3128 en utilisant comme utilisateur "toto"

Rfrences
1. (anglais) http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html
Cette page fait partie du livre Programmation

115 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Liste des mots rservs


Voici la liste des mots rservs la programmation en Java :

116 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Mot
rserv

Type

abstract

Mot-cl

Dclaration d'une mthode ou d'une classe abstraite.

assert

Mot-cl

Assertion

boolean

Type de
donnes

Valeur boolenne (vrai ou faux).

break

Mot-cl

Interrompre une boucle ou un choix multiple.

byte

Type de
donnes

Entier sign de -128 +127.

case

Mot-cl

Cas dans un choix multiple.

catch

Mot-cl

Capture d'un type d'exception.

char

Type de
donnes

Caractres Unicode (UTF-16, donc sur 16 bits).

class

Mot-cl

Dclaration d'une classe.

const

Rserv [1]

Inutilis actuellement.

continue

Mot-cl

Continuer une boucle en allant l'itration suivante.

default

Mot-cl

Cas par dfaut dans un choix multiple.

do

Mot-cl

Boucle itrative.

double

Type de
donnes

Nombre virgule flottante, double prcision.

else

Mot-cl

Excution conditionnelle.

enum

Mot-cl

Dclaration d'une numration.

extends

Mot-cl

Hritage : dclaration de la classe mre, ou pour une interface de toutes les


interfaces mres.

false

Valeur
littrale

Valeur boolenne fausse.

final

Mot-cl

Dclarer un membre comme final.

finally

Mot-cl

Code excut quoi qu'il se passe dans un bloc de capture d'exception.

float

Type de
donnes

Nombre virgule flottante, simple prcision.

for

Mot-cl

Boucle itrative.

goto

Rserv [1]

Inutilis actuellement.

if

Mot-cl

Excution conditionnelle.

implements

Mot-cl

Dclaration des interfaces implmentes par une classe.

import

Mot-cl

Dclaration des packages utiliss par une classe.

instanceof

Mot-cl

Tester si un objet est de la classe indique (voir Transtypage).

int

Type de
donnes

Entier sign de -2 147 483 648 +2 147 483 647.

interface

Mot-cl

Dclaration d'une interface.

long

Type de
donnes

Entier sign de -9 223 372 036 854 775 808 +9 223 372 036 854 775 807.

native

Mot-cl

Dclaration d'une mthode native.

new

Mot-cl

Allocation d'une instance de classe.

117 sur 142

Description

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Mot
rserv

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Type

Description

null

Valeur
littrale

Rfrence nulle.

package

Mot-cl

Dclaration du package de la classe.

private

Mot-cl

Dclaration d'un membre priv de la classe.

protected

Mot-cl

Dclaration d'un membre protg de la classe.

public

Mot-cl

Dclaration d'un membre public de la classe.

return

Mot-cl

Retourner une valeur depuis une mthode.

short

Type de
donnes

Entier sign de -32 768 +32 767.

static

Mot-cl

Dclaration d'un membre statique de la classe.

strictfp

Mot-cl

Dclaration d'une mthode ou classe o les oprations en virgule flottante doivent


tre valu strictement de gauche droite selon la spcification Java.

super

Mot-cl

Rfrence l'instance de la classe mre.

switch

Mot-cl

Dbut d'un choix multiple.

synchronized

Mot-cl

Voir Processus lgers et synchronisation.

this

Mot-cl

Rfrence l'instance de la classe englobante.

throw

Mot-cl

Lever une exception

throws

Mot-cl

Dclaration des exception leves par une mthode.

transient

Mot-cl

Dclaration d'un attribut exclure de la srialisation.

true

Valeur
littrale

Valeur boolenne vraie.

try

Mot-cl

Capture d'un type d'exception.

void

Mot-cl

Dclaration d'une mthode ne retournant aucune valeur.

volatile

Mot-cl

Dclaration d'un attribut volatile, c'est dire dont la valeur ne doit pas tre mise en
cache car elle est accde par diffrents threads.

while

Mot-cl

Boucle itrative.

Suffixes
L
L est un suffixe pour dclarer une valeur litrale de type long au lieu de int (voir syntaxe des valeurs de type
long).
F
Idem pour le suffixe F pour dclarer une valeur litrale de type float au lieu de double (voir syntaxe des
valeurs de type float).
D
Idem pour le suffixe D pour dclarer une valeur litrale de type double. Cependant, le type par dfaut des
nombres virgules tant double, ce suffixe n'est pas obligatoire (voir syntaxe des valeurs de type double).

Prfixes
0
0 est un prfixe utilisable pour une valeur entire exprime en octal (base 8, chiffres de 0 7).
0x
0x est un prfixe utilisable pour une valeur entire exprime en hexadcimal (base 16, chiffres de 0 9 et les

118 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

lettres de A F).

Notes et rfrences
1. Ces mots rservs ne sont pas utiliss, et ce, jusqu' la version 7 de Java. Cependant, ils ne peuvent tre utilis comme
nom de variable par exemple. Oracle se garde le droit de les utiliser plus tard.

119 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Dbogage
Erreurs la compilation
Fentre de warning ...java uses unchecked or unsafe operations
Une dclaration ne tient pas compte des surcharges possibles, une conversion de variable pose problme. Il faut donc
en prvoir les exceptions. Par exemple pour manipuler des entiers :
try {
i = i/2;
} catch (NumberFormatException e) {
return 0;
}

<identifier> expected
L'ordre des dclarations n'est pas chronologique.

annotation type not applicable to this kind of declaration


Voir @Override.

cannot be dereferenced
Il suffit de retirer la conversion, le .toString() aprs la variable de type int slectionne.
Ou en ajouter unecomme : (float), Float.valueOf(), ou .floatValue().

cannot find symbol - variable


Soit :
La variable mentionne n'a pas t dclare ;
Sa dclaration trouve dans une condition (if ou try) ferme avant la ligne en erreur ;
Elle se trouve dans un package non import ;
Si elle se trouve dans un autre fichier, les compiler depuis leur rpertoire parent (qui doit tre le mme) :
javac Projet1/Classe1.java
javac Projet1/Classe2.java

cannot instantiate from arguments because actual and formal argument lists differ in length
Cela peut survenir suite un Collections.sort(liste), alors mme que le Collections.shuffle(liste) fonctionne. Il faut
donc utiliser import java.util.Comparator; dans le trie :
import java.util.Collections;
import java.util.Comparator;
...
private List<T> list;
private Comparator<T> comparator = null;
if(this.comparator!= null) {
Collections.sort(list, comparator);
}

120 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

constructor variable in class classe cannot be applied to given types


Cette section est vide, pas assez dtaille ou incomplte.

exception IOException is never thrown in body of corresponding try statement


Un try inutile a t dtect.

impossible de trouver la classe principale


Lancer la commande "java" vers un .class (et non un .java).

incompatible types: possible lossy conversion from float to int


Problme de conversion.
Cette section est vide, pas assez dtaille ou incomplte.

java.lang.NumberFormatException
Un nombre dcimal contient un symbole qui n'est pas un chiffre (ex : ) ou bien une virgule la place d'un point.

local variable variable is accessed from within inner class; needs to be declared final
Cette section est vide, pas assez dtaille ou incomplte.

no suitable method found for - mthode


La mthode mentionne n'a pas t dclare, ou du moins pas avec ce type de paramtre (ex : remplacer .addAll() par
.add()).

no suitable constructor found for Integer(double)


Convertir plus explicitement :
MonEntier = ((Integer)MonDouble).intValue();

no suitable constructor for classe is abstract cannot be instanciated


S'il est possible de retirer le mot abstract de la dclaration de la classe, le faire.

non-static method/variable ... cannot be referenced from a static context


Cela peut se produire en invoquant une mthode ou une variable dans sa classe. Par exemple ci-dessous il fallait
ajouter ou remplacer le "this." par "c." :
MaClasse c = New MaClasse();
c.MaMethode();

not a statement

121 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Il manque srement les parenthses aprs le nom d'une mthode.

reference to assertequals is ambiguous


Il convient d'assurer un typage plus fort des paramtres de assertequals(), par exemple avec .intValue().

unclosed character literal


Problme d'encodage, remplacer les apostrophes par des guillemets.

unreachable statement
Une partie de code ne sera jamais excute, parce qu'elle est juste aprs un break ou un return.

unreported exception ...; must be caught or declared to be thrown


Une exception personnalise est lance (throw new NomDelException("Message");) sans que sa mthode soit
dclare avec throws NomDelException.

variable is already defined


Si la variable est redfinie dans une condition diffrente, il faut les sparer avec des { }, ex :
switch (args[0].toString()) {
case "1": {
a = 1;
break;
}
case "2": {
a = 2;
break;
}
}

Erreurs l'excution
Si deux variables de type String identiques ne peuvent pas tre compares
Les forcer avec .toString().

NullPointerException
Souleve si l'on applique une mthode sur un objet null. On peut donc changer l'appel ou lever l'exception :
try {
...
} catch (NullPointerException npe) {
npe.printStackTrace();
}

aucun attribut manifest principal dans ...jar


Il n'y a pas de mthode main() dans le .jar, ce fichier ne peut donc pas tre excut directement, mais uniquement
dcompress (avec le freeware 7zip ou la commande jar xvf).

java.lang.ArithmeticException: / by zero
122 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Une division par zro s'vite gnralement par un if sur le dnominateur, ou un throw d'une exception.

Class names, classe, are only accepted if annotation processing is explicitly requested
Les classes dfinies la compilation (par exemple avec javac -classpath) sont introuvables.

Stream closed
Retirer le .close() de la boucle du .read() ou du .write(), mme s'il est situ aprs. Si cela ne suffit pas, le retirer
de la mthode.

Unable to load native library: Can't load IA 32-bit .dll on a AMD 64-bit platform
Rinstaller JRE (https://www.java.com/fr/download/faq/java_win64bit.xml) [archive] en changeant de version.

Voir aussi
Recommandations d'Oracle : http://search.oracle.com/search/search?start=1&search_p_main_operator=all&
q=convention

123 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Autres langages
Cette section sera utile aux personnes qui apprennent Java mais connaissant un ou plusieurs autres langages. Les
confusions courantes sont voques et les quivalences listes.

C++
En java on utilise final et non const. Le mot const tant tout de mme rserv pour un usage ultrieur.
Java ne dfinit pas d'espace de nom (namespace), mais des paquetages (package).
On ne libre pas la mmoire. Cela est gr automatiquement par le ramasse-miette. la place, il est recommand de
librer les rfrences aux objets qui ne sont plus utiliss en assignant null la rfrence, ds que possible ou juste
avant une potentielle allocation d'une grande quantit d'objets ou de grands tableaux.
Il n'y a pas de pointeurs mais des rfrences :
Les oprateurs -> et * (drfrencement) n'existent pas. Il faut utiliser le point (.).
Les rfrences (contrairement au C++) peuvent tre modifies pour rfrencer un autre objet en utilisant
l'oprateur d'affectation (=).
un char fait un octet en C++ mais 2 octets en Java car l'encodage Unicode utilis est l'UTF-16.
unsigned n'existe pas en Java : tous les types entiers sont signs.
L'hritage multiple possible en C++ est interdit en Java, il faut utiliser des interfaces.
L'oprateur de rsolution de porte :: n'existe pas en Java :
Pour utiliser un membre d'un package ou un membre statique d'une classe, utiliser le point (.).
Pour appeler une mthode telle qu'elle est dfinie dans la classe parente, utiliser la rfrence super.
Les classes ou mthodes ne peuvent tre dclares virtual car elles le sont toutes : toutes les liaisons sont
dynamiques.
Les oprateurs ne sont pas redfinissable en Java. Les oprateurs n'agissent pas sur les objets, except pour
l'oprateur + permettant de concatner deux chanes de caractres.

PHP
L'quivalent de PDO (PHP Data Objects) est JDBC (Java DataBase Connectivity).
Import est remplac par require_once.

Voir aussi
Translinguisme/Programmation

124 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Premier programme
Premier programme
Le fichier source
Ce programme doit tre crit dans le fichier Exemple.java.
public class Exemple {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

Explications sur le langage


Ce programme est le classique Hello world. Comme son nom l'indique, ce programme va afficher la phrase "Hello
world" l'cran. Analysons-le ligne par ligne :
public class Exemple {

Cette ligne dclare une classe publique que nous appelons Exemple.
Un fichier .java ne peut contenir qu'une seule classe publique et le fichier doit porter le nom de cette classe. Ainsi, le
fichier de ce premier exemple s'appellera obligatoirement Exemple.java (en respectant la classe).
Ce systme de nommage permet au compilateur et l'interprteur de trouver les fichiers correspondant une classe.
public static void main(String[] args) {

Cette ligne dclare une mthode appele main. Cette mthode est le point d'entre du programme (la mthode appele
lorsqu'il sera excut).
Elle prend en argument un tableau de chanes de caractres (String[] args) et ne retourne rien (void).
Cette mthode est publique et statique, ce qui sera expliqu plus loin.
System.out.println("Hello world!");

Cette dernire instruction invoque la mthode println de l'objet out se trouvant dans la classe System en lui passant
en argument la chane Hello world!. L'excution de cette mthode aura pour rsultat l'affichage de Hello world!.
Cette ligne peut sembler obscure pour l'instant. Les dtails seront abords par la suite.

Compilation du fichier source


Nous allons prsenter la compilation de notre programme en utilisant le compilateur gratuit Java trs rpandu nomm
Javac, disponible gratuitement auprs d'Oracle. Cependant, il faut savoir qu'il existe aussi de nombreux
environnements de dveloppement Java permettant de taper, compiler, excuter ou dbuguer des programmes dans ce
langage.
Tapez le programme prcdent et sauvegardez le dans un fichier Exemple.java (pour la raison explique
prcdemment) et tapez dans une fentre :

125 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

Invite de commande DOS


> javac Exemple.java
> dir
Exemple.class
Exemple.java
>

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Terminal Unix
$ javac Exemple.java
$ ls
Exemple.class
Exemple.java
$

Le compilateur Javac a produit le fichier Exemple.class, contenant le code intermdiaire. Ce fichier n'est normalement
pas ditable [1] , ce qui peut garantir le copyright.

En cas de problmes...
Voici les points vrifier selon le type de problme :
Le systme indique que le compilateur est introuvable
1. Vrifiez que vous avez install un kit de dveloppement Java (le JDK) et pas simplement un environnement d'excution (JRE)
qui ne comporte pas les outils de compilation.
2. Vrifiez que le chemin du rpertoire bin contenant le compilateur javac (javac.exe sous Windows) est dans la liste de la
variable d'environnement PATH.
Le compilateur se lance mais affiche une erreur de classe non trouve
1. Si la classe ne dclare aucun paquetage (package), vrifiez que vous lancez la commande depuis le rpertoire o se trouve le
fichier source (*.java). Changez de rpertoire si ncessaire avant de recommencer.
2. Sinon, vous devez lancer la commande depuis le rpertoire parent du paquetage racine, en donnant le chemin relatif du fichier
source depuis ce rpertoire parent.
3. Dans les deux cas ci-dessus, en plus de changer de rpertoire courant, il peut tre ncessaire d'ajouter le chemin de ce
rpertoire dans le classpath. Cela peut tre fait soit dans la ligne de commande avec l'option -classpath (ou -cp), soit dans
la variable d'environnement CLASS_PATH.
Le compilateur se lance mais affiche une erreur de syntaxe
1. Vrifiez le contenu du fichier source. Pour compiler les exemples de ce livre, le mieux est de faire un copier-coller complet du
code.
2. Assurez-vous de compiler le bon fichier source et pas un autre.

Excution du programme
Java est une machine virtuelle java fournie par Oracle et disponible pour de nombreux environnements.
Pour excuter notre code intermdiaire, il faut taper :
java Exemple

L'excution du programme affiche dans une fentre console la fameuse phrase Hello world!.

En cas de problmes...
Voici les points vrifier selon le type de problme :
Le systme indique que la commande java est introuvable
1. Vrifiez que vous avez install un kit de dveloppement Java (le JDK).
2. Vrifiez que le chemin du rpertoire bin contenant l'interprteur java (java.exe sous Windows) est dans la liste de la variable
d'environnement PATH.
L'interprteur se lance mais affiche une erreur de classe non trouve
1. Vrifiez que vous avez compil le fichier source *.java (voir section prcdente) sans erreur, c'est--dire que vous avez obtenu
un fichier compil *.class.
2. Si la classe ne dclare aucun paquetage (package), vrifiez que vous lancez la commande depuis le rpertoire o se trouve le
fichier compil (*.class). Changez de rpertoire si ncessaire avant de recommencer.

126 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

3. Sinon, vous devez lancer la commande depuis le rpertoire parent du paquetage racine, en donnant le nom complet de la classe
(incluant le nom du paquetage).
4. Dans les deux cas ci-dessus, en plus de changer de rpertoire courant, il peut tre ncessaire d'ajouter le chemin de ce
rpertoire dans le classpath. Cela peut tre fait soit dans la ligne de commande avec l'option -classpath (ou -cp), soit dans
la variable d'environnement CLASS_PATH.
L'interprteur se lance mais rien ne s'affiche, ou le comportement n'est pas le mme
1. Vrifiez le contenu du fichier source. Pour compiler les exemples de ce livre, le mieux est de faire un copier-coller complet du
code.
2. Assurez-vous de lancer la bonne classe principale et pas une autre.

Voir aussi
(anglais) http://docs.oracle.com/javase/tutorial/getStarted/index.html

Rfrences
1. http://www.jmdoudoux.fr/java/dej/chap-decompil.htm
Cette page fait partie du livre Programmation

127 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Gnrer un carr magique


Ce programme permet de gnrer des carrs magiques d'ordre impair.
import java.io.*;
/*
Nom : Carre.java
Rle : Construction d'un carr magique d'ordre impair.
Compilation : javac Carre.java
Excution : java Carre.java <ordre>
avec <ordre> : entier impair > 1
Rsultat : dans un fichier texte nomm carre_ordre.txt
*/
public class Carre
{
public static void main(String args[])
throws Exception
{
int ordre, ligne, colonne;
int maxValue = (int)Math.sqrt((double)Integer.MAX_VALUE);
System.out.println("Dbut du programme.");
// test du paramtre obligatoire : > 1 et impair
if (args == null || args.length == 0)
{
System.out.println("Usage : java Carre <ordre>\n"+
"\tavec <ordre> : entier > 1 et impair.");
System.exit(1) ;
}
ordre = Integer.parseInt(args[0]);
if (ordre <= 1 || (ordre%2) == 0 || ordre > maxValue )
{
System.out.println(ordre + " n'est pas impair ou n'est pas suprieur a 1" +
" ou est trop grand : > " + maxValue) ;
System.exit(1) ;
}
System.out.println("Le paramtre " + ordre + " est correct : > 1 et impair");
// Cration du tableau
int carre[][] = new int[ordre][ordre] ;
System.out.println("Dbut du calcul");
// Rangement 1er nombre n au milieu de la premire ligne
// Puis rangement des autres nombres.
ligne = 0 ;
colonne = ordre/2 ;
for (int n=1; n<=(ordre*ordre); n++)
{
// criture dans le tableau dans la case calcule
carre[ligne][colonne] = n ;
// Dtermination de la position de la prochaine case crire
if ((n%ordre) == 0)
{
// Si dbordement gauche du tableau
// criture dans la case sous le dernier nombre
ligne++ ;
}
else
{
// criture dans la case en haut gauche
ligne = ((ligne == 0) ? ordre-1 : ligne-1);
colonne = ((colonne == 0) ? ordre-1 : colonne-1);
}
} // for (int n=1; n<=ordre*ordre; n++)
int sommeMagique = ordre * ( ordre * ordre + 1) / 2;
// Cration du fichier rsultat

128 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

String nomFic = "carre_" + ordre + ".txt";


System.out.println("Fin du calcul, criture du fichier "+ nomFic + "...");
PrintWriter hFic = new PrintWriter(new BufferedWriter(new FileWriter(nomFic)));
// Impression du tableau
hFic.println("Carre magique d'ordre " + ordre);
for (ligne=0; ligne<ordre; ligne++)
{
for (colonne=0; colonne<ordre; colonne++)
{
hFic.print(carre[ligne][colonne] + " ");
}
hFic.println("") ;
}
hFic.println("La somme magique est " + sommeMagique);
hFic.close();
System.out.println("fin criture, programme termin.");
} // public static void main(String args[])
} // public class Carre

129 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Gnrer un triangle de Sierpiski


La mthode rcursive private void drawSierpinskiTriangle ( int[] x, int[] y, int d ) accepte des
coordonnes de trois points (coins du triangle principal) plus ou moins arbitraires.
Pour Compiler (vous devez disposez du JDK Java) : javac SierpinskiTriangle.java
Pour excuter :
Avec un diteur de texte, crez le fichier SierpinskiTriangle.html dans le mme rpertoire que
SierpinskiTriangle.class cr lors de la compilation. Copiez-y le code html ci-dessous.
Ouvrez le fichier SierpinskiTriangle.html avec un navigateur comme Firefox.
Source de SierpinskiTriangle.html :
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<title> SierpinskiTriangle </title>
<body>
<applet code="SierpinskiTriangle.class" width=1024 height=1024>
Java n'est pas install !
</applet>
</body>
</html>

Source de SierpinskiTriangle.java :
/* Nom du fichier : SierpinskiTriangle.java */
import java.awt.*;
import java.applet.*;
public class SierpinskiTriangle extends Applet {
private Graphics g;
private int dMin=8;
// limite la rcursion en pixels
public void paint(Graphics g) {
this.g = g;
int d = 1024;
// base (largeur du triangle)
int x0 =
50;
// distance de gauche
int y0 =
50;
// distance du haut
int h = (int)(d*Math.sqrt(3)/2);
// hauteur
// adapt un triangle quilatral
//

//
//
//
//

spcification du triangle principal: points A, B,


int xA=x0,
yA=y0+h;
// (bas-gauche)
int xB=x0+d,
yB=y0+h;
// (bas-droite)
int xB=x0,
yB=y0;
// (haut-gauche)
int xB=x0+d,
yB=y0;
// (haut-droite)
int xC=x0+d/2, yC=y0;
// triangle quilatral
int xC=x0,
yC=y0;
// (haut-gauche)
// triangle perpendiculaire, angle droit prs
int xC=x0+d,
yC=y0;
// (haut-droite)
// triangle perpendiculaire, angle droit prs
int[] x = { xA, xB, xC };
int[] y = { yA, yB, yC };
drawSierpinskiTriangle( x, y, d/2 );

(haut-milieu)
A
B

// dmarrer la rcursion

}
private void drawSierpinskiTriangle ( int[] x, int[] y, int d ) {
if (d<dMin) g.fillPolygon ( x, y, 3 );
// fond de la rcursion
else {
// milieus des cots du triangle:
int xMc = (x[0]+x[1])/2,
yMc = (y[0]+y[1])/2;
int xMb = (x[0]+x[2])/2,
yMb = (y[0]+y[2])/2;
int xMa = (x[1]+x[2])/2,
yMa = (y[1]+y[2])/2;

130 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

int[] xNouveau1 = { x[0], xMc, xMb };


int[] yNouveau1 = { y[0], yMc, yMb };
drawSierpinskiTriangle ( xNouveau1, yNouveau1, d/2 );

// rcursion

int[] xNouveau2 = { x[1], xMc, xMa };


int[] yNouveau2 = { y[1], yMc, yMa };
drawSierpinskiTriangle ( xNouveau2, yNouveau2, d/2 );

// rcursion

int[] xNouveau3 = { x[2], xMb, xMa };


int[] yNouveau3 = { y[2], yMb, yMa };
drawSierpinskiTriangle ( xNouveau3, yNouveau3, d/2 );

// rcursion

}
}
}

131 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

XML
Il existe dans Java deux packages permettant de manipuler les fichiers XML : la manire SAX (Simple API for XML,
navigation via un curseur) et DOM (Document Object Model, navigation via un arbre).
Soit le fichier XML suivant :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Documentation>
<Site Wiki="Wikibooks">
<Livre Wikilivre="Java">
<Page1>Introduction</Page1>
<Page2>Bases du langage</Page2>
<Exemple>XML</Exemple>
</Livre>
</Site>
</Documentation>

Remarque : les espaces sont interdits dans les noms des balises.

La mthode DOM
Le programme suivant gnre ce fichier XML dans le mme rpertoire :
import
import
import
import
import
import

java.io.File;
javax.xml.parsers.*;
javax.xml.transform.*;
javax.xml.transform.dom.DOMSource;
javax.xml.transform.stream.StreamResult;
org.w3c.dom.*;

public class XML_Creation_DOM {


public static void main(String argv[]) {
try {
DocumentBuilderFactory XML_Fabrique_Constructeur = DocumentBuilderFactory.newInstance();
DocumentBuilder XML_Constructeur = XML_Fabrique_Constructeur.newDocumentBuilder();
Document XML_Document = XML_Constructeur.newDocument();
Element documentation = XML_Document.createElement("Documentation");
XML_Document.appendChild(documentation);
Element site = XML_Document.createElement("Site");
documentation.appendChild(site);
Attr attribut1 = XML_Document.createAttribute("Wiki");
attribut1.setValue("Wikibooks");
site.setAttributeNode(attribut1);
Element livre = XML_Document.createElement("Livre");
site.appendChild(livre);
Attr attribut2 = XML_Document.createAttribute("Wikilivre");
attribut2.setValue("Java");
livre.setAttributeNode(attribut2);
Element page1 = XML_Document.createElement("Page1");
page1.appendChild(XML_Document.createTextNode("Introduction"));
livre.appendChild(page1);
Element page2 = XML_Document.createElement("Page2");
page2.appendChild(XML_Document.createTextNode("Bases du langage"));
livre.appendChild(page2);
Element example = XML_Document.createElement("Exemple");

132 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

example.appendChild(XML_Document.createTextNode("XML"));
livre.appendChild(example);
TransformerFactory XML_Fabrique_Transformeur = TransformerFactory.newInstance();
Transformer XML_Transformeur = XML_Fabrique_Transformeur.newTransformer();
DOMSource source = new DOMSource(XML_Document);
StreamResult resultat = new StreamResult(new File("XML_rsultat.xml"));
XML_Transformeur.transform(source, resultat);
System.out.println("Le fichier XML a t gnr !");
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
}
}

La mthode SAX
Pour lire le fichier ci-dessus, il faut le parser avec un handler dont on redfinit les mthodes :
import
import
import
import
import

java.io.*;
javax.xml.parsers.*;
org.xml.sax.*;
org.xml.sax.helpers.*;
org.xml.sax.helpers.DefaultHandler;

public class XML_Creation_SAX {


public static void main(String[] args) throws Exception {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("XML_rsultat.xml", new DefaultHandler() {
public void startDocument() throws SAXException { System.out.println("startDocument"); }
public void endDocument() throws SAXException { System.out.println("endDocument"); }
public void startElement(String uri, String localName, String qName, Attributes attributes)
public void endElement(String uri, String localName, String qName) throws SAXException { System
});
} catch (Exception e) { System.err.println(e); System.exit(1); }
}
}

La mthode JDOM
JDOM utilise les deux bibliothques prcdentes. Si l'erreur suivante survient : error: package org.jdom does not
exist, il suffit de tlcharger la bibliothque (https://jdom.org/downloads/index.html) [archive]. Pour utilise la version 2,
remplacer les import org.jdom par des import org.jdom2.
Cette section est vide, pas assez dtaille ou incomplte.

Voir aussi
Gestion de fichiers sur Wikiversit

133 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

swing/Hello
Interfaces graphiques avec swing
Un premier exemple
Le premier programme de tout informaticien.
Le fichier Hello.java
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Hello extends JFrame {
// Constructeur
public Hello() {
super("Titre de la JFrame");
// Si on appuie sur la croix, le programme s'arrete
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// On rcupre le conteneur de la JFrame (this est
// une JFrame car Hello hrite de JFrame)
Container contentPane = this.getContentPane();
// Choix du gestionnaire de disposition
BorderLayout layout = new BorderLayout();
contentPane.setLayout(layout);
JPanel panel = new JPanel();
JLabel label = new JLabel(
"Bonjour, ceci est une JFrame qui contient"+
" un JPanel qui contient un JLabel");
panel.add(label);
// Ici ne sert pas car le panel est seul
contentPane.add(panel, BorderLayout.CENTER);
this.pack();
this.setVisible(true);
}
// Mthode principale : dmarrage du programme
public static void main(String[] args) {
new Hello();
}
}

134 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

swing/Boutons sur image


import
import
import
import
import
import
import

java.awt.*;
java.awt.event.*;
java.awt.image.BufferedImage;
javax.imageio.ImageIO;
javax.swing.*;
java.io.*;
java.net.*;

public class FormulaireImage {

public static void main(String[] args) {


JFrame f = new JFrame("Formulaire");
JLayeredPane l = new JLayeredPane();
l.setPreferredSize(new Dimension(150,150));
JPanel pi = new JPanel() {
public void paint(Graphics g) {
try {
URL ImageWB = new URL("http://upload.wikimedia.org/wikipedia/commons/6/64/Wikibook
BufferedImage image1 = ImageIO.read(ImageWB);
g.drawImage(image1, 0, 0, null);
} catch (IOException e) {
e.printStackTrace();
}
}
};
pi.setBounds(10,10,150,150);
// Fentre 150*150 place aux coordonnes 10,10
l.add(pi,new Integer(0));
// Dpose sur la couche zro
JPanel pb = new JPanel();
JButton b1 = new JButton("Bouton 1");
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("Clic bouton 1");
}
});
pb.add(b1);
JButton b2 = new JButton("Bouton 2");
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("Clic bouton 2");
}
});
pb.add(b2);
pb.setBounds(30,30,100,60);
l.add(pb,new Integer(1));
f.add(l);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true); // Ou show(); deprecated
}
}

135 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

swing/Somme
Interfaces graphiques avec swing
Calculer le somme de 2 entiers
Le fichier Somme.java
import
import
import
import

javax.swing.*;
java.awt.*;
java.awt.event.*;
javax.swing.border.*;

public class Somme extends JFrame implements ActionListener


{
private JLabel textX,textY,textS;
private JTextField editX,editY,editS;
private JButton buCompute;
double x,y,s;
public static void main(String [] args)
{
Somme a=new Somme();
}
Somme()
{
x=0;
y=0;
setBounds(10,20,400,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c;
c=getContentPane();
BorderLayout bl=new BorderLayout();
c.setLayout(bl);

JPanel p=new JPanel();


p.setLayout(null);
textX= new JLabel("Valeur de X : ");
textX.setBounds(10,20,100,20);
p.add(textX);
textY= new JLabel("Valeur de Y : ");
textY.setBounds(10,50,100,20);
p.add(textY);
textS= new JLabel("X+Y vaut : ");
textS.setBounds(10,80,100,20);
p.add(textS);
editX=new JTextField(20);
editX.setBounds(120,20,100,20);
p.add(editX);
editY=new JTextField(20);
editY.setBounds(120,50,100,20);
p.add(editY);
editS=new JTextField(20);
editS.setBounds(120,80,100,20);
editS.setEditable(false);
p.add(editS);

136 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Border bord=BorderFactory.createRaisedBevelBorder();
buCompute=new JButton("CALCULER");
buCompute.setActionCommand("CALCULER");
buCompute.addActionListener(this);
buCompute.setBorder(bord);
buCompute.setBounds(240,50,100,20);
p.add(buCompute);
c.add(p, BorderLayout.CENTER);
setVisible(true);
}

public void actionPerformed(ActionEvent e)


{
if(e.getActionCommand().equals("CALCULER"))
{
double vx,vy,d1;
try{
vx=Double.parseDouble(editX.getText());
}catch(RuntimeException ex)
{vx=x;editX.setText(String.valueOf(x));}
try{
vy=Double.parseDouble(editY.getText());
}catch(RuntimeException ex)
{vy=y;editY.setText(String.valueOf(y));}
x=vx;
y=vy;
s=x+y;
editS.setText(String.valueOf(s));
}
}
}

137 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

swing/Distance
Interfaces graphiques avec swing
Calculer la distance entre 2 points
Le fichier Distance.java
import
import
import
import

javax.swing.*;
java.awt.*;
java.awt.event.*;
javax.swing.border.*;

public class Distance extends JFrame implements ActionListener


{
private
private
private
private

JLabel textXA,textYA,textXB,textYB,textDistance;
JTextField editXA,editXB,editYA,editYB,editDistance;
JButton editA,editB;
Point A,B;

public static void main(String [] args)


{
Distance app=new Distance();
}
Distance()
{
setBounds(10,10,400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c;
c=getContentPane();
BorderLayout bl=new BorderLayout();
c.setLayout(bl);

JPanel p=new JPanel();


p.setLayout(null);
textXA= new JLabel("Abscisse de A : ");
textXA.setBounds(10,20,100,20);
p.add(textXA);
textYA= new JLabel("Ordonne de A : ");
textYA.setBounds(10,50,100,20);
p.add(textYA);
textXB= new JLabel("Abscisse de B : ");
textXB.setBounds(10,90,100,20);
p.add(textXB);
textYB= new JLabel("Ordonne de B : ");
textYB.setBounds(10,120,100,20);
p.add(textYB);
textDistance= new JLabel("La distance AB vaut : ");
textDistance.setBounds(10,170,150,20);
p.add(textDistance);
editXA=new JTextField(20);
editXA.setBounds(120,20,100,20);
editXA.setEditable(false);
p.add(editXA);
editYA=new JTextField(20);

138 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

editYA.setBounds(120,50,100,20);
editYA.setEditable(false);
p.add(editYA);

editXB=new JTextField(20);
editXB.setBounds(120,90,100,20);
editXB.setEditable(false);
p.add(editXB);
editYB=new JTextField(10);
editYB.setBounds(120,120,100,20);
editYB.setEditable(false);
p.add(editYB);
editDistance=new JTextField(20);
editDistance.setBounds(150,170,150,20);
editDistance.setEditable(false);
p.add(editDistance);
Border bord=BorderFactory.createRaisedBevelBorder();
editA=new JButton("MODIFIER A");
editA.setActionCommand("EDITA");
editA.addActionListener(this);
editA.setBorder(bord);
editA.setBounds(240,35,100,20);
p.add(editA);
editB=new JButton("MODIFIER B");
editB.setActionCommand("EDITB");
editB.addActionListener(this);
editB.setBorder(bord);
editB.setBounds(240,105,100,20);
p.add(editB);

c.add(p, BorderLayout.CENTER);
setVisible(true);
A=new Point();
B=new Point();
ShowPoint();
}

void ShowPoint()
{
editXA.setText(String.valueOf(A.getX()));
editYA.setText(String.valueOf(A.getY()));
editXB.setText(String.valueOf(B.getX()));
editYB.setText(String.valueOf(B.getY()));
editDistance.setText(String.valueOf(A.distance(B)));
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("EDITA"))
{
PointDialog dialog=new PointDialog(this,"Modification du point A",A);
dialog.setVisible(true);
ShowPoint();
}
else
if(e.getActionCommand().equals("EDITB"))
{
PointDialog dialog=new PointDialog(this,"Modification du point B",B);
dialog.setVisible(true);
ShowPoint();
}
}

139 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Le fichier Point.java
public class Point {
private double x,y;
Point()
{
x=0;
y=0;
}
public double getX(){return x;}
double getY(){return y;}
void setXY(double x,double y)
{
this.x=x;
this.y=y;
}
double distance(Point P)
{
double dx,dy;
dx=x-P.x;
dy=y-P.y;
return java.lang.Math.sqrt(dx*dx+dy*dy);
}
}

Le fichier PointDialog.java
import
import
import
import

javax.swing.*;
javax.swing.border.Border;
java.awt.event.*;
java.awt.*;

public class PointDialog extends JDialog implements ActionListener


{
private Point P;
JButton OK,Cancel;
JLabel textX,textY;
JTextField editX,editY;
PointDialog(JFrame f,String s,Point P)
{
super(f,s,true);
this.P=P;
setLocationRelativeTo(f);
setBounds(500,100,400,200);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
textX=new JLabel("Abscisse du point :");
textX.setBounds(10,20,120,20);
c.add(textX);
textY=new JLabel("Ordonne du point :");
textY.setBounds(10,50,120,20);
c.add(textY);
editX=new JTextField(20);
editX.setBounds(140,20,100,20);
c.add(editX);

140 sur 142

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

editY=new JTextField(20);
editY.setBounds(140,50,100,20);
c.add(editY);
Border bord=BorderFactory.createRaisedBevelBorder();
OK=new JButton("OK");
OK.setActionCommand("OK");
OK.addActionListener(this);
OK.setBorder(bord);
OK.setBounds(260,25,60,20);
c.add(OK);
Cancel=new JButton("Annuler");
Cancel.setActionCommand("CANCEL");
Cancel.addActionListener(this);
Cancel.setBorder(bord);
Cancel.setBounds(260,50,60,20);
c.add(Cancel);
ShowPoint();
}
private void ShowPoint()
{
editX.setText(String.valueOf(P.getX()));
editY.setText(String.valueOf(P.getY()));
}

public void actionPerformed(ActionEvent e)


{
double x,y;
if(e.getActionCommand().equals("OK"))
{
boolean ok=true;
if(ok) {
try{
x=Double.parseDouble(editX.getText());
}catch(RuntimeException ex)
{x=P.getX();editX.setText(String.valueOf(x));ok=false;}
try{
y=Double.parseDouble(editY.getText());
}catch(RuntimeException ex)
{y=P.getY();editY.setText(String.valueOf(y));ok=false;}
if(ok)
{
P.setXY(x,y);
dispose();
}
}
}
else if(e.getActionCommand().equals("CANCEL"))
{
dispose();
}
}
}

GFDL

141 sur 142

Vous avez la permission de copier, distribuer et/ou modifier ce document


selon les termes de la licence de documentation libre GNU, version 1.2
ou plus rcente publie par la Free Software Foundation ; sans sections
inaltrables, sans texte de premire page de couverture et sans texte de
dernire page de couverture.

24/01/2016 01:22

Programmation Java/Version imprimable Wikilivres

https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...

Rcupre de https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Version_imprimable&oldid=483810
Dernire modification de cette page le 14 juillet 2015, 01:33.
Les textes sont disponibles sous licence Creative Commons attribution partage lidentique ; dautres termes peuvent
sappliquer.
Voyez les termes dutilisation pour plus de dtails.
Dveloppeurs

142 sur 142

24/01/2016 01:22

Vous aimerez peut-être aussi