0% ont trouvé ce document utile (0 vote)
176 vues177 pages

Comprendre l'héritage en Java

Ce document traite de la notion d'héritage en Java. Il présente les concepts clés comme la classe dérivée, la classe super-classe, la syntaxe de l'héritage, le masquage et la redéfinition de méthodes.

Transféré par

Nossayba Darraz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
176 vues177 pages

Comprendre l'héritage en Java

Ce document traite de la notion d'héritage en Java. Il présente les concepts clés comme la classe dérivée, la classe super-classe, la syntaxe de l'héritage, le masquage et la redéfinition de méthodes.

Transféré par

Nossayba Darraz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre 5

Héritage

POO 1 / 177
Introduction

Introduction

Comme pour les pour autres langages orientés objets, Java permet la
notion d’héritage, qui permet de créer de nouvelles classes à partir
d’autres classes existantes. L’héritage permet de réutiliser des classes
déjà définies en adaptant les attributs et les méthodes (par ajout et/ou
par modification).
Une classe qui hérite d’une classe existante est appelée classe
dérivée. Elle est aussi appelée sous-classe ou classe-fille.
La classe, dont hérite d’autres classes, est appelée classe
super-classe. Elle est aussi appelée classe-mère ou classe-parente.

POO 2 / 177
Introduction

Syntaxe

class SousClasse extends SuperClass

POO 3 / 177
Introduction

Remarques :

Java ne permet pas l’héritage multiple. C’est-à-dire, une classe ne


peut pas hériter de plusieurs classes. Elle ne peut hériter que
d’une seule classe.
Une classe peut hériter d’une classe dérivée. Considérons la
classe A qui est la super-classe de B et B qui est la
super-classe de C.
−→ A est la super-super-classe de C.

classe A (super-classe de B)
↓ classe A (super-super-classe de C)
classe B (super-classe de C) ↓
↓ classe C
classe C

POO 4 / 177
Exemple introductif

Exemple introductif

Considérons les deux classes : Etudiant et Professeur. Pour les deux


classes :

1 les attributs nom et prenom sont en commun ;


2 les méthodes afficher() et setNom() sont en commun ;
3 la classe Etudiant contient l’attribut cne et la classe Professeur
contient l’attribut cin.

POO 5 / 177
Exemple introductif

Exemple : Classe Etudiant

class Etudiant {
p r i v a t e S t r i n g nom , prenom , cne ;

void a f f i c h e r ( ) {
System . o u t . p r i n t l n ( "Nom : " +nom) ;
System . o u t . p r i n t l n ( " Prenom : " +prenom ) ;
}
v o i d setNom ( S t r i n g nom) {
t h i s . nom = nom ;
}
}

POO 6 / 177
Exemple introductif

Exemple : Classe Professeur

class Professeur {
p r i v a t e S t r i n g nom , prenom , c i n ;

void a f f i c h e r ( ) {
System . o u t . p r i n t l n ( "Nom : " +nom) ;
System . o u t . p r i n t l n ( " Prenom : " +prenom ) ;
}
v o i d setNom ( S t r i n g nom) {
t h i s . nom = nom ;
}
void setCin ( Stri ng cin ) {
t h is . cin = cin ;
}
}

POO 7 / 177
Utilisation de l’héritage

Utilisation de l’héritage
Un étudiant et un professeur sont des personnes. Définissons une
nouvelle classe Personne :

c l a s s Personne {
p r i v a t e S t r i n g nom , prenom ;

void a f f i c h e r ( ) {
System . o u t . p r i n t l n ( "Nom : " +nom) ;
System . o u t . p r i n t l n ( " Prenom : " +
prenom ) ;
}
v o i d setNom ( S t r i n g nom) {
t h i s . nom = nom ;
}
}

POO 8 / 177
Utilisation de l’héritage

Les deux classes peuvent être modifiées en utilisant la classe


Personne . Elle deviennent comme le montre le listing suivant :
c l a s s E t u d i a n t extends Personne {
p r i v a t e S t r i n g cne ;
v o i d setCne ( S t r i n g cne ) {
t h i s . cne = cne ;
}
}

c l a s s P r o f e s s e u r extends Personne {
private String cin ;

void setCin ( Stri ng cin ) {


t h is . cin = cin ;
}
}

POO 9 / 177
Accès aux attributs

Accès aux attributs

L’accès aux attributs privés (private) d’une super-classe n’est pas


permis de façon directe. Supposons qu’on veut définir, dans classe
Etudiant, une méthode getNom() qui retourne le nom alors,
l’instruction suivante n’est pas permise puisque le champ
[Link] est non visible (The field [Link] is
not visible).

c l a s s E t u d i a n t extends Personne {
p r i v a t e S t r i n g cne ;
S t r i n g getNom ( ) {
r e t u r n nom ; / / non permise
}
}

POO 10 / 177
Accès aux attributs

Accès aux attributs

Pour accéder à un attribut d’une super-classe, il faut soit :

rendre l’attribut publique, ce qui implique que ce dernier est


accessible par toutes les autres classes ;
définir, dans la classe Personne, des méthodes qui permettent
d’accéder aux attributs privés (getters et setters) ;
déclarer l’attribut comme protégé en utilisant le mot clés
protected.

POO 11 / 177
Accès aux attributs

Exemple

La classe Etudiant peut accéder à l’attribut nom puisqu’il est protégé.

c l a s s Personne {
p r o t e c t e d S t r i n g nom ;
...
}
c l a s s E t u d i a n t extends Personne {
...
S t r i n g getNom ( ) {
r e t u r n nom ;
}
}

POO 12 / 177
Accès aux attributs

Remarques :

1 Un attribut protégé est accessible par toutes les sous-classes et


par toutes les classes du même paquetage (on verra plus loin la
notion de package) ce qui casse l’encapsulation.
2 Le mode protégé n’est pas très utilisé en Java.

POO 13 / 177
Héritage hiérarchique

Héritage hiérarchique
Comme mentionné dans l’introduction, une classe peut être la
super-super-classe d’une autre classe. Reprenons l’exemple
concernant l’héritage et ajoutons la classe EtudiantEtranger. Un
étudiant étranger est lui aussi un étudiant dont on veut lui ajouter la
nationalité .

c l a s s Personne {
...
}
c l a s s E t u d i a n t extends Personne {
...
}
c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
private String nationalite ;
...
}
POO 14 / 177
Masquage et redéfinition

Définitions

Masquage (shadowing)
un attribut d’une sous-classe qui porte le même nom qu’un autre
attribut de la super-classe.

Peu utilisé en pratique par-ce-qu’il est source d’Ambiguïté .

Redéfinition (overriding)
comme pour le cas de surcharge à l’intérieure d’une classe, une
méthode déjà définie dans une super-classe peut avoir une nouvelle
définition dans une sous-classe.

POO 15 / 177
Masquage et redéfinition

Remarques :

1 Il ne faut pas confondre surcharge et redéfinition !


2 On verra plus de détails concernant la redéfinition dans le chapitre
concernant le polymorphisme.

POO 16 / 177
Masquage et redéfinition

Exemple : masquage
p u b l i c c l a s s Masquage {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
Masquage masq = new Masquage ( ) ;
masq . a f f i c h e ( ) ; / / A f f i c h e r a 10
masq . v a r i a b l e L o c a l ( ) ; / / A f f i c h e r a 20
}
p r i v a t e i n t a = 10;
public void a f f i c h e ( )
{
System . o u t . p r i n t l n ( " a = " + a ) ;
}
public void variableLocal ( )
{
i n t a = 20; / / v a r i a b l e l o c a l e
System . o u t . p r i n t l n ( " a = " + a ) ;
}
} POO 17 / 177
Masquage et redéfinition

Redéfinition : Exemple 1
class A
{
public void f ( i n t a , i n t b )
{
/ / instructions
}
/ / A u t r e s methodes e t a t t r i b u t s
}
c l a s s B extends A
{
public void f ( i n t a , i n t b )
{
/ / l a methode r e d i f i n i e f ( ) de l a
super−c l a s s e
}
/ / A u t r e s methodes e t a t t r i b u t s
} POO 18 / 177
Masquage et redéfinition

Redéfinition : Exemple 2

Reprenons la classe Personne et ajoutons à cette classe la méthode


afficher() qui permet d’afficher le nom et le prénom.
Dans les classes Etudiant, EtudiantEtranger, et Professeur, la
méthode afficher() peut être définie avec le même nom et sera utilisé
pour afficher les informations propres à chaque classe.
Pour ne pas répéter les instructions se trouvant dans la méthode de
base, il faut utiliser le mot clé super().

POO 19 / 177
Masquage et redéfinition

Redéfinition : Exemple 2
c l a s s Personne {
p r i v a t e S t r i n g nom , prenom ;

void a f f i c h e r ( ) {
System . o u t . p r i n t l n ( "Nom : " +nom) ;
System . o u t . p r i n t l n ( " Prenom : " +prenom ) ;
}
...
}

c l a s s E t u d i a n t extends Personne {
p r i v a t e S t r i n g cne ;
void a f f i c h e r ( ) {
super . a f f i c h e r ( ) ;
System . o u t . p r i n t l n ( "CNE : " +cne ) ;
}
... POO 20 / 177
Masquage et redéfinition

Redéfinition : Exemple 2 (suite)


c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
private String nationalite ;
void a f f i c h e r ( ) {
super . a f f i c h e r ( ) ;
System . o u t . p r i n t l n ( " N a t i o n a l i t e : " +
nationalite ) ;
}
...
}

c l a s s P r o f e s s e u r extends Personne {
private String cin ;
void a f f i c h e r ( ) {
super . a f f i c h e r ( ) ;
System . o u t . p r i n t l n ( " CIN : " + c i n ) ;
}
... POO 21 / 177
Masquage et redéfinition

Remarques :

1 La méthode [Link]() doit être la première instruction dans


la méthode afficher().
2 La méthode [Link]() de la classe EtudiantEtranger, fait
appel à afficher() de la classe Etudiant.
3 Si la classe Etudiant n’avait pas la méthode afficher(), alors, par
transitivité, la méthode [Link]() de la classe
EtudiantEtranger, fait appel à afficher() de la classe Personne.
4 Il n’y a pas de : [Link].

POO 22 / 177
Héritage et constructeurs

Héritage et constructeurs

Une sous-classe n’hérite pas des constructeurs de la super-classe.

POO 23 / 177
Héritage et constructeurs

Exemple 1

Reprenons à la classe Personne et ajoutons à cette classe un seul


constructeur.
Si aucun constructeur n’est défini dans les classes Etudiant et
Professeur, il y aura erreur de compilation.

POO 24 / 177
Héritage et constructeurs

c l a s s Personne {
p r i v a t e S t r i n g nom , prenom ;
/ / Constructeur
p u b l i c Personne ( S t r i n g nom , S t r i n g prenom ) {
t h i s . nom = nom ;
t h i s . prenom = prenom ;
}
...
}
c l a s s E t u d i a n t extends Personne {
...
/ / Pas de c o n s t r u c t e u r
...
}
c l a s s P r o f e s s e u r extends Personne {
...
/ / Pas de c o n s t r u c t e u r
...
} POO 25 / 177
Héritage et constructeurs

Exemple 2

c l a s s Personne {
p r i v a t e S t r i n g nom , prenom ;
/ / Constructeur
p u b l i c Personne ( S t r i n g nom , S t r i n g prenom ) {
t h i s . nom = nom ;
t h i s . prenom = prenom ;
}
...
}

POO 26 / 177
Héritage et constructeurs

c l a s s E t u d i a n t extends Personne {
p r i v a t e S t r i n g cne ;
/ / Constructeur
p u b l i c E t u d i a n t ( S t r i n g nom , S t r i n g prenom ,
S t r i n g cne ) {
super ( nom , prenom ) ;
t h i s . cne = cne ;
}
...
}
c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
private String nationalite ;
/ / Constructeur
p u b l i c E t u d i a n t E t r a n g e r ( S t r i n g nom , S t r i n g
prenom , S t r i n g cne , S t r i n g n a t i o n a l i t e ) {
super ( nom , prenom , cne ) ;
this . nationalite = nationalite ;
}
... POO 27 / 177
Héritage et constructeurs

Dans cette exemple, le constructeur de la classe EtudiantEtranger


fait appel au constructeur de la classe Etudiant qui à son tour fait
appel au constructeur de la classe Personne.

POO 28 / 177
Héritage et constructeurs

Exemple 3
c l a s s Rectangle {
p r i v a t e double l a r g e u r ;
p r i v a t e double h a u t e u r ;
p u b l i c Rectangle ( double l , double h ) {
largeur = l ;
hauteur = h ;
}
...
}

c l a s s Carre extends Rectangle {


p u b l i c Carre ( double t a i l l e ) {
super ( t a i l l e , t a i l l e ) ;
}
...
}
Listing 1 – Héritage
POO et constructeurs 29 / 177
Héritage et constructeurs

Remarques :

1 super doit être la première instruction dans le constructeur et ne


doit pas être appelé 2 fois.
2 Il n’est pas nécessaire d’appeler super lorsque la super-classe
admet un constructeur par défaut. Cette tâche sera réalisée par le
compilateur.
3 Les arguments de super doivent être ceux d’un des constructeur
de la super-classe.
4 Aucune autre méthode ne peut appeler super(...).
5 Il n’y a pas de : [Link].

POO 30 / 177
Opérateur « instanceof »

Opérateur « instanceof »

POO 31 / 177
Opérateur « instanceof »

Types primitifs

Pour les types primitifs, les instructions suivantes sont vraies :

int i ;
float x;
double y ;
...
x = i;
y = x;

Un int est un float et un float est un double (conversion implicite).

POO 32 / 177
Opérateur « instanceof »

Types primitifs

Par contre, les instructions suivantes sont fausses :

i = x;
x = y;

Un float n’est pas un int et un double n’est pas un float.


Pour les utiliser, il faut faire une conversion explicite (faire un cast) :

i = ( int ) x;
x = ( float ) y;

POO 33 / 177
Opérateur « instanceof »

Objets

si B est sous-classe de A, alors on peut écrire :


/ / a est de type « A », mais l’objet référencé par a est de type « B » .
A a = new B ( . . . ) ;
A a1 ;
B b = new B ( ) ;
a1 = b ; / / a1 de type « A », référence un objet de type « B »

Par contre, on ne peut pas avoir :


A a=new A ( ) ;
B b;
b=a ;
/ / erreur : on ne peut pas convertir du type « A » vers le type « B »

POO 34 / 177
Opérateur « instanceof »

Cas des tableaux (Voir chapitre 7)

Reprenons l’exemple des classes Personne, Etudiant,


EtudiantEtranger et Professeur. Les instructions suivantes sont
vraies :
E t u d i a n t e = new E t u d i a n t ( ) ;
E t u d i a n t E t r a n g e r e E t r = new E t u d i a n t E t r a n g e r ( ) ;
P r o f e s s e u r p r o f = new P r o f e s s e u r ( ) ;

Personne [ ] P = new Personne [ 3 ] ;


P[0] = e ;
P[ 1 ] = eEtr ;
P[2] = prof ;

f o r ( i n t i =0; i <3; i ++)


P[ i ] . info ( ) ;

POO 35 / 177
Opérateur « instanceof »

Cas des tableaux

La méthode info() est ajoutée aux différentes classes pour indiquer


dans quelle classe on se trouve :

void i n f o ( ) {
System . o u t . p r i n t l n ( " Classe . . . " ) ;
}

On reviendra plus en détails sur l’utilisation des tableaux dans le


chapitre concernant les tableaux.

POO 36 / 177
Opérateur « instanceof »

instanceof

Si « B » est une sous classe de « A » alors l’instruction :


b instanceof A ; retourne true.
E t u d i a n t e = new E t u d i a n t ( ) ;
boolean b = e i n s t a n c e o f Personne ; / / b −−> t r u e

E t u d i a n t E t r a n g e r e E t r =new E t u d i a n t E t r a n g e r ( ) ;
b = e E t r i n s t a n c e o f Personne ; / / b −−> t r u e

Personne personne = new E t u d i a n t ( ) ;


b = personne i n s t a n c e o f E t u d i a n t ; / / b −−> t r u e

personne = new Personne ( ) ;


b = personne i n s t a n c e o f E t u d i a n t ; / / b −−> f a l s e

POO 37 / 177
Opérateur « instanceof »

Cas de la classe Object

L’instruction :

personne instanceof Object;

retourne « true » car toutes les classes héritent, par défaut, de la


classe Object

POO 38 / 177
Opérateur « instanceof »

Chapitre 6
Polymorphisme et abstraction

POO 39 / 177
Introduction

Introduction

Le mot polymorphisme vient du grecque : poly (pour plusieurs) et


morph (forme). Il veut dire qu’une même chose peut avoir différentes
formes. Nous avons déjà vue cette notion avec la redéfinition des
méthodes. Une même méthode peut avoir différentes définitions
suivant la classe où elle se trouve.

POO 40 / 177
Exemple introductif

Exemple introductif

Soient les classes Personne, Etudiant et EtudiantEtranger définies


dans les chapitres précédents :

c l a s s Personne {
...
}
c l a s s E t u d i a n t extends Personne {
...
}
c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
private String nationalite ;
...
}

POO 41 / 177
Exemple introductif

Exemple introductif

Puisque un étudiant étranger est lui aussi un étudiant, au lieu de


définir 2 tableaux :
Etudiant [] etudiants = new Etudiant[30];
EtudiantEtranger[] etudiantsEtrangers = new EtudiantEtranger[10];
on pourra définir un seul tableau comme suit :
Etudiant [] etudiants = new Etudiant[40];

POO 42 / 177
Exemple introductif

Exemple introductif
Avant d’utiliser le tableau précédent, considérons la déclaration :
Personne personne;
Nous avons vu que les instructions suivantes sont toutes valides :
personne = new Personne();
personne = new Etudiant();
personne = new EtudiantEtranger();
De la même façon on peut initialiser le tableau de la façon suivante :
f o r ( i n t i n t i =0; i <10; i ++)
e t u d i a n t s [ i ] = new E t u d i a n t ( ) ;

e t u d i a n t s [ 1 0 ] = new E t u d i a n t E t r a n g e r ( ) ;
e t u d i a n t s [ 1 1 ] = new E t u d i a n t E t r a n g e r ( ) ;
...
POO 43 / 177
Liaison dynamique

Liaison dynamique
Considérons la classe B qui hérite de la classe A :
class A{
p u b l i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s dans l a c l a s s e A" ) ;
}
}

c l a s s B extends A{
p u b l i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s dans l a c l a s s e B" ) ;
}
public void f ( ) {
System . o u t . p r i n t l n ( " Methode f de l a c l a s s e B" ) ;
}
}

La méthode « message() » a été redéfinie


POO dans la classe B et la 44 / 177
Liaison dynamique

Liaison dynamique

Considérons les instructions :


p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
A a = new A ( ) ;
B b = new B ( ) ;
a . message ( ) ;
b . message ( ) ;
b. f () ;
a = new B ( ) ;
a . message ( ) ;
}

POO 45 / 177
Liaison dynamique

Liaison dynamique

Dans l’exécution on aura le résultat suivant :

Je suis dans la classe A


Je suis dans la classe B
Methode f() de la classe B
Je suis dans la classe B

Lorsqu’une méthode est redéfinie (s’est spécialisée), c’est la version la


plus spécialisée qui est appelée. La recherche de la méthode se fait
dans la classe réelle de l’objet. La recherche s’est fait lors de
l’exécution et non lors de la compilation. Ce processus s’appelle la
liaison dynamique.
Il s’appelle aussi : liaison tardive, dynamic binding, late-binding ou
run-time binding.

POO 46 / 177
Liaison dynamique

Remarques :

Dans les instructions précédentes, la dernière instruction


« [Link](); » fait appel à la méthode « message() » de la
classe B.
Si on ajoute l’instruction :
a. f () ;
après l’instruction :
a = new B();
on aura une erreur de compilation, du fait que la méthode « f() »
n’est pas implémentée dans la classe de déclaration de l’objet
« a » même si la classe réelle (la classe B) possède « f() ».
Pour éviter l’erreur précédente, il faut faire un cast :
(( B) a). f () ;

POO 47 / 177
Liaison dynamique

Remarques :

La visibilité d’une méthode spécialisée peut être augmentée (par


exemple de protected vers public) mais elle ne peut pas être
réduite (par exemple de public vers private)

POO 48 / 177
Méthodes de classes

Méthodes de classes

Il n’y a pas de polymorphisme avec les méthodes de classes !

POO 49 / 177
Méthodes de classes

Exemple

class Etudiant {
p u b l i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s un e t u d i a n t " ) ;
}
}

c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
p u b l i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s un e t u d i a n t
etranger " ) ;
}
}

POO 50 / 177
Méthodes de classes

Exemple

p u b l i c c l a s s MethodesInstances {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
E t u d i a n t e = new E t u d i a n t ( ) ;
e . message ( ) ;

e = new E t u d i a n t E t r a n g e r ( ) ;
e . message ( ) ;
}
}

L’exécution du programme précédent donnera :

Je suis un etudiant
Je suis un etudiant etranger

POO 51 / 177
Méthodes de classes

Si on modifie la méthode « message() » de la classe Etudiant, en la


rendant statique :
class Etudiant {
p u b l i c s t a t i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s un e t u d i a n t " ) ;
}
}

c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
p u b l i c s t a t i c v o i d message ( ) {
System . o u t . p r i n t l n ( " Je s u i s un e t u d i a n t
etranger " ) ;
}
}

POO 52 / 177
Méthodes de classes

p u b l i c c l a s s MethodesInstances {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
E t u d i a n t e = new E t u d i a n t ( ) ;
e . message ( ) ;
e = new E t u d i a n t E t r a n g e r ( ) ;
e . message ( ) ;
}
}

alors l’exécution du programme précédent donnera :

Je suis un etudiant
Je suis un etudiant

C’est la classe du type qui est utilisée (ici Etudiant) et non du type réel
de l’objet (ici EtudiantEtranger).

POO 53 / 177
Abstraction

POO 54 / 177
Exemples introductifs

Reprenons les classes Personne, Etudiant et EtudiantEtranger et


ajoutons aux classes Etudiant et EtudiantEtranger la méthode
« saluer() » :

POO 55 / 177
c l a s s E t u d i a n t extends Personne {
...
public void saluer ( ) {
System . o u t . p r i n t l n ( " Assalam alaikoum " ) ;
}
}
c l a s s E t u d i a n t E t r a n g e r extends E t u d i a n t {
private String nationalite ;
...
public void saluer ( ) {
System . o u t . p r i n t l n ( " Bonjour " ) ;
}
}

Puisque la méthode « saluer() » est définie dans les deux classes


Etudiant et EtudiantEtranger, on souhaite la définir dans la classe
Personne.
POO 56 / 177
Solution 1

Une première solution consiste à la définir comme suit :

c l a s s Personne {
...
public void saluer ( ) {
}
}

Cette solution est mauvaise du fait que toute classe qui héritera de
Personne pourra appeler cette méthode (qui ne fait rien !).

POO 57 / 177
Solution 2

Une deuxième solution consiste à rendre la méthode « saluer() »


abstraite dans Personne et par conséquent, obliger chaque classe qui
hérite de Personne à définir sa propre méthode.

POO 58 / 177
Remarques :

Une méthode abstraite :


ne doit contenir que l’entête et doit être implémenté dans les sous
classes ;
doit être public (ne peut pas être privée) ;
est déclarée comme suit :
public abstract typeRetour methAbstr(args);
Une méthode statique ne peut pas être abstraite.
Une classe qui contient une méthode abstraite doit être elle aussi
abstraite et doit être déclarée comme suit :
public abstract class nomClasse{ ... }

POO 59 / 177
Remarques :

Une classe abstraite ne peut pas être utilisée pour instancier des
objets. Une instruction telle que :
obj=new nomClasse();
est incorrecte (avec nomClasse est une classe abstraite).
Une sous-classe d’une classe abstraite doit implémenter toutes
les méthodes abstraites sinon elle doit être déclarée abstraite.

POO 60 / 177
Solution 2 :

La classe Personne devient comme suit :


a b s t r a c t c l a s s Personne {
p r i v a t e S t r i n g nom , prenom ;
public abstract void saluer ( ) ;
// ...
}

POO 61 / 177
Exemple 2

Considérons les classes Cercle et Rectangle qui sont des sous


classes de la classe FigureGeometrique. Les surfaces d’un cercle et
d’un rectangle ne sont pas calculées de la même façon.

→ Une solution consiste à définir dans la classe


FigureGeometrique une méthode abstraite « surface() » et
obliger les classes Cercle et Rectangle à implémenter cette
méthode.

POO 62 / 177
Exemple 2
a b s t r a c t c l a s s FigureGeometrique {
p u b l i c a b s t r a c t double s u r f a c e ( ) ;
}

c l a s s C e r c l e extends FigureGeometrique {
p r i v a t e double rayon ;

p u b l i c C e r c l e ( double rayon ) {
t h i s . rayon = rayon ;
}

p u b l i c double s u r f a c e ( ) {
r e t u r n Math . PI ∗ rayon ∗ rayon ;
}
}

POO 63 / 177
Exemple 2

c l a s s Rectangle extends FigureGeometrique {


p u b l i c double l a r g e u r , l o n g u e u r ;

p u b l i c Rectangle ( double l a r g e , double longue ) {


t h i s . largeur = large ;
t h i s . l o n g u e u r = longue ;
}

p u b l i c double s u r f a c e ( ) {
r e t u r n l a r g e u r ∗ longueur ;
}
}

POO 64 / 177
Constructeurs et abstraction

Il est possible d’appeler une méthode abstraite dans le corps d’un


constructeur, ceci est cependant déconseillé !
Exemple :
a b s t r a c t c l a s s classeA {
p u b l i c a b s t r a c t v o i d m( ) ;

p u b l i c classeA ( ) {
m( ) ;
}
}

POO 65 / 177
Constructeurs et abstraction

c l a s s classeB extends classeA {


private int b;
p u b l i c classeB ( ) {
/ / classeA ( ) e s t invoquee i m p l i c i t e m e n t
/ / super ( ) ; ( automatique )
b = 1;
}
/ / d e f i n i t i o n de m pour classeB
p u b l i c v o i d m( ) {
System . o u t . p r i n t l n ( " b v a u t : " + b ) ;
}
}

POO 66 / 177
Constructeurs et abstraction

public class ConstructAbstraction {


p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
classeB b = new classeB ( ) ;
}
}

Le résultat de l’exécution du programme précédent est :


b vaut : 0

POO 67 / 177
Remarque

La classe Math n’est pas une classe abstraite même si on ne peut pas
créer une instance de cette classe. Pour définir une classe non
instanciable , il suffit de lui ajouter un et un seul constructeur privé
sans arguments.

POO 68 / 177
Remarque

Extrait de la classe Math :


p u b l i c f i n a l c l a s s Math {

/∗ ∗
∗ Don ’ t l e t anyone i n s t a n t i a t e t h i s c l a s s .
∗/
p r i v a t e Math ( ) { }

...
}

Toute classe abstraite est non instanciable mais l’inverse n’est pas vrai.

POO 69 / 177
Chapitre 7
Tableaux

POO 70 / 177
Déclaration et initialisation

Déclaration et initialisation

Comme pour les autres langages de programmation, java permet


l’utilisation des tableaux.
La déclaration d’un tableau à une dimension se fait de deux façons
équivalentes :
type tab[]; ou type[] tab;
tab est une référence à un tableau.
Exemple :
int tab [];
int [] tab;
Contrairement au langage C, la déclaration int tab [10]; n’est pas
permise. On ne peut pas fixer la taille lors de la déclaration.

POO 71 / 177
Déclaration et initialisation

Remarques :

En java, un tableau :

est un objet ;
est alloué dynamiquement (avec l’opérateur new) ;
a un nombre fixe d’éléments de même type ;
peut être vide (taille zéro).

POO 72 / 177
Déclaration et initialisation

Création

La création d’un tableau peut se faire soit, lors de la déclaration soit


par utilisation de l’opérateur new.
Exemples :

1 Création par initialisation au début :


int [] tab={12,10,30∗4};
2 Création par utilisation de new :
int [] tab;
tab = new int [5];
ou bien :
int [] tab = new int [5];

POO 73 / 177
Déclaration et initialisation

La déclaration
double[] tab = new double[5];
Crée un emplacement pour un tableau de 5 réels (double) et fait la
référence à tab comme illustré par le schéma suivant :
tab −−−−−−−−−→ 0.0 0.0 0.0 0.0 0.0

tab[0] tab[1] tab[2] tab[3] tab[4]


↓ ↓ ↓ ↓ ↓
0.0 0.0 0.0 0.0 0.0

Les valeurs du tableau sont initialisés aux valeurs par défaut (0 pour
int, 0.0 pour double ...).

POO 74 / 177
Déclaration mixte

Déclaration mixte

On peut combiner la déclarations de tableaux avec d’autres variables


de même type. La déclaration :
double scores[], moyenne;
crée :

un tableau non initialisé de type double nommé scores ;


une variable de type double nommée moyenne.

Par contre, la déclaration :


double[] scores, moyenne;
crée deux tableaux non initialisés.

POO 75 / 177
Taille d’un tableau

Taille d’un tableau

La taille d’un tableau est accessible par le champ « public final »


length.
Exemple :
double[] scores = new double[10];
[Link]([Link]); // Affiche 10

POO 76 / 177
Taille d’un tableau

Remarque :

La taille d’un tableau ne peut pas être changée. Par contre, la


référence du tableau peut changer. Elle peut référencée un tableau de
taille différente.

POO 77 / 177
Taille d’un tableau

Exemple :

double[] tab1 = new double[10];


double[] tab2 = new double[5];
tab1 = new double[7];//tab1 est maintenant un nouveau tableau de
taille 7
tab2 = tab1; // tab1 et tab2 referencent le meme tableau

POO 78 / 177
Parcours d’un tableau

Parcours d’un tableau

Comme pour le langage C, on peut accéder aux éléments d’un tableau


en utilisant l’indice entre crochets ([]).

POO 79 / 177
Parcours d’un tableau

Exemple

double [ ] t a b = new double [ 1 0 ] ;


f o r ( i n t i =0; i < t a b . l e n g t h ; i ++)
carres [ i ]= i ∗ i ;

f o r ( i n t i =0; i < t a b . l e n g t h ; i ++)


System . o u t . p r i n t f ( " t a b [%d ] = %.2 f \ n " , i , t a b [ i ] ) ;

POO 80 / 177
Parcours d’un tableau

Remarque :

La lecture d’un tableau peut se faire de la façon suivante :


f o r ( double c a r r e : t a b )
System . o u t . p r i n t l n ( c a r r e ) ;

Cette méthode de parcours d’un tableau n’est valable que pour la


lecture et ne peut pas être utilisée pour la modification. Elle a
l’avantage d’éviter l’utilisation des indices.
Correspond à : « pour chaque élément ... » (for each ...)

POO 81 / 177
Parcours d’un tableau

Exemple

Dans le listing suivant, pour calculer la somme des éléments du


tableau, on n’a pas besoin de connaître les indices.
double somme = 0 . 0 ;
f o r ( double c a r r e : t a b )
somme += c a r r e ;

System . o u t . p r i n t l n ( "Somme = " +somme) ;

POO 82 / 177
Parcours d’un tableau

Parcours des arguments de la ligne de commande


La méthode principale « main() » contient un tableau de « String ». Ce
tableau peut être utilisé comme les autres tableaux. Pour afficher son
contenu, on peut utiliser le code suivant :
System . o u t . p r i n t l n ( " t a i l l e de args " +args . l e n g t h ) ;
f o r ( S t r i n g arg : args )
System . o u t . p r i n t ( arg . toUpperCase ( ) + " " ) ;

Si le programme s’appel « Test » et on exécute la commande :


java Test bonjour tous le monde
alors le code précédent affichera :

taille de args : 4
BONJOUR TOUS LE MONDE

POO 83 / 177
Copie de tableaux

Copie de tableaux

Comme on l’a vu précédemment, pour copier le contenu d’un tableau


« tab2 » dans autre tableau « tab1 », l’instruction :
tab1 = tab2;
ne copie que la référence et non le contenu. Pour copier le contenu, on
peut soit, procéder de façon classique et copier élément par élément,
soit utiliser des méthodes prédéfinies.

POO 84 / 177
Copie de tableaux

Utilisation de : [Link]()

Sa syntaxe est :
[Link](src, srcPos, dest, destPos, nb);
Les arguments sont définis comme suit :

src : tableau source ;


srcPos : indice du premier élément copié à partir de src ;
dest : tableau destination ;
destPos : indice de destination où sera copié le premier élément ;
nb : nombre d’éléments à copier.

POO 85 / 177
Copie de tableaux

Exemple

double [ ] c a r r e s = new double [ 1 0 ] ;


double [ ] c a r r e s B i s = new double [ 1 0 ] ;
double [ ] c a r r e s T e s t = new double [ 6 ] ;

f o r ( i n t i =0; i < c a r r e s . l e n g t h ; i ++)


carres [ i ]= i ∗ i ;

/ / Copie de c a r r e s dans c a r r e s B i s
System . a r r a y c o p y ( c a r r e s , 0 , c a r r e s B i s , 0 , 10) ;

/ / Copie de 6 elements de c a r r e s a p a r t i r de l ’ i n d i c e
4 dans c a r r e s T e s t
/ / ( a p a r t i r du p r e m i e r element )
System . a r r a y c o p y ( c a r r e s , 4 , c a r r e s T e s t , 0 , 6 ) ;

POO 86 / 177
Copie de tableaux

Utilisation de : [Link]() ou
[Link]()

La classe [Link] contient différentes méthodes pour la


manipulation des tableaux (copie, trie, ...). Pour copier un tableau :

en entier, on peut utiliser la méthode [Link]() ;


juste une partie, on peut utiliser la méthode
[Link]().

POO 87 / 177
Copie de tableaux

Exemple

import java . u t i l . Arrays ;


...
double [ ] t 1 = new double [ 1 0 ] ;

f o r ( i n t i = 0 ; i < t 1 . l e n g t h ; i ++)
t [ i ] = i∗i ;

i n t [ ] t 2 = A r r a y s . copyOf ( t1 , 10) ;

1 crée le tableau t2
2 affecte au tableau t2 les 10 premiers éléments du tableau tab.

POO 88 / 177
Copie de tableaux

[Link]

i n t [ ] t 3 = A r r a y s . copyOfRange ( t1 , debut , f i n ) ;

1 crée le tableau t3
2 affecte à t3 les éléments de t1 situés entre les indices : debut et
(fin-1) :

POO 89 / 177
Comparer le contenu de deux tableaux de types primitifs

Comparer le contenu de deux tableaux de types


primitifs

Comme pour le cas du copie, pour comparer le contenu de deux


tableaux de types primitifs, on peut, soit :

procéder de façon classique et comparer les éléments des deux


tableaux un à un ;
utiliser la méthode equals() de la classe Arrays.

Exemple :
Soient t1 et t2 deux tableaux de primitifs déjà initialisés :
import java . u t i l . Arrays ;
...
boolean b= A r r a y s . equals ( tab1 , tab2 ) ;

POO 90 / 177
Utilisation de la classe Arrays

Utilisation de la classe Arrays

La classe Arrays contient différentes méthodes pour la manipulation


des tableaux. Nous avons déjà utilisé les méthodes [Link](),
[Link](), et [Link](). Dans ce qui suit, nous
allons voir quelques méthodes pratiques :

POO 91 / 177
Utilisation de la classe Arrays

Trie

La méthode void sort(type[] tab), permet de trier le tableau tab par


ordre croissant. Le résultat du trie est retourné dans tab.
La méthode void sort(type[] tab, int indiceDeb, int indiceFin)
permet de trier le tableau tab par ordre croissant à partir de l’indice
indiceDeb (inclue) jusqu’au indiceFin (exclue)

POO 92 / 177
Utilisation de la classe Arrays

Exemple

double [ ] t a b = new double [ 1 0 ] ;

f o r ( i n t i =0; i <10; i ++)


t a b [ i ] = Math . random ( ) ∗ 1 0 ;
/ / Math . random ( ) : genere un nombre a l e a t o i r e .

Arrays . s o r t ( tab ) ;

f o r ( i n t i =0; i <10; i ++)


t a b [ i ] = Math . random ( ) ∗ 1 0 ;

A r r a y s . s o r t ( tab , 2 , 5 ) ;
/ / T r i e l e s elements t a b [ 2 ] , t a b [ 3 ] e t t a b [ 4 ] par
ordre croissant

POO 93 / 177
Utilisation de la classe Arrays

Recherche

La méthode int binarySearch(type [] a, type val), permet de


chercher val dans le tableau tab. Le tableau doit être trié par ordre
croissant, sinon, le résultat de retour sera indéterminé.
Le résultat de retour est :

l’indice du tableau qui contient val si le tableau contient val ;


une valeur négative si le tableau ne contient pas val.

La méthode int binarySearch(type [] a, int indiceDeb, int indiceFin,


type val), permet de chercher val dans l’intervalle du tableau tab entre
l’indice indiceDeb (inclue) et indiceFin (exclue).

POO 94 / 177
Utilisation de la classe Arrays

Exemple
double [ ] t a b = new double [ 1 0 ] ;
double v a l =5;

f o r ( i n t i =0; i <10; i ++)


t a b [ i ] = Math . random ( ) ∗ 1 0 ;

tab [ 3 ] = val ;

Arrays . s o r t ( tab ) ;

/ / Recherche dans l e t a b l e a u
System . o u t . p r i n t l n ( A r r a y s . b i n a r y S e a r c h ( tab , v a l ) ) ;

/ / Recherche dans l ’ i n t e r v a l l e 2 . . 7
System . o u t . p r i n t l n ( A r r a y s . b i n a r y S e a r c h ( tab , 2 , 7 ,
val ) ) ;
POO 95 / 177
Utilisation de la classe Arrays

Remplissage

La méthode void fill(type[] tab, type val) affecte val à tous les
éléments du tableau.
La méthode void fill(type[] tab, int indiceDeb, int indiceFin, type
val) affecte val aux éléments du tableau compris entre indiceDeb et
indiceFin-1.
double [ ] t a b = new double [ 1 0 ] ;
double v a l =10;

A r r a y s . f i l l ( tab , v a l ) ;

v a l =7;
/ / tab [ 2 ] = tab [ 3 ] = tab [4]=7
A r r a y s . f i l l ( tab , 2 , 5 , v a l ) ;

POO 96 / 177
Utilisation de la classe Arrays

Méthode toString()

La méthode void toString(type[] tab) permet de convertir le tableau


en une chaîne de caractères. Elle met le tableau entre [ ] avec les
valeurs séparés par « , » (virgule suivie par espace).
i n t [ ] tab = {1 , 2 , 3 , 4 } ;

System . o u t . p r i n t l n ( A r r a y s . t o S t r i n g ( t a b ) ) ;
/ / Affiche : [1 , 2 , 3 , 4]

POO 97 / 177
Passage d’un tableau dans une méthode

Passage d’un tableau dans une méthode

Les tableaux sont des objets et par conséquent lorsqu’on les passe
comme arguments à une méthode, cette dernière obtient une copie de
la référence du tableau et par suite elle a accès aux éléments du
tableau. Donc, toute modification affectera le tableau.

POO 98 / 177
Passage d’un tableau dans une méthode

Exemple
Le programme suivant :
import java . u t i l . Arrays ;

p u b l i c c l a s s TabMethodesArg {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
i n t [ ] tab = { 1 , 2 , 3 , 4 } ;

System . o u t . p r i n t ( " Debut de main : " ) ;


System . o u t . p r i n t l n ( A r r a y s . t o S t r i n g ( t a b ) ) ;

/ / Appel de t e s t
t e s t ( tab ) ;

System . o u t . p r i n t ( " F i n de main : " ) ;


System . o u t . p r i n t l n ( A r r a y s . t o S t r i n g ( t a b ) ) ;
}
POO 99 / 177
Passage d’un tableau dans une méthode

Exemple (suite)
public s t a t i c void t e s t ( i n t [ ] x ) {
System . o u t . p r i n t l n ( " Debut : \ t " + A r r a y s .
toString (x) ) ;
A r r a y s . f i l l ( x , 10) ;
System . o u t . p r i n t l n ( " f i n : \ t " + A r r a y s .
toString (x) ) ;
}
}

affichera :

Debut de main: [1, 2, 3, 4]


Debut : [1, 2, 3, 4]
fin : [10, 10, 10, 10]
Fin de main: [10, 10, 10, 10]

POO 100 / 177


Retour d’un tableau dans une méthode

Retour d’un tableau dans une méthode


Une méthode peut retourner un tableau.
Exemple
La méthode :
public static i n t [ ] s c o r e I n i t i a l () {
i n t score [ ] = { 2 , 3 , 6 , 7 , 8 } ;
r e t u r n score ;
}

peut être utilisé comme suit :


p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
i n t [ ] tab = s c o r e I n i t i a l ( ) ;

System . o u t . p r i n t l n ( A r r a y s . t o S t r i n g ( t a b ) ) ;
}

POO 101 / 177


Tableaux d’objets

Tableaux d’objets

L’utilisation des tableaux n’est pas limité aux types primitifs. On peut
créer des tableaux d’objets. On a déjà utilisé les tableaux d’objets dans
la méthode « main(String[] args) », puisque « String » est une classe.
Considérons la classe « Etudiant » vue dans les chapitres précédents
et en TP :

class Etudiant {
p r i v a t e S t r i n g nom , prenom , cne ;
public Etudiant ( ) {
}
...
}

POO 102 / 177


Tableaux d’objets

Tableaux d’objets

La déclaration :
Etudiant [] etudiants = new Etudiant[30];
Crée l’emplacement pour contenir 30 objets de type « Etudiant ». Elle
ne crée que les références vers les objets. Pour créer les objets eux
mêmes, il faut utiliser, par exemple, l’instruction suivante :

f o r ( i n t i =0; i < e t u d i a n t s . l e n g t h ; i ++)


e t u d i a n t s [ i ] = new E t u d i a n t ( ) ;

POO 103 / 177


Tableaux d’objets

Attention

Pour les tableaux d’objets, les méthodes de la classe « Arrays »


opèrent sur les références et non sur les valeurs des objets.

POO 104 / 177


Tableaux d’objets

Exemple
import java . u t i l . Arrays ;

p u b l i c c l a s s TableauxObjets {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
E t u d i a n t [ ] etud1 = new E t u d i a n t [ 2 ] ;
E t u d i a n t [ ] etud2 = new E t u d i a n t [ 2 ] ;
E t u d i a n t [ ] etud3 = new E t u d i a n t [ 2 ] ;
boolean b ;
/ / I n i t i a l i s a t i o n de etud1
etud1 [ 0 ] = new E t u d i a n t ( " O u j d i " , " A l i " ) ;
etud1 [ 1 ] = new E t u d i a n t ( " B e r k a n i " , " L i n a " ) ;

/ / I n i t i a l i s a t i o n de etud2
etud2 [ 0 ] = new E t u d i a n t ( "Mohammed" , " A l i " ) ;
etud2 [ 1 ] = new E t u d i a n t ( " F i g u i g u i " , " Fatima " ) ;

POO 105 / 177


Tableaux d’objets

Exemple (suite)

b = A r r a y s . equals ( etud1 , etud2 ) ;


System . o u t . p r i n t l n ( b ) ; / / a f f i c h e f a l s e

etud2 [ 0 ] = etud1 [ 0 ] ;
etud2 [ 1 ] = etud1 [ 1 ] ;
b = A r r a y s . equals ( etud1 , etud2 ) ;
System . o u t . p r i n t l n ( b ) ; / / a f f i c h e t r u e

etud3 = etud1 ;
b = A r r a y s . equals ( etud1 , etud3 ) ;
System . o u t . p r i n t l n ( b ) ; / / a f f i c h e t r u e
}
}

POO 106 / 177


Objets qui contiennent des tableaux

Objets qui contiennent des tableaux

On peut avoir un objet qui contient des tableaux.


Considérons la classe « Etudiant » et ajoutons à cette classe le
tableau notes comme suit :
class Etudiant {
p r i v a t e S t r i n g nom , prenom , cne ;
p r i v a t e double [ ] notes = new double [ 6 ] ;
...
}

POO 107 / 177


Tableaux à plusieurs dimensions

Tableaux à plusieurs dimensions

On peut créer des tableaux à plusieurs dimensions par ajout de


crochets ([ ]). Par exemple, l’instruction :
double [][] matrice;
déclare un tableau à 2 dimensions de type double.
Comme pour le tableau à une seule dimension, la création d’un
tableau multi-dimensionnelle peut se faire par utilisation de l’opérateur
new.

POO 108 / 177


Tableaux à plusieurs dimensions

Exemple

L’instruction :
matrice = new double[4][3];
crée un tableau de 4 lignes et 3 colonnes.
On peut combiner les deux instructions précédentes :
double [][] matrice = new double[4][3];

POO 109 / 177


Tableaux à plusieurs dimensions

Remarques

En langage C, un tableau à plusieurs dimensions est en réalité un


tableau à une dimension. Par exemple, la déclaration :
double matrice [4][3];
crée en mémoire un tableau (contiguë) de 12 double.

En Java, un tableau à plusieurs dimensions n’est pas contiguë en


mémoire. En Java, un tableau de plusieurs dimensions est un
tableau de tableaux.

On peut définir un tableau à 2 dimensions dont les colonnes n’ont


pas la même dimension.

POO 110 / 177


Tableaux à plusieurs dimensions

Exemple 1

double [ ] [ ] t a b M u l t i = new double [ 2 ] [ ] ;

/ / t a b M u l t i [ 0 ] e s t un t a b l e a u de 3 doubles
t a b M u l t i [ 0 ] = new double [ 3 ] ;

/ / t a b M u l t i [ 1 ] e s t un t a b l e a u de 4 doubles
t a b M u l t i [ 1 ] = new double [ 4 ] ;

System . o u t . p r i n t l n ( t a b M u l t i . l e n g t h ) ; / / Affiche 2
System . o u t . p r i n t l n ( t a b M u l t i [ 0 ] . l e n g t h ) ; / / A f f i c h e 3
System . o u t . p r i n t l n ( t a b M u l t i [ 1 ] . l e n g t h ) ; / / A f f i c h e 4

POO 111 / 177


Tableaux à plusieurs dimensions

Exemple 1 (suite)

f o r ( i n t i =0; i < t a b M u l t i . l e n g t h ; i ++)


f o r ( i n t j =0; j < t a b M u l t i [ i ] . l e n g t h ; j ++)
tabMulti [ i ] [ j ]= i + j ;

System . o u t . p r i n t l n ( A r r a y s . deepToString ( t a b M u l t i ) ) ;
/ / Affiche [ [ 0 . 0 , 1.0 , 2.0] , [1.0 , 2.0 , 3.0 , 4 . 0 ] ]

POO 112 / 177


Tableaux à plusieurs dimensions

Exemple 2

Dans l’exemple suivant, on va créer un tableau triangulaire qui sera


initialisé comme suit :

0
0 0
0 0 0
0 0 0 0

POO 113 / 177


Tableaux à plusieurs dimensions

Exemple 2
f i n a l i n t N = 4;
i n t [ ] [ ] t a b T r i a n g u l a i r e = new i n t [ N ] [ ] ;
f o r ( i n t n =0; n<N; n++)
t a b T r i a n g u l a i r e [ n ] = new i n t [ n + 1 ] ;

System . o u t . p r i n t l n ( A r r a y s . deepToString (
tabTriangulaire ) ) ;
/ / Affiche [ [ 0 ] , [0 , 0] , [0 , 0 , 0] , [0 , 0 , 0 , 0]]

f o r ( i n t i =0; i < t a b T r i a n g u l a i r e . l e n g t h ; i ++) {


f o r ( i n t j =0; j < t a b T r i a n g u l a i r e [ i ] . l e n g t h ; j ++)
System . o u t . p r i n t ( t a b T r i a n g u l a i r e [ i ] [ j ] + " \ t " )
;
System . o u t . p r i n t l n ( ) ;
}

POO 114 / 177


Tableaux à plusieurs dimensions

Parcours d’un tableau multi-dimensionnel


Comme pour le cas à une seule dimension, on peut utiliser la boucle
(pour chaque -for each) pour accéder au contenu d’un tableau
multi-dimensionnel.
double [ ] [ ] m a t r i c e = new double [ 4 ] [ 3 ] ;

f o r ( i n t i =0; i <4; i ++)


f o r ( i n t j =0; j <3; j ++)
matrice [ i ] [ j ]= i + j ;

double somme=0;
f o r ( double [ ] l i g n e : m a t r i c e )
f o r ( double v a l : l i g n e )
somme += v a l ;

System . o u t . p r i n t l n ( "somme = " +somme) ;

L’initialisation peut se faire commePOO


suit : 115 / 177
Tableaux à plusieurs dimensions

Exemple

double [ ] [ ] t a b M u l t i = { new double [ 4 ] , new double [ 5 ] } ;

System . o u t . p r i n t l n ( t a b M u l t i . l e n g t h ) ; / / A f f i c h e 2
System . o u t . p r i n t l n ( t a b M u l t i [ 0 ] . l e n g t h ) ; / / A f f i c h e 4
System . o u t . p r i n t l n ( t a b M u l t i [ 1 ] . l e n g t h ) ; / / A f f i c h e 5

double [ ] [ ] t a b M u l B i s = { { 1 , 2 } , { 3 , 5 } , { 3 , 7 , 8 , 9 , 1 0 } } ;

System . o u t . println ( tabMulBis . length ) ; / / Affiche 3


System . o u t . println ( tabMulBis [ 0 ] . length ) ; / / Affiche 2
System . o u t . println ( tabMulBis [ 1 ] . length ) ; / / Affiche 2
System . o u t . println ( tabMulBis [ 2 ] . length ) ; / / Affiche 5

POO 116 / 177


Tableaux à plusieurs dimensions

Chapitre 8
Chaînes de caractères

POO 117 / 177


Introduction

Introduction
Considérons l’exemple suivant :
i m p o r t j a v a . u t i l . Scanner ;

p u b l i c c l a s s TestComparaisonChaines {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
S t r i n g nom = " smi " , s t r ;
Scanner i n p u t = new Scanner ( System . i n ) ;
System . o u t . p r i n t ( " S a i s i r l e nom : " ) ;
s t r = input . nextLine ( ) ;
i f (nom == s t r )
System . o u t . p r i n t l n (nom + " = " + s t r ) ;
else
System . o u t . p r i n t l n (nom + " d i f f e r e n t de " +
str ) ;
}
}
POO 118 / 177
Introduction

Introduction

Dans cet exemple, on veut comparer les deux chaînes de caractères


nom initialisée avec "smi" et str qui est saisie par l’utilisateur.
Lorsque l’utilisateur exécute le programme précédent, il aura le
résultat suivant :
Saisir le nom de la filiere : smi
smi different de smi
Il semble que le programme précédent produit des résultats incorrects.
Le problème provient du fait, que dans java, String est une classe et
par conséquent chaque chaîne de caractères est un objet.

POO 119 / 177


Introduction

Remarque :

L’utilisation de l’opérateur == implique la comparaison entre les


références et non du contenu.

POO 120 / 177


Introduction

En java, il existe des classes qui permettent la manipulation des


caractères et des chaînes de caractères :

Character : une classe qui permet la manipulation des caractères


(un seul caractère).
String : manipule les chaînes de caractères fixes.
StringBuilder et StringBuffer : manipulent les chaînes de
caractères modifiables.

POO 121 / 177


Manipulation des caractères

Manipulation des caractères

Nous donnons quelques méthodes de manipulation des caractères.


L’argument passé pour les différentes méthodes peut être un caractère
ou son code unicode.

POO 122 / 177


Manipulation des caractères

Majuscule

isUpperCase() : test si le caractère est majuscule


toUpperCase() : si le caractère passé en argument est une lettre
minuscule, elle retourne son équivalent en majuscule.
Sinon, elle retourne le caractère sans changement.

POO 123 / 177


Manipulation des caractères

Majuscule : Exemple
p u b l i c c l a s s TestUpper {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
char t e s t = ’ a ’ ;

i f ( C h a r a c t e r . isUpperCase ( t e s t ) )
System . o u t . p r i n t l n ( t e s t + " e s t
majuscule " ) ;
else
System . o u t . p r i n t l n ( t e s t + " n ’ e s t pas
majuscule " ) ;

t e s t = C h a r a c t e r . toUpperCase ( t e s t ) ;
System . o u t . p r i n t l n ( " Apres toUpperCase ( ) : "
+ test ) ;
}
}
POO 124 / 177
Manipulation des caractères

Minuscule

isLowerCase() : test si le caractère est minuscule


toLowerCase() : Si le caractère passé en argument est une lettre
majuscule, elle retourne son équivalent en minuscule.
Sinon, elle retourne le caractère sans changement.

POO 125 / 177


Manipulation des caractères

isDigit() : Retourne true si l’argument est un nombre (0−9) et


false sinon
isLetter() : Retourne true si l’argument est une lettre et false
sinon
isLetterOrDigit() : Retourne true si l’argument est un nombre ou une
lettre et false sinon
isWhitespace() : Retourne true si l’argument est un caractère
d’espacement et false sinon. Ceci inclue l’espace, la
tabulation et le retour à la ligne

POO 126 / 177


La classe String

Déclaration

Comme on l’a vu dans les chapitres précédents, la déclaration d’une


chaîne de caractères se fait comme suit :
String nom;
L’initialisation se fait comme suit :
nom="Oujdi";
Les deux instructions peuvent être combinées :
String nom = "Oujdi";
L’opérateur new peut être utilisé :
String nom = new String("Oujdi");
Pour créer une chaîne vide : String nom = new String();
ou bien : String nom = "";

POO 127 / 177


La classe String

Remarques

Une chaîne de type "Oujdi" est considérée par java comme un objet.
Les déclarations suivantes :
String nom1 = "Oujdi";
String nom2 = "Oujdi";
déclarent deux variables qui référencent le même objet ("Oujdi").
Par contre, les déclarations suivantes :
String nom1 = new String("Oujdi");
String nom2 = new String("Oujdi"); // ou nom2 = new String(nom1)
déclarent deux variables qui référencent deux objets différents.

POO 128 / 177


La classe String

Méthodes de traitement des chaînes de caractères

La compilation du programme suivant génère l’erreur « array


required, but String found
[Link]("Oujdi"[i]); »
p u b l i c c l a s s ProblemeManipString {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
f o r ( i n t i =0; i <5; i ++)
System . o u t . p r i n t l n ( " O u j d i " [ i ] ) ;
}
}

Pour éviter les erreurs de ce type, la classe « String » contient des


méthodes pour manipuler les chaînes de caractères. Dans ce qui suit,
nous donnons quelques unes de ces méthodes.

POO 129 / 177


La classe String

Méthode charAt()

Retourne un caractère de la chaîne.


Une correction de l’exemple précédent est :
p u b l i c class ProblemeManipStringCorrection {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
f o r ( i n t i =0; i <5; i ++)
System . o u t . p r i n t l n ( " O u j d i " . c h a r A t ( i ) ) ;
}
}

POO 130 / 177


La classe String

Méthode concat()

Permet de concaténer une chaîne avec une autre.


nom = " O u j d i " . concat ( " Mohammed" ) ;
/ / nom<−−"O u j d i Mohammed"

POO 131 / 177


La classe String

Méthode trim()

supprime les séparateurs de début et de fin (espace, tabulation, ...)


nom = " \ n O u j d i " + " Mohammed \n\ t " ;
nom = nom . t r i m ( ) ; / / nom<−−"O u j d i Mohammed"

POO 132 / 177


La classe String

Méthodes replace() et replaceAll()

replace() : Remplace toutes les occurrences d’une chaîne de


caractères avec une autre chaîne de caractères
replaceAll() : Remplace toutes les occurrences d’une expression
régulière par une chaîne

String str ;
s t r = " Bonjour " . r e p l a c e ( " j o u r " , " s o i r " ) ;
/ / s t r <−−"B o n s o i r "
s t r = " s o i r " . r e p l a c e A l l ( " [ so ] " , " t " ) ;
/ / s t r <−− " t t i r "
s t r = " d e f " . r e p l a c e A l l ( " [ a−z ] " , "A" ) ;
/ / s t r <−− "AAA"

POO 133 / 177


La classe String

Méthode compareTo()

Permet de comparer un chaîne avec une autre chaîne.


S t r i n g abc = " abc " ;
S t r i n g def = " def " ;
S t r i n g num = " 123 " ;
i f ( abc . compareTo ( d e f ) < 0 ) / / true
i f ( abc . compareTo ( abc ) == 0 ) / / true
i f ( abc . compareTo ( num ) > 0 ) / / true
System . o u t . p r i n t l n ( abc ) ;

POO 134 / 177


La classe String

Méthode indexOf()

Cherche la première occurrence d’un caractère ou d’une sous-chaîne


de la chaîne
S t r i n g abcs = " a b c d e f g h i j k l m n o p q r s t u v w x y z " ;
i n t i = abcs . indexOf ( ’ s ’ ) ; / / 18
i n t j = abcs . indexOf ( " d e f " ) ; / / 3
i n t k = abcs . indexOf ( " smi " ) ; / / −1

POO 135 / 177


La classe String

Méthode valueOf()

Retourne la chaîne qui est une représentation d’une valeur


double x = 1 0 . 2 ;
s t r = S t r i n g . valueOf ( x ) ; / / s t r <−− " 1 0 . 2 "
i n t i = 20;
s t r = S t r i n g . valueOf ( i ) ; / / s t r <−− " 2 0 "

POO 136 / 177


La classe String

Méthode substring()

Retourne une sous-chaîne de la chaîne :

substring(debut) : la sous-chaîne commence à partir du


caractère qui se trouve à l’indice debut et se termine à la fin de la
chaîne ;
substring(debut, fin) : la sous-chaîne commence à partir du
caractère qui se trouve à l’indice debut et se termine au caractère
qui se trouve à l’indice fin-1.

Exemple :

s t r = " Bonjour " . s u b s t r i n g ( 3 ) ; / / s t r <−− " j o u r "


s t r = " t o u j o u r s " . s u b s t r i n g ( 3 , 7 ) ; / / s t r <−− " j o u r "

POO 137 / 177


La classe String

Méthodes startsWith() et endsWith()

startsWith() : Vérifie si une chaîne commence par un suffixe


endsWith() : Vérifie si une chaîne se termine par un suffixe

S t r i n g u r l = " h t t p : / / www. ump .ma" ;


i f ( url . startsWith ( " http " ) ) / / true
i f ( u r l . endsWith ( "ma" ) ) / / t r u e
System . o u t . p r i n t l n ( s t r ) ;

POO 138 / 177


La classe String

Méthodes equals() et equalsIgnoreCase()


La méthode :
equals() compare une chaîne avec une autre chaîne en tenant
compte de la casse (majuscule ou minuscule) ;
equalsIgnoreCase() compare une chaîne avec une autre chaîne
en ignorant la casse.
Exemple :
S t r i n g s t r 1 = " t e s t " , s t r 2 = " Test " ;
i f ( s t r 1 . equals ( s t r 2 ) )
System . o u t . p r i n t l n ( " Les 2 chaines s o n t egaux " ) ;
else
System . o u t . p r i n t l n ( " Les 2 chaines d i f f e r e n t s " ) ;

i f ( s t r 1 . equalsIgnoreCase ( s t r 2 ) )
System . o u t . p r i n t l n ( " Les 2 chaines s o n t egaux (
sans t e n i r compte de l a casse ) " ) ;
POO 139 / 177
La classe String

Méthode getBytes()

Copie les caractères d’une chaîne dans un tableau de bytes.


Exemple :

S t r i n g s t r 1 = " abc_test_123 " ;


byte [ ] b ;
b = s t r 1 . getBytes ( ) ;
f o r ( i n t i = 0 ; i < b . l e n g t h ; i ++)
System . o u t . p r i n t l n ( b [ i ] ) ;

POO 140 / 177


La classe String

Méthode getChars()

Copie les caractères d’une chaîne dans un tableau de caractères.


Utilisation :
Soit str une chaîne de caractères. La méthode getChars() s’utilise
comme suit :
str .getChars(srcDebut, srcFin, dst, dstDebut)
Paramètres :

srcDebut : indice du premier caractère à copier ;


srcFin : indice après le dernier caractère à copier ;
dst : tableau de destination ;
dstDebut : indice du premier élément du tableau de destination.

POO 141 / 177


La classe String

Méthode getChars() :
Exemple :

s t r = " Ceci e s t un t e s t " ;


char [ ] c = new char [ s t r . l e n g t h ( ) ] ;

s t r . getChars ( 0 , s t r . l e n g t h ( ) , c , 0 ) ;
f o r ( i n t i = 0 ; i < c . l e n g t h ; i ++)
System . o u t . p r i n t l n ( c [ i ] ) ;

POO 142 / 177


La classe String

Méthode toCharArray()

Met la chaîne dans un tableau de caractères.


Exemple :

s t r = " Test " ;


char [ ] tabC= s t r . t o C h a r A r r a y ( ) ;
f o r ( i n t i n d = 0 ; i n d < tabC . l e n g t h ; i n d ++)
System . o u t . p r i n t l n ( tabC [ i n d ] ) ;

POO 143 / 177


La classe String

Méthode isEmpty()

Retourne true si la chaîne est de taille nulle.


Exemple :

i f ( s t r . isEmpty ( ) )
System . o u t . p r i n t l n ( " Chaine v i d e " ) ;
else
System . o u t . p r i n t l n ( " Chaine non v i d e " ) ;

POO 144 / 177


La classe String

Méthode indexOf()

Cherche la première occurrence d’un caractère ou d’une sous-chaîne


de la chaîne. Elle retourne l’indice du premier occurrence du caractère
dans la chaîne ou -1 si le caractère n’existe pas.
Exemple :

S t r i n g abcs = " a b c d e f g h i j k l m n o p q r s t u v w x y z " ;


i n t i = abcs . indexOf ( ’ s ’ ) ; / / 18
i n t j = abcs . indexOf ( " d e f " ) ; / / 3
i n t k = abcs . indexOf ( " smi " ) ; / / −1

POO 145 / 177


La classe String

Méthode lastIndexOf()

Cherche la dernière occurrence d’un caractère ou d’une sous-chaîne


dans une chaîne. Elle retourne l’indice du dernier occurrence du
caractère dans la chaîne ou -1 si le caractère n’existe pas.
Exemple :

S t r i n g abcs = " a b c d e f g h i j k l m n o p q r s t u v w x y z + s t r " ;


i n t i = abcs . l a s t I n d e x O f ( ’ s ’ ) ; / / 27
i n t j = abcs . l a s t I n d e x O f ( " d e f " ) ; / / 3
i n t k = abcs . l a s t I n d e x O f ( " smi " ) ; / / −1

POO 146 / 177


La classe String

Méthode replaceFirst()

Remplace la première occurrence d’une expression régulière par une


chaîne.
Exemple :
s t r = " T e s t 1 t e s t 2 " . r e p l a c e F i r s t ( " [0 −9] " , " _ " ) ;
/ / Test_test2

POO 147 / 177


La classe String

Méthodes toLowerCase() et toUpperCase()

La méthode :

toLowerCase() convertie la chaîne en minuscule ;


toUpperCase() convertie la chaîne en majuscule.

Exemple :

S t r i n g nom = " O u j d i " ;


nom = nom . toUpperCase ( ) ; / / nom <−− " OUJDI "

s t r = " TEst " ;


s t r = s t r . toLowerCase ( ) ; / / s t r <−− " t e s t "

POO 148 / 177


La classe String

Méthode split()
split() sépare la chaîne en un tableau de chaînes en utilisant une
expression régulière comme délimiteur.
nom = " O u j d i Mohammed" ;
S t r i n g [ ] t a b S t r = nom . s p l i t ( " " ) ;
f o r ( i n t i n d = 0 ; i n d < t a b S t r . l e n g t h ; i n d ++)
System . o u t . p r i n t l n ( t a b S t r [ i n d ] ) ; / / A f f i c h e r a :
/ / Oujdi
/ / Mohammed
s t r = "Un : deux , t r o i s ; q u a t r e " ;
tabStr = st r . s p l i t ( " [ : , ; ] " ) ;
f o r ( i n t i n d = 0 ; i n d < t a b S t r . l e n g t h ; i n d ++)
System . o u t . p r i n t l n ( t a b S t r [ i n d ] ) ; / / Affichera :
/ / Un
/ / deux
// trois
/ / quatre
POO 149 / 177
La classe String

Méthode hashCode()

Retourne le code de hachage (hashcode) d’une chaîne. Pour une


chaîne s, le code est calculé de la façon suivante :

s[0] ∗ 31(n−1) + s[1] ∗ 31(n−2) + · · · + s[n − 1]

avec : s[i] est le code du caractère à la position i (voir la méthode


getBytes()).
Exemple :

s t r = " 12 " ;
System . o u t . p r i n t l n ( " code " + s t r . hashCode ( ) ) ;
/ / r e t o u r n e : 1569 = 49∗31+50

POO 150 / 177


La classe String

Méthode valueOf()

Retourne la chaîne qui est une représentation d’une valeur.


Exemple :

double x = 1 0 . 2 ;
s t r = S t r i n g . valueOf ( x ) ; / / s t r <−− " 1 0 . 2 "

i n t t e s t = 20;
s t r = S t r i n g . valueOf ( t e s t ) ; / / s t r <−− " 2 0 "

POO 151 / 177


La classe String

Conversion entre String et types primitifs

Comme on l’a vu précédemment, la méthode valueOf() de la classe


String permet de récupérer la valeur d’un type primitif.
Les classes Byte, Short, Integer, Long, Float, et Double, disposent
de la méthode statique toString() qui permet de convertir un type
primitif vers un String. Elles disposent respectivement des méthodes
statiques parseByte(), parseShort(), parseInt(), parseLong(),
parseFloat() et parseDouble(), qui permettent de convertir une
chaîne en un type primitif.

POO 152 / 177


La classe String

Exemple :
p u b l i c c l a s s TestConversion {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
double x = 4 . 5 ;
S t r i n g s t r = Double . t o S t r i n g ( x ) ; / / s t r < − −"4.5"

i n t t e s t = 20;
s t r = I n t e g e r . t o H e x S t r i n g ( t e s t ) ; / / s t r <−− " 2 0 "

s t r = " 2.3 " ;


x = Double . parseDouble ( s t r ) ; / / x <−− 2 . 3

str = "5" ;
t e s t = I n t e g e r . p a r s e I n t ( s t r ) ; / / t e s t <−− 5
}
}

POO 153 / 177


Affichage des objets

Affichage des objets

Le code suivant :
E t u d i a n t etud = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;
System . o u t . p r i n t l n ( etud ) ;

affichera quelque chose comme : Etudiant@1b7c680.


Cette valeur correspond à la référence de l’objet.

POO 154 / 177


Affichage des objets

Affichage des objets

Si on souhaite afficher le contenu de l’objet en utilisant le même code,


il faut utiliser la méthode toString prévu par Java.

POO 155 / 177


Affichage des objets

Affichage des objets : Exemple


public class TestEtudiantToString {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
E t u d i a n t e t = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;
System . o u t . p r i n t l n ( etud ) ;
}
}

class Etudiant {
p r i v a t e S t r i n g nom , prenom , cne ;
...
public String toString () {
r e t u r n "Nom : " +nom+ " \ nPrenom : " +prenom+ " \ nCNE
: " +cne ;
}
...
}
POO 156 / 177
Affichage des objets

Affichage des objets : Exemple

Affichera :

Nom : Oujdi
Prenom : Ali
CNE : A20

POO 157 / 177


Comparaison des objets

Comparaison des objets

Le code suivant :
E t u d i a n t etud1 = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;
E t u d i a n t etud2 = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;

i f ( etud1 == etud2 )
System . o u t . p r i n t l n ( " I d e n t i q u e s " ) ;
else
System . o u t . p r i n t l n ( " D i f f e r e n t s " ) ;

affichera toujours « Differents », du fait que la comparaison s’est


faite entre les références des objets.

POO 158 / 177


Comparaison des objets

Comparaison des objets

Comme pour la méthode toString, Java prévoit l’utilisation de la


méthode equals qui pourra être définie comme suit :
class Etudiant {
p r i v a t e S t r i n g nom , prenom , cne ;
...
p u b l i c boolean equals ( E t u d i a n t b i s ) {
i f (nom == b i s . nom && prenom == b i s . prenom &&
cne == b i s . cne )
return true ;
else
return false ;
}
}

POO 159 / 177


Comparaison des objets

Comparaison des objets : utilisation de equals

public class TestEtudiantToString {


p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
E t u d i a n t e t = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;
E t u d i a n t e t 1 = new E t u d i a n t ( " O u j d i " , " A l i " , " A20 " ) ;

i f ( e t . equals ( e t 1 ) )
System . o u t . p r i n t l n ( " I d e n t i q u e s " ) ;
else
System . o u t . p r i n t l n ( " D i f f e r e n t s " ) ;
}
}

POO 160 / 177


Les classes StringBuilder et StringBuffer

Les classes StringBuilder et StringBuffer

Lorsqu’on a dans un programme l’instruction


str = "Bonjour";
suivie de
str = "Bonsoir";
le système garde en mémoire la chaîne "Bonjour" et crée une nouvelle
place mémoire pour la chaîne "Bonsoir". Si on veut modifier "Bonsoir"
par "Bonsoir SMI5", alors l’espace et "SMI5" ne sont pas ajoutés à
"Bonsoir" mais il y aura création d’une nouvelle chaîne. Si on fait
plusieurs opérations sur la chaîne str, on finira par créer plusieurs
objets dans le système, ce qui entraîne la consommation de la
mémoire inutilement.

POO 161 / 177


Les classes StringBuilder et StringBuffer

Les classes StringBuilder et StringBuffer

Pour remédier à ce problème, on peut utiliser les classes


StringBuilder ou StringBuffer. Les deux classes sont identiques à
l’exception de :

StringBuilder : est plus efficace.


StringBuffer : est meilleur lorsque le programme utilise les
threads.

Puisque tous les programmes qu’on va voir n’utilisent pas les threads,
le reste de la section sera consacré à la classe StringBuilder.

POO 162 / 177


Les classes StringBuilder et StringBuffer

Déclaration et création

Pour créer une chaîne qui contient "Bonjour", on utilisera l’instruction :


StringBuilder message = new StringBuilder("Bonjour");
Pour créer une chaîne vide, on utilisera l’instruction :
StringBuilder message = new StringBuilder();

POO 163 / 177


Les classes StringBuilder et StringBuffer

Remarque :

L’instruction :
StringBuilder message = "Bonjour";
est incorrecte. Idem, si « message » est un StringBuilder, alors
l’instruction :
message = "Bonjour";
est elle aussi incorrecte.

POO 164 / 177


Les classes StringBuilder et StringBuffer

Méthodes de StringBuilder
length() Retourne la taille de la chaîne
charAt() Retourne un caractère de la chaîne
substring() Retourne une sous-chaîne de la chaîne
setCharAt(i,c) permet de remplacer le caractère de rang i
par le caractère c.
insert(i,ch) permet d’insérer la chaîne de caractères
ch à partir du rang i
append(ch) permet de rajouter la chaine de caractères
ch à la fin
deleteCharAt(i) efface le caractère de rang i.
toString() Convertie la valeur de l’objet en une chaîne
(conversion de StringBuilder vers String)
concat() Concaténer une chaîne avec une autre
contains() Vérifie si une chaîne contient une autre
chaîne

POO 165 / 177


Les classes StringBuilder et StringBuffer

endsWith() Vérifie si une chaîne se termine par un suffixe


equals() Compare une chaîne avec une autre chaîne
getBytes() Copie les caractères d’une chaîne dans un ta-
bleau de bytes
getChars() Copie les caractères d’une chaîne dans un ta-
bleau de caractères
hashCode() Retourne le code de hachage (hashcode) d’une
chaîne
indexOf() Cherche la première occurrence d’un caractère ou
d’une sous-chaîne de la chaîne
lastIndexOf() Cherche la dernière occurrence d’un caractère ou
d’une sous-chaîne dans une chaîne
replace() Remplace toutes les occurrences d’un caractère
avec un autre caractère

POO 166 / 177


Les classes StringBuilder et StringBuffer

Remarque :

On ne peut pas faire la concaténation avec l’opérateur + entre des


StringBuilder. Par contre :
StringBuilder + String
produit une nouvelle chaîne de type String.

POO 167 / 177


Les classes StringBuilder et StringBuffer

Exemple

public class TestStringBuilder {


p u b l i c s t a t i c v o i d main ( S t r i n g args [ ] ) {
S t r i n g B u i l d e r s t r B u i l d e r = new S t r i n g B u i l d e r ( "
Bonjour SMI5 " ) ;
i n t n = s t r B u i l d e r . l e n g t h ( ) ; / / n <−− 12

char c = s t r B u i l d e r . c h a r A t ( 2 ) ; / / c <−− ’ n ’

s t r B u i l d e r . setCharAt ( 1 0 , ’A ’ ) ;
/ / remplace dans s t r B u i l d e r l e c a r a c t e r e ’ I ’ par ’
A ’.
/ / s t r B u i l d e r <−− " Bonjour SMA5"

POO 168 / 177


Les classes StringBuilder et StringBuffer

Exemple (suite)
s t r B u i l d e r . i n s e r t ( 1 0 , " semestre " ) ;
/ / i n s e r e dans s t r B u i l d e r l a chaine " semestre "
a
/ / p a r t i r du rang 1 0 .
/ / s t r B u i l d e r <−− " Bonjour SMA semestre 5"

s t r B u i l d e r . append ( " ( promo 14−15) " ) ;


/ / s t r B u i l d e r <−− " Bonjour SM semestre A5 ( promo
14−15) "

s t r B u i l d e r = new S t r i n g B u i l d e r ( " Boonjour " ) ;


s t r B u i l d e r . deleteCharAt ( 2 ) ;
/ / supprime de l a chaine s t r B u i l d e r l e c a r a c t e r e
de rang 2 .
/ / s t r B u i l d e r <−− " Bonjour "
POO 169 / 177
Les classes StringBuilder et StringBuffer

Exemple (suite)

String str = strBuilder . toString () ;


/ / s t r <−− " Bonjour "

s t r = s t r B u i l d e r . s u b s t r i n g (1 , 4) ;
/ / s t r <−− " o n j "

s t r = s t r B u i l d e r + " t o u s l e monde " ;


/ / s t r <−− " Bonjour t o u s l e monde "
}
}

POO 170 / 177


Les classes StringBuilder et StringBuffer

Exercices

POO 171 / 177


Les classes StringBuilder et StringBuffer

Exercice
Écrivez une application qui compte le nombre d’espaces contenus
dans une chaîne de caractères saisie par l’utilisateur. Sauvegardez le
fichier sous le nom [Link].

POO 172 / 177


Les classes StringBuilder et StringBuffer

Solution
i m p o r t j a v a . u t i l . Scanner ;

p u b l i c c l a s s NombreEspaces {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
i n t nombreEspaces = 0 ;
String str ;

Scanner c l a v i e r = new Scanner ( System . i n ) ;


System . o u t . p r i n t l n ( " S a i s i r une chaine " ) ;
s t r = c l a v i e r . nextLine ( ) ;

f o r ( i n t i = 0 ; i < s t r . l e n g t h ( ) ; i ++)
i f ( s t r . c h a r A t ( i ) == ’ ’ )
nombreEspaces ++;
System . o u t . p r i n t l n ( " Nombre d ’ espaces : " +
nombreEspaces ) ;
POO 173 / 177
Les classes StringBuilder et StringBuffer

Nombre de caractères d’espacement :


nombreEspaces = 0 ;
f o r ( i n t i = 0 ; i < s t r . l e n g t h ( ) ; i ++)
i f ( C h a r a c t e r . isWhitespace ( s t r . c h a r A t ( i ) ) )
nombreEspaces ++;

System . o u t . p r i n t l n ( " Nombre de c a r a c t e r e s d ’


espacement : " + nombreEspaces ) ;
c l a v i e r . close ( ) ;
}
}

POO 174 / 177


Les classes StringBuilder et StringBuffer

Exercice
L’utilisation de trois lettres dans les acronymes est courante. Par
exemple :

JDK : Java Development Kit ;


JVM :Java Virtual Machine ;
RAM : Random Access Memory ;
...

Écrivez un programme qui demande à l’utilisateur de saisir trois mots


et affiche à à l’écran l’acronyme correspondant composé des trois
premières lettres en majuscule. Si l’utilisateur saisisse plus de trois
mots, le reste sera ignoré.

POO 175 / 177


Les classes StringBuilder et StringBuffer

Solution
i m p o r t j a v a . u t i l . Scanner ;

p u b l i c c l a s s Acronymes {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
S t r i n g s t r , acronyme = " " ;
String [ ] tabStr ;

Scanner c l a v i e r = new Scanner ( System . i n ) ;


do { / / pour f o r c e r l ’ u t i l i s a t e u r a s a i s i r p l u s
de 3 mots
System . o u t . p r i n t l n ( " S a i s i r une chaine
composee de p l u s de t r o i s " ) ;
s t r = c l a v i e r . nextLine ( ) ;
tabStr = st r . s p l i t ( " " ) ;
} while ( tab Str . length < 3) ;

POO 176 / 177


Les classes StringBuilder et StringBuffer

f o r ( i n t i = 0 ; i < 3 ; i ++)
acronyme += t a b S t r [ i ] . c h a r A t ( 0 ) ;

System . o u t . p r i n t l n ( " Acronyme : " + acronyme .


toUpperCase ( ) ) ;
c l a v i e r . close ( ) ; / / fermer l e c l a v i e r
}
}

POO 177 / 177

Vous aimerez peut-être aussi