Comprendre l'héritage en Java
Comprendre l'héritage en Java
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
POO 3 / 177
Introduction
Remarques :
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
POO 5 / 177
Exemple introductif
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
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
c l a s s P r o f e s s e u r extends Personne {
private String cin ;
POO 9 / 177
Accès aux attributs
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
POO 11 / 177
Accès aux attributs
Exemple
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 :
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.
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 :
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
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
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 :
POO 22 / 177
Héritage et constructeurs
Héritage et constructeurs
POO 23 / 177
Héritage et constructeurs
Exemple 1
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
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 ;
}
...
}
Remarques :
POO 30 / 177
Opérateur « instanceof »
Opérateur « instanceof »
POO 31 / 177
Opérateur « instanceof »
Types primitifs
int i ;
float x;
double y ;
...
x = i;
y = x;
POO 32 / 177
Opérateur « instanceof »
Types primitifs
i = x;
x = y;
i = ( int ) x;
x = ( float ) y;
POO 33 / 177
Opérateur « instanceof »
Objets
POO 34 / 177
Opérateur « instanceof »
POO 35 / 177
Opérateur « instanceof »
void i n f o ( ) {
System . o u t . p r i n t l n ( " Classe . . . " ) ;
}
POO 36 / 177
Opérateur « instanceof »
instanceof
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
POO 37 / 177
Opérateur « instanceof »
L’instruction :
POO 38 / 177
Opérateur « instanceof »
Chapitre 6
Polymorphisme et abstraction
POO 39 / 177
Introduction
Introduction
POO 40 / 177
Exemple introductif
Exemple introductif
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
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" ) ;
}
}
Liaison dynamique
POO 45 / 177
Liaison dynamique
Liaison dynamique
POO 46 / 177
Liaison dynamique
Remarques :
POO 47 / 177
Liaison dynamique
Remarques :
POO 48 / 177
Méthodes de classes
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 ( ) ;
}
}
Je suis un etudiant
Je suis un etudiant etranger
POO 51 / 177
Méthodes de classes
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 ( ) ;
}
}
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
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 " ) ;
}
}
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
POO 58 / 177
Remarques :
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 :
POO 61 / 177
Exemple 2
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
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
p u b l i c classeA ( ) {
m( ) ;
}
}
POO 65 / 177
Constructeurs et abstraction
POO 66 / 177
Constructeurs et abstraction
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
/∗ ∗
∗ 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
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
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
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
POO 75 / 177
Taille d’un tableau
POO 76 / 177
Taille d’un tableau
Remarque :
POO 77 / 177
Taille d’un tableau
Exemple :
POO 78 / 177
Parcours d’un tableau
POO 79 / 177
Parcours d’un tableau
Exemple
POO 80 / 177
Parcours d’un tableau
Remarque :
POO 81 / 177
Parcours d’un tableau
Exemple
POO 82 / 177
Parcours d’un tableau
taille de args : 4
BONJOUR TOUS LE MONDE
POO 83 / 177
Copie de tableaux
Copie de tableaux
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 :
POO 85 / 177
Copie de tableaux
Exemple
/ / 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]()
POO 87 / 177
Copie de tableaux
Exemple
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
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
POO 91 / 177
Utilisation de la classe Arrays
Trie
POO 92 / 177
Utilisation de la classe Arrays
Exemple
Arrays . s o r t ( tab ) ;
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
POO 94 / 177
Utilisation de la classe Arrays
Exemple
double [ ] t a b = new double [ 1 0 ] ;
double v a l =5;
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()
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
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 } ;
/ / Appel de t e s t
t e s t ( tab ) ;
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 :
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 ) ) ;
}
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 ( ) {
}
...
}
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 :
Attention
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 " ) ;
Exemple (suite)
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
}
}
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];
Remarques
Exemple 1
/ / 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
Exemple 1 (suite)
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 ] ]
Exemple 2
0
0 0
0 0 0
0 0 0 0
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]]
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 ;
Exemple
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 } } ;
Chapitre 8
Chaînes de caractères
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
Remarque :
Majuscule
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
Déclaration
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.
Méthode charAt()
Méthode concat()
Méthode trim()
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"
Méthode compareTo()
Méthode indexOf()
Méthode valueOf()
Méthode substring()
Exemple :
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()
Méthode getChars()
Méthode getChars() :
Exemple :
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 ] ) ;
Méthode toCharArray()
Méthode isEmpty()
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 " ) ;
Méthode indexOf()
Méthode lastIndexOf()
Méthode replaceFirst()
La méthode :
Exemple :
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()
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
Méthode valueOf()
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 "
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 "
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
}
}
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 ) ;
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
Affichera :
Nom : Oujdi
Prenom : Ali
CNE : A20
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 " ) ;
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 " ) ;
}
}
Puisque tous les programmes qu’on va voir n’utilisent pas les threads,
le reste de la section sera consacré à la classe StringBuilder.
Déclaration et création
Remarque :
L’instruction :
StringBuilder message = "Bonjour";
est incorrecte. Idem, si « message » est un StringBuilder, alors
l’instruction :
message = "Bonjour";
est elle aussi incorrecte.
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
Remarque :
Exemple
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"
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"
Exemple (suite)
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 "
Exercices
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].
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 ;
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
Exercice
L’utilisation de trois lettres dans les acronymes est courante. Par
exemple :
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 ;
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 ) ;