Vous êtes sur la page 1sur 81

Par N.

Chenfour





Manuel du Dveloppeur
N. Chenfour
2






N. Chenfour
3


1.1 Introduction
Java est un langage de programmation objets dvelopp par Sun
Microsystems. Sa premire version a t publie en 1995.
Le langage Java est un langage qui drive du C/C++ tout en imposant un seul
mode de programmation : par les objets. Java dispose dun mcanisme de
gestion de mmoire trs puissant. En effet, tous les objets grs par un
programme Java sont crs dynamiquement. De plus, priodiquement ou
chaque fois quon a besoin de la mmoire un programme appel Garbage-
Collector (ou ramasse-miettes) est excut automatiquement pour rcuprer la
mmoire qui nest plus utilise. Java est aussi un langage multitche. Il permet
la cration et la gestion des processus lgers (les Threads).
Java dispose dune gigantesque bibliothque de classes spcialises dans
diffrents thmes et diffrents domaines (de la gestion des chanes de
caractres jusquau cryptage et scurit des rseaux en passant par des
bibliothques graphiques, bibliothque mathmatique, accs aux bases de
donnes JDBC, synchronisation des processus par le principe des moniteurs et
le mcanisme des signaux, etc)
Chapitre 1. Environnement de
dveloppement Java
N. Chenfour
4
1.2 Environnement de dveloppement
1.2.1 Langage Java
Il existe deux modes de programmation en Java : le mode Applications et le
mode Applets :
Le mode applications est le mode ordinaire des diffrents langages de
programmation.
Le mode applets permet de crer des applications pouvant tre incorpores
dans des pages Web. Les applets sont en fait des applications particulires dont
le droulement est prvu sur une page Web (le conteneur est une page Web et
non une fentre ordinaire). Le programme applet est ainsi interprt est
excut par le navigateur qui doit tout dabord rcuprer le programme de la
mme manire quil rcupre par exemple un fichier image avant de lafficher.
Une applet peut aussi tre excute avec un programme spcial (dlivr par
sun) appel AppletViewer. Il permet ainsi de tester le fonctionnement dune
applet avant sa diffusion sur Internet.
1.2.2 Portabilit de Java
Le mode de compilation Java constitue la premire particularit de ce langage.
En effet, un programme Java (extension .java) est traduit par le compilateur
Java (programme javac.exe) non pas en langage machine (programme
excutable) mais en un pseudo code intermdiaire appel Bytecode
indpendant de toute machine ou plate-forme. Le bytecode ainsi gnr (sous
forme de fichier dextension .class) peut ensuite tre interprt sur nimporte
quelle machine ou plate-forme. Il suffit que celle-ci dispose dun programme de
traduction adquat. Celui-ci constitue en fait ce quon appelle Machine
Virtuelle Java (ou JVM : Java Virtual Machine). Lun des composants de
la machine virtuelle Java est le programme java.exe permettant dexcuter
directement un programme .class (en faisant appel dautres bibliothques
ncessaires lexcution).
N. Chenfour
5
La machine virtuelle Java, quant elle, dpend alors de la plate-forme ou la
machine sur laquelle elle tourne. En fait, Sun publie sur son site diffrentes
machines virtuelles destines diffrentes plates-formes de dveloppement.
Le schma de dveloppement et dexcution dun programme Java est alors le
suivant :
On crit un programme java sauvegard dans un fichier dextension .java
(exemple Test01.java : suppos contenir une classe nome Test01)
On compile ensuite le programme pour gnrer le Byte Code associ :
C:\ > javac Test01.java
Un fichier Test01.class est alors cr.
Excution du programme rsultant :
C:\ > java Test01

Il est remarquer quun mme programme Java est gnralement organis
sous forme de plusieurs classes successives (dont lune fait appel des
instances de lautre). Le compilateur Java gnre alors un fichier .class associ
chacune des classes du programme est non au programme lui mme. Si ainsi
le programme Test01.java contient deux classes nommes C1 et C2 (et pas de
classe Test01), le compilateur gnre deux fichiers de classes : C1.class et
C2.class (et pas de fichier Test01.class). Ce quil faut alors excuter par la suite
est la classe principale (c d : celle contenant une mthode main) par
exemple C1 :
C:\ > java C1
1.2.3 Le JDK (Java Developpement Kit)
1.2.3.1 Dfinition
Le JDK est lensemble des programmes ncessaires pour le dveloppement
dapplications Java. Il regroupe ainsi les programmes javac.exe, java.exe,
N. Chenfour
6
appletviewer.exe pour excuter les applets, ainsi que dautres classes et
utilitaires de dveloppements.
1.2.3.2 Evolution
Depuis 1995 jusqu aujourdhui le JDK na cess dvoluer et dtre tendu de
version en version : 1.0, 1.1, 1.2, 1.3, 1.4, ...
1. La version 1.0 (lance en 1995 et constitue de quelques 212 classes et
interfaces) a subi quelques volutions jusqu a dernire version : 1.0.2.
Cette notation 1.s.b est interprte avec le chiffre b indiquant des
corrections de bugs ou des petites modifications alors que le chiffre au
milieu s indique des modifications de spcification ou des amliorations de
taille (ajout de classes et interfaces).
2. Le JDK 1.1 (504 classes et interfaces) a subi lui mme beaucoup de
modifications jusqu sa dernire version 1.1.8.
3. Le JDK 1.2 (1692 classes et interfaces) annonc en dcembre 1998 a
volu avec sa dernire version 1.2.2. Nom de code Playground
4. Le JDK 1.3 (76 packages et 1839 classes et interfaces). Nom de code
Kestrel
5. Le JDK 1.4 (Nom de code Merlin, avec 139 packages et 2723 classes et
interfaces)
6. Le JDK 1.5 (ou JDK 5, nom de code Tiger, avec 166 packages et 3279
classes et interfaces)
7. Java 6.0 (Nom de code Mustang), Octobre 2006 (11 Dcembre): 3777
classes et interfaces)
8. En fin, le dernier n du groupe (Fin 2010) : Java 7.0 (Nom de code
Dolphin) sous licence GPL.
N. Chenfour
7
1.2.3.3 Java
TM
2
Nous remarquons toutefois que Sun a voulu changer la nomination du JDK en la
remplaant partir de sa version 1.2 par SDK (Software Developpement Kit) ou
plus prcisment J2SDK pour JavaTM 2 SDK . Avec Java 2 dsignant le JDK
1.x (x 2). En fait Sun distingue entre deux concepts :
La spcification propose ou exige par Sun indpendamment des dtails
dimplmentation du langage ou la plate-forme de dveloppement. Celle-ci est
note : J2SE (JavaTM 2 platform Standard Edition).
Le software ou le kit qui implmente la spcification : J2SDK.
Pour terminer la remarque, on rsume que JDK, SDK, Java 2, J2SDK sont tous
des termes qui dsignent la mme chose : le kit de dveloppement Java.
1.2.3.4 Installation sur le disque
Gnralement le JDK (ou SDK) est dlivr (ou tlcharg gratuitement partir
du site de Sun) sous forme dun programme dont lexcution conduit
linstallation du kit.
Si lon prend lexemple du JDK 1.2.2, son installation par dfaut crera
larborescence suivante (de quelques 25 Mo) :

Tous les programmes dont on a besoin pour dvelopper (javac, java, ) se
trouveront alors dans le rpertoire : jdk1.2.2\bin quil est possible dajouter
au path pour tre accessible depuis nimporte quel rpertoire du disque.
N. Chenfour
8
1.2.4 Le JRE (Java Runtime Environment)
Le JRE est un ensemble doutils de classes et de bibliothques (.dll) ncessaires
pour lexcution dun programme Java. Ainsi le dploiement ou la diffusion
dune application dveloppe en Java ncessite que la machine sur laquelle
lapplication est installe dispose dune JVM. Le JRE constitue en quelque sorte
cette machine virtuelle ainsi que tous les outils dont a besoin toute application
Java pour pouvoir fonctionner. Le JRE est lui aussi accessible gratuitement dans
le site de Sun. Lorsquil est install sur le disque, il se prsente sous forme dun
rpertoire JRE (de quelques 20 Mo pour le JRE 1.2.2 associ au JDK 1.2.2).
1.2.5 Les Packages
Nous avons dj mentionn que le JDK dispose de plusieurs classes prtes
tre utilises. Ces classes sont en effet dlivres avec le JDK ou le JRE. On y
trouve mme la version source de ces classes dans un fichier archiv (src.jar).
Les classes accessibles sont gnralement organises en des arborescences.
Ainsi par exemple la classe String se trouve dans le sous rpertoire java\lang.
Ce dernier est appel paquetage ou Package. Ainsi lang est un package qui se
trouve dans le package java. Dautres sous packages du package java peuvent
tre signals tels que : java.util, java.awt, etc.. On remarque lutilisation du
symbole point . comme sparateur de chemin pour assurer la portabilit
entre systmes : le point sera remplac par le symbole anti-slash \ sous
Windows et / sous Unix.
Dans un programme java, pour utiliser une classe dun certain package par
exemple la classe Vector du package java.util on dmarre le programme avec la
ligne suivante :
import java.util.* ;
Ce qui signifie que toutes les classes du package sont accessibles. Ou encore :
import java.util.Vector ;
pour naccder qu la classe Vector.
N. Chenfour
9

Remarques :
Le Package java.lang est un package par dfaut. Ainsi il est possible dutiliser
toutes les classes de ce package sans avoir besoin de le mentionner par une
commande import.
Afin doptimiser lespace disque occup par les packages, Sun a mis en place un
mcanisme darchivage ou compression de tous ces packages (avec leur
classes) sous forme dun fichier dextension .jar (rt.jar). Les classes et les
packages restent comme mme accessibles comme sils ntaient par archivs.
On remarque que le JDK comporte un programme jar.exe (dans le sous-
rpertoire bin) avec lequel le programmeur peut fabriquer ces propres fichiers
.jar.
1.3 Elments de base du langage Java
1.3.1 Conventions de nommage
Il nest pas obligatoire mais il est recommand que le programmeur respecte
un certain ensemble de rgles lors de lcriture dun programme. Ces mmes
rgles sont dailleurs respectes par les dveloppeurs de Sun, ce qui facilite la
lecture des programmes et permet de deviner lcriture dun nom de classe ou
de mthode quelconque. Ces rgles peuvent tre rsumes de la manire
suivante :
Les noms de packages sont entirement en minuscule. Exemples :
java.awt
javax.swing
javax.swing.filechooser
etc
Un nom de classe est une squence de mots dont le premier caractre de
chaque mot est en majuscule et les autres en minuscule. Exemples :
String
N. Chenfour
10
StringBuffer
ComboBoxEditor
Un nom de mthode est une squence de mots dont le premier caractre de
chaque mot est en majuscule et les autres en minuscule sauf le premier mot
qui est entirement en minuscule. Exemples :
append
toString
deleteCharAt
Une proprit est en principe un membre priv donc non accessible directement
et par suite on peut lui choisir un nom librement. Sinon on lui applique la mme
rgle que celle dune mthode.
Une constante (final) est une squence de mots majuscules spars par un
blanc soulign _
PI
MIN_VALUE
MAX_VALUE
Les primitives (types de base ou type primitif ) et les mots cls sont en
minuscule :
byte, int,
while, for, if
this, super, try, cach, length,
class, extends, implements, null,
N. Chenfour
11
1.3.2 Diffrences lexicales et syntaxique avec le langage C++
Le langage Java a limin plusieurs structures du langage C/C++ dont on peut
citer :
le type enum (avant la version 5)
le mot cl const remplac par final
le mot cl goto
la notion de variables globales
les unions
les instructions #include et #define
les oprateurs : *, &, ->
la dsallocation
liste darguments variables (avant la version 5)
N. Chenfour
12
1.3.3 Structure gnrale dun programme Java
Le squelette gnral dun programme Java se prsente comme suit (chaque
classe dans un fichier spar et portant le mme nom que celui de la classe) :
public class NomDeClasse1 {
// Proprits de la classe
// Mthodes de la classe
}

public class NomDeClasse2 {
// Proprits de la classe
// Mthodes de la classe
}
...
public class NomDeClassePrincipale {
// Proprits de la classe
// Mthodes de la classe
public static void main(String args[]) {
// Code du programme principal
}
}

N. Chenfour
13
Il est remarquer que le compilateur Java gnre un fichier de classe (.class)
pour chacune des classes qui constituent le programme. Il est donc dusage
dcrire chaque classe sparment (dans un fichier spar portant le mme
nom que celui de la classe et avec respect de la casse). Le compilateur naura
pas de problme pour retrouver la classe compile (si elle est rfrence
partir dune autre classe qui se trouve dans un autre fichier) tant quon travaille
dans le mme rpertoire (ou plus exactement dans le mme package). Dans le
cas contraire (diffrents packages), on utilise linstruction import pour prciser
le chemin des classes accessibles.
1.3.4 Modificateurs et visibilit
Nous remarquons que la mthode main() qui constitue le point d'entre de
toute application est prcde par 3 mots rservs public static et void. Le
mot cl void dsigne le type de retour, cest donc une procdure. public et
static sont des modificateurs. Il existe 5 types de modificateurs trs utiliss qui
peuvent tre associes une donnes ou une fonction membre : modificateurs
de synchronisation, de visibilit, de permanence, de constance et dabstraction.

1- Synchronisation 2- Visibilit 3- Permanence 4- Constance Type Nom
SYNCHRONIZED
( seulement avec
les mthodes )
public
-
protected
private
STATIC FINAL
5- ABSTRACTION
ABSTRACT
(seulement les mthodes qui ne sont pas synchronized, static, final ou
private )
void
int


Exemples :
synchronized public static final void p1() {}
public abstract void p2() {}
public static int f1(){}
N. Chenfour
14
Modificateur synchronized :
Permet de mettre en place une mthode ou un bloc de programme verrouill
par lintermdiaire du mcanisme de moniteur. Une mthode synchronized est
une mthode dont laccs sur un mme objet est ralis en exclusion mutuelle.
Modificateurs private, public et protected :
Une donne ou mthode private est inaccessible depuis lextrieur de la classe
o elle est dfinie mme dans une classe drive.
Une donne ou mthode public est accessible depuis lextrieur de la classe o
elle est dfinie
Une donne ou mthode protected est protge de tout accs externe comme
private sauf partir des classes drives. Une mthode ou donne protected
est donc accessible dans une classe fille.

Remarque :
Lorsquon redfinie une mthode dans une classe fille, il est obligatoire
de conserver son modificateur de visibilit ou dutiliser un privilge daccs plus
fort. Cd :
une mthode public reste public,
une mthode protected reste protected ou devient public,
et une mthode private reste protected ou devient public ou protected.
Modificateur static :
Le modificateur static permet de dfinir une donne ou une mthode commune
toutes les instances de la classe. Ce sont des entits qui existent en labsence
de tout objet de la classe. Ainsi, une donne ou mthode static est associe
sa classe entire, et non une instance particulire de la classe. Le mot cl
static peut aussi tre appliqu toute la classe (static class , mais
uniquement pour les classes internes) dans tel cas tous les membres de la
classe seront static.
N. Chenfour
15
Les membres static peuvent donc tre appels directement par lintermdiaire
du nom de la classe. On na pas besoin de crer une instance de la classe pour
accder une mthode ou donne static se trouvant dans cette classe. Lappel
est ralis simplement laide du slecteur . (le C++, utilise pour ce cas le
slecteur :: ).
Les donnes static sont appeles variable de classe et les mthodes static
sont galement appeles mthodes de classe. Un exemple concret de
mthodes static est la mthode main() qui doit tre static afin de rester
indpendante des autres objets que le programme peut gnrer partir de sa
classe principale.
* Remarque :
Puisque les donnes non-static dune classe nont dexistence que
lorsquon a instancier un objet de la classe et inversement une mthode static
existe sans avoir besoin de crer dinstance de classe, une mthode static ne
peut donc pas accder une donne non-static ou une autre mthode
non-static :
Exemple :
class Class1 {
static int x = 20;
int y = 30;
static void p1() {
x = x + 1 ; // correcte
y = y * 2 ; // incorrecte
p2() ; // incorrecte
}
void p2() { // mthode non-static
x ++ ; // correcte
y ++ ; // correcte
p1() ; // correcte
N. Chenfour
16
}
}
Modificateur final :
Les donnes final sont des constantes. Ces donnes sont gnralement
dfinies en plus public et static afin dtre accessibles depuis lextrieur de la
classe et directement par lintermdiaire du nom de celle-ci sans avoir besoin
de crer une instance de la classe.
Exemple :
class Constantes {
public static final int CONST1 = 20;
public static final double PI = 3.14;
}
Lorsquune mthode porte le modificateur final, elle ne peut pas tre redfinie
dans une classe fille.
Modificateur abstract :
Ce modificateur permet de dfinir une mthode abstraite. Cd une mthode
dont le corps nest pas dfini. Une classe qui comporte une mthode abstraite
doit, elle aussi, tre dfinie abstraite. Il sagit dune classe de spcification qui
ne peut tre directement instancie. Elle ncessite dtre redfinie dans une
classe fille qui aura donc lobjectif dimplmenter les spcifications de la classe
abstraite mre.
La dfinition de mthodes abstraites est ralise de la manire suivante :
abstract class ClassAbstraite {

abstract typeretour methodeAbstraite(parametres) ;
}

N. Chenfour
17
Remarque :
Vue la notion dabstraction, une mthode abstraite ne peut pas tre :
- synchronized : car elle nest pas encore dfinie
- static : pour la mme raison (elle na pas encore dexistence, or une mthode
static existe ds la cration de la classe).
- final : car cela va empcher sa redfinition, or une mthode abstract na
dexistence que lorsquelle est dfine
- private : la redfinition dune mthode private signifie en fait la dfinition
dune nouvelle mthode qui porte le mme nom (et non pas le vritable sens de
la redfinition). De ce fait on ne peut pas donner dexistence une mthode
abstraite dclare private. Ce qui interdit la combinaison private-abstract.
1.3.5 La mthode main
La remarque que nous avons fait propos des mthodes static reste
valable pour le main qui est une mthode static. Cela impose une grande
restriction, car la mthode main ne peut accder qu des donnes et des
mthodes static. Pour rsoudre ce problme, il suffit de crer un objet de la
classe principale dans la mthode main. Ce qui implique lexcution du
constructeur. Ce dernier nest pas une mthode static on peut alors y mettre
tous les accs ncessaires aux diffrents membres non-static. Le squelette dun
programme Java est souvent alors form de la manire suivante :

N. Chenfour
18
class NomDeClasse {
// donnes membres
NomDeClasse () { // Constructeur
...
}
...
public static void main(String args[]) {
new NomDeClasse();
}
}
Exemple:
class Class1 {
static int x = 20;
int y = 30;
Class1() {
x = x + 1 ; // correcte
y = y * 2 ; // correcte
p2() ; // correcte
}
void p2() {
System.out.println("x = " + x + " y = " + y) ;
}

public static void main(String args[]) {
new Class1();
y = y * 2 ; // incorrecte
p2() ; // incorrecte
}
}
N. Chenfour
19
1.3.6 Units lexicales et syntaxiques de base du langage
Les units de base du langage Java sont hrites du langage C. Ainsi le langage
Java utilise sans modification les entits et structures suivantes du langage C :
Affectation : =
Oprateurs arithmtiques : +, -, *, /, %, ++, --, +=, -=, *=, /=, %=,
...
Oprateurs de relation : <, <=, >, >=, !=, ==
Oprateurs sur le bit : &, |, ~, ^, <<, >>, >>>
Instructions de choix :
if (condition) traitement1 ; else traitement2 ;
switch () { case ... default }
Oprateurs logiques : &&, ||, !
Les boucles :
for () {}
while (condition) {}
do { } while (condition)
Transtypage :
variable = (type) Expression ;
Commentaires :
//...
/* ...*/
N. Chenfour
20

2.1 Principe de base de la POO
Une structuration classique dun programme consiste en une structuration
deux niveaux : les donnes dune part et le code dune autre part. Ainsi les
donnes qui dcrivent ou caractrisent une mme entit sont regroupes
ensemble dans une mme structure de donne : un enregistrement ou un
tableau. De la mme manire des instructions ralisant ensemble une tache
bien dfinie et complte sont regroupes dans une mme procdure ou
fonction.
La Programmation Oriente Objets (POO) consiste en une structuration de plus
haut niveau. Il sagit de regrouper ensemble les donnes et toutes le
procdures qui permettent la gestion de ces donnes. On obtient alors des
entits comportant la fois un ensemble de donnes et une liste de procdures
et de fonctions pour manipuler ces donnes. La structure ainsi obtenue est
appele : Objet.
Un objet est alors une gnralisation de la notion denregistrement. Il est
compos de deux partie :
- Une partie statique (fixe) compose de la liste des donnes de lobjet. On les
appelle : Attributs ou Proprits, ou encore : Donnes Membres.
- Une partie dynamique qui dcrit le comportement ou les fonctionnalits de
lobjet. Elle est constitue de lensemble des procdures et des fonctions qui
permettent lutilisateur de configurer et de manipuler lobjet. Ainsi les
donnes ne sont gnralement pas accessibles directement mais travers
Chapitre 2. Programmation Oriente
objet en Java
N. Chenfour
21
les procdures et les fonctions de lobjet. Celles-ci sont appeles :
Mthodes ou Fonctions Membres.




2.2 Encapsulation
Un objet tel que dfini plus haut est une variable caractrise par des
proprits et des mthodes. La dfinition de ces proprits et de ces mthodes
devra tre ralise dans une structure de donnes appele classe.
Une classe est donc le support de lencapsulation : cest un ensemble de
donnes et de fonctions regroupes dans une mme entit. Les donnes seront
gnralement appeles des proprits, les fonctions qui oprent sur ces
proprits sont appeles des mthodes.
Crer un objet depuis une classe est une opration qui sappelle
linstanciation. Lobjet ainsi cr pourra tre appel aussi : instance. Entre
classe et objet il y a, en quelque sorte, le mme rapport quentre type de
donnes et variable.
Pour utiliser une classe il faut en dclarer une instance de cette classe (appele
aussi objet).
2.3 Syntaxe de dclaration dune classe
class NomDeClasse {
Proprits de la classe

Attributs ou Proprits
Mthodes ou Fonctions
Membres

N. Chenfour
22
Mthodes de la classe
}
Lordre des mthodes dans une classe na pas dimportance. Si dans une classe,
on rencontre dabord la mthode m1() puis la mthode m2(), m2() peut tre
appele sans problme dans m1().
2.4 Instanciation
Il est ncessaire de dclarer un objet avant son instanciation. La dclaration est
ralise de la manire suivante :
NomDeClasse nomDeVariable ;
Linstanciation et ralise ensuite laide de loprateur new qui se charge de
crer une instance (ou un objet) de la classe et de lassocier la variable
nomDeVariable = new NomDeClasse();
Il est possible de runir les 2 instructions en une seule :
NomDeClasse nomDeVariable = new NomDeClasse();
Si objet1 dsigne un objet de type NomDeClasse, et si objet2 est un nouvel
objet cr laide de linstruction objet2 = objet1, il est alors noter que cette
affectation ne dfinit pas un nouvel objet mais objet1 et objet2 dsignent tous
les deux le mme objet.
Loprateur new est un oprateur de haute priorit qui permet dinstancier des
objets et dappeler une mthode particulire de cet objet : le contructeur. Le
constructeur est une mthode de classe (sans valeur de retour) qui port le
mme nom que celui de la classe et dans laquelle sont ralises toutes les
initialisation de lobjet en cours.
Le constructeur peut avoir des paramtres et dans tel cas linstanciation est
ralise avec des arguments dappel :
NomDeClasse nomDeVariable = new NomDeClasse(a1, a2, ...);
N. Chenfour
23
Exemple :
String S = new String("abc");
Pour le cas des chanes de caractres, lcriture prcdente et quivalente
linstruction suivante :
String S = "abc";
Les constantes chanes sont des objets String
2.5 Dure de vie dun objet
Les objets en java sont tous dynamiques. La dure de vie dun objet passe par
trois tapes :
la dclaration de lobjet et son instanciation laide de loprateur new
lutilisation de lobjet en appelant ces mthodes
la suppression de lobjet : elle est ralise automatiquement laide
du garbage collector qui libre lespace mmoire associ lobjet ne
rfrence plus cet espace mmoire (par exemple affectation de null
lobjet) et lorsque cet espace mmoire nest plus rfrence par
aucune autre variable).
Il nexiste pas dinstruction delete comme en C++.
2.6 Affectation dobjets
Exemple :
NomDeClasse objet1 = new NomDeClasse ();
NomDeClasse objet2 = objet1;
objet1 et objet2 contiennent la mme rfrence et pointent donc tous les deux
sur le mme espace mmoire : les modifications faites partir de lune des
deux variables modifient le contenu aussi bien pour lune que pour lautre des 2
variables.
N. Chenfour
24
2.7 Rfrences et comparaison dobjets
Les variables de type objet que lon dclare ne contiennent pas un objet mais
une rfrence vers cet objet. Lorque lon crit c1 = c2 (c1 et c2 sont des
objets), on copie la rfrence de lobjet c2 dans c1 : c1 et c2 rfrent donc le
mme objet (ils pointent sur le mme objet). Loprateur == compare ces
rfrences. Deux objets avec des proprits identiques sont deux objets
distincts :
Exemple :
Point p1 = new Point (100,50);
Point p2 = new Point (100,50);
if (p1 == p2) { ... } // Faux
if (p1.equals(p2)) { ... } // Vrai
Pour tester lgalit des contenus de deux instances, il faut munir la classe dun
mthode permettant de raliser cette opration : la mthode equals hrite de
Object.
Remarque :
Pour sassurer que deux objets sont de la mme classe, il faut utiliser la
mthode getClass() de la classe Object dont toutes les classes hritent.
Exemple :
(obj1.getClass().equals(obj2.getClass())

N. Chenfour
25
2.8 Le mot cl this
Ce mot cl sert rfrencer dans une mthode linstance de lobjet en cours
dutilisation. this est un objet qui est gale linstance de lobjet dans lequel il
est utilis.
Ainsi dans une classe, pour accder une proprit p , on peut crire this.p.
cette notation devient ncessaire dans le cas ou une autre variable du contexte
(un paramtre ou une variable globale) porte le mme nom de la proprit.
Exemple :
class A {
private int value;
public A(int value) {
value = value;
this.value = value;
}
}
Cette rfrence est habituellement implicite :
Exemple :
class B {
private String text = "abc" ;
public String getText() {
return text;
}
}

N. Chenfour
26

2.9 Loprateur instanceof
Loprateur instanceof permet de dterminer la classe de lobjet qui lui est
pass en paramtre. La syntaxe est :
objet instanceof classe
Exemple :
void testClasse(Object x) {
if (x instanceof A ) ...
}

2.10 Les constantes
Les constantes sont dfinies avec le mot cl final : leur valeur ne peut pas tre
modifie. Elle sont gnralement aussi : publique et statiques.
Exemple :
public class A {
public static final double PI = 3.14 ;
}
2.11 Surcharge (ou Surdfinition) des mthodes
La surcharge dune mthode permet de dfinir plusieurs fois une mme
mthode avec des arguments diffrents. Lors de lappel la mthode, le
compilateur choisi la mthode qui doit tre appele en fonction du nombre et
du type des arguments.
Une mthode est surcharge lorsquelle excute des actions diffrentes selon le
type et le nombre de paramtres transmis.
N. Chenfour
27
public class Number {
private int value;
public Number(int value) {
This.value = value;
}
public void inc() {
value ++;
}
public void inc(int step) {
value = value + step;
}
}

Number n = new Number(20) ;
n.inc(); //appellera la premire mthode inc() et incrmentera la valeur par
1
n.inc(5); //appellera la 2me mthode inc(int) et incrmentera la valeur par
5
Remarque :
Les constructeurs peuvent aussi tre surchargs
2.12 Les accesseurs
Lencapsulation permet de scuriser laccs aux donnes dune classe. Ainsi, les
donnes dclares private lintrieur dune classe ne peuvent tre accdes et
modifies que par des mthodes dfinies dans la mme classe. Si une autre
N. Chenfour
28
classe veut accder aux donnes de la classe, lopration nest possible que par
lintermdiaire de mthodes de la classe prvues cet effet.
Un accesseur est une mthode publique qui donne laccs une proprit
prive dune classe. Laccs peut tre ralis en lecture ou en criture. Par
convention, les accesseurs en lecture commencent par le mot get (ou is ce le
type de la proprit est boolean) et sont appels des getters et les accesseurs
en criture commencent par le mot set et sont appels des setters.
public class Number {
private int value;
public Number(int value) {
This.value = value;
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
2.13 Dfinition dun package
En java, il existe un moyen de regrouper des classe voisines ou qui couvrent un
mme domaine dans une mme structure appele : package. Pour raliser un
package, on crit un nombre quelconque de classes dans plusieurs fichiers dun
mme repertoire et on commence le fichier de classe avec linstruction
suivante :
package nom.de.package;
N. Chenfour
29
Le mot cl package doit tre la premire instruction dans un fichier source et il
ne doit tre prsent quune seule fois dans le fichier source (une classe ne peut
pas appartenir plusieurs packages).
La hirarchie dun package se retrouve dans larborescence du disque dur
puisque chaque package est dans un rpertoire nomm du nom du package.
2.14 Utilisation dun package
Pour utiliser ensuite le package ainsi cr, on limporte dans le fichier :
import nom.de.package.*;
Pour utiliser une classe A particulire du package, on peut utiliser linstruction
suivante :
import nom.de.package.A;
Remarque :
Lutilisation du symbole * donne laccs toutes les classes du package mais
pas aux sous packages de celui-ci.
N. Chenfour
30

3.1 Variables et Objets
En Java, il existe 3 catgories de types :
1- les types de base (types primitifs)
2- le type Classe
3- le type tableau

Les types de base (en nombre de 8 plus le type void) sont les seuls types
statiques (non dynamiques). Les Objets et les tableaux sont toujours et
implicitement des donnes dynamiques cres par lintermdiaire du mot cl
new.
3.2 Types de base
le langage Java offre 8 types de base appels aussi primitives ou types
primitifs. Le mot cl void nest plus un type, il est utilis uniquement pour
dfinir les procdures,
Type Dsignation Plage de valeurs
byte Entier sign 1 octet -128 127
short Entier sign 2
octets
-32768 32767
int Entier sign 4
octets
-2
31
= -2147483648 2
31
-1 = 2147483647
long Entier sign 8 -2
63
= -9223372036854775808 2
63
-1 =
Chapitre 3. Elments de base du
langage Java
N. Chenfour
31
octets 9223372036854775807
float Rel sur 4 octets
double Rel sur 8 octets
-3.4x10
38
3.4x10
38

char Caractre 2 octets Code en Unicode: char c = x; ou char c =
\u0058;
boolean Type logique true et false

Exemple :
int x = 200 ;
byte b = 64 ;
3.3 Classes et Objets
Cration :
La cration des objets est toujours ralise par lintermdiaire de
loprateur new :
NomDeClasse objet;
objet = new NomDeClasse(paramtres dun constructeur);
ou encore :
NomDeClasse objet = new NomDeClasse(paramtres dun constructeur);

Exemple :
String S = new String("ceci est une chane de caractres");
N. Chenfour
32
Copie
Un objet peut aussi rfrencer ladresse dun objet existant. Les deux objets
dsigneront alors la mme information. Cependant la destruction de lun des
objets ne causera pas la destruction de lautre.
NomDeClasse objet1 = new NomDeClasse(paramtres dun constructeur);
NomDeClasse objet2 = objet1;
Exemple :
String S1 = new String("ceci est une chane de caractres");
String S2 = S1;
Les chanes de caractres constituent un cas particulier. Elles peuvent en plus
tre initialises des constantes chanes :
S2 = "abc"

Destruction
Un objet en mmoire est dtruit automatiquement par lintermdiaire du
Garbage Collector. Aucune destruction explicite nest alors ncessaire.
Cependant, la constante null peut tre affecte un objet pour supprimer le
lien avec lespace mmoire quil rfrenait auparavant. Ce qui entranera la
libration de la mmoire si celle-ci nest pas rfrence par un autre objet.
objet = null;
N. Chenfour
33
3.5 Quelques proprits du Langage Java
1. Les tableaux tels quils sont dfinis en Java (objets dynamiques) ne
peuvent pas remplacer la notion de liste. En effet, ds quils sont crs,
on ne peut plus leur modifier la taille, sauf si on remplace le tableau cr
par un autre.
2. Pour grer les listes, on peut :
Les crer laide de classes.
Ou encore utiliser une classe Liste existante : LinkedList , Vector ou
Stack du package java.util.
3. Un tableau de char nest pas une chane de caractres en Java. Il ne peut
donc pas tre gr comme une chane.
Exemple :
Lcriture :
char S[] = "abc" ;
est incorrecte.
4. Il est possible de convertir un tableau char [] en une chane (String) par
lintermdiaire de lun des constructeurs de la classe String.
Exemple :
char S1[] = {a,b,c};
String S2 = new String(S1) ;
5. Les types wrappers tels que Integer sont en principe utiliss pour
permettre la conversion automatique vers la classe mre Object. Ce qui
nest pas le cas pour les types de base (int, float, ).
N. Chenfour
34
Exemple :
Vector L = new Vector();
int x=20;
Integer wx=new Integer(20);
L.add(x); // est incorrecte avant la version 5 (avec celle-ci, cela devient
// possible laide de la notion dautoboxing) alors que
L.add(wx); // est correcte.

6. Les variables de types lmentaires (primitives) sont manipules
directement par valeur tandis que tous les autres objets sont manipuls
par leurs adresses. Ces derniers ncessite alors une cration explicite
aprs leur dclaration (par lintermdiaire de loprateur new).

7. Un rsultat de la remarque prcdente est quau niveau des procdures
et fonctions le passage des paramtres est toujours par adresse pour le
cas des objets. Quant au paramtres de type de base, le passage est par
valeur. Afin de raliser un passage par adresse pour ces derniers on peut
les envelopper dans des objets de classe que lon cre pour cette fin.
Exemple :
class Entier {
int val ;
public int getVal() {return val ;}
public void setVal(int v) {val = v ;}
}
Un paramtre de type Entier utilisera alors un passage par adresse,
linverse dun paramtre de type int.

N. Chenfour
35
8. Les proprits static sont accessibles directement par lintermdiaire du
nom de la classe : NomDeClasse.proprit

9. Les mthodes static ne peuvent accder quaux proprits et mthodes
static (ou des variables locales). Par consquent, la mthode main
(qui est static) ne peut pas accder des proprits non static (ni appeler
des mthodes non static).
Exemple 1 :
class Class1 {
private static int x ;
private int y ;
public static void main(String args[]) {
x = 20 ; // correcte
y = 30 ; // incorrecte

}
}

Exemple 2 :
class Class1 {
private int x, y ;
void initData() {
x = 20 ;
y = 30 ;
}
public static void main(String args[]) {
initData() ; // incorrecte
}
}

N. Chenfour
36
Une solution ce problme peut tre obtenue, on ajoutant un constructeur la
classe qui appelle la procdure initData(), et de crer une instance de la classe
dans le main :
class Class1 {
private int x, y ;
Class1() {
initData() ;
}
void initData() {
x = 20 ;
y = 30 ;
}
public static void main(String args[]) {
new Class1() ;
}
}

10. Les variables de classes (ou proprits) peuvent tre initialises (
linverse du C++) lors de leur dclaration.
Exemple :
class Class1 {
private int x=20, y=30 ;

}

N. Chenfour
37
11. Toutes les classes prdfinies ou dfinies par lutilisateur lui mme
drivet directement ou indirectement de la classe Object
(java.lang.Object). En consquence, Les mthodes qui acceptent des
paramtres de type Object peuvent recevoir des arguments instances de
nimporte quelle classe.

12. Pour dterminer le nom de classe dun objet, on peut utiliser dans
lune des mthodes (non statics) de la classe linstruction :
getClass().getName(). La mthode getClass() retourne la classe (un
objet de type Class) et la mthode getName() (de la classe Class)
retourne, sous forme de chane de caractres, le nom de la classe :
System.out.println("je suis un objet de la classe : " +
getClass().getName());

13. Pour dterminer le nom de classe mre dun objet, on peut utiliser
dans lune des mthodes (non statics) de la classe linstruction :
getClass().getSuperclass().getName().
La mthode getSuperclass() de la classe Class retourne un objet de type
Class qui contient la classe mre de lobjet en cours :
System.out.println("Ma classe mre : "
+getClass().getSuperclass().getName());

14. Pour dterminer le nom de la classe mre dune classe dont on
connat le nom, on peut utiliser linstruction :
Class.forName("Nom de la classe").getSuperclass().getName()

N. Chenfour
38
Exemple :
try {
System.out.println("mre de java.lang.Thread :" +
Class.forName("java.lang.Thread").getSuperclass().getName());
} catch (Exception e) {}

15. La mmoire occupe par un objet est automatiquement libre
lorsque celle-ci nest plus rfrence par aucune variable du programme.
Cette dsallocation automatique est ralise par un programme de la
machine virtuelle Java appel : Garbage Collector. Celui-ci peut
cependant tre appel explicitement par lintermdiaire de la mthode
static gc() de la classe System.
3.5 La classe Object
Lhritage est un concept qui est toujours utilis en Java. Ainsi chaque
fois que lon dfinisse une nouvelle classe, celle-ci se drive automatiquement
de la classe Object mre de toutes les classes :
class Test {
Test() {
String S = getClass().getName();
System.out.println("Je suis un nouvel objet de la classe : "+S);
}
public static void main(String args[]) {
new Test();
}
}
N. Chenfour
39
A lexcution, le programme affiche le message :
Je suis un nouvel objet de la classe : Test

getClass tant une mthode de la classe Object retournant un objet de type
Class qui reprsente la classe de lobjet appelant. La mthode getName() de la
classe Class permet dobtenir le nom de la classe sous forme dune chane de
caractre.
Voici la liste des mthodes de la classe Object :
1- protected Object clone()
Crer une copie de lobjet appelant.
2- boolean equals(Object obj)
Teste si lobjet obj est gal lobjet appelant. La fonction retourne true si les
objet ont la mme rfrence. Exemple :
Class1 v1 = new Class1();
Class1 v2 = v1;
if (v1.equals(v2))
La mthode equals peut tre redfinie pour faire une comparaison sur le
contenu et non la rfrence.
3- protected void finalize()
Cette mthode est appele par le Garbage Collector lorsquil veut liminer un
objet de la mmoire. Si lon veut raliser un traitement particulier il suffit de
redfinir cette mthode avec le comportement adquat dans les classes
utilises.
4- Class getClass()
Retourne un objet de type Class qui reprsente la classe laquelle appartient
lobjet appelant.
Pour afficher le nom de cette classe, il suffit dappeler la mthode getName()
sur lobjet retourn :
N. Chenfour
40
String S = getClass().getName();
Pour crer un nouvel objet de cette mme classe, on utilise la mthode
newInstance() :
Class c = getClass();
try {
c.newInstance();
} catch (Exception e) {}
5- int hashCode()
Retourne un Hash-Code pour lobjet appelant.
6- void notify()
Cette mthode est appele uniquement dans un moniteur (dans une mthode
synchronized) permettant de rveiller lun dentre les processus qui se sont
fait bloquer dans ce mme moniteur. Le choix du processus rveiller est
ralis par le systme. Lobjet appelant ignore compltement quel serais le
prochain processus rveill.
7- void notifyAll()
Comme notify(), mais rveille tous les processus bloqus dans le moniteur.
8- String toString()
Retourne un reprsentation sous forme de String de lobjet, affichable par
lintermdiaire de la mthode System.out.print(ln). La mthode toString() est
appele chaque fois que lon essai dafficher un objet par la mthode
System.out.print(ln). Il suffit donc de la redfinir dans la classe de lobjet avec
le comportement adquat. Exemple :
class Point {
int x, y;

public String toString() {
return ("( " + x + " , " + y + " )");
}
}
N. Chenfour
41
9- void wait()
Cette mthode est appele, comme notify(), lintrieur dun moniteur
permettant le blocage du processus appelant qui restera bloqu jusqu
recevoir un signal notify() envoy par un autre processus.
10- void wait(long timeout)
Comme wait() mais le blocage est pendant timeout millisecondes
11- void wait(long timeout, int nanos)
Comme wait() mais le blocage est pendant timeout millisecondes et nanos
nanosecondes

Remarque :
Puisque toutes les classes Java (existantes ou cres par lutilisateur)
descendent de la classe Object, si on a alors une mthode qui reoit en
paramtre une variable de type Object, on peut alors communiquer cette
mthode un objet de nimporte quel type. Comme exemple, on peut citer la
mthode add de la classe LinkedList (Liste chane) du pakage java.util. Celle-
ci accepte en paramtre une variable de type Object ( add(Object o) ). On
peut donc remplir la liste avec des objets de types varis :

LinkedList L = new LinkedList();
L.add(new String("abc") );
L.add(new Integer(20) );

N. Chenfour
42
3.6 Gestion des exceptions en Java
La gestion des exceptions ou erreurs en Java offre des moyens structurs
pour capturer les erreurs d'excution dun programme et de fournir des
informations significatives leur sujet. Pour le traitement des exceptions, on
utilise les mots cls try, catch et finally :
try {
// Code pouvant se terminer en erreur et dclencher une exception.
}
catch( Exception e ) {
// Code de traitement de l'exception.
// La ligne suivante ouvre un suivi de pile de l'exception :
e.printStackTrace();
}
finally {
// Le code insr ici sera toujours excut,
// que l'exception ait t dclenche dans le bloc try ou non.
}

1- Le bloc try doit tre utilis pour entourer tout code susceptible de
dclencher une exception ayant besoin d'tre gre. Si aucune exception
n'est dclenche, tout le code du bloc try est excut. Mais, si une exception
est dclenche, le code du bloc try arrte l'excution l'endroit o
l'exception a t dclenche et le contrle passe au bloc catch, dans lequel
l'exception est gre.

2- Le bloc catch permet de traiter lexception. On peut faire tout ce dont on a
besoin pour grer l'exception dans un ou plusieurs blocs catch. Le moyen le
plus simple de grer des exceptions peut tre ralis travers un seul bloc
catch. Pour cela, l'argument entre les parenthses suivant catch doit
indiquer la classe Exception, suivie d'un nom de variable affecter cette
exception. Cela indique que toute exception qui est une instance de
N. Chenfour
43
java.lang.Exception ou de n'importe laquelle de ses sous-classes sera
capture.

3- Le bloc finally est optionnel. Le code se trouvant dans le bloc finally sera
toujours excut, mme si le bloc try qu'il dclenche une exception et ne se
termine. Le bloc finally est un bon endroit pour placer du code de nettoyage.

N. Chenfour
44



1. Une classe B tend une class A pour ajouter ou modifier des
services. On peut aussi ajouter des proprits.
2. La nouvelle classe B est appele : classe Fille, ou classe Drive.
3. La classe A est la classe Mre ou classe de Base.
4. On dit que B tend A ou B hrite de A.

Contraintes :
5. Si la classe A ne dispose daucun constructeur ( le compilateur gnre
un constructeur sans paramtre pour A), la classe B peut tre dfinie
sans contraintes.
Exemple :
class A {
private int x, y;

public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
Chapitre 4. Hritage Java
N. Chenfour
45
public int getY() {
return y;
}
public void print() {
System.out.println("(" + x + ", " + y + ")");
}
}

Class B extends A {

}

Un constructeur sans paramtre est gnr pour B.

6. Si A dispose dun constructeur avec paramtres et pas de constructeur
sans paramtres, alors la dfinition suivante est errone :

Class B extends A {

}

7. En fait un constructeur sans paramtre est gnr pour B, celui-ci
appellera le constructeur sans paramtre de A qui nexiste pas. Do
lerreur

N. Chenfour
46
8. Rgle Gnrale : tous les constructeurs dune classe Fille appellent
automatiquement le constructeur sans paramtre de la classe Mre. Cet
appel est gnr automatiquement par le compilateur comme premire
instruction de chaque constructeur.

9. Cet appel au constructeur de la classe Mre peut tre ralis
explicitement laide du mot cl super :

Class B extends A {
B() {
super() ;
...
}
}

10. Cet appel comme premire instruction Signifie que si on a une class C qui
drive de B, alors :
- Le constructeur de A est excut en premier lieu
- Ensuite celui de B
- Et enfin celui de C :
N. Chenfour
47
Class A {
A() {
System.out.println(A);
}
}

Class B extends A {
B() {
System.out.println(B);
}
}

Class C extends B{
C() {
System.out.println(C);
}
}

Une instanciation de la classe C laffichage suivant:
A
B
C
N. Chenfour
48
11. Lexistence de ce mot cl super permettra de drouter lappel un autre
constructeur avec paramtres en prcisant entre les parenthses les
arguments dappel de celui-ci :

class A {
private int x;
A() {
System.out.println(A);
}
A(int x)
This.x = x;
System.out.println(A(x));
}
}
Class B extends A {
B() {
super(20);
System.out.println(B);
}
}

Au rsultat, on aura:
A(x)
B

N. Chenfour
49
12. Chaque super appel la classe Mre immdiatement suprieure
class A {
private int x;
A() {
System.out.println(A);
}
A(int x) {
This.x = x;
System.out.println(A(x));
}
}

Class B extends A {
B() {
super(20);
System.out.println(B);
}
}

Class C extends B {
C() {
super(20); // est une erreur
System.out.println(B);
}
}

Signifie que B a un constructeur
avec un paramtre entier, ce qui
nest pas le cas.

N. Chenfour
50
13. Remarque : Un constructeur dune classe peut aussi appeler un autre
constructeur de la mme classe (pour rutiliser les instructions dfinies
dans ce dernier). On utilisera le mot cl this :
class A {
private int x;
A() {
System.out.println(A);
}
A(int x) {
this();
this.x = x;
System.out.println(A(x));
}
}
Ou encore :
class A {
private int x;
A() {
this(20);
System.out.println(A);
}
A(int x) {
this.x = x;
System.out.println(A(x));
}
}
N. Chenfour
51

14. Linstruction this() doit aussi tre la toute premire instruction du
constructeur.
15. Lextension dune classe permettra dajouter des services :
Class A {
A() {
System.out.println(A);
}
void s1() {
...
}
void s2() {
...
}
}


Class B extends A {
B() {
System.out.println(B);
}
void s3() {
...
}
}

N. Chenfour
52
Une instance a de A aura droit aux services : s1() et s2()
Une instance b de B aura droit aux services :
s1(), s2() (hrits) ainsi quau service s3().
Cest dire :
A a = new A() ;
B b = new B() ;
a.s1(); a.s2(); a.s3();
b.s1(); b.s2(); b.s3();

16. Lextension dune classe permettra de modifier des services. On parlera
de la Redfinition :

Class A {
A() {
System.out.println(A);
}
void s1() {
System.out.println(Service s1() de A);
}
}

N. Chenfour
53
Class B extends A {
B() {
System.out.println(B);
}
void s1() {
System.out.println(Service s1() Redfini dans B);

}
}

A a = new A() ;
B b = new B() ;
a.s1(); Service s1() de A;
b.s1(); Service s1() Redfini dans B;

17. Si on veut rutiliser le service s1() de la classe Mre dans la classe Fille,
il est possible dappeler le service s1() de la classe Mre depuis la Fille
laide de linstruction super.s1() :
Class B extends A {
B() {
System.out.println(B);
}
void s1() {
System.out.println(Service s1() Redfini dans B);
super.s1();
}
}
N. Chenfour
54

B b = new B() ;
b.s1(); Service s1() Redfini dans B;
Service s1() de A;

En rsum : Le mot cl super dsigne la classe mre. Il peut tre utilis dans
deux situations diffrentes :
1- Pour appeler un constructeur de la classe mre : il est alors utilis comme
premire instruction du constructeur de la classe fille :
Syntaxe :
super(paramtres du constructeur de la classe mre);

Exemple :
Classe Mre :
class A {
private String name;
A(String S) {
name = S;
}
String getName() {
return name;
}
}


N. Chenfour
55
Classe Fille :
class B extends A {
B(String Nom) {
super(Nom);
}
public static void main(String[] args) {
B objet = new B("objet B");
System.out.println(B.getName());
}
}

2- Pour appeler une mthode de la classe mre, si celle-ci est redfinie dans
la classe fille :

Syntaxe :
super.nomDeLaMethode(paramtres);

Exemple :
class A {
void p()
{
System.out.println("Mthode p() de la classe A");
}
}

N. Chenfour
56
public class B extends A {
void p() {
System.out.println("Mthode p() de la classe B");
super.p();
}
public static void main(String[] args) {
B objet = new B();
objet.p();
}
}
Le programme affiche :
Mthode p() de la classe B
Mthode p() de la classe A

18. Remarque : la classe Object est la classe mre de toutes les classes
sans Mre. Ainsi la dfinition suivante :

class A {
...
}
Est quivalente :
class A extends Object {
...
}

N. Chenfour
57
Rsultats :
19. Rsultat N 1 : La classe Object se trouve en tte de larbre dhritage
de toutes les classes Java.
20. Rsultat N 2 : Toute nouvelle classe va hriter de toutes les mthodes
public de la classe Object.
21. Rsultat N 3 : comme exemple de mthodes, il y a la mthode
toString() invoque automatiquement par le compilateur lors dune
tentative daffichage dun objet :

System.out.println(objet)

System.out.println(objet.toString()) //gnre par le compilateur
Mais aussi dans tout contexte ncessitant cette transformation :
gnralement les concatnation de chanes de caractres :

String s ;
s + objet + s + objet.toString() +

22. la mthode toString() est une mthode public de la classe Object qui
retourne une chane de caractre ; lobjet est alors imprimable ou
affichable .
23. La mthode toString() est dfinie par dfaut (dans Object) pour
retourner ladresse de lobjet sous forme dune chane de caractres.
24. Il est donc possible de la redfinir dans nimporte quelle classe pour
choisir le format adquat dafficher des objets de la classe.
N. Chenfour
58
Exemple :
class A {
private int x, y;

public String toString() {
return "(" + x + ", " + y + ")") ;
}
}

25. La redfinition dune mthode ne doit pas rduire ses
privilges daccs :
private void p() ; (Red) private, protected, sans ,
public
protected void p() ; (Red) protected, sans , public
void p() ; (Red) sans , public
public void p() ; (Red) public

26. Important : un objet de classe Fille peut tre affect un
objet de classe Mre :
Laffectation [ Mre Fille ] est possible :
Fille f = new Fille (...);
Mre m = f ;

lobjet m aura une
Vue plus restreinte que f

NECESSAIRE
Mre





Fille
m
f
Partie Commune
N. Chenfour
59
27. Important : Laffectation [Mre Fille] nest possible que :
- Si on utilise un transtypage (Casting)
- Si lobjet Mre pointe effectivement un Objet Fille :
Exemple :
Fille f1 = new Fille() ;
Mre m = f1 ; // lobjet mre Pointe une fille.
Fille f2 = (Fille) m ; // Possible

Mre m2 = new Mre() ;
Fille f3 = (Fille)m2 ;// Possible lors de la compilation (syntaxiquement).
Mais ERREUR lors de lExcution.
Remarques :
28. Le casting des objets en Java permet de Retrouver lidentit relle dun
objet.
29. Pas de casting entre de objets de classes nayant pas de relation Mre-
Fille
30. Cette relation peut ne pas Entre directe :
Exemple :
C tend B et B tend A, on peut faire :
C c1 = new C() ;
A a = c1 ; // Mre Fille
C c2 = (C) a; // Fille Mre

N. Chenfour
60
1.5 Classes Abstraites et Interfaces
En Java, il existe 3 types dentits quon peut manipuler :
1. Les classes (dj vues)
2. Les classes abstraites prsentes par le mot cl abstract :
abstract class NomClasse {
...
}
Dans une classe abstraite, le corps de quelques mthodes peut ne pas tre
dfini (on dclare uniquement le prototype de la mthode). Ces mthodes
sont dites des mthodes abstraites. Une mthode abstraite est aussi
prsentes par lintermdiaire du mot cl abstract de la manire ci-aprs.
Cest aux classes drives de redfinir ces mthodes et de prciser leur
comportement.
abstract class NomClasse {
abstract type NomMthode(parameters);
...
}
Une classe abstraite ne peut donc jamais tre instancie. Il sagit dune
spcification devant tre implmente par lintermdiaire dune classe
drive. Si cette dernire dfinit toutes les mthodes abstraites alors celle-ci
est instanciable.
Remarque :
Une classe abstraite (prsente par le mot cl abstract) peut ne pas
contenir de mthodes abstraites. Cependant, une classe contenant une
mthode abstraite doit obligatoirement tre dclare abstract.
N. Chenfour
61
3. Les interfaces qui sont dfinies par lintermdiaire du mot cl interface au
lieu de class constituent un cas particulier des classes abstraites : dune
part, ce sont des classes o aucune mthode nest dfinie (uniquement le
prototype de chaque mthode). Dautre part, lextension dune interface est
appele implmentation et elle est ralise par lintermdiaire du mot cl
implements :
- Dfinition dune interface :
interface NomInterface {
type1 methode1(paramtres);
type2 methode2(paramtres);

}

- Implmentation dune interface :
class NomDeClasse implements NomInterface {

}

Remarques :
1. Une classe qui implmente une interface doit dfinir toutes les mthodes
de linterface.
2. Une interface peut aussi contenir des attributs.
3. Tous les attributs dune interface doivent obligatoirement tre initialiss.
4. Tous les attributs dune interface sont public, static et final.

N. Chenfour
62


5.1 Dclaration :
Type NomDuTableau[] ;
Avec Type est lun des deux cas suivant :
- un type primitif
- une classe
Exemples :
int T1[] ;
Vector T2[] ;
String T3[] ;
5.2 Cration du Tableau
NomDuTableau = new Type[taille] ;
Exemples :
T1 = new int[20] ;
T2 = new Vector[10] ;
T3 = new String[15] ;
Remarque :
Dans le cas des tableaux de classes, seul le tableau est cr mais pas les
lments ce qui ncessite pour le cas de T2 et T3 la cration de chaque T2[i] et
chaque T3[j]
Chapitre 5. Les Tableaux
N. Chenfour
63
5.3 Cration des lments dun tableau
- Pour T1 (tableau de primitifs) :
T1[0] = 34 ;
T1[1] = 45 ;

- Pour T2 et T3 (tableaux dobjets) : les lments doivent tre
crs avant de sen servir
T2[0] = new Vector() ; T2[0].add() ;
T3[0] = new String(.) ; if (T3[0].equals()
5.4 Le tableau est un Objet
Il dispose des mthodes hrites de la classe Object, en plus il dispose de la
proprit lecture seule : length
int l = T1.length ; 20
Remarque1 :
Lorsquun tableau est cr, il est impossible de le redimensionner.
La solution :
- crer un nouveau tableau avec la taille souhaite
- copier les lments du tableau initial
- supprimer ce tableau
Exemple :
int T1[] = new int[20] ;
int tmp[] = new int[21] ;
for (int i=0 ; i<T1.length ; i++) tmp[i] = T1[i] ;
tmp[20] = nouvelle valeur;
T1 = tmp;
N. Chenfour
64
Remarque21 :
1. Les 2 critures suivantes sont quivalentes :
Type T[] ;

Type []T ;
2. Une fonction peut retourner un tableau:
int []nomDeMethode() {

}
5.5 Initialisation des tableaux
Un tableau peut tre initialis lors de sa dclaration :
1. Cas dun tableau de primitifs :

int T1[] = {3, 5, 7, 34} ;


int T1[] = new int[4] ;
T1[0] = 3 ;
T1[1] = 5 ;
T1[2] = 7 ;
T1[3] = 34 ;
N. Chenfour
65
2. Cas dun tableau dobjets :
1
re
Solution :
Vector v1 = new Vector() ;
Vector v2 = new Vector() ;

Vector T2[] = {v1, v2, } ;
2
me
Solution (pratique) :
Vector T2[] = {
new Vector(), // ce sont des objets crs la volet (objets anonymes)
new Vector(),

} ;

5.6 Cration de tableaux anonymes :
Soit une mthode ayant un tableau comme paramtre :
void p1(int T[]) {

}


N. Chenfour
66
Appeler la mthode :
1
re
solution :
int T1[] = {2, 6, 17} ;
p1(T1) ;

2
me
Solution : tableau anonyme
p1( new int[] {2, 6, 17} ) ;

Syntaxe gnrale :
new type [] { valeur/objet, valeur/objet, }
5.7 Tableau plusieurs dimensions
Type nomDuTableau[][] ;
Exemple :
int M[][] ;
Cration :
M = new int[3][10] ;
Accs :
M[i][j] = ..
N. Chenfour
67
Remarque :
Si on suppose que la 1
re
dimension. Cest les lignes et la 2
me
dimension.
Cest les colonnes :
M.length : le nombre de lignes
M[i].length : le nombre de colonne de la ligne i
Initialisation :
int M [][] = {
{2, 3, 4},
{1, 45, 6}
};
Chaque M[i] est un tableau :
M[0] {2, 3, 4}
M[1] {1, 45, 6}
M.length = 2 et
M[0].length = M[1].length = 3

Rsultat :
Chaque ligne de la matrice peut avoir un nombre dlment
different:
Exemple :
int M [][] = {
{2, 3},
{1, 45, 6, 3},
{3, 7, 9}
};
N. Chenfour
68
Remarques :
1. Une matrice M est un tableau de tableaux
2. Chaque M[i] est un tableau pouvant tre cr sparment
1. La matrice M peut tre cre comme un tableau dont les lments sont
crs ultrieurement
Exemple :

int M[][] ;
M = new int[3][] ;

M[0] = new int[2] ;
M[1] = new int[4] ;
M[2] = new int[3] ;

N. Chenfour
69

6.1 Les flux en JAVA
Le Package java.io offre une vritable collection de classes permettant la
gestion des Entres/Sortie. On numre alors les classes suivantes.
BufferedInputStream FilterInputStream PipedOutputStream
BufferedOutputStream FilterOutputStream PipedReader
BufferedReader FilterReader PipedWriter
BufferedWriter FilterWriter PrintStream
ByteArrayInputStream InputStream PrintWriter
ByteArrayOutputStream InputStreamReader PushbackInputStream
CharArrayReader LineNumberInputStream PushbackReader
CharArrayWriter LineNumberReader RandomAccessFile
DataInputStream ObjectInputStream Reader
DataOutputStream ObjectInputStream.GetField SequenceInputStream
File ObjectOutputStream SerializablePermission
FileDescriptor ObjectOutputStream.PutField StreamTokenizer
FileInputStream ObjectStreamClass StringBufferInputStream
FileOutputStream ObjectStreamField StringReader
FilePermission OutputStream StringWriter
FileReader OutputStreamWriter Writer
FileWriter PipedInputStream


Chapitre 6. Les Fichiers
N. Chenfour
70
6.2 Fichiers Textes
Fonctions de lecture : classe FileReader
Classe utilise :
FileReader
Constructeur :
FileReader (String NomDeFichier)
FileReader f = new FileReader("test.txt");
Si le fichier nexiste pas louverture dclenche une exception qui peut
tre attrape de la manire suivante :
try {
f = new FileReader("test2.dat");
}
catch (Exception e) {
System.out.println("Erreur d'ouverture du fichier");
System.out.println(e.getMessage());
System.exit(0);
}

Mthodes :
int read(). Lit un caractre. Retourne 1 si fin de fichier.
int read(char[] cbuf)
Lit un tableau de caractres et retourne le nombre
de caractres lus
int read(char[] Tchar,
int debut,
int Nombre)
lit une squence de caractres dans une portion
de tableau et retourne le nombre de caractres
lus.
N. Chenfour
71
Exemple 1 : Lecture dun fichier texte caractre par caractre
import java.io.*;
class ES01 {
public static void main(String args[]) throws IOException
{
FileReader f=null;
try {
f = new FileReader("test.txt");
}
catch (IOException e) {
System.out.println("Erreur d'ouverture du fichier");
System.out.println(e.getMessage());
System.exit(0);
}
int c;
while ((c=f.read())!=-1) System.out.print((char)c);
f.close();
}
}
N. Chenfour
72
Exemple 2 : Lecture dun fichier texte tampon par tampon
import java.io.*;
class ES02 {
public static void main(String args[]) throws IOException
{
FileReader f=null;
try {
f = new FileReader("test.txt");
}
catch (IOException e) {
System.out.println("Erreur d'ouverture du fichier");
System.out.println(e.getMessage());
System.exit(0);
}
char T[]=new char[1000];
int n;
while ((n=f.read(T))> 0) {
String S=new String(T,0,n);
System.out.print(S);
}
}
}
N. Chenfour
73
Fonctions dcriture : classe FileWriter
Classe utilise :
FileWriter
Constructeur :
FileWriter (String NomDeFichier)

FileWriter f = new FileWriter("test.dat");

crasement du contenu du fichier si existant
les erreurs douverture peuvent aussi tre dtectes par
lintermdiaire de la clause : try catch

Mthodes :
void write(int c) Ecrit un caractre dans le fichier.
void write(char[] Tchar) Ecrit un tableau de caractres
void write(char[] Tchar, int Debut, int Nombre) Ecrit une portion dun tableau de
caractres
void write(String str) Ecrit une chane de caractres.
void write(String str, int Debut, int Nombre) Ecrit une portion dune chane de
caractres.

N. Chenfour
74
Exemple :
import java.io.*;
class ES03 {
public static void main(String args[]) throws IOException
{
FileWriter f;
f = new FileWriter("test.dat");
f.write("ceci est une chaine ");
f.write(65);
f.write(a);
f.write(" 30.58");
float y = (float)45.65;
String S=Float.toString(y);
f.write(S); //ou
f.write( + y);
//ou encore f.write("" + y);
f.close();
}
}
Autres fonctions de la classe FileReader
1- skip(long n); Saut de n caractres. n doit tre un nombre positif;
2- close(); Fermeture du fichier
Autres fonctions de la classe FileWriter
1- flush(); vider le tampon dcriture dans le fichier
2- close(); Fermeture du fichier
N. Chenfour
75
Ouverture en mode Mise jour : classe
RandomAccessFile
Pour lajout, la modification, accs direct etc on utilise la classe
RandomAccessFile . Celle-ci peut cependant tre utilise pour grer aussi
bien des fichiers textes que des fichiers binaires. Nous donnons alors dans ce
qui suit un exemple douverture de fichier en mode ajout. La classe sera
tudie dans le paragraphe suivant.
import java.io.*;
class ES04 {
public static void main(String args[]) throws IOException
{
RandomAccessFile f;
f = new RandomAccessFile("test.dat","rw");
f.seek(f.length());
f.writeBytes("\r\nceci est une nouvelle ligne");
f.write(20);
f.writeBytes("#");
int x = 65;
f.write(x);
f.writeBytes(" 30.58");
f.close();
}
}
N. Chenfour
76
6.3 Fichiers Binaires
Classe utilise :
RandomAccessFile
Classe Mre :
java.lang.Object


java.io.RandomAccessFile
Constructeur :
RandomAccessFile (String NomDeFichier, String Mode)
avec Mode une chane de caractres qui prcise le mode douverture. Elle peut prendre deux valeurs possibles :
"r"
Ouverture en mode lecture. Si le fichier nexiste pas une exception est dclenche.
"rw"
ouverture en mode mise jour : Lecture+Ecriture+Ajout+Accs Direct. Si le fichier existe
son contenu nest pas cras et le pointeur de fichier est plac la fin du fichier. Sinon, il
est alors cr.
Exemple :
RandomAccessFile f = new RandomAccessFile("test.dat","rw");
1.1 Mthodes daccs
4.1.1 Accs direct.
void seek(long pos)
Positionner le pointeur de fichier sur loctet N pos.
int skipBytes(int n) Sauter sur n octets.
long
getFilePointer()
Retourner la position en cours du pointeur de fichier.
4.1.2 Longueur du fichier.
long length()
Retourne la longueur du fichier.
void setLength(long L)
Permet dattribuer une nouvelle longueur L au fichier.

N. Chenfour
77
Remarques :
1- Linstruction f.setLength(L) permet de tronquer un fichier pour quil
ne contiennent plus que L octets si son contenu initial tait suprieur
L.
2- Linstruction f.setLength(0) permet dcraser le contenu du fichier.
Ainsi louverture dun fichier en criture avec crasement du contenu
peut tre ralise de la manire suivante :
RandomAccessFile f = new RandomAccessFile(NomFichier,"rw");
f.setLength(0) ;
Fermeture du fichier.
La fermeture du fichier est ralise par lintermdiaire de la mthode close().
Mthodes dcriture
1 void write(int b) Ecrit un caractre dans le fichier.
2 void write(byte[] Tbyte) Ecrit un tableau doctets
3 void write(byte[] Tbyte, int Debut, int nb) Ecrit une portion dun tableau doctets
4 void writeBoolean(boolean v) Ecrit un boolean cod sur 1 octet.
5 void writeByte(int v) Ecrit un octet ou un caractre sous forme dun octet
(comme write).
6 void writeBytes(String s) Ecrit une chane de caractres sous forme dune
squences doctets.
7 void writeChar(int v) Ecrit un caractre sous forme de 2 octets (le plus
fort ensuite le moins fort).
8 void writeChars(String s) Ecrit une chanes de caractres cod chacun sur 2
octets.
9 void writeDouble(double v) Ecrit un double sous son format binaire 8 octets.
10 void writeFloat(float v) Ecrit un rel sous son format binaire 4 octets.
11 void writeInt(int v) Ecrit un entier sous son format binaire 4 octets.
12 void writeLong(long v) Ecrit un entier long sous son format binaire 8
octets.
13 void writeShort(int v) Ecrit un entier court sous son format binaire 2
octets.
14 void writeUTF(String str) Ecrit une chane sous format dencodage UTF-8.
N. Chenfour
78
Exemple :
Dans cet exemple, nous crivons la mme information (30.58) dlimite par les
deux symboles < et > avec diffrents formats :
RandomAccessFile f;
f = new RandomAccessFile("test.dat","rw");
f.writeBytes("<");
f.writeFloat((float)30.58);
f.writeBytes(">\r\n<");
f.writeDouble(30.58);
f.writeBytes(">\r\n<");
f.writeBytes("30.58");
f.writeBytes(">\r\n<");
f.writeChars("30.58");
f.writeBytes(">\r\n<");
f.writeUTF("30.58");
f.writeBytes(">");
Le fichier cr aura le contenu suivant :
crit avec writeFloat (4 octets)
avec writeDouble (8 octets)
avec writeBytes (format texte : 1 octet par
caractre)
avec writeChars (format texte : 2 octets par
caractre)
<A>
<@%G~>
<30.58>
< 3 0 . 5 8>
< 30.58>
avec writeUTF (texte UTF : avec entte de 2
octets)
Mthodes de lecture
1 int read(). Lit un octet. Retourne 1 si fin de fichier.
2 int read(byte[] cbuf) Lit un tableau doctets et retourne le nombre de caractres
lus
3 int read(byte[] Tchar,
int debut,
int Nombre)
lit une squence doctets dans une portion de tableau et
retourne le nombre de caractres lus.
4 boolean readBoolean() Lit un boolean (1 octet).
5 byte readByte() Lit un octet
N. Chenfour
79
6 char readChar() Lit un caractre Unicode (2 octets)
7 double readDouble() Lit un double (8 octets)
8 float readFloat() Lit un rel (4 octets)
9 void readFully(byte[] b) Lit exactement b.length octets. Si la fin de fichier est
dtecte avant, une erreur (IOException) est dclenche.
10 void readFully(byte[] b, int
off, int len)
Lit exactement len octets. Si la fin de fichier est dtecte
avant, une erreur (IOException) est dclenche.
11 int readInt() Lit un entier (4 octets)
12 String readLine() Lit une ligne entire partir dun fichier texte
13 long readLong() Lit un entier long (8 octets)
14 short readShort() Lit un entier (2 octets)
15 int readUnsignedByte() Lit un octet non sign (valeur positive)
16 int readUnsignedShort() Lit un entier non sign (2 octets de valeur positive)
17 String readUTF() Lit une chane enregistre sous le format standard UTF-8
Exemple 1 : Lecture dun fichier texte par tampon laide dune seule
instruction.
RandomAccessFile f;
f = new RandomAccessFile("test.txt","r");
int L =(int)f.length(); //suppose que la taille du fichier est <32535
byte T[]= new byte[L];
int n = f.read(T);
String S=new String(T);
System.out.println(S);
f.close();
N. Chenfour
80
Exemple 2 : Lecture dun fichier texte ligne par ligne.
RandomAccessFile f;
f = new RandomAccessFile("test.txt","r");
String Ligne;
int n=0;
while ((Ligne=f.readLine())!= null)
System.out.println(Ligne);
f.close();

6.4 Fichiers Binaires denregistrements
- Persistance des objets -
Classes utilises :
ObjectInputStream : pour la lecture
ObjectOutputStream : pour lcriture
Classe Mre :
java.lang.Object


java.io.InputStream


java.io.ObjectInputStream

java.lang.Object


java.io.OutputStream


java.io.ObjectOutputStream

N. Chenfour
81
Constructeur :
ObjectInputStream (new FileInputStream(NomDeFichier))
ObjectOutputStream (new FileOutputStream(NomDeFichier))
6.5 Lecture/Ecriture dun objet
Lobjet lire ou crire doit appartenir un objet srialisable. La classe de
lobjet doit alors implmenter linterface Serializable.
Exemple :
class Produit implements Serializable {
public String ref;
public String desig;
public double PU;
public int QS;
Record() {}
Record(String ref,String deisig,double PU,int QS) {
this.ref=ref;
this.desig=desig;
this.PU=PU;
this.QS=QS;
}
}
Ecriture : // Srialisation
Produit p =new Produit( ) ;
FileOutputStream fos = new FileOnputStream(NomDeFichier);
ObjectOutputStream fout = new ObjectOutputStream (fos);
fout.writeObject(p);
Lecture : //Dsrialisation
FileInputStream fis = new FileInputStream(NomDeFichier);
ObjectInputStream fin = new ObjectInputStream (fis);
Produit r = (Produit)fin.readObject();