Académique Documents
Professionnel Documents
Culture Documents
S&SM S&SM
mkdir~/javaexemples
cp/cdrom/source/source.tar
Configuration du JDK
Aprs linstallation du JDK au moyen des programmes de mise en place gurant dans le
CD-ROM, il devrait normalement tre congur convenablement. Cependant, la plupart des
problmes rencontrs avec Java tant dus des erreurs de conguration, il est souhaitable de
vrier quelle est correcte. Si vous avez install le JDK depuis une autre source que le CD-ROM,
vous avez sans doute intrt lire attentivement cette section.
Le JDK exige deux modications importantes de votre
autoexec.bat
pour tourner correctement :
le rpertoire
JDK1.1\bin
doit se trouver sur le chemin dexcution, et la variable
CLASSPATH
doit
avoir t initialise.
Modiez votre
autoexec.bat
au moyen de votre diteur de texte habituel (le Bloc-notes con-
vient parfaitement). Recherchez une ligne du genre :
PATH C:\WINDOWS;C:WINDOWS\COMMAND;C:\DOS; ...
Quelque part sur cette ligne vous devez voir une entre pour le JDK ; si vous installez le JDK
depuis le CD-ROM, la ligne devrait avoir laspect suivant (les points indiquent quil peut y avoir
dautres lments sur la ligne en question) :
PATH C:\WINDOWS; ... C:\JDK1.1\BIN; ...
Si vous ne trouvez pas de rfrence
JDK\BIN
ou
JAVA\BIN
dans votre PATH, ajoutez-la. Ajoutez
la n de cette ligne le nom complet du chemin conduisant votre installation JDK, commen-
ant par C et nissant par BIN; par exemple, C:\JAVA\BIN ou C:\JDK1.1\BIN.
part 01 Page 23 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 24
1
La seconde addition indispensable au chier autoexec.bat concerne la variable CLASSPATH, si
elle ny gure pas dj. Cherchez une ligne du genre :
SET CLASSPATH=C\TEACHY~1\JDK1.1.\lib\classes.zip;.;
La variable CLASSPATH peut contenir dautres indications pour Netscape ou Internet Explorer,
mais ce qui vous intresse le plus, cest une rfrence au chier classes.zip du JDK, et au
rpertoire courant (.). Si votre chier autoexec.bat ninclut aucun de ces deux emplacements,
ajoutez au chier une ligne contenant ces deux indications (la ligne ci-avant fera laffaire).
Aprs avoir sauvegard votre chier autoexec.bat, vous devez redmarrer Windows pour ren-
dre effectives les modications.
Le JDK pour Macintosh ne devrait pas avoir besoin dtre congur la suite de linstallation.
Pour congurer le JDK dans le cas de Solaris, il suft dajouter le rpertoire java/bin ou jdk/
bin votre chemin dexcution.
En gnral, linsertion dune ligne telle que la suivante dans vos chiers .cshrc, .login ou
.profile permet dobtenir le rsultat cherch :
set path= (~/java/bin/ $path)
Cette ligne correspond au cas o le JDK (en tant que dossier java) est install dans votre rper-
toire personnel ; si vous lavez install ailleurs, vous devez substituer le nom de chemin corres-
pondant.
Assurez-vous que vous utilisez la commande source avec le nom du chier adquat, pour que
le changement prenne effet (sinon, faites un log out suivi dun log in).
source ~/.login
Cration dune application Java
Commenons par une application Java simple : le programme classique Hello World par lequel
dbutent tous les livres de programmation.
Les applications Java sont diffrentes des applets. Les applets sont des programmes Java tl-
chargs par lintermdiaire du World Wide Web, et excuts sur la machine de lutilisateur par
un navigateur Web compatible Java.
Les applications Java, en revanche, sont des programmes plus gnraux crits dans le langage
Java. Elles nont pas besoin dun navigateur pour tourner ; Java peut tre utilis pour crer tou-
tes sortes dapplications, qui pourraient avoir t cres avec un langage de programmation
classique.
Un programme Java peut tre une applet ou une application, ou les deux, selon la manire dont
le programme est crit et selon ses fonctions. Au cours de cette premire partie, pour apprendre
le langage Java, vous crirez surtout des applications ; puis, dans la seconde partie de louvrage,
vous utiliserez ce que vous avez appris pour crire des applets. Il est prfrable de commencer
part 01 Page 24 lundi 1 dcembre 1997 10:05
25
L E P R O G R A M M E U R
par ce stade lmentaire, car tout ce que vous apprendrez en crant de simples applications Java
vous servira pour crer des applets.
Cration du fichier source
Dans tous les langages de programmation, les chiers source sont crs laide dun diteur de
texte. Java nchappe pas cette rgle ; les chiers sont sauvegards en mode ASCII simple,
sans caractre de contrle. Les diteurs exploitables sous UNIX sont emacs, ped, ou vi. Sous
Windows, on peut choisir le Bloc-notes ou lEditeur DOS (nous vous conseillons dutiliser le
Bloc-notes en shareware). Sur Mac, vous pouvez utiliser SimpleText (fourni avec le Mac) ou le
shareware Bbedit. Si vous utilisez un environnement de dveloppement comme Caf, vous uti-
liserez lditeur de texte qui lui est associ.
Si vous faites votre dveloppement Java sous Windows, assurez-vous que Windows comprend
lextension de chier .java avant de vous lancer ; autrement, votre diteur de texte attachera
systmatiquement une extension .txt tous vos chiers. La mthode la plus simple pour obtenir
le rsultat voulu est de taper le nom de chier entre guillemets ("HelloWorld.java"). Cepen-
dant, il vaut mieux aller une fentre de lExplorateur Windows, slectionner Afchage |
Options | Types de chiers, choisir Nouveau type, et inscrire respectivement fichier source
Java et .java dans les zones de texte Description du type et Extension associe.
Aprs avoir slectionn lditeur, saisissez le programme Java prsent dans le Listing 1.1.
Noubliez ni parenthse, ni virgule ou guillemet, et utilisez la mme casse (majuscules et
minuscules) que sur le listing.
Le code de ces exemples gure galement sur le CD-ROM. Toutefois, si vous tapez vous-mme
ces premiers exemples, qui sont trs courts, vous aurez une ide plus prcise de ce quest le code
Java.
Listing 1.1 Premire application Java
1: class HelloWorld {
2: public static void main (String args[]) {
3: System.out.println("Hello World!");
4: }
5: }
Aprs avoir saisi le programme, sauvegardez le chier sur votre disque sous le nom Hello-
World.java. Ce nom est trs important. Les fichiers source Java doivent avoir le mme nom que
la classe quils dnissent (y compris les mmes lettres majuscules ou minuscules), et ils doi-
vent avoir lextension .java. Ici, la dnition de classe a le nom HelloWorld, de sorte que le
nom du chier doit tre HelloWorld.java. Si vous donnez un autre nom au chier (mme quel-
que chose comme helloworld.java ou Helloworld.java), vous ne pourrez pas le compiler.
Assurez-vous que le nom est bien HelloWorld.java.
Info
Info
part 01 Page 25 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 26
1
Les numros placs en dbut de ligne ne font pas partie du programme. Ils rfrencent les lignes
et sont repris dans le texte lors de lanalyse dun programme. Ils ne doivent donc pas tre saisis.
Aprs avoir saisi le programme, sauvegardez le chier sur votre disque sous le nom Hello-
World.java. Ce nom est trs important. Les fichiers source Java doivent avoir le mme nom que
la classe quils dnissent (y compris les mmes lettres majuscules ou minuscules), et ils doi-
vent avoir lextension .java. Ici, la dnition de classe a le nom HelloWorld, de sorte que le
nom du chier doit tre HelloWorld.java. Si vous donnez un autre nom au chier (mme quel-
que chose comme helloworld.java ou Helloworld.java), vous ne pourrez pas le compiler.
Assurez-vous que le nom est bien HelloWorld.java.
Vous pouvez sauvegarder vos chiers Java nimporte o sur le disque, mais il vaut mieux les
conserver tous dans un mme dossier. Les chiers dexemples de ce chapitre ont t placs dans
un dossier appel TYJtests (abrviation de Teach Yourself Java tests).
Compilation et excution du fichier source
Vous tes maintenant prts compiler le chier. Si vous utilisez le JDK, conformez-vous aux
instructions des pages suivantes. Si vous utilisez un environnement de dveloppement graphi-
que, vous disposerez probablement dun bouton ou dune option pour lancer la compilation
(vriez-le dans la documentation fournie avec le programme).
Le compilateur associ au JDK est pilot par des lignes de commande. Pour utiliser ce compi-
lateur, vous devez dabord dmarrer un shell DOS. Sous Windows 95, ce shell DOS fait partie
du menu Programmes (il sappelle Commandes MS-DOS).
Une fois dans le DOS, changez les rpertoires pour aller lendroit o vous avez sauvegard
votre chier HelloWorld.java. Comme nous avons plac le ntre dans le dossier TYJtests, nous
utilisons la commande :
CD C:\TYJtests
Aprs avoir commut sur le rpertoire convenable, utilisez la commande javac comme suit, en
reprenant le nom du chier que vous avez sauvegard sous Windows (javac veut dire "Java
compiler"). Ici encore, le respect de la casse est requis :
javac HelloWorld.java
Nous avons insist sur la ncessit dutiliser le nom de chier original, parce quune fois
lintrieur du shell DOS, vous vous apercevrez que les noms de chiers longs ont t tronqus
en noms 8.3 positions conformes lancien style, et quen fait, HelloWorld.java apparat
sous la forme HELLO~1.jav. Ne vous en inquitez pas ; ceci est d simplement la manire dont
Windows 95 gre les noms de chiers longs. Ignorez le fait que le chier semble sappeler
HELLO~1.jav et tenez-vous en au nom de fichier utilis lors de la sauvegarde.
La Figure 1.4 montre ce que nous avons fait lintrieur du shell DOS, pour vous permettre de
vrier que vous tes sur la bonne voie.
Attention
Info
part 01 Page 26 lundi 1 dcembre 1997 10:05
27
L E P R O G R A M M E U R
Si tout se passe bien, vous obtenez un chier appel HelloWorld.class (du moins, cest son
appellation si vous lexaminez lextrieur du shell DOS ; lintrieur du DOS, il sappelle
HELLO~1.cla). Cest votre fichier de pseudo-code Java. Si vous obtenez des messages derreur,
revenez votre chier source dorigine et assurez-vous que vous lavez tap exactement de la
manire prsente sur le Listing 1.1, avec les majuscules et minuscules gurant sur le modle.
Le chier doit avoir exactement la mme casse que le nom de la classe (lun et lautre scrivent
HelloWorld).
Lorsque vous disposez dun chier de classe, vous pouvez vous en servir au moyen de linter-
prteur de pseudo-code Java. Linterprteur Java sappelle simplement java, et est lanc depuis
le shell DOS de la mme manire que javac. Faites marcher votre programme Hello World
comme suit partir des lignes de commandes, en respectant bien la casse indique (et remar-
quez que largument du programme java na pas dextension .class) :
Java HelloWorld
Si votre programme a t tap et compil correctement, vous obtenez en retour sur votre cran
la phrase Hello World!. La Figure 1.5 montre ce que nous avons fait.
Notez bien que le compilateur Java et linterprteur Java sont deux choses diffrentes. Vous uti-
lisez le compilateur Java (javac) pour crer des chiers .class partir de vos chiers source
Java, et vous utilisez linterprteur Java (java) pour excuter effectivement vos chiers .class.
Le JDK pour le Mac est fourni avec une application appele Compilateur Java. Pour compiler
votre chier source Java, faites simplement un glisser-dposer du chier sur licne du compi-
lateur Java. Le programme compile votre chier Java et, sil ny a pas derreur, cre un chier
appel HelloWorld.class dans le mme dossier que votre chier source.
Figure 1.4
Compilation Java
dans le shell DOS.
Attention
part 01 Page 27 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 28
1
En plaant un alias du compilateur Java sur le bureau, vous pouvez plus facilement glisser et
dposer des chiers source Java.
En cas derreur, vriez la frappe de votre chier source dorigine, qui doit tre exactement
conforme au Listing 1.1, notamment en ce qui concerne la casse. Assurez-vous aussi que la
casse du nom du chier est bien la mme que celle de la classe (cest--dire HelloWorld dans
lun et lautre cas).
Aprs avoir russi gnrer un chier HelloWorld.class, faites simplement un double-clic sur
ce chier pour lexcuter. Lapplication Java Runner, qui fait partie du JDK, dmarre alors, et
le programme vous demande les arguments en lignes de commande. Laissez cet cran vide et
cliquez sur OK. Une fentre appele stdout apparat alors avec le message Hello World!. La
Figure 1.6 montre cette fentre.
Cest tout ! Souvenez-vous que vous vous servez de lapplication Compilateur Java pour com-
piler vos chiers .java et en faire des chiers .class, eux-mmes excuts en vous servant de
Java Runner.
Pour compiler un chier source Java sous Solaris, vous utilisez le compilateur Java en lignes de
commande qui est fourni avec le JDK. Au moyen dune ligne de commande UNIX cd, passez
Figure 1.5
Excution dune application
Java dans le shell DOS.
Astuce
Figure 1.6
Excution dapplications
Java sur Mac au moyen
de Java Runner.
part 01 Page 28 lundi 1 dcembre 1997 10:05
29
L E P R O G R A M M E U R
sous le rpertoire qui contient votre chier source Java. Le ntre tant plac dans le rpertoire
TYJtests, il est accessible par la commande :
cd~/TYJtests
Une fois dans le rpertoire adquat, utilisez la commande javac en lui adjoignant le nom du
chier, comme suit :
javac HelloWorld.java
Si tout se passe normalement, vous obtenez un chier appel HelloWorld.class, dans le mme
rpertoire que votre chier source. Cest votre chier de pseudo-code. En cas derreur, vriez
votre chier source dorigine et assurez-vous que vous lavez tap exactement comme sur le
Listing 1.1, en utilisant la mme casse. Vriez galement que la casse pour les lettres du nom
de chier est la mme que pour celles du nom de la classe, cest--dire HelloWorld.
Disposant dun chier .class, vous pouvez lexcuter au moyen de linterprteur de pseudo-
code Java. Linterprteur Java sappelle simplement java, et vous pouvez le lancer en lignes de
commande, tout comme javac (notez que largument du programme Java ne comporte pas
dextension .class) :
java HelloWorld
Si votre programme a t tap et compil correctement, vous devez voir en retour la phrase
Hello World! safficher sur votre cran. La Figure 1.7 montre les commandes que nous avons
utilises jusqu ce stade (lindication [desire]~[1] est le prompt utilis sur notre systme).
Notez bien que le compilateur et linterprteur Java sont deux choses diffrentes. Vous utilisez
le compilateur Java (javac) pour crer des chiers .class partir de vos chiers source Java,
et vous utilisez linterprteur Java (java) pour excuter effectivement vos chiers .class.
Cration dune applet Java
La cration dune applet diffre de celle dune simple application. En effet, les applets Java tour-
nent et sont afches dans une page Web, parmi dautres lments. Elles suivent, par cons-
quent, des rgles de comportement particulires, rendant leur cration plus complexe que celle
dune application.
Figure 1.7
Compilation et excution
dune application Java
sous Solaris.
Info
part 01 Page 29 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 30
1
Par exemple, pour crer une simple applet Hello World, il ne suft pas de pouvoir imprimer un
message sous forme de jeu de caractres, il faut aussi amnager un espace pour le message sur
les pages Web, utiliser des fonctions graphiques et dnir des polices pour peindre le message
sur lcran.
En ralit, on peut faire tourner une simple application Java sous forme dapplet, mais le mes-
sage Hello World safche alors sur une fentre spciale ou sur un chier log, selon la manire
dont la sortie du navigateur a t paramtre. Vous verrez ces points plus en dtail dans la
seconde partie de louvrage.
Cration du fichier source
Dans lexemple suivant, vous allez crer lapplet Hello World, la placer dans une page Web et
observer le rsultat.
Comme dans le cas de lapplication Hello World, vous commencez par crer le chier source
au sein dun simple diteur de texte. Le Listing 1.2 montre le code de cet exemple.
Listing 1.2 Applet Hello World
1: import java.awt.Graphics;
2:
3: class HelloWorldApplet extends java.applet.Applet {
4:
5: public void paint(Graphics g) {
6: g.drawString("Hello World!", 5, 25);
7: }
8:}
Sauvegardez ce chier de la mme manire que vous avez sauvegard lapplication Hello
World, en utilisant comme nom de chier un nom identique celui de la classe. En loccurrence,
le nom de la classe est HelloWorldApplet, vous devez donc sauvegarder le chier sous le nom
HelloWorldApplet.java. Nous avons plac le fichier dans un dossier appel TYJch01, mais vous
pouvez utiliser tout autre dossier de votre choix.
Compilation du fichier source
Ltape suivante consiste compiler le chier de lapplet Java. Bien quil sagisse dune applet,
vous compilez le chier exactement de la mme manire que celui dune application, en utili-
sant lune des procdures suivantes :
Depuis un shell DOS, faites un cd vers le rpertoire contenant le chier source de votre applet,
et utilisez la commande javac pour compiler ce chier (attention aux majuscules et aux
minuscules) :
javac HelloWorldApplet.java
Info
part 01 Page 30 lundi 1 dcembre 1997 10:05
31
L E P R O G R A M M E U R
Faites glisser le chier HelloWorldApplet.java sur licne du compilateur Java.
Dans un systme ligne de commande, faites un cd vers le rpertoire contenant le chier source
de lapplet, et utilisez la commande javac pour le compiler :
javac HelloWorldApplet.java
Inclusion de lapplet dans une page Web
Si vous avez tap le chier correctement, vous obtenez un chier appel HelloWorldApplet
.class, situ dans le mme dossier que le fichier source. Cest le fichier de lapplet Java ; pour
faire tourner lapplet dans une page Web, vous devez, lintrieur du code HTML de cette page,
vous rfrer ce chier class en utilisant la balise <APPLET>. Le Listing 1.3 montre un simple
chier HTML susceptible dtre utilis cette n.
Listing 1.3 Code HTML avec lapplet
1: <HTML>
2: <HEAD>
3: <TITLE>Hello to Everyone!</TITLE>
4: </HEAD><BODY>
5: <P>My Java applet says:
6: <APPLET CODE="HelloWorldApplet.class" WIDTH=150 HEIGHT=25>
7. </APPLET>
8: </BODY>
9: </HTML>
<APPLET> rfrence une applet dans le fichier HTML. Vous en apprendrez davantage plus loin
dans ce chapitre, mais vous pouvez noter deux choses ds prsent :
G Lattribut CODE est utilis pour indiquer le nom de la classe contenant lapplet, ici Hello-
WorldApplet.class.
G Les attributs WIDTH et HEIGHT indiquent la taille de lapplet sur la page. Le navigateur les uti-
lise pour dterminer lespace rserv lapplet sur la page. Dans lexemple, une bote de
150 pixels de large sur 25 pixels de haut est cre.
Sauvegardez le chier HTML dans le mme dossier que votre chier classe, avec un nom des-
criptif et une extension .html (par exemple, vous pourriez utiliser le mme nom que pour
lapplet : HelloWorldApplet.html).
Comme nous lavons dj vu, votre diteur de texte peut insister et adjoindre vos chiers
HTML une extension .txt, tant que Windows ne reconnat pas lextension .html. Choisissez
Afchage | Options | Types de chier partir dune fentre de lexplorateur de Windows pour
rgler ce problme.
Info
part 01 Page 31 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 32
1
Il reste maintenant visualiser lapplet. Pour cela, il faut lun des lments suivants :
G Un navigateur supportant les applets Java, comme Netscape 2.0. ou Explorer 3.0. Si vous
travaillez sur un Macintosh, vous avez besoin de Netscape 3.0 ou dune version plus rcente.
Si vous utilisez Windows 95 ou NT, vous avez besoin dune version 32 bits de Netscape. Et
si vous utilisez Internet Explorer, il vous faut la version 3.0 bta 5 ou une version plus
rcente (ou la version dnitive).
G Lapplication Appletviewer, incluse dans JDK. Appletviewer nest pas un programme de
navigation Web, et ne permet pas la visualisation de la page Web entire. Cest une solution
acceptable, faute de mieux, pour tester et voir quoi ressemble une applet.
G Un visualisateur dapplet ou un outil dexcution fourni avec votre environnement de dve-
loppement.
Avec un programme de navigation compatible Java comme Netscape, choisissez Fichier | Ouvrir
chier pour naviguer vers le chier HTML contenant lapplet et la visualiser (assurez-vous
douvrir le chier HTML et non le chier classe). Dans le cas dInternet Explorer, choisissez
Fichier | Ouvrir, puis slectionnez Parcourir pour trouver le chier sur votre disque. Pour le
moment, aucune installation sur le serveur Web nest ncessaire : tout se passe sur le systme
local. Notez que lapplet Java peut mettre un certain temps dmarrer une fois la page charge ;
soyez patient. La Figure 1.8 montre le rsultat du fonctionnement de lapplet sous Netscape.
Sans programme de navigation compatible Java, ou si vous voulez tester des applets crites pour
Java 1.1, vous pouvez utiliser lAppletviewer du JDK.
Pour faire tourner lAppletviewer des versions Windows ou Solaris du JDK, faites un cd vers le
rpertoire o se trouvent vos chiers classe et HTML, et utilisez la commande appletviewer
avec le nom du chier HTML que vous venez de crer :
appletviewer HelloWorldApplet.html
Lappletviewer ne montrera que lapplet elle-mme, sans le texte HTML correspondant.
Figure 1.8
Applet tournant sous
Netscape.
part 01 Page 32 lundi 1 dcembre 1997 10:05
33
L E P R O G R A M M E U R
Rsolution des problmes
Cette section peut vous aider surmonter dventuelles difcults rencontres lors de la mise
en uvre des exemples prcdents. Voici les problmes les plus courants, et leurs solutions.
G Bad command or filename ou Command not found
Ce type derreur apparat lorsque le rpertoire contenant le binaire du JDK ne se situe pas
sur le chemin afch pour lexcution, ou si le chemin daccs ce rpertoire est erron.
Sous Windows, vriez soigneusement votre chier autoexec.bat ; sous UNIX, vriez le
chier systme contenant les commandes de dnition du chemin (.cshrc, .login,
.profile, ou un fichier similaire).
G javac: invalid argument
Assurez-vous que le nom du chier utilis dans la commande javac est bien celui du
chier. En particulier, dans le cas du shell DOS, vous devez utiliser le nom de chier
Windows comportant une extension .java, et non lquivalent DOS (HELLO~1.java, par
exemple).
G Warning: public class HelloWorldApplet must be defined in a file called HelloWorld-
Applet.java
Cette erreur rsulte le plus souvent de la non-concordance entre le nom de la classe indiqu
par le chier Java lui-mme (le nom suivant le mot class) et le nom du chier source Java.
Les deux noms doivent tre identiques, en tenant compte des minuscules et majuscules
(cette erreur particulire correspond en gnral des casses non identiques). Renommez
soit le chier, soit la classe, et lerreur disparatra.
G Erreurs du type Insufficient memory
Le JDK nutilise pas la mmoire dune manire trs efcace. Confront ce problme de
mmoire, essayez de quitter des programmes volumineux avant de compiler ou de lancer
vos programmes Java, mettez en uvre la mmoire virtuelle, ou installez davantage de
RAM.
G Autres types derreur de code
Si vous ne russissez pas compiler vos chiers source Java pour dautres raisons que
celles mentionnes ci-avant, vriez encore que votre frappe correspond bien ce qui est
indiqu dans les exemples, notamment en ce qui concerne les majuscules et les minuscules.
Java est sensible la casse, ce qui veut dire que les minuscules et les majuscules sont trai-
tes diffremment. Si vous ne voyez pas do peut venir une erreur, essayez de comparer
vos chiers source aux chiers du CD-ROM.
part 01 Page 33 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 34
1
Rsum
Ce chapitre a prsent le langage Java avec ses caractristiques et ses objectifs. Il ressemble
C ou C++ et permet de dvelopper de nombreux types de programmes. Lune de ses utilisations
les plus courantes actuellement est le dveloppement dapplets pour les navigateurs compati-
bles Java. Les applets sont des programmes Java tlchargs et excuts au sein dune page
Web. Elles peuvent crer des animations, des jeux, des programmes interactifs et dautres effets
multimdias sur les pages Web.
Les forces de Java sont sa portabilit (source et binaire), sa conception oriente objet et sa sim-
plicit. Ces caractristiques rendent possible la cration des applets. De plus, elles font de Java
un langage excellent pour lcriture de programmes plus gnraux, sexcutant sans navigateur
compatible Java. Pour les distinguer des applets, ces programmes sont appels applications.
A la n du chapitre, vous avez labor une applet et une application. Leurs diffrences ont ainsi
t mises en vidence. La compilation et lcriture de programmes Java ont t traites, ainsi
que linsertion dapplets dans une page Web. Vous avez ainsi acquis les bases ncessaires la
conception dapplications ou dapplets plus complexes.
Questions rponses
Q Je connais bien HTML et peu la programmation. Puis-je, malgr cela, crire des
programmes Java ?
R Sans exprience de programmation, programmer en Java va vous sembler nettement plus
difcile quen HTML. Mais pour apprendre programmer, Java est un bon langage. Etudiez
consciencieusement tous les exemples et les exercices de ce livre pour commencer utiliser
Java.
Q Quel est le rapport entre JavaScript et Java ?
R Une erreur courante dans le monde du Web consiste prter ces deux entits plus de points
communs quelles nen ont en ralit. Java est un langage de programmation, rpondant
des besoins multiples ; vous pouvez lutiliser pour crer des applets. JavaScript est un
langage de script invent par Netscape, qui ressemble Java ; il permet de faire diffrentes
choses astucieuses dans le cadre des pages Web. Ce sont des langages indpendants, conus
pour des objectifs diffrents. Si la programmation en JavaScript vous intresse, procurez-
vous un autre ouvrage, consacr JavaScript.
Q La distinction entre Java 1.02 et Java 1.1 est une cause de perplexit. Cet ouvrage est
cens tre consacr Java 1.1, mais selon vous, la version 1.02 est plus rpandue, et trs
peu de navigateurs supportent 1.1. Quelle version dois-je utiliser ?
part 01 Page 34 lundi 1 dcembre 1997 10:05
35
L E P R O G R A M M E U R
R Nous vivons une priode de transition entre la version 1.02, plus rpandue, et la nouvelle
version. La version 1.1 sera beaucoup plus largement supporte lavenir, et les raisons
dhsiter entre les deux sattnueront.
En rgle gnrale, si vous crivez du code conforme lAPI 1.02, il marchera nimporte
o, mme avec la version 1.1 du JDK. Mais si vous utilisez des fonctions de la version 1.1,
vous limitez la porte de votre code, puisquil ne pourra tre compil et excut que dans
un environnement 1.1. Selon lusage que vous voulez faire de Java, il vous appartient de
dcider si vous voulez ou non utiliser les nouveauts 1.1. (Dans le cas des applets, il vaut
probablement mieux en rester 1.02 pour le moment. Dans le cas des applications, vous
disposez dune plus grande latitude.)
Ce problme ne doit pas vous troubler outre mesure au stade actuel de la lecture du livre.
Pour la plupart, les fonctions de base de Java sont rigoureusement les mmes entre les deux
versions ; les diffrences ne prendront de limportance que lorsque nous plongerons plus
profond dans le JDK. Les fonctions propres 1.1 seront signales au fur et mesure de leur
apparition.
Q Selon ce premier chapitre, un navigateur compatible Java tel que Netscape tlcharge
les applets pour excution sur le systme de lutilisateur. Quen est-il de la scurit ?
Quest-ce qui empche quelquun dcrire une applet compromettant la scurit de
mon systme ou y causant des dommages ?
R Lquipe Java de Sun sest penche sur les problmes de scurit lis aux applets dans les
programmes de navigation compatibles Java. Plusieurs contrles existent pour que les
applets ne causent aucun dgt :
G Les applets Java ne peuvent ni lire ni crire sur le disque du systme local.
G Les applets Java ne peuvent pas excuter un programme sur le systme local.
G Les applets Java ne peuvent pas se connecter une machine du Web, lexception du
serveur partir duquel elles ont t tlcharges
Notez que certaines de ces restrictions peuvent ne pas jouer pour certains navigateurs, ou
tre leves. Attendez-vous nanmoins ce quaucune des possibilits en question ne soit
autorise.
En outre, le compilateur et linterprteur vrient le code source et le pseudo-code. Ils
dtectent ainsi les coups sournois du programmeur, par exemple, dpasser la limite de la
mmoire tampon ou dune pile.
Ces contrles ne suppriment pas tous les problmes de scurit (ce quaucun systme nest
en mesure de faire !), mais rduisent beaucoup les risques de tomber sur une applet malfai-
sante. Les questions de scurit des applets sont abordes au Chapitre 8, et de faon plus
dtaille au Chapitre 21.
Q Ce chapitre mentionne Solaris, Windows et Macintosh. Et les autres systmes
dexploitation ?
part 01 Page 35 lundi 1 dcembre 1997 10:05
Introduction la programmation Java 1.1
Java 1.1 36
1
R Si vous utilisez une autre version dUNIX que Solaris, il y a de bonnes chances pour que le
JDK ait t port sur votre systme. Voici quelques exemples :
G La version SGI du JDK peut tre obtenue http://www.sgi.com/Products/cosmo/cosmo
instructions.html.
G Des informations sur Java pour Linux sont disponibles http://www.blackdown.org/
java-linux/.
G IBM a port le JDK sur OS/2 et AIX. Renseignez-vous de manire plus prcise http:
//www.ncc.hurley.ibm.com/javainfo/.
G OSF porte le JDK sur HP/UX, Unixware, Sony NEWS, et lUNIX de Digital. Voir http:
//www.osf.org/mall/web/javaport.htm.
(Merci Elliot Rusty Harold pour ces informations extraites des rponses aux questions
frquemment poses (FAQ) http://www.sunsite.unc.edu/javafaq/javafaq/html.)
Q Jutilise le bloc-notes sur Windows pour prparer mes chiers Java. Le programme
insiste pour ajouter une extension .txt tous mes chiers, quelle que soit la faon dont
je les nomme (de sorte que jobtiens toujours des chiers tels que HelloWorld.java
.txt). Sauf les renommer avant chaque compilation, comment puis-je rgler ce
problme ?
R La solution consistant renommer les chiers reprsente une contrainte dsagrable,
notamment si vous avez de nombreux chiers. La difcult provient de ce que Windows ne
comprend pas lextension .java (lextension .html du HTML soulve les mmes dif-
cults).
Pour rgler cette question, allez dans une fentre de lexplorateur Windows, choisissez
Afchage | Options | Types de chiers. Dans la bote de dialogue qui apparat alors, choi-
sissez Nouveau type. Entrez Fichiers source Java dans la zone de texte Description du
type, et .java dans la zone de texte Extension associe. Puis, cliquez sur OK. Faites de
mme pour les chiers HTML si ncessaire, et cliquez de nouveau sur OK. Vous devez
pouvoir utiliser dsormais le bloc-notes (ou tout autre diteur de texte) pour crer et sauve-
garder des chiers Java et HTML.
Une mthode plus simple, mais quil faut se rappeler chaque fois, consiste sauvegarder
les chiers en plaant des doubles guillemets de part et dautre du nom de chier ; par
exemple, "HelloWorld.java".
Q O puis-je apprendre davantage de choses sur Java et trouver des applets et des appli-
cations pour jouer avec ?
R Vous pouvez dj nir de lire ce livre ! Voici dautres endroits o vous trouverez des infor-
mations sur Java et sur les applets Java :
G La page daccueil Java, http://www.Java.sun.com/ est la source ofcielle des infor-
mations sur Java, y compris les informations sur le JDK, sur la prochaine diffusion 1.1,
part 01 Page 36 lundi 1 dcembre 1997 10:05
37
L E P R O G R A M M E U R
et sur des outils de dveloppement tels que Java Workshop. Vous y trouverez galement
une documentation bien toffe.
G Gamelan, http://www.gamelan.com/, est une source dinformations sur les applets et
sur Java, organise par catgories. Pour jouer avec des applets et des applications, cest
ici quil convient de vous adresser.
G Pour toute discussion sur Java, consultez le newsgroup comp.lang.java, et notamment
comp.lang.java.programmer, comp.lang.java.tech, comp.lang.java.advocacy, etc.
(Pour accder ces newsgroups, vous avez besoin dun lecteur de news Usenet.)
part 01 Page 37 lundi 1 dcembre 1997 10:05
L E P R O G R A M M E U R
2
2
Programmation
oriente objet
et Java
part 01 Page 39 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 40
2
La programmation oriente objet (POO) est lune des plus importantes innovations de ces der-
nires annes en matire de programmation, et son ampleur pourrait vous faire redouter de met-
tre des annes pour apprendre ses mthodologies et proter de ses avantages par rapport aux
mthodes traditionnelles. En fait, les mthodes de la POO rpondent toutes une organisation
des programmes proche de la ralit.
Ce chapitre traite des concepts de programmation oriente objet de Java et de leur mise en
uvre. Il aborde aussi la structuration des programmes :
G La dnition des classes, des objets et de leurs relations
G Les parties essentielles dune classe ou dun objet : les comportements et les attributs
G Lhritage des classes et son inuence sur la conception des programmes
G Quelques informations sur les packages et les interfaces
Penser en termes dobjets : lanalogie
Les Lego ont des similitudes avec la POO. Ce sont de petits blocs de construction en plastique,
de tailles et de couleurs variables, qui sencastrent les uns dans les autres. De leur assemblage
naissent diffrents objets plus volumineux. Plusieurs pices (roues, moteur, charnire) permet-
tent de crer des chteaux, des automobiles, des robots gants, etc. Lassemblage des Lego est
dtermin par leur forme. Chaque pice a un rle dans la construction dun objet plus grand.
Cest peu prs de cette faon que fonctionne la programmation oriente objet : assembler de
petits lments pour en construire de plus grands.
Un autre exemple : la fabrication dun ordinateur complet partir de divers composants : une
carte mre, un disque dur, un clavier, etc. Le systme nal rsulte de lassemblage de toutes les
units.
Chaque composant interne est particulier de par sa complexit, son origine (constructeur) et sa
conception. Son fonctionnement spcique prsente peu dintrt, seul le rsultat compte : un
appui sur la touche A provoque lafchage du caractre A lcran. Chaque composant est une
unit indpendante et son seul intrt rside dans son interaction avec les autres composants.
Cette carte vido sadapte-t-elle dans un slot de la carte mre ? Cet cran est-il compatible avec
la carte vido ? Les composants dialoguent-ils correctement entre eux pour permettre aux dif-
frentes parties de converser ? Connatre la nature des interactions entre les diffrents compo-
sants et pouvoir les mettre en uvre facilite lassemblage complet du systme.
La programmation oriente objet fonctionne de la mme faon. Ainsi, ce type de programme
est constitu de plusieurs composants (objets) autonomes. Ils ont un rle spcique et dialo-
guent de faon prtablie.
part 01 Page 40 lundi 1 dcembre 1997 10:05
41
L E P R O G R A M M E U R
Objets et classes
La programmation oriente objet est base sur ce principe. Dans la ralit, des objets en consti-
tuent dautres plus grands. Ce procd de combinaisons nest toutefois quun aspect trs gnral
de la POO. La programmation oriente objet prsente plusieurs autres concepts et caractristi-
ques, qui facilitent et assouplissent la cration et lutilisation des objets. Les classes en sont les
lments les plus importants.
Lcriture dun programme dans un langage POO ne dnit pas des objets rels, mais des clas-
ses dobjets, une classe tant un modle applicable de multiples objets ayant des caractristi-
ques similaires. Une classe dcrit toutes les caractristiques communes un ensemble dobjets.
Par exemple, une classe Arbre peut dcrire les caractristiques de tous les arbres (possdent des
feuilles et des racines, poussent, fabriquent de la chlorophylle). Elle sert alors de modle abstrait
pour le concept darbre. Pour la slectionner, dialoguer avec elle ou labattre, il faut avoir une
instance de cet arbre. Bien sr, il est possible de crer de nombreuses instances dune classe
darbres dtermine. Chacune delles a ventuellement des caractristiques diffrentes (court,
haut, touffu, perd ses feuilles en automne), mme si elles se ressemblent et sont identiables en
tant quarbre (voir Figure 2.1).
Arbre
Classe Arbre
(abstrait)
Arbre
Arbre
Arbre
Figure 2.1
La classe Arbre et plusieurs
instances dArbre.
part 01 Page 41 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 42
2
Une classe est un modle commun un ensemble dobjets de mmes caractristiques.
Une instance de classe est lautre nom dun objet rel. Si les classes sont une reprsentation abs-
traite dun objet, une instance en est une reprsentation concrte.
Il ny a donc aucune diffrence entre une instance de classe et un objet. Le terme objet est plus
gnral mais ils sont tous deux une reprsentation concrte dune classe. Les termes dinstance
et dobjet sutilisent indiffremment en langage de POO. Une instance arbre et un objet arbre
reprsentent la mme chose.
Une instance est une manifestation concrte dune classe.
Voici un exemple proche de la programmation Java : la cration dune classe pour un bouton de
linterface utilisateur. La classe Button dnit les caractristiques dun bouton (son nom, sa
taille, son aspect) et son comportement (faut-il un simple ou un double-clic pour lactiver, que
fait-il quand il est activ ?). Aprs la dnition de la classe Button, la cration de ses instances
est aise (donc des objets bouton). Leurs caractristiques de base sont dnies dans la classe,
mais leur aspect et leur comportement diffrent ventuellement. Ce dernier est fonction des
besoins. Avec une classe Button, la rcriture du code pour chaque bouton nest pas obligatoire.
La classe Button est utile pour crer diffrents types de boutons dans ce programme ou dans un
autre.
Dans le langage C, la classe sassimile la cration dun nouveau type de donne avec struct
et typedef. Les classes fournissent plus quune simple collection de donnes. Ceci est illustr
dans la suite du chapitre.
Lcriture dun programme Java ncessite la conception et la construction de plusieurs classes.
Ainsi, les programmes sexcutent, des instances de ces classes se crent et seffacent au fur et
mesure des besoins. Le travail dun programmeur Java est de crer le bon ensemble de classes
pour que les programmes puissent fonctionner correctement.
En guise daide, lenvironnement Java offre un ensemble standard de classes (une bibliothque
de classes) couvrant un grand nombre de comportements de base. Ce sont des tches de pro-
grammation classiques (des classes pour des fonctions mathmatiques de base, des tableaux,
des chanes de caractres, etc.) mais aussi des comportements graphiques ou de gestion de
rseaux. Souvent, les bibliothques de classes Java rduisent lapport du programmeur la cra-
tion dune classe unique utilisant les bibliothques standard. Pour les programmes Java comple-
xes, il faut crer un ensemble complet de classes. Celles-ci dialoguent alors selon des rgles
dnies.
Une bibliothque de classes est un collection de classes susceptibles dtre utilises de faon
rptive dans diffrents programmes. Les bibliothques de classes standard de Java comportent
un nombre important de classes relatives aux tches de base en Java.
Lexique
Lexique
Astuce
Lexique
part 01 Page 42 lundi 1 dcembre 1997 10:05
43
L E P R O G R A M M E U R
Attributs et comportement
Chaque classe crite en Java se compose gnralement de deux parties : les attributs et le com-
portement. Dans cette section, une classe thorique simple appele Motorcycle permet de les
tudier. Ensuite, le code Java met en uvre la reprsentation dune moto.
Attributs
Les attributs sont les caractristiques individuelles qui diffrencient un objet dun autre. Ils en
dnissent lapparence, ltat et les autres qualits. Soit une classe thorique appele Motorcycle
avec les attributs suivants :
G couleur : rouge, vert, gris, brun
G style : patrouille, sport, standard
G marque : Honda, BMW, Bultaco
Les attributs dun objet peuvent aussi inclure des informations sur son tat, telles que ltat du
moteur (en marche ou larrt), ou la vitesse slectionne.
Les attributs sont dnis dans les classes par des variables. Les types et les noms de ces varia-
bles sont dnis dans la classe. Chaque objet dune classe pouvant avoir des valeurs diffrentes
pour ses variables, on utilise le terme variable dinstance pour dsigner la variable dun objet.
Une variable dinstance dnit un attribut dun objet. Les types et les noms des variables sont
dnis dans la classe, mais leurs valeurs sont xes et modies dans lobjet.
Les variables dinstance peuvent tre initialises la cration dun objet et demeurer constantes
pendant toute la vie de lobjet, ou tre changes au cours du droulement du programme. La
modication des valeurs des variables entrane celle des attributs de lobjet.
Aux variables dinstance viennent sajouter des variables de classe. Ces dernires sappliquent
la classe elle-mme et tous ses objets. Les valeurs des variables dinstance sont stockes dans
linstance. Les valeurs des variables de classe sont stockes dans la classe elle-mme. Le cha-
pitre suivant tudie les caractristiques des variables dinstance et de classe.
Comportement
Le comportement dune classe, cest la manire dont opre une instance de cette classe ; par
exemple, la faon dont elle ragit une demande dune autre classe ou dun autre objet, ou ce
quelle fait lorsque son tat interne se modie. Le comportement dun objet, cest sa faon de
faire quelque chose ou de lobtenir. A titre dexemple, voici quelques comportements de la
classe Motorcycle :
G Dmarrer le moteur
Lexique
part 01 Page 43 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 44
2
G Arrter le moteur
G Acclrer
G Changer de vitesse
G Caler
La dnition du comportement dun objet passe par la cration de mthodes, des ensembles
dinstructions Java excutant certaines tches. Elles ressemblent aux fonctions des autres lan-
gages, mais elles sont dnies dans une classe et accessibles seulement dans cette classe.
A linverse de C++, Java ne possde pas de fonctions dnies en dehors des classes.
Les mthodes sont des fonctions dnies dans les classes. Elles agissent sur les objets de ces
dernires.
Les mthodes peuvent oprer sur un seul objet individuel, ou encore permettre des objets de
communiquer entre eux. Une classe ou un objet peut appeler les mthodes dune autre classe ou
dun objet diffrent, pour signaler des modications denvironnement ou demander cet autre
objet de changer dtat.
De mme quil existe des variables de classe et des variables dinstance, il existe aussi des
mthodes dinstance et des mthodes de classe. Les mthodes dinstance (appeles simplement
mthodes) agissent sur un objet. Les mthodes de classe agissent sur une classe (ou sur dautres
objets). Ces dernires sont traites en dtail dans les prochains chapitres.
Cration dune classe
Cette section est une application de la thorie tudie jusque-l. La cration de la classe Motor-
cycle montre comment dfinir les mthodes et les variables dinstance dans une classe. Vient
ensuite lapplication Java pour crer un nouvel objet de la classe Motorcycle et en afcher les
variables dinstance.
Nous laissons de ct ltude dtaille de la syntaxe, qui compliquerait la comprhension de
lexemple, et qui de toute faon deviendra beaucoup plus vidente au cours des chapitres sui-
vants. Pour le moment, limportant est de comprendre les structures de base de la dnition de
classe.
Saisissez les lignes suivantes avec votre diteur, en respectant la casse. Il sagit dune dnition
de classe basique.
class Motorcycle {
}
Vous venez de crer une classe, mme si elle ne ralise pas grand-chose pour le moment. Cest
une classe Java dans sa version la plus simple.
Lexique
Info
part 01 Page 44 lundi 1 dcembre 1997 10:05
45
L E P R O G R A M M E U R
Ajoutez les trois lignes suivantes juste sous la premire, an de crer des variables dinstance
pour cette classe :
String make;
String color;
boolean engineState;
Parmi les trois variables dinstance de lexemple, make et color contiennent des objets String
(un String est un chane de caractres ; String scrit avec un S majuscule et fait partie de la
bibliothque de classes standard mentionne prcdemment). La troisime, engineState, est
une variable boolenne et indique si le moteur est en marche ou larrt ; la valeur false veut
dire que le moteur est arrt, et true veut dire quil tourne. Notez que boolean scrit avec un b
minuscule. Une variable boolenne ne peut prendre que lune des deux valeurs true ou false.
Dans le langage Java, boolean est un vritable type de donnes. Il accepte les valeurs true ou
false. A linverse de leurs homologues en langage C, les donnes boolennes en Java ne sont
pas des nombres.
Les comportements (mthodes) de la classe moto peuvent tre nombreux, mais lexemple se
limite un seul : une mthode qui dmarre le moteur. Ajoutez maintenant les lignes suivantes
sous les variables dinstance dans votre dnition de classe :
void startEngine() {
if (engineState == true)
System.out.println("The engine is already on.");
else {
engineState = true;
System.out.println("The engine is now on.");
}
}
La mthode startEngine teste le moteur pour savoir sil tourne dj (ligne engineState ==
true). Si cest le cas, elle affiche un message qui lindique. Si le moteur est larrt, elle change
son tat en true (mettant le moteur en marche), puis afche le message de dmarrage du moteur.
Enn, la mthode startEngine() ne retournant pas de valeur, sa dnition commence par le
mot void. (On peut aussi dnir des mthodes qui retournent des valeurs ; ce sera lun des th-
mes du Chapitre 6.)
Ici et tout au long de louvrage, nous ajoutons systmatiquement des parenthse vides la suite
du nom dune mthode laquelle il est fait rfrence (par exemple, la mthode startEngine()
du paragraphe prcdent). Cest une convention adopte par la communaut des program-
meurs pour indiquer quil sagit dune mthode et non dune variable.
Info
Info
part 01 Page 45 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 46
2
Sauvegardez le programme dans un chier appel Motorcycle.java (les chiers doivent avoir
le mme nom que la classe quils dnissent). Le Listing 2.1 montre laspect du programme au
stade actuel :
Listing 2.1. Le chier Motorcycle.java
1 : class Motorcycle {
2 :
3 : String make;
4 : String color;
5 : boolean engineState = false;
6 :
7 : void startEngine() {
8 : if (engineState == true)
9 : System.out.println("The engine is already on.");
10 : else {
11 : engineState = true;
12 : System.out.println("The engine is now on.");
13 : }
14 : : }
15 : }
Le compilateur Java ne tient pas compte de lindentation des diffrentes parties de la classe.
Lutilisation dune indentation particulire permet cependant de relire plus facilement la d-
nition de classe. Celle de lexemple (variables et mthodes dcales de la dnition de la
classe) est conserve dans tout le livre. Les bibliothques de classes Java utilisent une indenta-
tion similaire. Le choix de lindentation appartient au programmeur.
Avant de compiler cette classe, ajoutez la mthode showAtts, sous la mthode startEngine
(entre les lignes 14 et 15). Elle afche les valeurs courantes de toutes les variables dinstance
dans une instance de la classe Motorcycle. Voici cette mthode :
void showAtts() {
System.out.println("This motorcycle is a"
+ color + " " + make);
if (engineState == true)
System.out.println("The engine is on.");
else System.out.println("The engine is off.");
}
La mthode showAtts afche deux lignes lcran : make et color de lobjet motorcycle et ltat
du moteur.
Vous avez cr ainsi une classe Java comportant trois variables dinstance et deux mthodes
dnies.
Astuce
part 01 Page 46 lundi 1 dcembre 1997 10:05
47
L E P R O G R A M M E U R
Sauvegardez de nouveau ce chier et compilez-le par lune des mthodes suivantes :
Aprs cet exemple, les mcanismes de compilation et dexcution des programmes Java seront
considrs comme acquis, et ne seront plus dcrits.
Depuis un shell DOS, faites un CD vers le rpertoire contenant votre chier source Java, et utilisez
la commande javac pour le compiler :
javac Motorcycle.java
Glissez et dposez le chier Motorcycle.java sur licne du compilateur Java.
Depuis une ligne de commande, faites un CD vers le rpertoire contenant votre chier source
Java, et utilisez la commande javac pour le compiler :
javac Motorcycle.java
Lorsque vous excutez ce petit programme en utilisant lun des programmes java ou Java Runner,
vous obtenez une erreur. Pourquoi ? Si vous excutez directement une classe qui vient dtre
compile, Java suppose quil sagit dune application et recherche une mthode main(). Comme
vous navez pas dni de mthode main() lintrieur de la classe, linterprteur Java produit
lun des deux messages derreur ci-aprs :
In class Motorcycle: void main(String argv[]) is not defined
Exception in thread "main": java.lang.UnknownError
Pour utiliser la classe Motorcycle (crer et manipuler des objets), il faut crire une applet ou une
application Java qui lutilise, ou lui ajouter une mthode main. La deuxime solution est la plus
simple (voir Listing 2.2). Cette mthode doit tre ajoute juste avant la dernire accolade de
fermeture (}), sous les mthodes startEngine() et showAtts().
Listing 2.2 Mthode main() pour Motorcycle.java
1 : public static void main (String args[]) {
2 : Motorcycle m = new Motorcycle();
3 : m.make = "Yamaha RZ350";
4 : m.color = "yellow";
5 : System.out.println("Calling showAtts...");
6 : m.showAtts();
7 : System.out.println("--------");
8 : System.out.println("Starting engine...");
9 : m.startEngine();
10: System.out.println("--------");
11: System.out.println("Calling showAtts...");
12: m.showAtts();
13: System.out.println("--------");
14: System.out.println("Starting engine...");
15: m.startEngine();
16:}
Info
part 01 Page 47 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 48
2
Grce la mthode main(), la classe Motorcycle devient une application ofcielle. La compi-
lation est alors possible sans message derreur. Le rsultat de lexcution est le suivant :
Calling showAtts...
This motorcycle is a yellow Yamaha RZ350
The engine is off.
--------
Starting engine...
The engine is on.
--------
Calling showAtts...
This motorcycle is a yellow Yamaha RZ350
The engine is now on.
--------
Starting engine...
The engine is already on.
La mthode main() comportant beaucoup dlments nouveaux, voici, ligne par ligne, lindica-
tion de ce quelle ralise (les deux chapitres suivants donnent des dtails plus spciques).
La premire ligne dclare la mthode main(). Elle prend toujours cette forme. Chacune de ses
parties sera tudie dans les chapitres suivants.
La ligne 2 cre un nouvel objet Motorcycle et stocke sa rfrence dans la variable m. Il est rare
dagir directement sur les classes dans les programmes Java. Au lieu de cela, on cre des objets,
puis on appelle des mthodes pour ces objets.
Les lignes 3 et 4 mettent en place les variables dinstance de lobjet Motorcycle. La marque est
maintenant Yamaha RZ350 et la couleur yellow.
La ligne 5 imprime un message pour annoncer lappel de la mthode ShowAtts, puis la ligne 6
appelle cette mthode, qui a t dnie dans lobjet Motorcycle. Le nouvel objet Motorcycle
afche alors la valeur de ses variables dinstance (make et color renseignes prcdemment) et
signale larrt du moteur.
La ligne 7 afche une ligne de sparation pour une lecture plus facile.
La ligne 9 appelle la mthode startEngine() dans lobjet motorcycle pour dmarrer le moteur.
Son tat change alors : il tourne.
La ligne 12 afche nouveau la valeur des variables dinstance. Cette fois, le message signale
que le moteur tourne.
La ligne 15 essaye de dmarrer nouveau le moteur. Puisquil tourne dj, cette tentative pro-
voque lafchage du message The engine is already on.
Le Listing 2.3 montre la version nale de la classe Motorcycle, telle quelle doit pouvoir tre
compile et excute sans problme. Noubliez pas que cet exemple, comme tous les autres
exemples du livre, est inclus dans le CD-ROM fourni avec louvrage.
Analyse
part 01 Page 48 lundi 1 dcembre 1997 10:05
49
L E P R O G R A M M E U R
Listing 2.3. La version nale de Motorcycle Java
1: class Motorcycle {
2:
3: String make;
4: String color;
5: boolean engineState;
6:
7: void startEngine() {
8: if (engineState == true)
9: System.out.println("The engine is already on.");
10: else {
11: engineState = true;
12: System.out.println("The engine is now on.");
13: }
14: }
15:
16: void showAtts() {
17: System.out.println("This motorcycle is a "
18: + color + " " + make);
19: if (engineState == true)
20: System.out.println("The engine is on.");
21: else System.out.println("The engine is off.");
22: }
23:
24: public static void main (String args[]) {
25: Motorcycle m = new Motorcycle();
26: m.make = "Yamaha RZ350";
27: m.color = "yellow";
28: System.out.println("Calling showAtts...");
29: m.showAtts();
30: System.out.println("------");
31: System.out.println("Starting engine...");
32: m.startEngine();
33: System.out.println("------");
34: System.out.println("Calling showAtts...");
35: m.showAtts();
36: System.out.println("------");
37: System.out.println("Starting engine...");
38: m.startEngine();
39: }
40:}
Hritage, interfaces et packages
Vous tes dsormais familiaris avec les classes, les objets, les mthodes et les variables, et vous
savez les runir dans un programme Java. Lhritage, les interfaces et les packages sont des
mcanismes dorganisation des classes et de leurs comportements. Les bibliothques de classes
part 01 Page 49 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 50
2
Java utilisent tous ces concepts. La cration de bonnes bibliothques de classes pour les pro-
grammes passe par lutilisation de ces mmes concepts.
Hritage
Lhritage est essentiel pour la programmation oriente objet et inuence directement la concep-
tion et lcriture des classes Java. Lhritage est un mcanisme puissant qui facilite lcriture
dune classe. En effet, il suft de spcier les diffrences de cette classe par rapport une autre ;
lhritage donne un accs automatique toute linformation contenue dans cette autre classe.
Avec lhritage, toutes les classes (crites ou issues dautres bibliothques de classes ainsi que
les classes utilitaires standard) suivent une hirarchie stricte (voir Figure 2.2).
Chaque classe possde une super-classe (la classe situe au-dessus dans la hirarchie) et ven-
tuellement une ou plusieurs sous-classes (les classes situes au-dessous dans la hirarchie). Les
classes hritent de celles qui sont situes au-dessus delles dans la hirarchie.
Les sous-classes hritent de toutes les mthodes et variables de leurs super-classes. Ainsi, si une
super-classe dnit un comportement utile une classe, il nest pas ncessaire de rednir cette
dernire ou de copier ce code partir dune autre classe. En effet, la classe rcupre automati-
quement le comportement partir de sa super-classe, et ainsi de suite jusquau sommet de la
hirarchie. Une classe devient alors une combinaison de toutes les caractristiques des classes
dont elle hrite.
La classe A est la super-classe de B
La classe B est une sous-classe de A
La classe B est la super-classe
de C, D et E
Les classes C, D et E sont des
sous-classes de B
Classe A
Classe B
Classe D Classe C Classe E
Figure 2.2
Une hirarchie
de classes.
part 01 Page 50 lundi 1 dcembre 1997 10:05
51
L E P R O G R A M M E U R
Lhritage est un concept de la programmation oriente objet, selon lequel toutes les classes
font partie dune hirarchie stricte. Chaque classe possde des super-classes (les classes
situes au-dessus dans la hirarchie), et un nombre quelconque de sous-classes (les classes
situes au-dessous dans la hirarchie). Les sous-classes hrites des attributs et des comporte-
ments de leurs super-classes.
La classe Object se trouve au sommet de la hirarchie des classes Java. Toutes les classes hri-
tent de cette super-classe. Cest la classe la plus gnrale de la hirarchie. Elle dnit le com-
portement spcique tous les objets dans Java. Chaque classe situe un niveau plus bas dans
la hirarchie ajoute des informations supplmentaires. Aussi, plus elles sont basses dans la hi-
rarchie, plus leur usage est spcique. Ainsi, la hirarchie de classe est un ensemble de concepts.
Ils sont trs abstraits au sommet, mais deviennent concrets quand on descend dans la chane des
super-classes.
Il est souvent ncessaire de crer une classe qui possde non seulement toutes les informations
dune autre classe, mais galement des caractristiques complmentaires. Par exemple, vous
pouvez vouloir crer une version de Button possdant une tiquette spcique. Pour rcuprer
toutes les informations Button, il suft de dnir une classe qui en hrite. La classe rcupre
alors tous les comportements dnis dans Button (et dans les super-classes de Button). Ensuite,
il reste grer les diffrences entre cette classe et Button. Ce mcanisme, qui consiste dnir
de nouvelles classes en fonction de leurs diffrences avec leurs super-classes, sappelle sous-
classement.
Le sous-classement concerne la cration dune classe qui hrite dautres classes de la hirarchie.
Avec le sous-classement, il suft de dnir les diffrences entre la classe et ses parents. Les
comportements complmentaires sont tous disponibles pour la classe grce lhritage.
Le sous-classement revient dnir une nouvelle classe hritire dune classe qui existe dj.
Si la classe dnit compltement un nouveau comportement et si elle nest pas une vritable
sous-classe, elle peut hriter directement de la classe Object, ce qui lui permet de sintgrer elle
aussi la hirarchie des classes Java. En fait, la dnition dune classe sans super-classe en pre-
mire ligne amne Java supposer quelle hrite de la classe Object. La classe Motorcycle cre
dans la section prcdente hrite ainsi de la classe Object.
Cration dune hirarchie de classes
Lorsquun trs grand nombre de classes sont cres, dans le cas dun programme trs complexe,
il est logique de penser quelles forment une hirarchie. Elles hritent ainsi de la hirarchie de
classes et peuvent elles-mmes former une hirarchie. Crer une hirarchie ncessite une orga-
nisation pralable du code Java. Cet effort supplmentaire est rcompens par de prcieux
avantages :
Lexique
Lexique
part 01 Page 51 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 52
2
G Le dveloppement des classes dans une hirarchie permet de placer les informations com-
munes de nombreuses classes dans des super-classes. Lutilisation rpte de ces informa-
tions est ensuite possible. En fait, chaque sous-classe obtient ces informations communes
par le mcanisme de lhritage.
G Le changement (ou linsertion) dune classe dans le haut de la hirarchie modie automati-
quement le comportement de ses sous-classes. En effet, ces dernires obtiennent les nouvel-
les informations par hritage et non par recopie du code, de sorte quil nest pas ncessaire
de les modier et de les recompiler.
Soit la classe Motorcycle de lexemple prcdent et un programme qui met en uvre toutes les
caractristiques dune moto. Il sexcute alors correctement, tout fonctionne. Il savre ensuite
ncessaire de crer une classe Car. Car et Motorcycle ont beaucoup de points communs : lune
et lautre comprennent des vhicules ms par des moteurs, possdant des transmissions, des
phares et des compteurs. Une premire raction consisterait ouvrir la classe Motorcycle et
copier dans la nouvelle classe Car une bonne partie des informations dj dnies.
La meilleure solution est de placer les informations communes Car et Motorcycle dans une
hirarchie de classes plus gnrale. Le travail de modication des classes Car et Motorcycle est
important. A linverse, lajout des classes Bicycle, Scooter, Truck, etc., en ncessite peu. En
effet, le comportement commun dni dans la super-classe le rduit de faon signicative.
Voici une conception de hirarchie de classes conforme ce principe. Au sommet se trouve la
classe Object, racine de toutes les classes Java. La classe la plus gnrale commune Car et
Motorcycle se nomme Vehicle. Un vhicule (vehicle) est un moyen de transport dun endroit
un autre. Le seul comportement dni dans la classe Vehicle est le transport dun point a vers
un point b.
Pourquoi ne pas mettre ensuite sous la classe Vehicle les deux classes suivantes : Person-
PoweredVehicle et EnginePoweredVehicle. EnginePoweredVehicle est diffrente de Vehicle
tout court, cause du moteur, auquel sont associs des comportements. Ces comportements
peuvent tre le dmarrage et larrt du moteur, la rserve en essence et huile, et aussi la vitesse
de rotation du moteur. Les vhicules sans moteur (PersonPoweredVehicle) ont eux aussi leur
comportement propre. Par exemple, ils transforment lnergie humaine pour dplacer le vhi-
cule (pdales). La Figure 2.3 illustre tout ceci.
Lajout dautres classes apporte une plus grande prcision : Motorcycle, Car, Truck, etc. Liso-
lement de certains comportements dans des classes intermdiaires est galement possible.
Ainsi, les classes TwoWheeled et FourWheeled peuvent possder diffrents comportements des
vhicules deux ou quatre roues (voir Figure 2.4).
Enn, partir de la sous-classe des deux-roues moteur, on peut dnir la classe des motos,
Motorcycle. On peut dfinir aussi une classe pour les scooters ou une autre pour les mobylettes.
En effet, ce sont aussi des vhicules moteur deux roues, mais avec des caractristiques dif-
frentes de celles des motos.
part 01 Page 52 lundi 1 dcembre 1997 10:05
53
L E P R O G R A M M E U R
O placer des caractristiques comme la marque ou la couleur ? L o elles sintgrent le mieux
dans la hirarchie de classes. Par exemple, dans la classe Vehicle pour que toutes les sous-
classes puissent y accder. Une caractristique ou un comportement doit tre dni une seule
fois dans la hirarchie. Les sous-classes les utilisent ensuite automatiquement.
Fonctionnement de lhritage
Comment fonctionne lhritage ? Comment des instances de classe accdent-elles automatique-
ment aux mthodes et variables des classes situes au-dessus dans la hirarchie ?
Pour les variables dinstance, lorsque vous crez un nouvel objet dans une classe, un emplacement
est attribu chaque variable dnie dans la classe courante et dans toutes ses super-classes.
Ainsi, la combinaison de toutes les classes constitue un modle de lobjet courant. De plus,
chaque objet apporte linformation approprie sa situation.
Objet
Vhicule
Vhicule moteur Vhicule sans moteur
Figure 2.3
Hirarchie de base
des vhicules.
Deux-roues
Vhicule moteur
Quatre-roues
Vhicule moteur
Vhicule moteur
Moto Scooter Mobylette
Figure 2.4
Vhicules deux
et quatre roues.
part 01 Page 53 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 54
2
Les mthodes oprent de manire similaire. Ainsi, les nouveaux objets ont accs tous les noms
de mthodes de leur classe et de leurs super-classes. Par contre, les dnitions de mthodes sont
choisies dynamiquement au moment de lappel. Si lappel porte sur un objet particulier, Java
commence par chercher la dnition de la mthode dans la classe de lobjet. Sil ne la trouve
pas, il poursuit sa recherche dans la super-classe et ainsi de suite (voir Figure 2.5).
Les choses se compliquent lorsque deux mthodes dnies dans une sous-classe et une super-
classe ont la mme signature (nom, nombre et types darguments). Dans ce cas, Java excute la
premire dnition trouve (du bas de la hirarchie vers le haut). Ce mcanisme permet de d-
nir dans une sous-classe une mthode ayant la signature dune mthode de lune de ses super-
classes, et ainsi de masquer cette dernire. On dit que la mthode a t rednie. La rednition
est tudie plus en dtail au Chapitre 7.
La rednition consiste crer dans une sous-classe une mthode dont la signature (nom, nom-
bre et type darguments) est identique celle dune super-classe. La nouvelle mthode "masque"
alors celle de la super-classe (voir Figure 2.6).
Figure 2.5
Dtermination de
lendroit o se trouve
une mthode.
Classe Classe
Le message est envoy
l'objet puis transmis
la hirarchie de classe
j'usqu' ce qu'une dfinition
soit trouve
Dfinition de
la mthode
Classe Classe
Classe
Objet Objet
Lexique
part 01 Page 54 lundi 1 dcembre 1997 10:05
55
L E P R O G R A M M E U R
Hritage simple ou multiple
La forme dhritage tudie prcdemment sappelle hritage simple. Dans lhritage simple,
chaque classe Java a une seule super-classe (mme si une super-classe donne possde ven-
tuellement plusieurs sous-classes).
Dans les autres langages de programmation orients objet comme C++ ou Smalltalk, les classes
peuvent avoir plusieurs super-classes. Elles hritent alors de la combinaison des variables et
mthodes de toutes leurs super-classes. Cela sappelle lhritage multiple. Ce mcanisme puis-
sant permet aux classes davoir toutes sortes de comportements. Malheureusement, il compli-
que souvent la dnition des classes et le code. Pour ces raisons, Java se limite lhritage
simple.
Interfaces et packages
Il reste deux concepts de Java tudier dans ce chapitre : les packages et les interfaces. Ils per-
mettent la conception et la mise en uvre de groupes de classes et du comportement de ces clas-
ses. Le Chapitre 16 couvre plus en dtail les interfaces et les packages, mais il est utile de les
aborder ds prsent.
Chacune des classes Java a une super-classe et une seule. Elle hrite des mthodes et des varia-
bles de sa super-classe, et de toutes les super-classes situes au-dessus. Avec lhritage simple,
les relations entre les classes et leurs fonctions sont faciles comprendre et concevoir. Cepen-
dant, cela savre souvent restrictif. Cest le cas si lon veut mettre en uvre des comportements
Classe Classe
Le message est envoy
l'objet et transmis
la hirarchie des classes
j'usqu' ce qu'une dfinition
soit trouve (la premire)
La dfinition initiale est
remplace par celle de
la mthode polymorphe
Dfinition de
la mthode
initiale
Classe
Classe
Objet Objet
Figure 2.6
Redfinition
de mthodes.
part 01 Page 55 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 56
2
similaires sur diffrentes "branches" de la hirarchie des classes. Java rsout ce problme de
comportement partag grce au concept dinterface. Une interface permet de rassembler un
ensemble de noms de mthodes en un seul endroit, et dajouter ces mthodes en bloc des clas-
ses qui en ont besoin. Notez que les interfaces ne contiennent que les noms de mthodes et les
indications dinterface (par exemple les arguments), mais pas les dnitions des mthodes
concernes.
Bien quune classe Java possde une super-classe et une seule (hritage simple), elle peut impl-
menter un nombre quelconque dinterfaces. Limplmentation dune interface consiste dnir
des mthodes dont les noms gurent dans linterface. Ainsi, deux classes trs diffrentes peu-
vent rpondre aux mmes appels de mthodes mentionnes dans linterface implmente dans
les deux classes. Ces classes peuvent faire des choses trs diffrentes en rponse aux appels de
ces mthodes.
Une interface est une collection de noms de mthodes, sans dnitions, qui peut tre ajoute
des classes pour leur adjoindre des comportements non reprsents par les mthodes que la
classe a dnies elle-mme, ou dont elle a hrit de ses super-classes.
Ce chapitre ne va pas plus loin dans ltude des interfaces, qui sera reprise ultrieurement.
Abordons maintenant le concept des packages.
Les packages regroupent des classes et des interfaces ayant un rapport entre elles, dans une
seule collection ou bibliothque. Grce eux, les groupes de classes sont disponibles unique-
ment sils sont ncessaires, ce qui permet notamment dviter des conits entre noms de classes
de diffrents groupes.
La troisime partie de ce livre tudie les packages en dtail. Le prsent chapitre se limite aux
points suivants :
G Les bibliothques de classes du JDK sont dans le package java. Les classes de ce package
sont compatibles avec toutes les installations Java. La compatibilit nest assure que pour
ces seules classes. Le package java contient dautres packages dont les classes dnissent
le langage, les entres/sorties, la gestion de rseaux de base, les fonctions de fentrage, et
bien entendu les applets. Quand elles sont issues dautres packages (de Sun ou de Netscape),
les classes sutilisent uniquement avec des installations spciques.
G Par dfaut, les classes accdent seulement java.lang (le package du langage de base
fourni avec le package Java). Pour utiliser celles dun autre package, il faut les rfrencer
explicitement avec le nom du package ou les importer dans le chier source.
G Pour rfrencer une classe dun package, il faut spcier les noms des packages dans lesquels
elle se situe diffrents niveaux, et son nom, et sparer ces diffrents noms par un point (.).
Par exemple, la classe color, contenue dans le package awt (awt signie Abstract Windowing
Toolkit), lui-mme inclus dans le package java, est rfrence ainsi : java.awt.color.
Lexique
part 01 Page 56 lundi 1 dcembre 1997 10:05
57
L E P R O G R A M M E U R
Cration dune sous-classe
Pour terminer ce chapitre, vous allez crer une sous-classe dune autre classe et rednir des
mthodes. Cet exemple illustre en outre le fonctionnement des packages.
Un exemple typique de cration dune sous-classe est celui de la cration dune applet. Toutes
les applets sont des sous-classes de la classe Applet (incluse dans le package java.applet).
A la cration dune sous-classe dApplet, les comportements des outils de fentrage et les clas-
ses de mise en page sont rcuprs automatiquement. Ainsi, lapplet est dessine au bon endroit
dans la page et dialogue avec le systme, pour rpondre aux touches de fonction ou la souris
par exemple.
Dans cet exemple, lapplet est similaire celle du chapitre prcdent (Hello World), mais la
chane Hello est crite dans une couleur diffrente et une police plus grande. Pour commencer,
il faut construire la dnition de la classe. Depuis votre diteur de texte, saisissez la dnition
de classe suivante :
public class HelloAgainApplet extends java.applet.Applet {
}
La classe HelloAgainApplet est maintenant cre. Dans linstruction, extends java.applet
.Applet dfinit HelloAgainApplet comme une sous-classe de la classe Applet contenue dans le
package java.applet. Pour accder cette classe, il faut la rfrencer explicitement, cest--dire
indiquer son nom et celui de son package.
Le mot cl public rend la classe disponible pour tout le systme Java ds son chargement.
Public est gnralement utilis pour rendre une classe visible par toutes celles du programme
Java. Pour les applets, le mot cl public est obligatoire (les classes public sont traites dans la
troisime partie de ce livre).
Une dnition de classe vide (sans variables ni mthodes) na aucune utilit. Pour quune sous-
classe serve quelque chose, il faut lui ajouter des mthodes et des variables, ou rednir des
mthodes de sa super-classe. Ajoutez des informations cette classe, entre les deux accolades,
pour la diffrencier de sa super-classe.
Dans un premier temps, ajoutez-lui une variable dinstance contenant un objet Font :
Font f = new Font ("TimesRoman",Font.BOLD,36);
La variable dinstance f contient maintenant une nouvelle instance de la classe Font incluse
dans le package java.awt. Cet objet Font est la police de caractres Times Roman, gras, 36 points.
Dans lapplet Hello World prcdente, la police par dfaut Font utilise tait : 12 points, Times
Roman. Lutilisation dun objet Font permet de changer la police du texte crit par lapplet.
La variable dinstance cre pour contenir lobjet "Font" rend celui-ci accessible toutes les
mthodes de la classe. Crez maintenant une mthode qui lutilise.
part 01 Page 57 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 58
2
Une applet emploie plusieurs mthodes standard dj dnies dans ses super-classes, et qui sont
le plus souvent rednies dans la nouvelle classe applet. Cela concerne les mthodes dinitiali-
sation et de lancement de lapplet, mais aussi celles qui dirigent des oprations comme le mou-
vement et les clics de la souris, ou la libration des ressources en n dexcution. Une de ces
mthodes standard est paint(), qui afche lapplet sur lcran. La dnition par dfaut de
paint() ne fait rien, cest une mthode vide. En redfinissant paint(), on indique simplement
lapplet ce quelle doit afcher. Voici une dnition de paint() :
public void paint (Graphics g) {
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hello again !", 5, 25);
}
En ce qui concerne la mthode paint(), deux notions sont retenir. En premier lieu, tout comme
lapplet, cette mthode est dclare public. Cependant, la raison est diffrente : la mthode
quelle rednit est elle-mme public. Si une mthode dune super-classe est dnie comme
public, une mthode qui la redfinit doit elle aussi tre public, sinon une erreur se produit la
compilation de la classe.
En second lieu, la mthode paint() reoit un seul argument : une instance de la classe Graphics.
Cette classe fournit des comportements indpendants de la plate-forme pour les polices, les cou-
leurs et les oprations de base de dessin de lignes et de formes. La deuxime partie de ce livre
tudie la classe Graphics au travers dapplets plus importantes.
Dans lexemple, la mthode paint() vous a permis de faire trois choses :
G Indiquer lobjet graphics la police utiliser par dfaut, celle contenue dans la variable f.
G Indiquer lobjet graphics la couleur par dfaut, une instance (red) de la classe Color :
G Afcher la chane "Hello Again !" lcran aux positions x et y suivantes : 5 et 25. Cette
chane apparat avec la nouvelle police et la nouvelle couleur.
Cela suft pour une applet aussi simple. Elle ressemble maintenant ceci :
public class HelloAgainApplet extends java.applet.Applet {
Font f = new Font ("TimesRoman",Font.BOLD,36);
public void paint (Graphics g) {
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hello again !", 5, 50);
}
}
Cet exemple prsente une erreur. Pour en prendre connaissance, sauvegardez le chier sous le
nom de la classe HelloAgainApplet.java et compilez-le. Le compilateur Java envoie le message
derreur suivant :
HelloAgainApplet.java :7 :Class Graphics not found in type declaration.
part 01 Page 58 lundi 1 dcembre 1997 10:05
59
L E P R O G R A M M E U R
Ce message apparat parce que les classes rfrences dans lexemple font partie dun package
qui nest pas disponible par dfaut. Le seul package accessible automatiquement dans votre pro-
gramme Java est java.lang. Ainsi, la rfrence la classe Applet dans la premire ligne de la
dnition de classe indique le nom de son package complet (java.applet.Applet). Dans les
lignes suivantes, toutes les autres classes sont rfrences comme si elles taient dj disponi-
bles. Le compilateur sen aperoit et vous dit que vous navez pas accs ces autres classes.
Il existe deux mthodes pour rsoudre ce problme : rfrencer toutes les classes externes avec
le nom du package complet, ou importer la classe ou le package appropri en tte du chier
classe. Le choix importe peu, mais la seconde solution diminue le volume de code crire si
vous vous rfrez souvent des classes dun mme package.
Dans lexemple, importez les classes dont vous avez besoin. Elles sont au nombre de trois :
Graphics, Font et Color, et appartiennent au package java.awt. Pour les importer, placez les
codes suivants en tte du programme, avant la dnition de la classe :
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
Lastrisque (*) remplace le nom de la classe pour limportation dun package complet de
classes (public). Par exemple, pour importer toutes les classes du package awt, utilisez
linstruction suivante :
import java.awt.*;
Les classes sont maintenant correctement importes dans le programme. La compilation de
HelloAgainApplet doit alors seffectuer correctement. Le Listing 2.4 vous montre sa version
nale.
Listing 2.4. La version nale de HelloAgainApplet.java
1:import java.awt.Graphics;
2:import java.awt.Font;
3:import java.awt.Color;
4:
5:public class HelloAgainApplet extends java.applet.Applet {
6:
7: Font f = new Font("TimesRoman",Font.BOLD,36);
8:
9: public void paint(Graphics g) {
10: g.setFont(f);
11: g.setColor(Color.red);
12: g.drawString("Hello again!", 5, 40);
13: }
14:}
Astuce
part 01 Page 59 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 60
2
Pour tester le chier classe obtenu, crez un chier HTML avec ltiquette <APPLET> comme
dans le chapitre prcdent :
<HTML>
<HEAD>
<TITLE>Another Applet</TITLE>
</HEAD>
<BODY>
<P>My second Java applet says:
<BR><APPLET CODE="HelloAgainApplet.class" WIDTH=200 HEIGHT=50>
</APPLET>
</BODY>
</HTML>
Dans cet exemple, le chier classe Java et le chier HTML se trouvent dans le mme rpertoire.
Sauvegardez le chier dans HelloAgainApplet.html. Lancez ensuite le navigateur compatible
Java ou Appletviewer de Java. La Figure 2.7 afche le rsultat de lexcution (la chane "Hello
Again!" est rouge).
Rsum
Une partie des informations de ce chapitre peut sembler trop thorique aux dbutants en pro-
grammation oriente objet. Il ny a pas sen inquiter : ils comprendront mieux en avanant
dans le livre et en crant des classes et des applications.
Une des difcults essentielles de la programmation oriente objet rside dans le nom des
concepts. La POO possde un jargon trs tendu. Voici un rsum des termes et des concepts
abords dans ce chapitre :
Classe : modle dobjet contenant des variables et des mthodes. Celles-ci dnissent le com-
portement et les attributs. Les classes peuvent hriter de variables et de mthodes issues dautres
classes.
Mthode de classe : mthode dnie dans une classe, oprant sur la classe elle-mme et pouvant
tre appele par lintermdiaire de la classe ou lune de ses instances.
Figure 2.7
Lapplet HelloAgain.
part 01 Page 60 lundi 1 dcembre 1997 10:05
61
L E P R O G R A M M E U R
Variable de classe : variable "appartenant" la classe et toutes les instances prises dans leur
ensemble, dont la valeur est stocke dans la classe.
Instance : la mme chose quun objet ; tout objet est une instance dune classe.
Mthode dinstance : mthode dnie dans une classe, qui opre sur une instance de cette
classe. Les mthodes dinstance sont habituellement appeles simplement mthodes.
Variable dinstance : variable appartenant une instance individuelle, dont la valeur est stocke
dans linstance.
Interface : une collection de spcications abstraites de comportements, qui peuvent tre impl-
mentes par les classes individuelles.
Objet : instance concrte dune classe. Tous les objets qui sont des instances dune mme classe
accdent aux mmes mthodes, mais leurs variables dinstance ont en gnral des valeurs dif-
frentes.
Package : collection de classes et dinterfaces. Dans le cas des classes incluses dans dautres
packages que java.lang, le nom du package complet doit tre spci pour les rfrencer, ou
le package doit tre import.
Sous-classe : une classe situe plus bas, dans la hirarchie de lhritage, que sa classe parente
appele super-classe. La cration dune classe est souvent appele sous-classement.
Super-classe : une classe situe au-dessus de ses sous-classes dans la hirarchie de lhritage.
Questions rponses
Q Les mthodes sont des fonctions dnies dans les classes. Si elles ressemblent des
fonctions et se comportent comme elles, pourquoi les appelle-t-on mthodes ?
R Certains langages de programmation orients objet les nomment fonctions (C++ les appelle
fonctions membres). Dautres langages orients objet font la diffrence entre les fonctions
internes une classe ou un objet et les fonctions externes. Dans ce cas, avoir des termes
diffrents est important pour comprendre le fonctionnement de chacune. Java a choisi le
terme de mthode car la diffrence entre fonctions internes et externes nest signicative que
pour dautres langages, et parce que le terme mthode est maintenant couramment utilis
dans la technologie oriente objet.
Q Je comprends ce que reprsentent les variables et mthodes dinstance mais pas la
notion de mthodes et de variables de classe.
R Tout ce qui est fait dans des programmes Java se ralise avec des objets. Malgr tout, il
est utile de stocker certains comportements et attributs dans la classe et non dans lobjet.
Par exemple, pour crer une nouvelle instance dans une classe, il faut une mthode dnie
et disponible dans la classe elle-mme, faute de quoi on ne peut pas crer cette instance.
part 01 Page 61 lundi 1 dcembre 1997 10:05
Programmation oriente objet et Java
Java 1.1 62
2
Les variables de classe, elles, sont souvent utilises lorsque la valeur dun attribut doit tre
partage par toutes les instances de la classe.
En gnral, vous utilisez des variables et des mthodes dinstance. Vous trouverez des
informations dtailles sur les variables et les mthodes de classe dans les chapitre suivants
de cette premire partie.
part 01 Page 62 lundi 1 dcembre 1997 10:05
L E P R O G R A M M E U R
3
3
Les bases de Java
part 01 Page 63 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 64
3
Vous avez vu jusquici les aspects les plus gnraux de la programmation Java, ce quest lex-
cutable dun programme Java, et comment crer des classes simples. Le Chapitre 3 traite plus
en dtail du langage de programmation Java.
Dans ce chapitre, vous ne dnirez ni classes ni objets, et vous naurez pas vous soucier de la
faon dont ces lments communiquent au sein dun programme Java. Vous vous contenterez
dexaminer les instructions Java lmentaires. Elles sont utilises pour raliser les tches de
base dans une dnition de mthode telle que main().
Ce chapitre aborde les thmes suivants :
G Les instructions et expressions de Java
G Les types de donnes et de variables
G Les commentaires
G Les constantes
G Les oprateurs arithmtiques
G Les comparaisons
G Les oprateurs logiques
Java ressemble C++ et, par extension, au langage C. Une grande partie de sa syntaxe est
connue des programmeurs expriments en langage C ou C++. Les notes techniques (comme
celle-ci) les intresseront plus particulirement, puisquelles les informent des diffrences que
C et C++ ou les autres langages traditionnels prsentent avec Java.
Instructions et expressions
Une instruction scrit trs simplement avec Java. Elle reprsente une opration, comme le
montrent les exemples suivants :
int i = 1;
import java.awt.Font;
System.out.println("This motorcycle is a"
+ color + " " + make);
m.engineState = true;
Les instructions retournent parfois des valeurs. Cest le cas pour laddition de deux nombres ou
pour un test dgalit entre deux valeurs. Ces instructions, appeles expressions, sont tudies
plus loin dans ce chapitre.
Les espaces placs dans les instructions Java sont ignors, comme dans le langage C. Une ins-
truction peut gurer sur une seule ligne ou sur plusieurs, ce qui est sans incidence sur la faon
dont elle est lue par le compilateur Java. Ce qui importe, cest que toutes les instructions Java
se terminent par un point-virgule. Labsence de celui-ci provoque une erreur la compilation.
Info
part 01 Page 64 lundi 1 dcembre 1997 10:05
65
L E P R O G R A M M E U R
Java possde galement des instructions composes, ou blocs, utilises comme une instruction
simple. Elles commencent et nissent par des accolades ({}). Le Chapitre 5 apporte des prci-
sions sur la notion de blocs.
Types de donnes et de variables
Les variables sont des emplacements de mmoire dans lesquels on peut stocker des valeurs.
Toute variable a un nom, un type et une valeur. Avant dutiliser une variable, il faut la dclarer.
On peut ensuite lui attribuer une valeur (comme vous allez le voir plus loin, on peut lui attribuer
une valeur en mme temps quon la dclare).
Java possde trois sortes de variables : les variables dinstance, les variables de classe et les
variables locales.
Les variables dinstance dterminent les attributs ou ltat dun objet donn. Les variables de
classe ont le mme type de fonction, mais leurs valeurs sappliquent tous les objets de la classe
(et la classe elle-mme) et non un seul objet.
Les variables locales sont dclares et utilises dans les dnitions de mthodes. Elles servent
de compteur dindex dans une boucle, de variable temporaire ou encore, elles contiennent des
valeurs utiles la dnition de la mthode. Elles sont aussi utilises dans les blocs, tudis au
Chapitre 5. La dnition de variable et sa valeur cessent dexister aprs lexcution de la
mthode (ou du bloc). Elles sont utiles pour stocker les informations destines une seule
mthode. On utilise des variables locales pour stocker des donnes utilises par une seule
mthode (ou un seul bloc), et les variables dinstance pour les donnes utilises par plusieurs
mthodes dans un objet.
Les variables locales et les variables dinstance sont dclares de faon similaire, mais laccs
et lattribution de valeurs aux variables dinstance ou de classe diffrent de ceux des variables
locales. Ce chapitre traite plus particulirement de lutilisation des variables dans les dnitions
de mthodes, cest--dire des variables locales. Le chapitre suivant montre comment sy pren-
dre avec les variables de classe et les variables dinstance.
Contrairement dautres langages, Java ne possde pas de variable globale. Les variables
dinstance et de classe les remplacent. Elles servent communiquer des informations "globa-
les" dans et entre les diffrents objets. Comme Java est un langage orient objet, il faut penser
en termes dobjets et de dialogues entre objets, et non en termes de programmes.
Info
part 01 Page 65 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 66
3
Dclaration des variables
Une variable doit tre dclare avant dtre utilise dans un programme. Sa dclaration se com-
pose dun type et dun nom de variable :
int myAge;
String myName;
boolean isTired;
Les dnitions de variables se placent nimporte o dans la dnition de la mthode (l o il
peut y avoir une instruction Java habituelle), mais elles sont souvent dclares en tte :
public static void main (String args[]) {
int count;
String title;
boolean isAsleep;
...
}
Toutes les variables du mme type peuvent tre dclares ensemble :
int x, y, z;
String firstName, LastName;
Linitialisation dune variable est possible dans la dclaration :
int myAge, mySize, numShoes = 28;
String myName = "Laura";
boolean isTired = true;
int a = 4, b = 5, c = 6;
Si une ligne contient plusieurs variables mais une valeur dinitialisation unique (voir premire
ligne de lexemple), seule la dernire variable est initialise. Pour initialiser plusieurs variables
sur une seule ligne, il suft de les sparer avec une virgule, comme dans la dernire ligne de
lexemple ci-avant.
Avant dutiliser une variable locale, il faut lui attribuer une valeur (la compilation du pro-
gramme Java choue si une variable locale est vide). Pour cette raison, il est prfrable dinitia-
liser les variables locales dans leurs dclarations. Cette contrainte nexiste pas pour les variables
dinstance ou de classe, qui ont une valeur par dfaut en fonction de leur type :
null pour les instances de classe,
0 pour les variables numriques,
\0 pour les caractres, et
false pour les boolens.
part 01 Page 66 lundi 1 dcembre 1997 10:05
67
L E P R O G R A M M E U R
Noms de variables
Les noms de variables du langage Java commencent par une lettre, le signe de soulignement (_)
ou le signe dollar ($). Ils ne peuvent pas commencer par un chiffre. Les caractres suivants sont
des chiffres ou des lettres. Les symboles comme %, *, @ ou / doivent tre vits car ils sont sou-
vent rservs aux oprateurs de Java.
Java utilise galement le jeu de caractres Unicode. Unicode regroupe tous les caractres ASCII
standard et plusieurs milliers dautres caractres. La plupart des alphabets internationaux sont
ainsi reprsents. Les noms de variables peuvent alors contenir des caractres accentus ou tout
autre glyphe, condition que le code du caractre Unicode soit suprieur 00C0.
La codication Unicode est regroupe en deux volumes contenant des milliers de caractres. Si
Unicode nest pas rellement ncessaire, il est prfrable de se limiter aux chiffres et aux lettres
pour nommer les variables.
Enn, Java diffrencie les majuscules et les minuscules. Aussi, la variable X est-elle diffrente
de la variable x. Un autre exemple : rose nest ni une Rose ni une ROSE.
Par convention, un nom de variable Java doit tre reprsentatif de cette variable. Il se compose
souvent de plusieurs mots combins. Le premier est crit en minuscules et les mots suivants
commencent par une majuscule :
button theButton;
long reallyBigNumber;
boolean currentWeatherStateOfPlanetXShortVersion;
Types de variables
Une dclaration de variable se compose dun nom mais aussi dun type, qui dtermine les
valeurs possibles de cette variable. Un type de variable :
G un des huit types de donnes primaires,
G un nom de classe,
G un tableau.
La dclaration et lutilisation des variables tableaux sont traites au Chapitre 5. Le prsent cha-
pitre se limite aux types de donnes primaires et au type de classe.
Types de donnes primaires
Les huit types de donnes primaires regroupent les types entiers usuels, les nombres virgule
ottante, les caractres et les valeurs boolennes. Il sont appels primaires car ils sont construits
dans le systme et ne sont pas des objets, ce qui rend leur utilisation plus efcace. Ils sont ind-
pendants de la machine, et par suite, leur taille et leurs caractristiques ne varient pas selon les
programmes.
Info
part 01 Page 67 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 68
3
Il existe quatre types dentiers dans Java, correspondant chacun un intervalle de valeurs (voir
Tableau 3.1). Ils sont tous signs, et acceptent donc les nombres ngatifs ou positifs. Le choix
du type dpend des valeurs maximales et minimales que peut prendre la variable. Si une valeur
stocke devient trop grande pour le type de la variable, elle est tronque, sans autre indication.
Les nombres virgule ottante sont utiliss pour les nombres comportant une partie dcimale.
Dans Java, ils respectent les rgles IEEE 754 (un standard international pour larithmtique et
la dnition des nombres virgule ottante). Java contient deux types de nombres virgule
ottante : float (32 bits, simple prcision) et double (64 bits, double prcision).
Le type char dnit les caractres. Comme Java utilise la codication Unicode, le type char est
non sign, avec une prcision de 16 bits.
Enn, le type boolean accepte deux valeurs : true ou false. Pour Java, contrairement aux lan-
gages analogues C, boolean nest pas un nombre. Il ne peut donc tre trait comme tel. Tous
les tests dune variable boolenne doivent rechercher les valeurs true ou false.
Notez que tous les types de donnes primaires sont indiqus en minuscules. Ce point est impor-
tant, car il existe aussi des classes de mmes noms, mais commenant par une majuscule, et dont
le comportement est diffrent. Par exemple, le type primaire boolean est diffrent de la classe
Boolean. Vous en apprendrez davantage sur ces classes particulires et sur leur utilisation au
Chapitre 4.
Types de classes
Les variables de Java peuvent aussi tre dclares pour recevoir un objet dune classe
particulire :
String LastName;
Font basicFont;
OvalShape myOval;
Ces variables reoivent uniquement les objets dune classe donne ou de lune de ses sous-clas-
ses. Cette seconde variante est utile lorsquune variable doit pouvoir contenir des instances de
diverses classes ayant une mme super-classe. Par exemple, dans le cas dun ensemble de clas-
ses de fruits (Pomme, Poire, Fraise, etc.), toutes hritires de la classe gnrale Fruit, si vous
dclarez une variable de type Fruit, cette variable peut contenir des instances de nimporte
Tableau 3.1 Les types dentiers
Type Taille Intervalle de valeurs
byte 8 bits -128 127
short 16 bits -32 768 32 767
int 32 bits -2 147 483 648 2 147 483 647
long 64 bits -9 223 372 036 854 775 808 9 223 372 036 854 775 807
part 01 Page 68 lundi 1 dcembre 1997 10:05
69
L E P R O G R A M M E U R
laquelle des sous-classes de Fruit. Si lon dclare une variable de type Object, cette variable
peut contenir nimporte quel objet.
Java ne possdant pas dinstruction typedef (comme en C ou C++), la dclaration dun nou-
veau type passe par celle dune nouvelle classe. Il est ensuite possible de dclarer une variable
du type de cette classe.
Attribution de valeurs aux variables
Lorsquune variable a t dclare, on peut lui attribuer une valeur au moyen de loprateur
daffectation (=), de la faon suivante :
size = 14;
tooMuchCaffeine = true;
Commentaires
Java possde trois sortes de commentaires, deux pour les commentaires ordinaires du code
source, et une troisime pour le systme particulier de documentation javadoc.
Les symboles /* et */ entourent des commentaires multilignes. Le texte compris entre ces deux
bornes est ignor :
/* I dont know how I wrote this next part; I was working
really late one night and it just sort of appeared. I
suspect the code elves did it for me. It might be wise
not to try and change it.
*/
Les commentaires ne simbriquent pas ; autrement dit, vous ne pouvez pas placer un commen-
taire lintrieur dun commentaire.
Le double slash (//) prcde les commentaires dans une ligne. Tout le texte situ entre le double
slash et la n de ligne est ignor :
int vices =7; // Ceci est un commentaire
Enn, les commentaires spciaux destins au systme javadoc commencent avec /** et se
terminent par */. Javadoc gnre de la documentation API partir du code. Ce livre ne traite
pas javadoc. Pour obtenir des informations sur cet outil, consultez la documentation fournie
avec le JDK ou la page daccueil Java de Sun (http://java.sun.com).
Info
part 01 Page 69 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 70
3
Constantes
Les constantes stockent des valeurs simples utiles aux programmes, suivant le principe : ce que
vous tapez, cest aussi ce que vous obtenez.
Constante est un terme de programmation. La frappe de 4 dans un programme Java entrane la
mmorisation de la valeur 4 dans un entier. Si vous tapez a vous obtenez un caractre ayant
la valeur a.
Il existe plusieurs types de constantes dans Java : nombres, caractres, chanes et valeurs boo-
lennes.
Constantes nombre
Les entiers sont reprsents par plusieurs types de constantes. Par exemple, le nombre 4 est une
constante entire dcimale de type int (mme si cette valeur peut tre attribue une variable
de type byte ou short, vu sa taille). Une constante entire dcimale trop grande pour un type
int est automatiquement de type long. Ajouter L ou l un nombre force ce type long (4L est un
entier long de valeur 4). Les entiers ngatifs sont prcds dun signe moins (-) : par exemple,
-45.
Les entiers sexpriment en octal ou en hexadcimal. Si un entier commence par 0, le nombre est
en octal : 0777 ou 0004, par exemple. Si lentier commence par 0x (ou 0X), cest un nombre hexa-
dcimal (0xFF, 0XAF45). Les nombres hexadcimaux sont constitus de chiffres (0 9) et de
lettres majuscules ou minuscules (a [ou A] f [ou F]).
Les constantes virgule ottante sont gnralement constitues de deux parties : la part entire
et la part dcimale (par exemple 5.677777). Elles deviennent alors des nombres virgule ot-
tante de type double sans tenir compte de la prcision. Ajouter la lettre f (ou F) un nombre
force le type float : 2.56F.
Pour avoir des exposants avec les constantes virgule ottante, il faut ajouter les lettres e ou E
suivies de lexposant (qui peut tre ngatif) la n du nombre : 10e45 ou .36E-2.
Constantes boolennes
Les constantes boolennes sont reprsentes par deux mots cls : true ou false. Vous pouvez
utiliser ces mots cls partout o vous voulez effectuer un test, ou bien encore, comme les deux
seules valeurs possibles pour les variables boolennes.
Constantes caractre
Les constantes caractre se composent dune lettre entoure de guillemets simples : a, #,
3, etc. Ces caractres sont stocks sous forme de codes Unicode 16 bits. Le Tableau 3.2
part 01 Page 70 lundi 1 dcembre 1997 10:05
71
L E P R O G R A M M E U R
prsente les codes spciaux. Ce sont des caractres non imprimables ou Unicode. Dans les
squences, la lettre d reprsente un chiffre (0 9) ou une lettre (a f ou A F).
Les programmeurs en C et C++ auront certainement remarqu labsence des caractres de
contrle \a (alarme) et \v (tabulation verticale).
Constantes chane
Une chane est une combinaison de caractres. En langage Java, les chanes sont des objets de
la classe String, et non de simples tableaux de caractres, comme dans C ou C++. De plus, elles
empruntent certaines de leurs caractristiques aux tableaux (la possibilit de tester leur lon-
gueur, dajouter ou deffacer certains caractres). Comme ce sont des objets part entire pour
Java, elles possdent des mthodes permettant de les combiner, de les tester ou de les modier
trs facilement.
Les chanes sont reprsentes par une srie de caractres entoure de guillemets doubles :
"Hi, Im a string literal. "
"" //une chaine vide
Les chanes peuvent contenir des caractres de contrle (retour la ligne, tabulation ou carac-
tres Unicode) :
"A string with a \t tab in it"
"Nested strings are \"strings inside of\" other strings"
"This string brought to you by Java\u2122"
Dans le dernier exemple, la squence Unicode \u2122 produit le symbole .
Tableau 3.2 Codes des caractres spciaux
Squence Signication
\n Retour la ligne
\t Tabulation
\b Retour arrire
\r Retour chariot
\f Saut de page
\\\ Slash invers
\ Guillemet simple
\" Guillemet double
\ddd Octal
\xdd Hexadcimal
\udddd Caractre Unicode
Info
part 01 Page 71 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 72
3
Pouvoir reprsenter un caractre par son code Unicode ne signie pas quil peut tre afch.
Lordinateur ou le systme dexploitation utilis ne supporte peut-tre pas Unicode, ou votre
police de caractres peut ne pas contenir son image. La reconnaissance des squences
Unicode par Java offre un moyen de coder des caractres spciaux pour des systmes compa-
tibles Unicode. Java 1.02 tait plus limit cet gard que Java 1.1 ; en Java 1.1, vous pouvez
afcher nimporte quel caractre Unicode, ds lors quil existe une image pour ce caractre.
Pour plus dinformations sur Unicode, consultez la page daccueil Unicode http://unicode.org.
Lutilisation dune constante chane dans un programme Java entrane la cration automatique
dun objet de la classe String avec la valeur fournie. Cest la particularit des chanes. Les
autres constantes ne se comportent pas ainsi : les types primaires ne sont pas de vritables
objets, et la cration dun nouvel objet, autre quun objet String, ncessite la cration explicite
dune nouvelle instance de classe.
Oprateurs et expressions
Dans Java, une expression est la plus simple forme dune instruction accomplissant quelque
chose. Toutes les expressions, lorsquelles sont values, retournent une valeur (les autres ins-
tructions ne le font pas ncessairement).
Les oprations arithmtiques et les tests dgalit sont des expressions. Une expression retourne
une valeur, qui est attribue une variable ou teste dans dautres instructions.
La plupart des expressions Java utilisent des oprateurs. Les oprateurs sont des symboles
spciaux, pour des oprations arithmtiques, diffrentes formes daffectation, des oprations
dincrmentation ou de dcrmentation, ainsi que pour des oprations logiques.
Les expressions sont des instructions qui retournent une valeur.
Les oprateurs sont des symboles spciaux couramment utiliss dans les expressions.
Oprateurs arithmtiques
Java possde cinq oprateurs arithmtiques de base (voir Tableau 3.3).
Tableau 3.3 Oprateurs arithmtiques
Oprateur Signication Exemple
+ Addition 3 + 4
- Soustraction 5 - 7
* Multiplication 5 * 5
/ Division 14 / 7
% Modulo 20 % 7
Info
Lexique
part 01 Page 72 lundi 1 dcembre 1997 10:05
73
L E P R O G R A M M E U R
Tous ces oprateurs utilisent deux oprandes et sont placs entre ces derniers. Loprateur de
soustraction (-) peut aussi servir inverser le signe dun oprande.
Le rsultat de la division de deux entiers est un entier : comme les entiers nont pas de partie
dcimale, le reste de la division est ignor. Par exemple, ce rsultat de lexpression 31 / 9 est 3.
Loprateur modulo (%) donne le reste de la division de deux oprandes. Par exemple, 31 % 9
gale 4 (3 fois 9 gale 27, plus 4 pour obtenir 31).
Pour les entiers, le rsultat dune opration est de type int ou long, indpendamment du type
des oprandes (les types short ou byte sont automatiquement convertis en int). Les grands
rsultats sont de type long et les autres de type int. Les oprations arithmtiques sur un entier
et un nombre virgule ottante ont pour rsultat un nombre virgule ottante. Les spcica-
tions du langage Java dcrivent les mcanismes de manipulation et de conversion des donnes
numriques dun type vers un autre. Le Listing 3.1 donne un exemple darithmtique simple en
Java.
Listing 3.1 Exemple doprations arithmtiques simples
1: class ArithmeticTest {
2: public static void main (String[] args) {
3: short x = 6;
4: int y = 4;
5: float a = 12.5f;
6: float b = 7f;
7:
8: System.out.println("x is " + x + ", y is " + y);
9: System.out.println("x + y = " + (x + y));
10: System.out.println("x - y = " + (x - y));
11: System.out.println("x / y = " + (x / y));
12: System.out.println("x % y = " + (x % y));
13:
14: System.out.println("a is " + a + ", b is " + b);
15: System.out.println("a / b = " + (a / b));
16: }
17:
18: }
Rsultat :
x is 6, y is 4
x + y = 10
x - y = 2
x / y = 1
x % y = 2
a is 12.5, b is 7
a / b = 1.78571
part 01 Page 73 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 74
3
Dans lexemple (remarquez la mthode main()), les lignes 3 6 dnissent quatre variables.
Les deux premires, x et y, sont des entiers (type int). Les suivantes, a et b, sont des nombres
virgule ottante (type float). Un rappel : le type par dfaut des constantes virgule ottante
(comme 12.5) est double. Pour obtenir des nombres de type float, il faut les faire suivre de la
lettre f (lignes 5 et 6).
La suite du programme effectue des oprations mathmatiques simples avec des entiers et des
nombres virgule ottante. Il afche ensuite les rsultats.
Notez aussi la prsence de la mthode System.out.println(), utilise dans les chapitres prc-
dents sans explication. Cette mthode envoie simplement un message vers la sortie standard de
votre systme (lcran), une fentre particulire ou un chier log. La destination est fonction du
systme et de lenvironnement de dveloppement utiliss. La mthode reoit un seul argument
(une chane), le signe + permettant la concatnation de valeurs dans une chane.
A propos doprations mathmatiques, signalons deux particularits de Java. La premire est
la classe Math, qui fournit de nombreuses oprations mathmatiques courantes comme la racine
carre, la valeur absolue, le cosinus, etc., que vous verrez de plus prs au chapitre suivant,
"Travailler avec les objets". La seconde particularit est propre Java 1.1 : les classes BigDe-
cimal et BigInteger. Ces classes fournissent des mcanismes pour stocker et traiter des nom-
bres extrmement grands, appels "bignums", qui peuvent ltre trop pour les types primaires
Java standard. Si ce sujet vous intresse, consultez la documentation API du package
java.math.
Affectations
Laffectation des variables est une forme dexpression qui retourne une valeur. Aussi est-il pos-
sible de chaner des variables :
x = y = z = 0;
Dans cet exemple, les trois variables prennent la valeur 0.
La partie droite de lexpression daffectation est toujours value avant lopration daffecta-
tion. Une expression comme x = x + 2 est donc traite ainsi : 2 est ajout la valeur de x, puis le
rsultat est affect x. Ce type dopration est tellement courant que Java en possde une ver-
sion abrge emprunte C et C++. Le Tableau 3.4 liste ces oprateurs daffectation combine.
Tableau 3.4 Oprateurs daffectation
Expression Signication
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y
Info
part 01 Page 74 lundi 1 dcembre 1997 10:05
75
L E P R O G R A M M E U R
Les oprations daffectation abrge et les combinaisons quelles sont censes remplacer ne
sont pas strictement quivalentes, notamment quand x et y sont elles-mmes des expressions
complexes et dans la mesure o le code exploite certains effets de bord de ces expressions com-
plexes. Dans la plupart des cas, cependant, les deux formes sont quivalentes, dun point de vue
fonctionnel. Pour obtenir des informations complmentaires sur lvaluation des expressions
complexes, consultez les spcications du langage Java.
Incrmentation et dcrmentation
Comme en C ou C++, les oprateurs ++ et permettent dincrmenter ou de dcrmenter de 1
la valeur dune variable. Par exemple, x++ ajoute 1 la valeur de x comme le ferait lexpression
x = x + 1. De la mme faon, x-- diminue de 1 la valeur de x. (Contrairement C et C++, Java
permet x dtre du type virgule ottante).
Ces deux oprateurs se placent devant ou derrire la valeur incrmenter ou dcrmenter.
Dans le cas dune expression simple, leur position importe peu. A linverse, pour des affecta-
tions complexes avec attribution du rsultat de lexpression qui incrmente ou dcrmente, ce
choix fait toute la diffrence.
Soit les deux expressions suivantes :
y = x++;
y = ++x;
Elles donnent des rsultats diffrents. Quand les oprateurs sont placs aprs la valeur (x++ ou
x--), y prend la valeur de x avant incrmentation. Avec la notation en prfixe, la valeur de x est
attribue y aprs incrmentation. Le Listing 3.2 illustre le fonctionnement de ces oprateurs.
Listing 3.2 Test des oprateurs dincrment en mode postxe ou prxe
1: class PrePostFixTest {
2:
3: public static void main (String args[]) {
4: int x = 0;
5: int y = 0;
6:
7: System.out.println("x and y are " + x + " and " + y);
8: x++;
9: System.out.println("x++ results in " + x);
10: ++x;
11: System.out.println("++x results in " + x);
12: System.out.println("Resetting x back to 0.");
13: x = 0;
14: System.out.println("-------------");
15: y = x++;
16: System.out.println("y = x++ (postfix) results in:");
17: System.out.println("x is " + x);
18: System.out.println("y is " + y);
Info
part 01 Page 75 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 76
3
19: System.out.println("-------------");
20:
21: y = ++x;
22: System.out.println("y = ++x (prefix) results in:");
23: System.out.println("x is " + x);
24: System.out.println("y is " + y);
25: System.out.println("-------------");
26:
27: }
28:
29: }
Rsultat :
x and y are 0 and 0
x++ results in 1
++x results in 2
Resetting x back to 0.
------
y = x++ (postfix) results in:
x is 1
y is 0
------
y = ++x (prefix) results in:
x is 2
y is 2
------
Dans la premire partie de lexemple, la valeur de x est simplement augmente avec les nota-
tions en postxe et en prxe des oprateurs dincrment. Dans les deux cas, la valeur de x aug-
mente de 1. Dans une forme simple comme celle-ci, les deux notations donnent le mme
rsultat.
Dans la deuxime partie de lexemple, lexpression y = x++ utilise la notation en postxe de
loprateur dincrment. La valeur de x est alors incrmente aprs son affectation y. y prend
donc la valeur initiale de x (0), qui est ensuite augmente de 1.
Dans la troisime partie, lexpression y = ++x utilise la notation en prxe. La valeur de x est
alors incrmente avant dtre attribue y. La valeur 1 de x passe donc 2, puis elle est attri-
bue y. x et y nissent avec la mme valeur : 2.
Dun point de vue technique, cette description est incorrecte. En ralit, Java value toujours
entirement toutes les expressions droite dune affectation avant dattribuer cette valeur une
variable. Affecter x y avant dincrmenter x ne reprsente donc pas la ralit. En fait, Java
mmorise la valeur de x, value x (incrment) puis attribue lancienne valeur de x y. Pour la
majorit des cas simples, cette distinction a peu dimportance, mais pour les expressions plus
complexes, elle affecte le comportement de lexpression complte. Pour obtenir des informa-
tions complmentaires sur lvaluation des expressions dans Java, consultez les spcications
du langage Java.
Info
part 01 Page 76 lundi 1 dcembre 1997 10:05
77
L E P R O G R A M M E U R
Comparaisons
Java possde plusieurs expressions permettant deffectuer des comparaisons (voir Tableau 3.5).
Chacune delles retourne une valeur boolenne (true ou false).
Oprations logiques
Les expressions dont le rsultat est une valeur boolenne (par exemple, les oprations de com-
paraison) peuvent tre combines laide doprateurs logiques, ET, OU, XOU (ou exclusif) et
NON.
Le ET logique est reprsent par les oprateurs & ou &&. Lexpression est vraie si les deux op-
randes sont galement vrais. Si lun des deux est faux, alors la combinaison est fausse. La dif-
frence entre les deux oprateurs rside dans lvaluation de lexpression. Avec &, les deux cts
de lexpression sont valus indpendamment des rsultats obtenus. Avec le &&, si la partie gau-
che de lexpression est fausse, la combinaison est value fausse et la partie droite ignore.
Le OU est symbolis par | ou ||. Les expressions OU sont vraies si lun des deux oprandes est
vrai. Sils sont tous les deux faux, lexpression est value fausse. Comme pour & et &&, lop-
rateur | value les deux cts de lexpression indpendamment des rsultats. Avec ||, si la par-
tie gauche de lexpression est vraie, lexpression complte est value vraie et la partie droite
ignore.
Le OU EXCLUSIF ^ sajoute ces deux oprations logiques. Il retourne la valeur true (vrai)
si les deux oprandes sont diffrents (lun vrai et lautre faux ou vice versa). Dans le cas con-
traire, il retourne la valeur false (faux).
En gnral, les oprateurs utiliss pour de vraies combinaisons logiques sont && et ||. Les op-
rateurs &, | et ^ sont plutt utiliss pour des oprations logiques au niveau bit.
Le NON logique est reprsent par loprateur !. Il ne concerne quun argument de lexpression.
La valeur dune expression NON est la ngation de lexpression. Si x est vrai, !x est faux.
Tableau 3.5 Oprateurs de comparaison
Oprateur Signication Exemple
== Egal x == 3
!= Diffrent x != 3
< Infrieur x < 3
> Suprieur x > 3
<= Infrieur ou gal x <= 3
>= Suprieur ou gal x >= 3
part 01 Page 77 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 78
3
Oprateurs sur les bits
Pour terminer, voici un court rsum des oprateurs Java au niveau des bits. Ils sont pour la plu-
part issus des langages C et C++. Ils permettent de raliser des oprations directement sur les
bits des nombres entiers. Ce livre ne traite pas ces oprations. Cest un sujet pointu trs bien
expliqu dans les manuels de C ou C++. Le Tableau 3.6 prsente ces oprateurs.
Hirarchie des oprateurs
La hirarchie des oprateurs indique lordre dvaluation des expressions. Dans certains cas,
elle dtermine la valeur de lexpression complte. Soit lexpression suivante :
y = 6 + 4 / 2
La valeur de y est 5 ou 8, selon la partie de lexpression qui est value en premier (6 + 4 ou
4 / 2). La hirarchie des oprateurs impose un ordre de traitement des oprations. Le rsultat
dune expression est ainsi prvisible. En gnral, lincrmentation et la dcrmentation sont
traites avant les oprations arithmtiques, les oprations arithmtiques sont values avant les
comparaisons, et les comparaisons avant les expressions logiques. Les affectations sont traites
en dernier.
Le Tableau 3.7 indique la hirarchie propre aux diffrents oprateurs de Java. Les oprateurs de
la premire ligne du tableau sont valus en premier, ceux de la deuxime en second, etc. Les
oprateurs prsents dans une mme ligne ont une " priorit " gale et sont valus de gauche
droite (position dans lexpression). Ce tableau montre que la division est traite avant laddition :
le rsultat de y = 6 + 4 / 2 est donc 8.
Tableau 3.6 Oprateurs sur les bits
Oprateur Signication
& ET bit bit
| OU bit bit
^ OU exclusif bit bit
<< Dcalage gauche bit bit
>> Dcalage droite bit bit
>>> Dcalage droite bit bit avec remplissage par des 0
~ Ngation bit bit
<<= Dcalage gauche et affectation (x = x << y)
>>= Dcalage droite et affectation (x = x >> y)
>>>= Dcalage droite, remplissage par des 0 et affectation (x = x >>> y)
x &= y ET affectation (x = x & y)
x |= y OU affectation (x + x | y)
x ^= y NON affectation (x = x ^ y)
part 01 Page 78 lundi 1 dcembre 1997 10:05
79
L E P R O G R A M M E U R
Pour changer lordre de traitement, il suft de mettre entre parenthses les expressions valuer
en premier. De plus, les parenthses simbriquent, celles qui se trouvent le plus lintrieur
tant traites en premier. Lexpression suivante a pour rsultat 5, car lexpression 6 + 4 est va-
lue dabord :
y = (6 + 4) / 2
Les parenthses sont souvent utiles pour clarier lordre de traitement dans une expression. En
fait, elles facilitent la lecture et la comprhension du code. Lajout de parenthses nayant aucun
effet nocif, il ny a pas se restreindre, surtout si cet ajout facilite la comprhension de lva-
luation des expressions.
Tableau 3.7 Ordre de traitement des oprateurs
Oprateur Commentaire
. [] () Les parenthses () groupent les expressions. Le point (.) permet daccder
aux mthodes et variables dans les classes et les objets (voir le chapitre
suivant). [] est utilis pour les tableaux (cet oprateur sera tudi dans un
autre chapitre de la premire partie de louvrage).
++ -- ! ~ instanceof instanceof retourne vrai (true) si lobjet appartient la classe dsigne,
et faux (false) sil appartient lune de ses super-classes (voir chapitre
suivant).
new (type) expression Loprateur new cre de nouvelles instances de classes. Dans ce cas, les ()
attribuent un autre type une valeur (voir le chapitre suivant).
* / % Multiplication, division, modulo.
+ - Addition, soustraction.
<< >> >>> Dcalages gauche et droite bit bit.
< > >= <= Comparaison.
== != Egalits.
& ET.
^ OU exclusif.
| OU.
&& ET logique.
|| OU logique.
? : Raccourcis pour if...then...else (voir Chapitre 5).
= += -= *= /= %= ^= Affectations diverses.
&= |= <<= >>= >>>= Affectations diverses (suite).
part 01 Page 79 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 80
3
Arithmtique sur les chanes
Une particularit de Java est lutilisation de loprateur daddition (+) pour crer et concatner
des chanes. Dans la plupart des exemples prcdents apparaissaient des lignes comme celle-ci :
System.out.println(name + " is a " + color " beetle");
Cette ligne afche une chane de caractres dans laquelle la valeur des variables (ici name et
color) est insre aux endroits indiqus dans linstruction.
Loprateur + employ avec des chanes ou dautres objets construit une chane unique. Cest
le rsultat de la concatnation de tous les oprandes. Si lun des oprandes nest pas une chane,
il est automatiquement converti en chane. Ceci facilite la cration des lignes en sortie de ce
type.
Un objet ou un type peut tre converti en chane grce la mthode toString(). Tout objet pos-
sde une reprsentation chane par dfaut (le nom de la classe suivi daccolades), mais les clas-
ses rednissent gnralement toString() pour offrir une meilleure reprsentation en sortie.
La concatnation des chanes facilite la construction de lignes comme dans lexemple prc-
dent. Pour crer une chane, il vous suft den runir les diffrents composants (descriptions et
variables) et denvoyer le rsultat vers la sortie standard, lcran, une applet, etc.
Loprateur +=, tudi prcdemment, est aussi utilis dans une chane. Linstruction :
myName += " Jr. ";
est quivalente :
myName = myName + " Jr. ";
exactement comme pour les nombres. Dans ce cas, la valeur de myName est modie (John Smith
devient John Smith Jr.).
Rsum
Un programme Java est constitu essentiellement de classes et dobjets, eux-mmes constitus
de mthodes et de variables. Les mthodes sont construites laide dinstructions et dexpres-
sions tudies dans ce chapitre. Ce sont les bases de la cration de classes et de mthodes. Leur
association permet dobtenir un programme Java complet.
Nous avons donc tudi : les variables, la faon de les dclarer et de leur attribuer une valeur,
les constantes pour crer facilement des nombres, les caractres et les chanes, les oprations
arithmtiques, les tests, etc. Cette syntaxe de base permet daborder le chapitre suivant, cest--
dire dapprendre travailler avec les objets et construire des programmes Java utiles et simples.
Info
part 01 Page 80 lundi 1 dcembre 1997 10:05
81
L E P R O G R A M M E U R
Pour terminer, le Tableau 3.8 prsente tous les oprateurs vus dans ce chapitre. Cest une
rfrence.
Tableau 3.8 Rsum des oprateurs
Oprateur Signication
+ Addition
- Soustraction
* Multiplication
/ Division
% Modulo
< Infrieur
> Suprieur
<= Infrieur ou gal
>= Suprieur ou gal
!= Diffrent de
&& ET logique
|| OU logique
! NON logique
& ET bit bit
| OU bit bit
^ OU exclusif bit bit
<< Dcalage gauche bit bit
>> Dcalage droite bit bit
>>> Dcalage droite bit bit avec remplissage par des 0
~ Ngation bit bit
= Affectation
++ Incrmentation
-- Dcrmentation
+= Addition et affectation
-= Soustraction et affectation
*= Multiplication et affectation
/= Division et affectation
%= Modulo et affectation
&= ET et affectation
|= OU et affectation
<<= Dcalage gauche et affectation
>>= Dcalage droite et affectation
>>>= Dcalage droite, remplissage par des 0 et affectation
part 01 Page 81 lundi 1 dcembre 1997 10:05
Les bases de Java
Java 1.1 82
3
Questions rponses
Q Ny a-t-il aucun moyen de dnir les constantes ?
R Java interdit la cration de constantes locales. Il permet uniquement la cration de variables
de classe et dobjets constants (voir chapitre suivant).
Q Que se passe-t-il si la valeur attribue une variable de type entier nappartient pas
lintervalle des valeurs autorises pour le type dclar ?
R La variable nest pas convertie dans le type adquat. Il se produit un dpassement de capa-
cit (overflow). Un nombre trop grand pour une variable donne est remplac par le plus
petit nombre ngatif du type ; on compte ensuite nouveau jusqu zro.
Comme cela donne des rsultats fantaisistes (et faux), assurez-vous davoir dclar le bon
type dentier. Si un nombre prsente un risque de dpassement de capacit, choisissez le
type suprieur.
Q Comment trouver le type dune variable donne ?
R Ce nest pas possible avec les types de base (int, float, boolean). Si vous avez besoin dun
type dtermin, il faut convertir la valeur en question dans le type dsir (voir chapitre
suivant).
Avec des types de classe, vous pouvez utiliser loprateur instanceof (voir chapitre suivant).
Q Pourquoi y a-t-il tant doprateurs raccourcis pour les oprations arithmtiques et les
affectations ? Cela complique la lecture du code.
R La syntaxe de Java est base sur la syntaxe de C++ et donc sur celle de C. Un des objectifs
du langage C est de raliser des choses volues avec le minimum de frappe. Cest pour cette
raison que les oprateurs raccourcis sont couramment utiliss.
Rien ne vous oblige les utiliser dans vos programmes. Si vous pensez gagner en lisibilit
du code, choisissez la forme longue.
Q Vous avez trait les oprations mathmatiques simples dans la section consacre aux
oprateurs. Puis-je supposer que Java a dautres moyens pour faire des oprations
mathmatiques plus complexes ?
R En effet, une classe spciale du package java.lang, appele java.lang.Math, comporte un
certain nombre de mthodes pour le calcul exponentiel, la trigonomtrie et dautres opra-
tions mathmatiques de base. En fait, comme on peut appeler ces mthodes en utilisant la
classe Math elle-mme, ce sont des exemples types de mthodes de classe. Vous en appren-
drez plus sur ce sujet au chapitre suivant.
part 01 Page 82 lundi 1 dcembre 1997 10:05
L E P R O G R A M M E U R
4
4
Travailler
avec les objets
part 01 Page 83 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 84
4
Tout dabord, une vidence : Java tant un langage orient objet, de nombreux objets seront trai-
ts dans ce chapitre. Il faut les crer, les mettre jour, les dplacer, modier leurs variables,
appeler leurs mthodes, les combiner entre eux et, bien sr, dvelopper des classes.
Ce chapitre couvre ltude de lobjet Java dans son milieu naturel, au travers des sujets suivants :
G Cration dinstances de classes
G Test et modication des variables dinstance et de classe dans une nouvelle instance
G Appel de mthodes dans un objet
G Conversion dobjets et dautres types de donnes dune classe vers une autre
G Complments divers sur le travail avec des objets
G Vue densemble des bibliothques de classes Java
Cration de nouveaux objets
Lcriture dun programme Java passe par la dnition de classes, qui sont des modles pour les
objets (voir Chapitre 2). Gnralement, lutilisation des classes se rsume la cration et la
manipulation des objets. Cette section explique comment crer un nouvel objet dans une classe
donne.
Lutilisation dune constante chane (une srie de caractres entre guillemets doubles) cre un
nouvel objet de la classe String avec la valeur de cette chane (voir chapitre prcdent).
Cette caractristique de la classe String est exceptionnelle : une constante suft la cration
dun de ses objets, bien que ce soit une classe. Ce nest pas le cas pour les autres classes. Pour
crer leurs objets, il faut imprativement utiliser loprateur new.
A linverse des constantes chane, les constantes des nombres et des caractres ne crent pas
dobjet. Leurs types de donnes primaires dnissent des nombres et des caractres, mais lef-
cacit veut quils ne soient pas des objets rels. Pour les traiter comme des objets, il faut les
entourer dobjets-crans. Cest lun des thmes de ce chapitre, dans la section "Conversion
dobjets et de types de donnes primaires".
Oprateur new
Les objets sont crs au moyen de loprateur new. Pour cela, new doit tre suivi du nom de la
classe dans laquelle lobjet est cr, et de parenthses. Les exemples suivants crent de nouvel-
les instances des classes String, Random et Motorcycle, et stockent ces nouvelles instances dans
des variables de types adquats :
String str = new String();
Random r = new Random();
Motorcycle m2 = new Motorcycle();
Info
part 01 Page 84 lundi 1 dcembre 1997 10:05
85
L E P R O G R A M M E U R
Les parenthses sont importantes, ne les oubliez pas. Quand elles sont vides, comme dans
lexemple ci-avant, un objet basique est cr. Si elles contiennent des arguments, ceux-ci dter-
minent les valeurs initiales des variables dinstance, ou toute autre qualit initiale de lobjet :
Date dt = new Date(90, 4, 1, 4, 30);
Point pt = new Point(0,0);
Le nombre et le type des arguments de new lintrieur des parenthses sont dnis par la classe
elle-mme, au moyen dune mthode spciale appele constructeur (nous reviendrons sur les
constructeurs au cours du prsent chapitre). Si vous essayez de crer une nouvelle instance
dune classe avec un mauvais nombre ou un mauvais type darguments (ou si vous omettez les
arguments alors quils sont ncessaires), vous obtiendrez une erreur la compilation. Voici un
exemple de cration de diffrents types dobjets utilisant des nombres et des types darguments
diffrents. La classe Date, qui fait partie du package java.util, cre des objets qui reprsentent
la date courante. Le Listing 4.1 dcrit trois faons diffrentes de crer un objet Date avec lop-
rateur new.
Listing 4.1 Programme Date de Laura
1: import java.util.Date;
2:
3: class CreateDates {
4:
5: public static void main (String args[]) {
6: Date d1, d2, d3;
7:
8: d1 = new Date();
9: System.out.println("Date 1: " + d1);
10:
11: d2 = new Date(71, 7, 1, 7, 30);
12: System.out.println("Date 2: " + d2);
13:
14: d3 = new Date("April 3 1993 3:24 PM");
15: System.out.println("Date 3: " + d3);
16: }
17: }
Rsultat :
Date 1: Sun Nov 26 19:10:56 PST 1995
Date 2: Sun Aug 01 07:30:00 PDT 1971
Date 3: Sat Apr 03 15:24:00 PST 1993
Dans cet exemple, trois objets Date diffrents sont crs grce aux diffrents arguments trans-
mis la classe indique aprs new. Pour le premier objet (ligne 8), loprateur new ne prend pas
dargument. Le rsultat (voir la premire ligne de sortie standard) est un objet Date avec la date
du jour.
part 01 Page 85 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 86
4
Le second objet Date contient cinq arguments entiers. Ils reprsentent une date : anne, mois,
jour, heures et minutes. Le rsultat est un objet Date avec : Sun Aug 01 07:30:00 PDT 1971.
Java numrote les mois en commenant par 0. Ainsi, bien que vous vous attendiez ce que le
7me mois soit juillet, en Java il sagit en fait du mois daot.
La troisime version de Date reoit un unique argument : une date sous forme de chane de
caractres. La chane est analyse et lobjet Date est cr (voir troisime ligne du rsultat). Une
chane date prend de nombreuses formes diffrentes, dcrites dans la documentation API four-
nie avec le package java.util.
Oprations ralises par new
La programmation de loprateur new dclenche une srie dactions. Dabord, un nouvel objet
dune classe donne est cr, et de la mmoire lui est alloue. Puis, une mthode particulire,
dnie dans la classe concerne, est appele. Cette mthode est un constructeur. Les construc-
teurs sont des mthodes spciales, dnies dans les classes, qui servent crer et initialiser de
nouvelles instances de ces classes.
Les constructeurs initialisent lobjet et ses variables et crent tous les autres objets dont cet objet
peut lui-mme avoir besoin ; ils effectuent en fait toutes les autres oprations dont le nouvel
objet a besoin pour tre initialis.
Diffrentes dnitions de constructeurs dans une classe peuvent avoir diffrents nombres ou
types darguments. Ainsi, le constructeur appel correspond aux arguments passs new. Cela
explique lexemple prcdent : chacune des versions de new correspond un rsultat diffrent.
Pour obtenir diffrents comportements dune classe, il suft de dnir autant de constructeurs
que lon souhaite de comportements diffrents pour cette classe (voir Chapitre 7).
Gestion de la mmoire
Dans Java, la gestion de la mmoire est dynamique et automatique. Java alloue automatique-
ment la mmoire ncessaire chaque nouvel objet cr ; aucune action explicite nest nces-
saire.
Lopration inverse est elle aussi automatique. Lorsque vous navez plus besoin dun objet, vous
attribuez de nouvelles valeurs toutes les variables qui pourraient le contenir, et vous lliminez
de tous les tableaux o il gurait ; lobjet devient ainsi inutilisable. Java possde un programme
rcuprateur de mmoire, parfois appel aussi ramasse-miettes. Ce programme recherche les
objets inutiliss et libre la mmoire quils occupent. Il nest donc pas ncessaire de librer
explicitement la mmoire, il suft de vous assurer que vous ne maintenez pas quelque part un
objet dont vous voulez vous dbarrasser. Le Chapitre 21, traite du rle et du fonctionnement du
programme rcuprateur de mmoire.
Attention
part 01 Page 86 lundi 1 dcembre 1997 10:05
87
L E P R O G R A M M E U R
Ce programme est un outil spcial de lenvironnement Java recherchant les objets inutiliss.
Lorsquil en trouve, il les limine et libre la mmoire quils utilisaient.
Variables dinstance et de classe :
accs, fixation dune valeur
Lobjet obtenu ce stade peut contenir des variables dinstance ou de classe. Travailler avec ces
dernires est ais. Elles se comportent comme les variables locales du chapitre prcdent. Seul
le mode daccs est lgrement diffrent.
Accs aux valeurs
Pour obtenir la valeur dune variable dinstance, on se sert dune expression conforme la nota-
tion point.
Avec la notation point, la rfrence une variable dinstance ou de classe est compose de deux
parties : lobjet, gauche du point, et la variable, droite.
La notation point sert rfrencer, au moyen dune expression, des variables dinstance et des
mthodes dinstance gurant dans un objet.
Soit un objet attribu la variable myObject. Sil possde une variable appele var, vous vous
rfrez la valeur de cette variable de la manire suivante :
myObject.var;
Cette forme daccs aux variables est une expression (elle retourne une valeur) et les deux par-
ties spares par le point peuvent galement tre des expressions. Il est donc possible dimbri-
quer des accs aux variables dinstance. Si var contient elle-mme un objet ayant sa propre
variable dinstance appele state, la valeur de cette dernire sobtient ainsi :
myObject.var.state;
Les expressions points sont values de gauche droite. Dans lexemple, la variable var de
myObject est traite en premier. Comme elle pointe sur un autre objet comportant la variable
state, celle-ci est ensuite prise en compte. Le rsultat final est la valeur de la variable state,
aprs valuation de lexpression complte.
Mise jour des valeurs
Pour attribuer une valeur une variable, il suft dajouter loprateur daffectation sa droite :
myObject.var.state = true;
part 01 Page 87 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 88
4
Lexemple de programme prsent dans le Listing 4.2 teste et modie les variables dinstance
dun objet Point. Point appartient au package java.awt et rfrence les coordonnes dun point
laide des valeurs x et y.
Listing 4.2. La classe TestPoint
1: import java.awt.Point;
2:
3: class TestPoint {
4: public static void main(String args[]) {
5: Point thePoint = new Point(10,10);
6:
7: System.out.println("X is " + thePoint.x);
8: System.out.println("Y is " + thePoint.y);
9:
10: System.out.println("Setting X to 5.");
11: thePoint.x = 5;
12: System.out.println("Setting Y to 15.");
13: thePoint.y = 15;
14:
15: System.out.println("X is " + thePoint.x);
16: System.out.println("Y is " + thePoint.y);
17:
18: }
19:}
Rsultat :
X is 10
Y is 10
Setting X to 5.
Setting Y to 15.
X is 5
Y is 15
Dans cet exemple, lobjet Point est cr avec la valeur 10 pour X et Y (ligne 5). Les lignes 7 et 8
les afchent laide de la notation point. Les lignes 10 13 remplacent les valeurs de ces varia-
bles par 5 et 15. Enn, les lignes 15 et 16 afchent nouveau les valeurs de X et Y pour preuve
de la mise jour.
Variables de classe
Les variables de classe sont dnies et stockes dans la classe elle-mme. Leurs valeurs sappli-
quent la classe et tous ses objets.
Le fonctionnement des variables dinstance diffre de celui des variables de classe. Pour les pre-
mires, chaque nouvelle instance de classe rcupre une copie des variables dinstance dnies
par cette classe. Chaque instance met ainsi jour la valeur de ces variables. Il ny a pas dinter-
part 01 Page 88 lundi 1 dcembre 1997 10:05
89
L E P R O G R A M M E U R
frence avec une autre instance. Pour les secondes, il existe une seule copie de la variable. Cha-
que instance de classe y accde, mais il ny a quune valeur. Quand elle est modie, elle lest
pour toutes les instances de la classe.
Les variables de classe sont dnies avec le mot cl static plac devant la variable. Ce sujet
est trait en dtail dans le Chapitre 6. Soit cet extrait dune dnition de classe :
class FamilyMember {
static String surname = "Johnson";
String name;
int age;
...
}
Les instances de la classe FamilyMember ont chacune leurs propres valeurs pour name et age.
A linverse, la variable de classe surname a une seule valeur pour tous les membres de la famille.
Si la valeur de surname est modie, toutes les instances de FamilyMember le sont aussi.
Laccs aux variables de classe et dinstance utilise la mme notation. Pour accder ou modier
la valeur dune variable de classe, lobjet ou le nom de la classe doit prcder le point. Les deux
lignes afches par le code suivant sont identiques :
FamilyMember dad = new FamilyMember();
System.out.println("Familys surname is: " + dad.surname);
System.out.println("Familys surname is: " + FamilyMember.surname);
Avec la possibilit de modier la valeur dune variable de classe laide dune instance, il est
facile de se perdre entre les variables de classe et lorigine de leurs valeurs. Cest pourquoi il
vaut mieux rfrencer une variable de classe laide du nom de la classe. Le code est alors com-
prhensible et les rsultats fantaisistes plus faciles corriger.
Appel des mthodes
Lappel dune mthode est similaire la rfrence aux variables dinstance dun objet : les
appels de mthodes dans des objets utilisent aussi la notation point. Lobjet est plac gauche
du point, la mthode et ses arguments droite :
myObject.methodOne (arg1, arg2, arg3);
Toutes les mthodes doivent tre suivies de parenthses, mme si elles nont pas darguments :
myObject.methodNoArgs();
Si la mthode appele est un objet qui contient aussi des mthodes, ces dernires simbriquent,
comme pour les variables. Lexemple suivant appelle la mthode getName, dnie dans lobjet
retourn par la mthode getClass, elle-mme dnie dans myObject.
myObject.getClass().getName();
part 01 Page 89 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 90
4
Les appels imbriqus de mthodes peuvent se combiner avec des rfrences des variables
dinstance galement imbriques. Dans lexemple suivant, vous appelez la mthode
methodTwo(), dfinie dans lobjet stock par la variable dinstance var, qui fait elle-mme partie
de lobjet myObject.
myObject.var.methodTwo(arg1, arg2);
La mthode System.out.println() est un bon exemple de variables et de mthodes imbriques.
La classe System (du package java.lang) dcrit les comportements propres au systme. System.out
est une variable de classe. Elle contient une instance de la classe PrintStream qui pointe sur la
sortie standard du systme. Les instances de PrintStream ont une mthode println() qui
envoie une chane dans le ux de sortie.
Le Listing 4.3 prsente un exemple dappels de mthodes dnies dans la classe String. Celle-
ci comprend des mthodes pour les tests et les modications de chanes.
Listing 4.3 Exemples dutilisation des mthodes de String
1: class TestString {
2:
3: public static void main (String args[]) {
4: String str = "Now is the winter of our discontent";
5:
6: System.out.println("The string is : " + str);
7: System.out.println("Length of this string : "
8: + str.length());
9: System.out.println("The character at position 5 : "
10: + str.charAt(5));
11: System.out.println("The substring from 11 to 18 : "
12: + str.substring(11, 18));
13: System.out.println("The index of the character d : "
14: + str.indexOf(d));
15: System.out.print("The index of the beginning of the ");
16: System.out.println("substring \"winter\":"
17: + str.indexOf("winter"));
18: System.out.println("The string in upper case : "
19: + str.toUpperCase());
20: }
21: }
Rsultat :
The string is: Now is the winter of our discontent
Length of this string: 35
The character at position 5: s
The substring from positions 11 to 18: winter
The index of the character d: 25
The index of the beginning of the substring "winter": 11
The string in upper case: NOW IS THE WINTER OF OUR DISCONTENT
part 01 Page 90 lundi 1 dcembre 1997 10:05
91
L E P R O G R A M M E U R
Une nouvelle instance de String est cre en ligne 4 laide dune constante chane (cest plus
facile que de passer par new et de rentrer les caractres individuellement). La suite du pro-
gramme appelle simplement diffrentes mthodes de String pour effectuer des oprations sur
la chane :
G La ligne 6 afche la valeur de la chane cre en ligne 4 : "Now is the winter of our discon-
tent".
G La ligne 7 appelle la mthode length() dans le nouvel objet String. Cette chane a une lon-
gueur de 35 caractres.
G La ligne 9 appelle la mthode charAt(). Elle retourne le caractre situ la position donne
dans la chane. Comme la premire position est 0, le caractre en position 5 est s.
G La ligne 11 appelle la mthode substring(). Elle reoit deux entiers reprsentant un inter-
valle et retourne la sous-chane des caractres situs dans cet intervalle. La mthode sub-
string() peut aussi tre appele avec un seul argument. Elle retourne alors la sous-chane
qui commence cette position et se termine en n de chane.
G La ligne 13 appelle la mthode indexOf(). Elle retourne la position de la premire occur-
rence du caractre donn (ici d).
G La ligne 15 montre un autre usage de la mthode indexOf(). Elle reoit un argument chane
et retourne lindex du dbut de cette chane.
G La ligne 19 utilise la mthode toUpperCase(). Elle retourne une copie de la chane en majus-
cules.
Mthodes de classe
Comme les variables de classe, les mthodes de classe sappliquent la classe tout entire et
non ses instances. Elles sont souvent utilises pour des mthodes vocation gnrale. Ces der-
nires noprent pas directement sur une instance de la classe, mme sil y a adquation dun
point de vue conceptuel. Par exemple, la classe String contient une mthode de classe appele
valueOf() qui reoit lun des nombreux types dargument (entiers, boolens, autres objets,
etc.). valueOf() retourne ensuite une instance de String(), contenant la valeur chane de largu-
ment transmis. Cette mthode nopre pas directement sur une instance de String existante.
Cependant, rcuprer une chane partir dun autre objet ou type de donnes est bien une op-
ration de style chane. Elle a donc toute sa place dans la classe String.
Les mthodes de classe servent aussi grouper au mme endroit, dans une classe, des mthodes
caractre gnral. Par exemple, la classe Math dnie dans le package java.lang contient de
nombreuses mthodes de classe. Ce sont des oprations mathmatiques. Il nexiste pas dins-
tance de la classe Math, mais on peut utiliser ses mthodes avec des arguments numriques ou
boolens. Par exemple, la mthode de classe Math.max() prend deux arguments et retourne le
part 01 Page 91 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 92
4
plus grand des deux. Il nest pas ncessaire de crer une nouvelle instance de Math ; il suft
dappeler la mthode l o on en a besoin, comme suit :
in biggerOne = Math.max(x,y);
Lappel des mthodes de classe utilise la notation point, comme lappel des mthodes dins-
tance. La classe ou lune de ses instances est gauche du point. Cette syntaxe est identique
celle employe pour les variables de classe. Cependant, lemploi du nom de la classe facilite la
lecture du code, pour les raisons dj voques avec les variables de classe. Les deux dernires
lignes de lexemple suivant produisent le mme rsultat (la chane "5") :
String s, s2;
s = "foo";
s2 = s.valueOf(5);
s2 = String.valueOf(5);
Rfrences aux objets
Mme si elles sont occultes, les rfrences aux objets manipuls sont importantes. Lorsque des
objets sont attribus des variables ou passs en arguments une mthode, ce sont leurs rf-
rences qui sont transmises. En effet, ni les objets eux-mmes, ni leur copie ne sont passs.
Le Listing 4.4 est un exemple simple illustrant le fonctionnement des rfrences.
Listing 4.4. Exemple de rfrences
1: import java.awt.Point;
2:
3: class ReferencesTest {
4: public static void main (String args[]) {
5: Point pt1, pt2;
6: pt1 = new Point(100, 100);
7: pt2 = pt1;
8:
9: pt1.x = 200;
10: pt1.y = 200;
11: System.out.println("Point1: " + pt1.x + ", " + pt1.y);
12: System.out.println("Point2: " + pt2.x + ", " + pt2.y);
13: }
14: }
Rsultat :
Point1: 200, 200
Point2: 200, 200
part 01 Page 92 lundi 1 dcembre 1997 10:05
93
L E P R O G R A M M E U R
Dans la premire partie de ce programme, on dclare deux variables de type Point (ligne 5), on
cre un nouvel objet Point affect pt1 (ligne 6), et, enn, on affecte pt2 la valeur de pt1
(ligne 7).
La question est : aprs la mise jour des variables dinstance x et y de pt1 par les lignes 9 et 10,
que devient pt2 ?
Comme vous pouvez le voir, les variables dinstance x et y de pt2 ont galement t modies,
bien quon ne lait pas fait explicitement. Laffectation de la valeur de pt1 pt2 a vritablement
cr partir de pt2 une rfrence lobjet point par pt1, comme on peut le voir sur la
Figure 4.1. Quand lobjet rfrenc par pt2 est modi, celui sur lequel pointe pt1 lest gale-
ment, parce quil sagit de deux rfrences au mme objet.
Pour que pt1 et pt2 pointent sur des objets distincts, il faut coder new Point() sur chacune des
deux lignes pour crer deux objets distincts.
Lutilisation des rfrences prend toute son importance lorsque des arguments sont transmis aux
mthodes, comme vous le verrez plus loin dans ce mme chapitre.
Java nautorise ni les pointeurs explicites, ni les oprations arithmtiques sur les pointeurs, uti-
liss dans les langages de type C. Vous disposez uniquement de rfrences, mais celles-ci com-
portent la plupart des possibilits des pointeurs, sans entraner la confusion et les bogues
insidieux rsultant de lutilisation des pointeurs explicites.
Conversion de types
de donnes primaires et dobjets
Parfois, certaines valeurs sont stockes dans un type qui ne convient pas pour ce que vous vou-
lez en faire. Cela peut tre linstance dune mauvaise classe, un nombre virgule ottante
(float) au lieu dun entier (int), ou un entier au lieu dune chane. Le mcanisme consistant
transformer la valeur dun type vers un autre est une conversion.
La conversion est un mcanisme qui, partir dun objet ou dune valeur dun certain type, cre
un autre objet ou une autre valeur de type diffrent. Le rsultat de la conversion est un nouvel
objet ou une nouvelle valeur. La conversion naffecte pas lobjet ou la valeur dorigine.
x: 200
y: 200
Objet Point
pt1
pt2
Figure 4.1
Rfrences des objets.
Astuce
Info
part 01 Page 93 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 94
4
Le concept de conversion est simple, mais les rgles spciant quels types peuvent tre conver-
tis dans dautres types sont compliques en Java par lexistence de types primaires dune part
(int, float, boolean), et de types dobjets dautre part (string, Point, Window, etc.). Trois formes
de conversions sont abordes dans cette section :
G Conversion entre types primaires : un entier (int) vers un nombre virgule ottante (float)
ou un float vers un double.
G Conversion entre types dobjet : une instance de classe vers celle dune autre classe.
G Conversion de types primaires en objets et vice versa.
Conversion des types primaires
La conversion des types primaires consiste convertir la valeur dun type primaire dans un
autre. Un exemple : laffectation dun nombre de type x une variable de type y. Cette opration
est frquente sur des types numriques. Les valeurs boolennes ne peuvent pas tre converties
en dautres types primaires.
Les conversions vers un type plus "grand" que celui de la valeur transformer peuvent ne pas
tre explicites. Vous pouvez le plus souvent traiter automatiquement (conversion implicite) un
type byte ou character comme un long, un int ou un float, et nimporte lequel des types pr-
cdents comme un double. Dans la plupart des cas, le type le plus grand apporte une prcision
suprieure et aucune information nest perdue lors de la conversion. Toutefois, la conversion
dentiers valeurs virgule ottante fait exception cette rgle gnrale ; la conversion dun int
ou dun long en un float, ou dun long en un double, peut entraner une perte de prcision.
Une conversion dune valeur dans un type plus "petit" que le sien doit tre explicite, la conver-
sion pouvant entraner une perte de prcision. La conversion explicite utilise le format suivant :
(typename) value
Dans cette instruction, typename est le nom du type dans lequel value (une expression) doit tre
convertie (en short, int, float, boolean, par exemple). Lexpression suivante divise x par y et
convertit le rsultat en type int :
(int) (x / y);
La conversion est prioritaire sur les oprations arithmtiques, do lemploi des parenthses
dans notre exemple, pour que la conversion porte bien sur le rsultat de la division. Autrement, la
valeur de x serait dabord convertie, puis divise par y, ce qui pourrait donner un rsultat diffrent.
Conversion des objets
Les instances dune classe peuvent aussi tre converties en instances dautres classes, une
condition : les classes des objets convertir et convertis doivent tre lies par le mcanisme
dhritage. Autrement dit, la conversion dun objet nest possible que vers une instance dune
sous-classe ou dune super-classe de sa propre classe.
part 01 Page 94 lundi 1 dcembre 1997 10:05
95
L E P R O G R A M M E U R
Dune manire analogue la conversion de valeurs vers un type plus "grand", la conversion de
certains objets nest pas obligatoirement explicite. En effet, les instances de sous-classes contien-
nent gnralement toutes les informations des instances des super-classes. Il est donc possible
dutiliser une instance dune sous-classe l o lon sattend utiliser une instance dune de ses
super-classes. Par exemple, si une mthode reoit deux arguments, le premier de type Object et
le second de type Number, lui passer une instance de ces classes particulires nest pas obliga-
toire. En effet, pour largument de type Object, une sous-classe quelconque dObject (donc tout
objet) suft. De mme, pour largument de type Number, il suft de passer une instance dune
sous-classe de Number (Integer, Boolean, Float, etc.). Il nest pas ncessaire de faire dabord
une conversion explicite.
La conversion vers le bas dans la hirarchie des classes est automatique, mais la conversion vers
le haut ne lest pas. La conversion dun objet dans une instance dune de ses super-classes
entrane une perte des informations fournies par la sous-classe et doit, de ce fait, tre explicite.
La conversion dun objet vers une autre classe seffectue par la mme opration que celle utili-
se pour les types de donnes primaires :
(classname) object
Dans cette instruction, classname est le nom de la classe dans laquelle object (une rfrence
un objet) doit tre converti. La conversion cre une rfrence, du type classname, lancien
objet. Lancien objet continue dexister sans subir de changement.
Voici un exemple de conversion dune instance de la classe GreenApple vers la classe Apple (o
GreenApple est une sous-classe de Apple, contenant des informations supplmentaires pour dfi-
nir la pomme comme verte) :
GreenApple a;
Apple a2;
a = new GreenApple();
a2 = (Apple) a;
La conversion des objets peut seffectuer non seulement vers des classes, mais aussi vers des
interfaces. La conversion nest possible que si la classe de lobjet, ou lune de ses super-classes,
implmente effectivement linterface. Ce type de conversion autorise lappel dune des mtho-
des de linterface, mme si cette dernire nest pas effectivement implmente par la classe de
lobjet. Les interfaces sont traites plus en dtail dans la troisime partie de ce livre.
Transformation de types primaires en objets et vice versa
Vous avez vu comment convertir un type de donnes primaire vers un autre, et comment effec-
tuer des conversions entre classes. Peut-il y avoir des conversions dun type primaire vers une
classe ou dans lautre sens ?
La rponse est non. Les types de donnes primaires et les objets sont deux choses trs diffrentes
en Java. Par consquent, il nest pas possible de convertir lune en lautre. Cependant, le package
part 01 Page 95 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 96
4
java.lang contient des classes spciales qui correspondent chaque type de donnes primaire :
Integer pour les entiers, Float pour les nombres virgule flottante, Boolean pour les boolens,
etc. Notez que les noms de classes commencent par une lettre majuscule, et les types de donnes
primaires par une minuscule. Java traite ces noms de manire trs diffrente, aussi ne les confon-
dez pas, car vos variables et vos mthodes ne se comporteraient pas comme prvue.
Grce aux mthodes de classe dnies dans ces classes, on peut crer un quivalent objet pour
tous les types de base, laide de loprateur new. La ligne de code suivante cre une instance
de la classe Integer avec la valeur 35 :
Integer intObject = new Integer(35);
Disposant dobjets rels, vous pouvez traiter ces valeurs comme des objets. Ensuite, sil savre
ncessaire de revenir aux valeurs de type primaire, vous disposez de mthodes pour ce faire. Par
exemple, intvalue() extrait une valeur de type int dun objet Integer :
int theInt = intObject.intValue() ; // retourne 35
Consultez la documentation Java API relative ces classes particulires pour plus de prcisions
sur la conversion des types de donnes primaires en objets et inversement.
Java 1.0 fournit les classes spciales suivantes correspondant aux types primaires : Boolean,
Character, Double, Float, Integer et Long. Java 1.1 comporte en outre les classes Byte et short,
ainsi quune classe enveloppe spciale, Void. Ces dernires classes sont principalement utili-
ses pour la rexion des objets.
Complments divers
Cette section regroupe diverses informations complmentaires sur la manipulation des objets.
En particulier :
G Comparaison dobjets.
G Identication de la classe dun objet.
G Test dun objet pour dterminer sil sagit dune instance dune classe donne.
Comparaison des objets
Le chapitre prcdent fournit une liste doprateurs destins la comparaison de valeurs : gal,
diffrent, infrieur, etc. La plupart dentre eux ne marchent quavec des types de donnes pri-
maires, et pas avec des objets. Si leurs oprandes ne sont pas des nombres, le compilateur Java
produit des erreurs.
Les oprateurs == (gal) et != (diffrent) font exception cette rgle : utiliss avec des objets,
ils vrient les deux oprandes font rfrence au mme objet en mmoire.
Info
part 01 Page 96 lundi 1 dcembre 1997 10:05
97
L E P R O G R A M M E U R
Pour obtenir un rsultat signicatif lors de la comparaison dobjets dune classe, il faut crer
des mthodes spciales dans la classe et les appeler.
Dans Java, le polymorphisme nexiste pas pour les oprateurs, ce qui veut dire quil nest pas
possible de rednir le comportement des oprateurs en utilisant des mthodes dans les classes.
Les oprateurs prvus dans Java sont dnis uniquement pour les nombres.
La classe String illustre bien ce quest la comparaison dobjets. Elle permet davoir deux cha-
nes (deux objets indpendants) en mmoire avec les mmes valeurs, cest--dire les mmes
caractres placs dans le mme ordre. Vis--vis de loprateur ==, ces deux objets String ne sont
pas gaux, car, mme si leur contenu est identique, ils ne reprsentent pas le mme objet.
Cependant, la classe String possde une mthode appele equals(). Cette mthode teste chaque
caractre de deux chanes et retourne la valeur true sil y a galit parfaite (voir Listing 4.5).
Listing 4.5 Test dgalit des chanes
1: class EqualsTest {
2: public static void main(String args[]) {
3: String str1, str2;
4: str1 = "les chemises de larchiduchesse sont sches.";
5: str2 = str1;
6:
7: System.out.println("String1: " + str1);
8: System.out.println("String2: " + str2);
9: System.out.println("Same object? " + (str1 == str2));
10:
11: str2 = new String(str1);
12:
13: System.out.println("String1: " + str1);
14: System.out.println("String2: " + str2);
15: System.out.println("Same object? " + (str1 == str2));
16: System.out.println("Same value? " + str1.equals(str2));
17: }
18: }
Rsultat :
String1: les chemises de larchiduchesse sont sches.
String2: les chemises de larchiduchesse sont sches.
Same object? true
String1: les chemises de larchiduchesse sont sches.
String2: les chemises de larchiduchesse sont sches.
Same object? false
Same value? true
Info
part 01 Page 97 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 98
4
La premire partie du programme (lignes 3 5) dclare deux variables (str1 et str2) et affecte
la constante Les chemises de larchiduchesse sont sches str1 puis la valeur de str1 str2.
Comme nous lavons vu prcdemment lors de ltude des rfrences dobjets, str1 et str2
pointent maintenant sur le mme objet et le test de la ligne 9 le conrme.
Dans la seconde partie, new cre un nouvel objet String ayant la mme valeur que str1, et
affecte str2 ce nouvel objet de type chane. Il y a maintenant deux objets String diffrents
(leurs rfrences sont diffrentes) avec la mme valeur. La ligne 15 les teste laide de lopra-
teur == pour savoir sil sagit du mme objet. Comme prvu, la rponse est non. De mme, le
test dgalit sur leurs valeurs, effectu avec la mthode equals() en ligne 16, retourne true :
elles ont la mme valeur.
Pourquoi ne pas utiliser une autre constante au lieu de new lors de la modication de str2 ?
Les constantes chane (String) sont optimises dans Java. Ainsi, la cration dune chane via
une constante, puis lutilisation dune autre constante avec les mmes caractres, dclenchent
loptimisation. Java redonne le premier objet String. Les deux chanes reprsentent alors le
mme objet. Pour crer deux objets diffrents, il faut employer une technique diffrente.
Identification de la classe dun objet
Voici comment identier la classe dun objet attribu la variable obj :
String name = obj.getClass().getName() ;
getClass() est une mthode de la classe Object. Elle est donc disponible pour tous les objets.
De lappel de cette mthode rsulte un objet de la classe Class. Il contient une mthode appele
getname() qui retourne le nom de la classe sous forme de chane.
Loprateur instanceof permet aussi de raliser des tests. Il a deux oprandes : un objet, gau-
che, et le nom dune classe, droite. Lexpression retourne true si lobjet appartient la classe
dsigne ou lune de ses sous-classes, et false dans le cas contraire :
"foo" instanceof String // true
Point pt = new Point(10,10);
pt instanceof String // false
Loprateur instanceof sutilise aussi avec les interfaces. Si un objet implmente une interface,
instanceof, avec le nom de linterface droite, retourne la valeur true. Les interfaces sont trai-
tes dans la troisime partie de ce livre.
Info
part 01 Page 98 lundi 1 dcembre 1997 10:05
99
L E P R O G R A M M E U R
Inspection des classes et des mthodes
par la rflexion
Lune des amliorations apportes au langage Java par la diffusion 1.1 est lintroduction de la
rexion (en anglais, reection), aussi appele introspection. La rexion permet une classe
Java, telle quun programme que vous crivez, dobtenir des prcisions sur nimporte quelle
autre classe.
Grce la rexion, un programme Java peut charger une classe dont il ne sait rien, en dcouvrir
les variables, les mthodes et les constructeurs, et travailler avec ces lments.
Un exemple permettra de voir demble ce dont il sagit. Le Listing 4.6 montre une brve appli-
cation appele seeMethods.
Listing 4.6 Texte intgral de SeeMethods.java
1: import java.lang.reflect.*;
2: import java.util.Random;
3:
4: class SeeMethods {
5: public static void main(String[] argumentss) {
6: Random rd = new Random();
7: Class className = rd.getClass();
8: Method[] methods = className.getMethods();
9: for (int i = 0; i < methods.length; i++) {
10: System.out.println("Method: " + methods[i]);
11: }
12: }
13: }
Ce programme utilise le groupe de classes java.lang.reflect.*, qui fournit des informations
sur les attributs, les mthodes et les constructeurs de nimporte quelle classe.
Lapplication SeeMethods cre un objet Random la ligne 6, puis utilise la rexion pour afcher
toutes les mthodes publiques faisant partie de la classe. Le Listing 4.7 montre la sortie de cette
application.
Listing 4.7. La sortie de lapplication SeeMethods
1: Method: public final native java.lang.Class java.lang.Object.getClass()
2: Method: public native int java.lang.Object.hashCode()
3: Method: public boolean java.lang.Object.equals(java.lang.Object)
4: Method: public java.lang.String java.lang.Object.toString()
5: Method: public final native void java.lang.Object.notify()
6: Method: public final native void java.lang.Object.notifyAll()
part 01 Page 99 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 100
4
7: Method: public final native void java.lang.Object.wait(long)
8: Method: public final void java.lang.Object.wait(long,int)
9: Method: public final void java.lang.Object.wait()
10: Method: public synchronized void java.util.Random.setSeed(long)
11: Method: public void java.util.Random.nextBytes(byte[])
12: Method: public int java.util.Random.nextInt()
13: Method: public long java.util.Random.nextLong()
14: Method: public float java.util.Random.nextFloat()
15: Method: public double java.util.Random.nextDouble()
16: Method: public synchronized double java.util.Random.nextGaussian()
En utilisant la rexion, lapplication SeeMethods peut connatre chacune des mthodes de la
classe Random, ainsi que toutes les mthodes quelle a hrit de ses super-classes. Chaque ligne
du listing donne les informations suivantes sur une mthode :
G Mthode public ou non
G Type dobjet ou de variable retourn par la mthode
G Mthode de la classe ou dune de ses super-classes
G Nom de la mthode
G Types des objets ou des variables utiliss comme arguments lors de lappel de la mthode
Lapplication SeeMethods pourrait tre utilise avec nimporte quelle classe dobjets. Il suft de
changer la ligne 6 de SeeMethods.java pour crer un objet diffrent et examiner ses mcanismes
internes.
La rexion est surtout utilise par des outils servant parcourir des classes, ou par des dbo-
gueurs, pour obtenir plus dinformations sur les classes ou les objets examins ou en cours de
mise au point. On sen sert aussi avec JavaBeans, pour sinformer sur un autre objet et dcouvrir
ce quil peut faire (en vue de lui demander de faire quelque chose), ce qui facilite la construction
dapplications dune bonne envergure. Le Chapitre 14 donne plus de prcisions sur JavaBeans.
Le package java.lang.reflect comporte les classes suivantes :
G Field, pour obtenir et grer linformation sur les variables de classe et dinstance.
G Method, pour les mthodes de classe et les mthodes dinstance.
G Constructor, pour les mthodes spciales servant la cration de nouvelles instances des
classes.
G Array, pour les tableaux.
G Modifier, pour dcoder les informations de modification relative aux classes, aux variables
et aux mthodes (les modicateurs sont traits au Chapitre 15).
Un certain nombre de nouvelles mthodes seront en outre disponibles au sein dune classe appe-
le class, pour faire le lien entre les diverses classes de rexion.
La rexion est une fonction avance que vous nutiliserez peut-tre pas tout de suite dans vos
programmes. Elle prsente un grand intrt pour la srialisation des objets, JavaBeans, ou
dautres types de programmes sophistiqus.
part 01 Page 100 lundi 1 dcembre 1997 10:05
101
L E P R O G R A M M E U R
Bibliothque de classes Java
La bibliothque de classes Java comprend lensemble des classes dont la fourniture est assure
pour tout environnement Java de caractre commercial (par exemple, tout environnement de
dveloppement Java ou tout navigateur comme celui de Netscape). Ces classes se trouvent dans
le package Java. Toutes celles qui ont t tudies jusqu prsent en font partie, comme
dailleurs un grand nombre dautres classes prsentes plus loin dans cet ouvrage, et dautres
encore que vous ne connatrez peut-tre jamais.
Le JDK est livr avec une documentation sur la totalit de la bibliothque de classes Java. Cette
documentation dcrit les variables dinstance de chaque classe, les mthodes, les constructeurs,
les interfaces, etc. Vous pouvez vous la procurer (elle sappelle Java Application Programmers
Interface, ou API) via le Web http://java.sun.com:80/products/JDK/CurrentRelease/api/
packages.html. Un court rsum de lAPI Java se trouve en Annexe C. Parcourir la bibliothque
de classes Java avec ses mthodes et ses variables dinstance est un bon moyen de savoir ce que
Java peut ou ne peut pas faire, et de voir de quelle manire ces lments peuvent servir de point
de dpart de vos propres dveloppements.
Les packages suivants font partie de la bibliothque de classes Java :
G java.lang : ses classes concernent le langage lui-mme. Object, String et System en font
partie. Ce package contient aussi des classes spciales destines la reprsentation des types
de donnes primaires (Integer, Character, Float, etc.). La premire partie du prsent
ouvrage donne au moins un aperu de la plupart des classes de ce package.
G java.util : ces classes sont des utilitaires, comme Date, ou de simples classes de collec-
tions, comme Vector et Hashtable.
G java.io : ces classes crivent ou lisent dans les flux dentres/sorties (comme lentre ou la
sortie standard), ou encore, grent les chiers. Le Chapitre 19, est consacr aux classes de
ce package.
G java.net : ce sont des classes de gestion de rseau, comme Socket et URL (une classe per-
mettant de rfrencer des documents sur le World wide Web). Le Chapitre 14 donne quel-
ques indications supplmentaires sur les rseaux.
G java.awt (cest lAbstract Windowing Toolkit, ou jeu doutils de fentrage abstrait) : ces
classes permettent dimplmenter une interface utilisateur graphique. Window, Menu, Button,
Font, CheckBox, etc., en font partie. Ce package contient aussi des mcanismes de gestion
des vnements systme, et des classes de traitement dimages (le package java.awt.Image).
AWT est trait dans la seconde partie de louvrage.
G java.applet : ces classes servent implmenter des applets Java.
Outre les classes de Java, lenvironnement de dveloppement peut en contenir dautres, fournis-
sant dautres utilitaires ou des fonctions diffrentes. Elles sont certainement trs utiles, mais
nappartiennent pas la bibliothque Java standard. Dautres personnes essayant de faire marcher
part 01 Page 101 lundi 1 dcembre 1997 10:05
Travailler avec les objets
Java 1.1 102
4
vos programmes Java risquent de ne pas en disposer, moins que vous nincluiez explicitement
ces classes dans vos programmes. Ceci est particulirement important dans le cas des applets,
destines tourner sur de nombreuses plates-formes laide dun programme de navigation
compatible Java. Seules les classes contenues dans le package Java sont toujours disponibles
sur tous les programmes de navigation et dans tous les environnements Java.
Rsum
Des objets, toujours des objets. Ce chapitre a trait de leur manipulation : cration, recherche et
mise jour des valeurs de leurs variables, appel de leurs mthodes. Les mcanismes de copie,
de comparaison et de conversion dobjets ont eux aussi t tudis. Enn, vous avez dcouvert
la bibliothque de classes de Java (qui constitue une matire premire importante pour program-
mer).
Vous disposez dsormais des bases pour travailler avec les composants les plus simples du lan-
gage. Il vous reste tudier les tableaux, les instructions de contrle et les boucles. Cest le sujet
du prochain chapitre. Au Chapitre 6, vous apprendrez ensuite dnir et utiliser des classes
au sein des applications Java, et dans la seconde partie de louvrage, vous dboucherez directe-
ment sur les applets. La quasi-totalit de la programmation avec Java se rsume au concept
dobjet.
Questions rponses
Q Jai du mal faire la diffrence entre les objets et les types de donnes primaires
comme int et boolean.
R Les types de donnes primaires (byte, short, int, long, float, double et char) sont les plus
petites entits du langage. Ce ne sont pas des objets, mme sils peuvent, de diverses
manires, tre traits comme tel. Par exemple, il est possible de les affecter des variables
et de les passer aux mthodes comme arguments, ou de les obtenir en retour. Malgr tout, la
plupart des oprations portant sur les objets ne marchent pas avec les types de donnes
primaires.
Les objets sont des instances dune classe et, par consquent, des types de donnes bien
plus complexes que de simples nombres ou caractres. Ils contiennent souvent des nombres
et des caractres comme variables dinstance ou de classe.
Q Pas de pointeur en Java ? Sans pointeurs, comment pouvez-vous travailler avec des
listes lies, dans lesquelles un pointeur dune liste correspond une autre liste et
permet de les parcourir ?
part 01 Page 102 lundi 1 dcembre 1997 10:05
103
L E P R O G R A M M E U R
R Java nest pas totalement dpourvu de pointeurs ; il na pas de pointeur explicite. Les rf-
rences aux objets sont, en fait, des pointeurs. Ainsi, pour crer une entit du type liste lie,
vous crez une classe appele Node, qui aura une variable dinstance galement du type Node.
Pour lier ensemble les objets Node, il vous suft alors daffecter un objet Node la variable
dinstance de lobjet qui le prcde immdiatement dans la liste. Comme les rfrences aux
objets sont des pointeurs, les listes lies agences de cette manire se comporteront comme
vous pouvez le souhaiter.
Q Dans la section traitant de lappel des mthodes, une mthode tait appele avec un
nombre darguments diffrent chaque fois, et cela donnait des rsultats varis.
Comment est-ce possible ?
R Ce concept sappelle le polymorphisme. Pour un mme nom de fonction, il existe divers
comportements. Ils dpendent des arguments transmis au moment de lappel. Les arguments
varient en nombre et/ou en type. Les mthodes sont cres dans les classes avec des signa-
tures distinctes et des dnitions diffrentes. Lorsque la mthode est appele, Java recherche
la dnition correspondant au nombre et aux types des arguments transmis.
Ce sujet est trait au Chapitre 6.
Q Java tant bas sur C++, pourquoi le polymorphisme ne sapplique-t-il pas aux
oprateurs ?
R Java est effectivement bas sur le langage C++, mais il a galement t conu pour tre
simple. Cest pourquoi de nombreuses caractristiques de C++ ont disparu. Rednir les
oprateurs complique leur manipulation et la lecture du code. Les concepteurs de Java ont
donc choisi dabandonner cette caractristique de C++.
part 01 Page 103 lundi 1 dcembre 1997 10:05