Programmation Java FR
Programmation Java FR
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Un livre de Wikilivres.
1 sur 142
24/01/2016 01:22
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
6 sur 142
24/01/2016 01:22
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.
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
9 sur 142
24/01/2016 01:22
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!");
}
}
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.
10 sur 142
24/01/2016 01:22
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
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
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
byte
1 octet
8 bits
short
2 octets
16 bits
int
4 octets
[+|-]chiffres...
32 bits
8 octets
[+|-]chiffres...L
64 bits
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
-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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
\"
Guillemet (pour qu'il soit inclus au lieu de marquer la fin de la chane de caractres),
\'
Caractre 8 bits dont le code OOO est spcifi en octal (jusqu' 3 chiffres),
\xXX
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.
Byte
14 sur 142
24/01/2016 01:22
Boolean
15 sur 142
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
pour boolean
24/01/2016 01:22
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
Oprateur
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Description
Type
()
Appel de mthode
classes et objets
[]
tableaux
classes et objets
.
++
--
double
byte char short int long float
double
byte char short int long float
Positif
Ngation
Non logique
boolean
Non binaire
Conversion de type
tous
Multiplication
Division
Addition
de gauche
droite
(type)
Associativit
double
de droite
gauche
de gauche
droite
<<
>>
>>>
<
<=
>
Infrieur
Infrieur ou gal
Suprieur
>=
Suprieur ou gal
==
Egal
!=
17 sur 142
Soustraction
Diffrent
de gauche
droite
de gauche
droite
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
de gauche
droite
OU exclusif binaire
de gauche
droite
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
OU binaire
de gauche
droite
&&
ET logique
boolean
de gauche
droite
||
OU logique
boolean
de gauche
droite
?:
boolean ?
Affectation
tous
tous : tous
de droite
gauche
Addition et affectation
+=
double
String (concatnation)
-=
Soustraction et affectation
*=
Multiplication et affectation
/=
Division et affectation
Modulo et affectation
%=
<<=
>>=
&=
ET binaire et affectation
^=
|=
OU binaire et affectation
Enchanement d'expressions
tous
>>>=
de droite
gauche
de gauche
droite
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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 !
{ /*...*/ }
19 sur 142
24/01/2016 01:22
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
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
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
22 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
23 sur 142
24/01/2016 01:22
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
ou
int [ ] monTableau = new int[10];
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};
24 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
// ->
// 11
2 3 5 7 11 23 17
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;
}
25 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
};
//
//
//
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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]);
*/
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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;
}
Dans un commentaire de
...
Description
@author auteur
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
@param description de
constructeur et mthode
l'id
@return description
mthode
@exception
description du type
constructeur et mthode
Documentation
29 sur 142
24/01/2016 01:22
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.
30 sur 142
24/01/2016 01:22
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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();
}
}
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.
33 sur 142
24/01/2016 01:22
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
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
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 }
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
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");
}
}
37 sur 142
24/01/2016 01:22
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
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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
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).
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
Modificateur du membre
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
private
Oui
Oui
Oui
Oui
Oui
Oui
Oui
Non
Non
Oui
Oui
Non
Non
Non
Oui
44 sur 142
24/01/2016 01:22
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
}
}
Polymorphisme d'hritage
45 sur 142
24/01/2016 01:22
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
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
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();
}
48 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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.
}
Discussion
Si, par exemple, nous avions une classe Personne possdant une mthode conduire(Vehicule v), on peut alors crire :
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
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.
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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;
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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"
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();
53 sur 142
24/01/2016 01:22
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
54 sur 142
24/01/2016 01:22
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
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);
}
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]);
}
}
56 sur 142
24/01/2016 01:22
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
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
<N>
Number ;
<T>
Type ;
etc.
second, troisime, ime type.
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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();
Le tas
Objets dans la pile
Constantes et membres static
Attributs
62 sur 142
24/01/2016 01:22
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.
63 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
}
// -> "Le livre/Chapitre 1"
}
}
64 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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)
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
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)
65 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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)
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
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.
67 sur 142
24/01/2016 01:22
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Mthodes utiles
Les numrations possdent des mthodes communes.
ordinal()
name()
valueOf(String s)
values()
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).
24/01/2016 01:22
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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.
72 sur 142
24/01/2016 01:22
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();
}
Cette mthode ne lancera jamais d'exception de type FileNotFoundException car cette sous-classe de IOException
est dj capture.
73 sur 142
24/01/2016 01:22
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
}
...
Error
74 sur 142
24/01/2016 01:22
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" );
}
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
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
package org.wikibooks.exemple;
class Toto ...
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.
77 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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),
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
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
FileReader
80 sur 142
24/01/2016 01:22
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
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).
Type
Rle
Object
get(int index)
int
indexOf(Object o)
int
lastIndexOf(Object o)
Object
remove(int index)
Object
int
size()
List
subList(int fromIndex,int
toIndex)
82 sur 142
24/01/2016 01:22
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)
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)
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
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 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
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.
Vider la collection.
boolean containsKey(Object key)
85 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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.
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.
86 sur 142
24/01/2016 01:22
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);
}
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)
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)
Vider la collection.
boolean isEmpty()
Retourne un itrateur permettant de faire une boucle sur tous les objets contenus dans la collection.
int size()
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Tableau rcapitulatif
Implmentations
Interface
Liste (List)
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
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
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
@Override
java.lang.Override
@SuppressWarnings
java.lang.SuppressWarnings
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();
}
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
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.
Exemple :
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationPourExecution
{
// lments d'information disponibles l'excution
}
92 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
{
// Type = class/interface/enum
}
UneClasseConnue.class
93 sur 142
24/01/2016 01:22
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
bytes.
java.io.OutputStream
La classe java.io.OutputStream possde des mthodes crivant une srie d'octets (byte).
OutputStream.write(): crit
un byte
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
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, ...).
Images
import javax.imageio.ImageIO;
ImageIO.read(imgage);
ImageIO.write(imgage, "jpg", new File(filename));
95 sur 142
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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.
98 sur 142
24/01/2016 01:22
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 ...
}
}
est quivalent :
public class MyClass {
public static void codeProtege() {
synchronized(MyClass.class) {
... code protg ...
}
}
}
99 sur 142
24/01/2016 01:22
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.
...
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,
24/01/2016 01:22
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.
24/01/2016 01:22
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.
24/01/2016 01:22
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
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 le nom.
int getModifiers()
Cette mthode quivaut appeler la seconde mthode avec pour paramtres : (name, true,
this.getClass().getClassLoader()).
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
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)
24/01/2016 01:22
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.
// 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;
}
}
Pour les versions de Java antrieures 5.0 o l'auto-boxing n'existe pas, et o il faut explicitement utiliser des
tableaux :
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Regex
Syntaxe
Expressions rationnelles courantes
Caractre
Type
Explication
Point
[...]
[^...]
circonflexe
dollar
barre verticale
(...)
parenthse
astrisque
0, 1 ou plusieurs occurrences
le plus
1 ou plusieurs occurrence
interrogation
0 ou 1 occurrence
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;
24/01/2016 01:22
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
24/01/2016 01:22
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.
24/01/2016 01:22
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
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.
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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...
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.
24/01/2016 01:22
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
24/01/2016 01:22
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
24/01/2016 01:22
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.
Description
http.proxyHost
http.proxyPort
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
http.proxyPassword
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
-Xmx
-Xmn
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Mot
rserv
Type
abstract
Mot-cl
assert
Mot-cl
Assertion
boolean
Type de
donnes
break
Mot-cl
byte
Type de
donnes
case
Mot-cl
catch
Mot-cl
char
Type de
donnes
class
Mot-cl
const
Rserv [1]
Inutilis actuellement.
continue
Mot-cl
default
Mot-cl
do
Mot-cl
Boucle itrative.
double
Type de
donnes
else
Mot-cl
Excution conditionnelle.
enum
Mot-cl
extends
Mot-cl
false
Valeur
littrale
final
Mot-cl
finally
Mot-cl
float
Type de
donnes
for
Mot-cl
Boucle itrative.
goto
Rserv [1]
Inutilis actuellement.
if
Mot-cl
Excution conditionnelle.
implements
Mot-cl
import
Mot-cl
instanceof
Mot-cl
int
Type de
donnes
interface
Mot-cl
long
Type de
donnes
Entier sign de -9 223 372 036 854 775 808 +9 223 372 036 854 775 807.
native
Mot-cl
new
Mot-cl
Description
24/01/2016 01:22
Mot
rserv
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
Type
Description
null
Valeur
littrale
Rfrence nulle.
package
Mot-cl
private
Mot-cl
protected
Mot-cl
public
Mot-cl
return
Mot-cl
short
Type de
donnes
static
Mot-cl
strictfp
Mot-cl
super
Mot-cl
switch
Mot-cl
synchronized
Mot-cl
this
Mot-cl
throw
Mot-cl
throws
Mot-cl
transient
Mot-cl
true
Valeur
littrale
try
Mot-cl
void
Mot-cl
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
24/01/2016 01:22
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.
24/01/2016 01:22
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.
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 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);
}
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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.
not a statement
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
unreachable statement
Une partie de code ne sera jamais excute, parce qu'elle est juste aprs un break ou un return.
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();
}
java.lang.ArithmeticException: / by zero
122 sur 142
24/01/2016 01:22
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
24/01/2016 01:22
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
24/01/2016 01:22
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!");
}
}
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.
24/01/2016 01:22
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.
24/01/2016 01:22
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
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
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
//
//
//
//
//
(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;
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
// rcursion
// rcursion
// rcursion
}
}
}
24/01/2016 01:22
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.*;
24/01/2016 01:22
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;
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
24/01/2016 01:22
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();
}
}
24/01/2016 01:22
https://fr.wikibooks.org/w/index.php?title=Programmation_Java/Versio...
java.awt.*;
java.awt.event.*;
java.awt.image.BufferedImage;
javax.imageio.ImageIO;
javax.swing.*;
java.io.*;
java.net.*;
24/01/2016 01:22
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.*;
24/01/2016 01:22
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);
}
24/01/2016 01:22
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.*;
JLabel textXA,textYA,textXB,textYB,textDistance;
JTextField editXA,editXB,editYA,editYB,editDistance;
JButton editA,editB;
Point A,B;
24/01/2016 01:22
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();
}
}
24/01/2016 01:22
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.*;
24/01/2016 01:22
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()));
}
GFDL
24/01/2016 01:22
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
24/01/2016 01:22