Vous êtes sur la page 1sur 81

Manuel du Dveloppeur

Par N. Chenfour

N. Chenfour

Chapitre 1. Environnement de
dveloppement Java

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 GarbageCollector (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)

N. Chenfour

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

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

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

1.2.3.3 JavaTM 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

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

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 sousrpertoire 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

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

10

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

11

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

12

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
public
SYNCHRONIZED
( seulement avec protected
les mthodes )
private

3- Permanence

4- Constance

STATIC

FINAL

Type
void
int

Nom

5- ABSTRACTION
ABSTRACT

(seulement les mthodes qui ne sont pas synchronized, static, final ou


private )
Exemples :
synchronized public static final void p1() {}
public abstract void p2() {}
public static int f1(){}

N. Chenfour

13

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

14

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

15

}
}
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

16

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

17

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

18

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

19

Chapitre 2. Programmation Oriente


objet en Java
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

N. Chenfour

20

les procdures et les fonctions de lobjet. Celles-ci sont appeles :


Mthodes ou Fonctions Membres.

Attributs ou Proprits
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

N. Chenfour

21

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

22

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

23

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

24

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

25

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

26

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

27

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

28

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

29

Chapitre 3. Elments de base du


langage Java
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 -32768 32767

sign

4 -231 = -2147483648 231-1 = 2147483647

sign

8 -263

octets
int

Entier
octets

long
N. Chenfour

Entier

-9223372036854775808

263-1

=
30

octets

9223372036854775807

float

Rel sur 4 octets

double

Rel sur 8 octets

-3.4x1038 3.4x1038

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

31

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

32

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

33

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);

6. Les

variables

de

// est correcte.

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

34

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

35

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

36

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.
lune

Pour dterminer le nom de classe dun objet, on peut utiliser dans


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

37

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

38

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

39

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

40

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. Celleci 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

41

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

42

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

43

Chapitre 4. Hritage Java

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;
}
N. Chenfour

44

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

45

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

46

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

47

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

48

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

Signifie que B a un constructeur


avec un paramtre entier, ce qui
nest pas le cas.

System.out.println(B);
}
}

N. Chenfour

49

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

50

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

51

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

52

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

53

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

54

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

55

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

56

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

57

Exemple :
class A {
private int x, y;

NECESSAIRE

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 ;

Partie Commune
f

m
Mre

lobjet m aura une


Vue plus restreinte que f

Fille
N. Chenfour

58

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 MreFille
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

59

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

60

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

61

Chapitre 5. Les Tableaux

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]
N. Chenfour

62

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

63

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

64

2. Cas dun tableau dobjets :


1re Solution :
Vector v1 = new Vector() ;
Vector v2 = new Vector() ;

Vector T2[] = {v1, v2, } ;


2me 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

65

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

2me 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

66

Remarque :
Si on suppose que la 1re dimension. Cest les lignes et la 2me 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

67

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

68

Chapitre 6. Les Fichiers

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

N. Chenfour

69

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,

lit une squence de caractres dans une portion

int debut,

de tableau et retourne le nombre de caractres

int Nombre)

lus.

N. Chenfour

70

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

71

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

72

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

73

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

74

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

75

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

Retourner la position en cours du pointeur de fichier.

getFilePointer()

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

76

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)


N. Chenfour

Ecrit une chane sous format dencodage UTF-8.


77

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)
avec writeUTF (texte UTF : avec entte de 2
octets)

<A>
<@%G~>
<30.58>
< 3 0 . 5 8>
< 30.58>

Mthodes de lecture
1

int read().

Lit un octet. Retourne 1 si fin de fichier.

int read(byte[] cbuf)

Lit un tableau doctets et retourne le nombre de caractres


lus

int read(byte[] Tchar,


int debut,

lit une squence doctets dans une portion de tableau et


retourne le nombre de caractres lus.

int Nombre)
4 boolean readBoolean()

Lit un boolean (1 octet).

5 byte readByte()

Lit un octet

N. Chenfour

78

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

79

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

80

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
N. Chenfour

(Produit)fin.readObject();
81

Vous aimerez peut-être aussi