You are on page 1of 181

Programmation Orientée Objet

POO : Java

Java

Responsable

Tarak CHAARI

tarak.chaari@isecs.rnu.tn
tarak.chaari@gmail.com

Tarak CHAARI
‹N
‹N°
°›
Contenu

C’est quoi Java?


POO : Java

Les bases du langage

Concept Objet du langage Java

Classes et Objets en Java

Programmation orientée objet avancée Java

Les classes de bases

Exercices et corrigés

Tarak CHAARI
‹N
‹N°
°›
Chapitre
POO : Java

1
C'est quoi Java ?

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-1 Historique du langage Java

Développé en 1990 chez SUN MicroSystems sous la


direction de Bill Joy et James Gosling.
Gosling.

Le nom oak étant déjà utilisé le langage est appelé Java


POO : Java

(café en argot américain).


américain).

En 1993,,
1993 avec l'intérêt grandissant d'Internet, ce
langage, se métamorphose en langage dédié à Internet :
SUN diffuse le premier browser HotJava qui permet
d'exécuter des programmes Java encapsulés dans des
pages WEB (i.e. des applets Java) de plus en plus «
vivantes ».

1996 : Les Java Développement Kits (JDK


JDK)) ou (J2SDK
SDK))
sont disponibles gratuitement pour la plupart des
Tarak CHAARI
machines du marché
marché..
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (1/8)

Le langage Java est familier :


Java est un langage familier très proche du langage C
, C++. Par exemple :
POO : Java

Même types de base que C++ (int, float, double, etc.),


Même formes de déclarations que C++,
Même structure de contrôle que C++ (if, while, for, etc.).

Le langage Java est simple :


Java est un langage simple par rapport au langage C
et C++.
Il n'y a plus de pointeurs et des manipulations les concernant ;
Java se charge (presque) de restituer au système les zones
mémoire inaccessibles et ce sans l'intervention du
programmeur.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (2/8)

Le langage Java est orienté objet :


Paquetage pour la réutilisation :
java.lang : classes de base
POO : Java

java.io : entrée/sortie
java.awt : interfaces graphiques
java.net : communication réseaux (socket et URL)
java.applet : API Applet
java.util : classes outils

Le langage Java est distribué :


Supporte des applications réseaux (protocoles de
communication java.net)
URL : permet l ’accès à des objets distants
RMI : Remote Method Invocation
Programmation d'applications Client/Serveur : classe Socket
Manipulation de fichier local ou fichier distant identique : indifférence
Tarak CHAARI à la localisation.
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (3/8)

Le langage Java est interprété :


Un programme Java n'est pas compilé en code
machine ;
POO : Java

Il sera compilé en code intermédiaire interprété nommé


ByteCode.
Lors de l'exécution le ByteCode sera interprété à l’aide d’une
machine dite virtuelle JVM (Java Virtual Machine).

Le langage Java est portable et indépendant des plates-


plates-
formes :
Le code intermédiaire produit « ByteCode » est
indépendant des plates-formes.
Il pourra être exécuté sur tous types de machines et systèmes
pour peu qu'ils possèdent l'interpréteur de code Java « JVM ».
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (4/8)

Production d’une application Java standard

Bytecode
POO : Java

COMPILATEUR
Prog.java JAVA Class1.class

Code source

Class2.class

Bytecode = Pseudo code machine qui contrairement à du code


binaire natif, n'est pas exécuté directement par le processeur – ce qui a
pour conséquence de ralentir son exécution.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (5/8)

Exécution d’une application Java standard


POO : Java

Bytecode
JVM
Prog.class INTERPRETEUR Résultats
DE BYTECODE

JVM = Programme capable d'interpréter les instructions contenues


dans les fichiers ByteCode Java afin de les exécuter.

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (6/8)
POO : Java

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (7/8)

Système d’exploitation
POO : Java

MVJ
Code Java

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-2 Caractérisation du langage Java (8/8)

Le langage Java est robuste et sûr :


Détection des erreurs d’invocation des méthodes :
java est fortement typé
seules des conversions sûres sont automatiques
POO : Java

Fiabilité de la gestion de la mémoire


pas de pointeurs
ramasse miettes automatique
contrôle automatique d’accès aux tableaux et aux chaînes de
caractères.

Le langage Java est multithread :


JAVA permet l’exécution simultanée de plusieurs processus
légers (thread)
Classe java.lang.thread avec les méthodes permettant de :
Démarrer, Exécuter, Stopper ces processus.
Tarak CHAARI contrôler les synchronisations et l’état cohérent des données.
‹N
‹N°
°›
1- C’est quoi Java
1-3 Java vs C++

Un programme doit contenir au moins une classe.

Une méthode main() avec un type de retour void.


POO : Java

Une constante est définie au sein d’une classe à l’aide de


l’instruction final.

L’instruction include est remplacée par l’instruction import


suivie par un nom complet de la classe.

Représentation des caractères et des identificateurs sur 16 bits


(Unicode).

Pas de pointeurs, seulement des références.

Pas de fonctions à nombre variables d’arguments (Template).

Pas d’héritage multiple de classes.


Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

Fichier «XXX.java »
// Commentaire
POO : Java

Définition d’une classe XXX


Méthode main ( )

Une application Java minimale doit contenir une classe :

Portant le même nom que le fichier ayant l’extension


« .java » dans lequel elle est enregistrée.
Comportant (au moins) une méthode :
appelée main,
de type public et static,
Tarak CHAARI ayant un argument de type String[ ],
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

Programme Java minimal :

Fichier «PremierProgramme.java »
POO : Java

// Ce programme se contente d’afficher le message « Ca Marche »

class PremierProgramme
{

public static void main(String args[] )


{
System.out.println("Ca Marche");
}
}

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

Fichier «PremierProgramme.java »
POO : Java

// Ce programme se contente d’afficher le message « Ca Marche »

La première ligne du programme « PremierProgramme »


est une ligne de commentaire :

Elle commence par //.

Tout ce qui est compris entre ces deux caractères et


la fin de la ligne est ignoré par le compilateur.

En revanche, d’autres outils peuvent utiliser le texte


Tarak CHAARI contenu dans ce type de commentaire.
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

class PremierProgramme
{
}
POO : Java

Le mot class veut dire que nous allons définir une nouvelle
classe Java, suivi du nom de cette classe
classe..

En Java, les majuscules et les minuscules sont considérés


comme des caractères différents.
différents.
PremierProgramme n’est pas identique à
PREMIERProgramme.

Les caractères « { « et « } » marquent le début et la fin


du bloc d’instructions à réaliser par la classe.
classe.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

public static void main(String args[] )


{
POO : Java

main() { : signifie que nous allons définir une méthode


appelée main
main..

Le mot main indique que cette méthode est la méthode


principale de la classe.
classe.

Un interpréteur Java a pour fonction d’exécuter les


instructions contenues dans le bloc d’instruction de la
méthode principale main
main,, du programme qu’on lui soumet
soumet..

Une méthode est une sorte de procédure (ensemble


Tarak CHAARI d’instructions
d’instructions)) appartenant à une classe
classe..
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

public static void main(String args[] )


{
POO : Java

}
Une méthode peut prendre des paramètres de types précis
et renvoie éventuellement une valeur de type tout aussi
précis..
précis

le mot void signifie que la méthode main ne renvoie


aucune valeur
valeur..

args[ ] est le paramètre d’entrée de type String de la


méthode main
main..

les mots public et static décrivent chacun une


Tarak CHAARI caractéristique de la méthode (voir plus loin)
loin).
‹N
‹N°
°›
1- C’est quoi Java
1-4 Java par l’exemple

public static void main(String args[] )


POO : Java

{
System.out.println("Ca Marche");
}

System.out.
System. out.println est une commande permettant
d’afficher la chaîne de caractère « Ca MARCHE » sur la
sortie par défaut de votre machine qui est l’écran.
l’écran.

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-5 Structure d’une application Java standard

Fichier «XXX.java »
// Commentaire
POO : Java

Définition d’une classe AAA


// Commentaire

Définition d’une classe BBB

Définition d’une classe XXX


Méthode main ( )

Parmi les classes définies dans le fichier XXX.java il ne peut y


avoir qu’une seule classe publique et cette classe doit avoir le
même nom XXX que le fichier.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-6 Exemple d’une application Java standard

Fichier «PremierProgramme.java »
// Ce programme se contente d’afficher le message « Ca Marche »
POO : Java

class PremierProgramme
{
static void Affiche( )
{
System.out.println("Ca Marche");
}
public static void main(String args[] )
{
Affiche( );
}
}
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-7 Le Java developper Kit : JDK

Le JDK ou J2SDK (Java 2 Software Development Kit)


Kit):
est l’ensemble des outils nécessaires pour développer
et exécuter une application Java.
POO : Java

Des environnement intégrés de développement Java sont


actuellement :
commercialisés (Visual j++, Symnatec café, etc.)
distribués gratuitement à travers le Web (Eclipse).

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-8 Outils fournis par le JDK (1/4
1/4))

Le compilateur javac
javac::
Compile les fichiers sources java de nom XXX.java.
Traduit les fichiers sources en ByteCode :
POO : Java

Produit autant de fichier .class qu’il y a de classe définie dans


le fichier .java.

L’interpréteur java
java::
Prend en paramètre le nom de la classe.
Cherche le ou les fichiers .class qui lui correspondent.
Appelle la méthode main de la classe.

Le documenteur javadoc
javadoc::
Génère automatiquement une documentation sous la
forme de fichiers html à partir des fichiers sources
Tarak CHAARI commentés.
‹N
‹N°
°›
1- C’est quoi Java
1-8 Outils fournis par le JDK (2/4
2/4))

L’interpréteur d’applet appletviewer


appletviewer::
Un programme permettant de tester les applets Java,
prévues pour être intégrées dans des pages HTML.
POO : Java

Le générateur d’interface avec C, javah :


Un programme permettant de lier des programmes
Java avec des méthodes natives, écrites dans un autre
langage et dépendants des systèmes.

Le désassembleur de classe javap :


Un programme permettant de désassembler les
fichiers compilés en prenant en paramètre les fichiers
.class et de produire un texte en clair de la classe afin
d’examiner le ByteCode.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-8 Outils fournis par le JDK (3/4
3/4))

Le débogueur Java JDB


JDB::
Un programme permettant de faciliter la mise au point des
programmes grâce à de nombreuses options permettant de
surveiller leur exécution.
POO : Java

Il est beaucoup plus facile à utiliser lorsqu’il est intégré à un


IDE « Integrated Developpement Environnement »

Les librairies de classe standard :


Classes pour réaliser les entrées sorties.
Classes pour réaliser des applications réseau.

Le jfc :
Exemples des nouveaux composants swing de l’interface
utilisateur.
Si vous voulez en avoir un catalogue complet, exécuter le programme
SwingSet2.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-8 J2RE (Java 2 Runtime Environment)

Contient tout ce qui est nécessaire pour diffuser vos


applications.
En cas d’une application devant être diffusée au public
POO : Java

sur un CD-ROM, vous ne pouvez pas supposer que


chaque utilisateur sera équipé d’une JVM.
Il est nécessaire d’accompagner chaque application d’une
machine virtuelle .

C’est à cette fin que Sun MicroSystems met à la disposition de


tous, gratuitement le J2RE. Celui-ci contient tous les éléments
nécessaires pour faire fonctionner une application Java, par
opposition au J2SDK, qui contient tout ce qui est nécessaire
pour développer une application.
Le J2RE peut être diffusé librement sans payer aucun droit à
Sun Microsystems.
Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-9 Ecrire une application Java en ligne de
commandes
Pré requis
Un éditeur de texte
http://java.sun.com/j2se/1.4.1/download.hl
POO : Java

Etapes :
Ecrire le code source du programme
PremierProgramme.java dans un fichier portant le
nom de la classe.

Respecter la casse des caractères


(majuscules/minuscules).

Compiler le code source: javac


PremierProgramme.java.

Un fichier PremierProgramme.class contenant du


ByteCode sera généré.
Tarak CHAARI
Exécuter le ByteCode : java PremierProgramm.
‹N
‹N°
°›
1- C’est quoi Java
1-10 Ecrire une application Java avec un IDE (1/4
1/4))

Pré requis
ECLIPSE : www.eclipse.org
POO : Java

Etapes :
Créer un projet.
File  new Project
Java  Java Project
Next  ‘’Test ‘’

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-10 Ecrire une application Java avec un IDE (2/4
2/4))

Etapes (suite
suite)) :
Créer une classe.
File  new Class
POO : Java

Source folder  ‘’Test’’

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-10 Ecrire une application Java avec un IDE (3/4
3/4))

Etapes (suite
suite)) :
Insérer l’instruction « System.out.println("Ca Marche"); »
dans le corps de la méthode main.
POO : Java

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-10 Ecrire une application Java avec un IDE (4/4
4/4))

Etapes (suite
suite)) :
Compiler le code source.
POO : Java

Exécuter le ByteCode

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-11 Point faible de Java

Pas aussi rapide qu’un programme natif.


natif.
POO : Java

Gourmand en mémoire.
mémoire.

Absence dans le langage des types paramétriques


(Templates)..
(Templates)

Java, est actuellement, un langage propriétaire (Sun)

Tarak CHAARI
‹N
‹N°
°›
1- C’est quoi Java
1-12 Références

Sites Web :

Site officiel Java (JDK et doc.) :


POO : Java

http://www.javasun.com.
Info sur Java :
http://www.javaworld.com.
Applications, applets, packages, ...
http//www.gamelan.com.
Java pour linux :
http://www.blackdown.com.

Tarak CHAARI
‹N
‹N°
°›
Chapitre
POO : Java

2
Les bases du langage

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.1 Les commentaires (1/4
(1/4))

Tout programme (grand ou petit, simple ou complexe)


contient (ou devrait contenir) des commentaires.
commentaires.
POO : Java

Ils ont pour but d'expliquer :


Ce qu'est sensé faire le programme,
Les conventions adoptées,
Tout autre information rendant le programme lisible à
soi même et surtout à autrui.

Java dispose de trois types de commentaires :


Les commentaires multilignes,
Les commentaires lignes,
Les commentaires de type documentation.
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.1 Les commentaires (2/4
(2/4))

Commentaires en lignes
POO : Java

Les commentaires lignes débutent avec les symboles


``
``//
//''
'' et qui se terminent à la fin de la ligne.
ligne.

// Ce programme imprime la chaîne


// de caractères " bonjour " à l'écran
...

Ils sont utilisés pour des commentaires courts qui


tiennent sur une ligne.
ligne.

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.1 Les commentaires (3/4
(3/4))

Commentaires multilingues :
POO : Java

Un commentaire multiligne commence par les


caractères ``/*''
``/*'' et se terminent par ``
``*/
*/''
''..

/* Ce programme imprime la chaîne


de caractères "bonjour" à l'écran
*/

A l'intérieur de ces délimiteurs toute suite de


caractères est valide (sauf évidemment ``
``*/
*/'')
'')..

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.1 Les commentaires (4/4
(4/4))

Commentaires de types documentation :

Ces commentaires, appelés aussi commentaires javadoc


javadoc,,
servent à documenter les classes que l'on définit.
définit.
POO : Java

Ces commentaires sont encadrés entre ``


``/**
/**''
'' et ``
``*/
*/''
'' .

/** Documentation de la classe .


*/

Java exige que ces commentaires figurent avant la définition


de la classe, d'un membre de la classe ou d'un constructeur.
constructeur.

Ces commentaires servirons à produire automatiquement


(avec l'outil javadoc
javadoc)) la documentation sous forme HTML à
l'image de la documentation officielle de SUN
SUN..

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.3 Les types de données élémentaires

Le langage Java est un langage fortement typé :

Chaque variable et chaque expression possède un


type bien défini.
POO : Java

Le choix d’un type est en fonction de l'étendu de


valeur souhaitée pour vos variables.

Les types de données de Java sont divisés en deux grands


groupes :

Les types primitifs (ou de base)


Exemple : Les types numériques, le type booléen, Le type
caractère.

Les types références.


Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.4 Les types primitifs numériques ((1/2
1/2))

Les types numériques entiers


byte short int long
POO : Java

Taille en bits 8 16 32 64
Etendue -128 -32768
.. .. -231 .. 231-1 -263 .. 263-1
127 32767

Le bit y est utilisé pour décrire les tailles.


Un bit ne peut prendre que deux valeurs (0 ou 1).
n bits ne peuvent définir que 2n valeurs.
Un octet ou byte en anglais = 8 bits.
Un octet peut donc contenir 28 (soit 256) valeurs
distinctes.

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.4 Les types primitifs numériques ((2/2
2/2))

Les types numériques flottants


POO : Java

De même que pour les types numériques, il existe deux types


pour les nombres flottants :
float,
double.

la seule différence résidant dans la taille utilisée pour stocker


une valeur de ce type.

float double
Taille en bits 32 64
Exemple de 3.25f 3.25
valeur

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.5 Le type primitif booléen

Ce type est introduit en Java par le mot clé booléen.

Ce type est un vrai type booléen


POO : Java

il accepte seulement deux états :


l'un est nommé true :
Symbolise un état d'acceptation,
l'autre, nommé false,
Symbolise un état de réfutation.

Attention, contrairement au langage C, le type booléen en


Java n'est pas un sous-type numérique :
En C par exemple, la valeur 0 est considérée comme
fausse et les autres valeurs entières comme vraies.
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.6 Le type primitif caractère

Ce type, introduit par le mot clé char, et permet la gestion


des caractères.
POO : Java

Java utilise le codage de caractères universel Unicode qui


est un extension du codage ASCII.

Le codage ASCII utilise 8 bits et permet de représenter


seulement 128 caractères.

Le codage Unicode permet la portabilité du code produit.


Il utilise 16 bits pour représenter un caractère.
65536 caractères possibles.
Codage des caractères d’alphabets Cyrillique, Hébreux, Arabe,
Tarak CHAARI Chinois, Grec, ...
‹N
‹N°
°›
2- Les bases du langage
2.7 Les types références

Tout type non primitif, est un type de référence.


POO : Java

Le rôle d’un type de référence est de référencer ou repérer


une zone mémoire.

Un type de référence a un rôle analogue à celui des


pointeurs du langage C .

Plus de détails plus loin …

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.8 Déclaration et initialisation des variables

Syntaxe :
Type identificateur [= constante ou expression];
int NbredeMois = 12 ; int NbredeMois = 4*3 ;
POO : Java

int nbrDeDoigts = 012 ; // on octal =10 en décimal


int annee = 0x7d4; //on hexadécimal = 2004 en décimal.
boolean Unboolean = false ;
float Unfloatant = 1.3f ;
float Unfloatant = 5.2e+2f //520
double Undouble = 1.3 ; float
char Uncaractère = 'c' ; char Uncaractère = ‘\n' ;
String Unstring= " bonjour \n " ;

Et éventuellement, un « modificateur d’accès ou de


visibilité » : final float pi=3.14159

Tarak CHAARI String n'est pas un type primitif, mais une classe
‹N
‹N°
°›
2- Les bases du langage
2.9-- Les opérateurs
2.9

Les opérateurs dans Java sont regroupés par :


type d’opérations :
d’affectation
POO : Java

numérique,
de comparaison,
logique,
sur les chaînes de caractères,
de manipulations binaires.

le nombre d’opérandes :
unaire,
binaire,
ternaire.
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.10-- Opérateurs unaires
2.10

Opérateurs Action Exemple


unaires
- négation i=-j
POO : Java

++ incrémentation de 1 i=j++ ou i=++j


-- décrémentation de 1 i=j-- ou i=--j

++ et -- peuvent préfixer ou postfixer la variable.


i = j++ : post-incrémentation
La valeur en cours de j est affectée à i et ensuite la valeur de j
est incrémentée de 1.
i = ++ j : pré-incrémentation
La valeur en cours de j est incrémentée de 1 et ensuite la valeur
de j est affectée à i.
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.11-- Opérateurs binaires
2.11

Opérateurs Action Exemple Syntaxe


binaires équivalente
+ addition i = j+k;
POO : Java

+= i += 2; i= i + 2
- soustraction i = j - k;
-= i -= j; i= i - j
* multiplication x=2*y;
*= x *=x; x= x * x
/ division i =j/k;
/= (tronque si les x /= 10; x= x /10
arguments sont entiers)
% modulo i = j %k;
%= i %=2 i= i %2
>> décalage vers la droite i>>k; i*2k
<< décalage vers la gauche i<<k; i/2k (si i>0)
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.12-- Opérateurs relationnels
2.12

Le résultat d'une comparaison est une valeur booléenne


(vrai ou faux).
POO : Java

Dans le langage Java, le résultat d'une comparaison est


true ou false.

Opérateurs Action Exemple


relationnels
< plus petit que x<i;
> plus grand que i>100;
<= plus petit ou égal que j<=k;
>= plus grand ou égal que c>=‘a’;
== égal à i==20;
!= différent de c!=‘z’;
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.13-- Opérateurs logiques
2.13

Opérateurs Action Exemple Syntaxe


logiques équivalent
! négation !p;
POO : Java

& ET p & (i<10)


| OU p|q
^ OU exclusif p ^ false
&& ET évalué p && q && r
|| OU évalué p || q || r
!= négation assignée p!=p;
&= ET assigné p&=q p= p & q
|= OU assigné p|=q p= p | q

Dans le cas d’un opérateur logique évalué, l’évaluation de


l’expression logique est stoppée dès que sa valeur de
Tarak CHAARI
vérité peut être assurée.
‹N
‹N°
°›
2- Les bases du langage
2.14-- Opérateurs ternaire
2.14

Un unique opérateur ternaire.

Cette expression est une sorte de si-alors-sinon sous


POO : Java

forme d'expression :

a = (condition e) ? x : y
si la condition e est vraie alors a vaut x sinon elle vaut y.

Exemple : a = (v==2) ? 1 : 0;
Cette expression affecte à la variable a la valeur 1 si v vaut 2,
sinon affecte à la variable a la valeur 0.

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : if

Syntaxe :
if (expression booléene ) instruction ;
POO : Java

Exemple : Résultat d’affichage


public class ifApplication1 {

public static void main(String[ ] args)


{
int i = 4 ;
if ( i %0 != 0 ) System.out.print (" i est impair ");
}
}

Attention : L'expression logique attendue est


obligatoirement de type boolean.
si l'on écrit if ( i = 1 ), le compilateur détectera une erreur, car
Tarak CHAARI le type de l'expression logique est alors int.
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : if - else

Syntaxe Exemple
if (expression booléenne ) public class if_elseApplication {
{
instruction 1 ;
POO : Java

public static void main(String[ ] args)


…… {
instruction i ; int i = 4 ;
}
if (i % 2 == 0 )
else {
{ System.out.println (" i est pair " );
instruction j ; }
…… else
instruction n ; {
}
System.out.println (" i est impair " );
}
Résultat d’affichage }
}
i est pair

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : if – else - if

Syntaxe Exemple
if (expression booléene 1) public class if_else_ifApplication {
{
instruction 1 ; public static void main(String[ ] args)
POO : Java

…… {
instruction i ; int i = 1, j =2 ;
} if (i == j )
else if (expression booléene 2 ) {
{ System.out.println (" i est égal à j " );
instruction j; }
…… else if ( i>j)
instruction m ; {
} System.out.println (" i est supérieur à j" );
else }
{ else
instruction m+1 ; {
…… System.out.println (" i est inférieur à j " );
}
} Résultat d’affichage
}
i est positive }
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : switch

Syntaxe Exemple
switch (variable) public class switchApplication {
{
POO : Java

public static void main(String[ ] args)


case valeur 1 : {
int i = 1,
instr1_1; instr1_2; …
switch (i)
break; { case 0 :
... System.out.println (" 0 " );
case valeur N : case 1 :
break;
instrN_1; instrN_2; System.out.println (" 1 " );
break; break;
case 2 :
default: /* optionnel */ System.out.println (" 2 " );
instrD_1; instrD_2; ... break;
break; default :
System.out.println (i);
} }
break;
Résultat d’affichage
}
1 }
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : for

Exemple :
public class forApplication {
POO : Java

public static void main(String[ ] args)


{
int somme = 0;
for ( int compteur = 1, max = 4 ; compteur < max ; compteur++)
{
somme = somme + compteur;
}
System.out.println (somme );
} Résultat d’affichage
}
6
Fonctionnement :
initialisation du compteur,
comparaison avec max,
réalisation des instructions,
Tarak CHAARI
Incrémentation du compteur et on recommence.
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : while

Exemple :

public class whileApplication {


POO : Java

public static void main(String[ ] args)


{
int compteur =1; int max = 4 ; int somme = 0;

while (compteur < max )


{
somme = somme + compteur ;
compteur++;
}

System.out.println (somme );
}
Résultat d’affichage
}
6

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : do - while

Exemple :
public class do_WhileApplication {
POO : Java

public static void main(String[ ] args)


{
int compteur =1; int max = 4 ; int somme = 0;

do
{
somme = somme + compteur ;
compteur++;
}
while (compteur < max ) ;

System.out.println (somme );
}
Résultat d’affichage
}
6

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : break

Utilisation :
Pour sortir d’une structure de boucle avant que la
condition du test soit remplie.
POO : Java

Quand la boucle rencontre une instruction break, elle se


termine immédiatement en ignorant le code restant.
Résultat d’affichage
public class breakApplication {
0
public static void main(String[ ] args) 1
{ 2
int compteur =0; 3
4
while (compteur < 10 )
{
System.out.println (compteur );
compteur++;
if (compteur == 5) break;
}
}
Tarak CHAARI }
‹N
‹N°
°›
2- Les bases du langage
2.15 structures de contrôle : continue

Utilisation :
Pour ignorer le reste de la boucle et reprendre
l’exécution à l’itération suivante de la boucle.
POO : Java

public class continueApplication {

public static void main(String[ ] args)


{
int compteur =0;
for(compteur=0 ; compteur< 6 ; compteur++ )
{
if (compteur == 4) continue; Résultat d’affichage
System.out.println (compteur ); 0
} 1
} 2
} 3
5
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (1/8
(1/8))

Il y a 2 catégories de conversions possibles :

Conversions explicites :
POO : Java

celles faites sur une demande explicite par un programmeur.

Conversions implicites :
celles faites automatiquement par un compilateur :
lors d'une affectation,
lors d'une promotion arithmétique,
lors d'un passage de paramètres (lors de l'invocation d'une
méthode),

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (2/8
(2/8))

Conversion explicite :
Objectif :
POO : Java

changer le type d'une donnée si besoin.

Comment ? :
Préfixer l’opérande par le type choisi.
Encadrer le type choisi par des parenthèses.

Exemple :
double d = 2.5 ;
long l = (long) d ;

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (3/8
(3/8))

Conversion implicite lors d'une affectation :


Objectif :
changer automatiquement le type d'une donnée si besoin.
POO : Java

Comment ? :
Exemple 1 :
Contrairement à ce qui se passe dans C, les conversions
pouvant provoquer une perte de valeur ne sont pas
autorisées de manière implicite dans C : cela doit être
explicitement demandé.
Exemple 2 :
Un type char peut être utilisé partout où une valeur de
type int est permise.
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (4/8
(4/8))

Conversion implicite lors d'une affectation :


Illustration pour l’exemple 1:
public class ProgrammeAffectation {
POO : Java

public static void main(String[ ] args)


{
int i;
short j = 2 ;
i = j; Conversion implicite

float k= 1.2 f ;
i = k; Erreur de compilation
}
}
Solution :

i = (int) k;
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (5/8
(5/8))

Conversion implicite lors d'une affectation :


Illustration pou l’exemple 2:
POO : Java

public class ProgrammeSoustraction {

public static void main(String[ ] args)


{
int i;
i = ‘A’; Conversion implicite

System.out.print( i ) ;
}
}

Résultat d’affichage : 65

Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (6/8
(6/8))

Conversion implicite lors d'une promotion arithmétique :


Objectif :
Si un opérateur s'applique sur deux arguments de type
POO : Java

différent un des deux arguments sera converti dans le type de


l'autre.
Exemple :
public class ProgrammeSoustraction {

public static void main(String[ ] args)


{
int i;
i = ‘A’-1; Conversion implicite

System.out.print( i ) ;
}
}
Tarak CHAARI
Résultat d’affichage : 64
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (7/8
(7/8))

Conversion implicite lors d'un passage de paramètres


(lors de l'invocation d'une méthode) :
POO : Java

public class ProgrammeSoustraction {

static short entierShort;

static void Afficher( int entier )


{
System.out.print( entier ) ;
}

public static void main(String[ ] args)


{
entierShort = 2 ;
Afficher(entierShort ) ; Invocation de la
} méthode Afficher
}
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.16 Les conversions des types (8/8
(8/8))

Attention :
Il n'y a pas de conversion possible (implicite ou
explicite) entre un type entier et le type boolean :
POO : Java

int i = 0;

If ( i ) // Erreur à la compilation
{
………..
}

If ( i != 0 ) // Ok
{
………..
}
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.17 Les tableaux (1/2
(1/2))

Déclaration
monodimensionnel
int[ ] tableau_Entier;
POO : Java

équivalent à : int tableau_Entier[ ];


multidimensionnel
Color rgb_cube[ ][ ][ ];

Création et initialisation
int[] primes = {1, 2, 3, 5, 7};
int[] tableau_Entier = new int[50];
rgb_cube = new int[256][256][256];
tableau_Entier[0]= 3;
Tarak CHAARI
‹N
‹N°
°›
2- Les bases du langage
2.17 Les tableaux (1/2
(1/2))

Pour les tableaux dont le type de données est primitif


chaque élément est initialisé à une valeur par défaut.
Pour les tableaux dont les éléments sont des objets
POO : Java

chaque élément est initialisé à null.

Les indices des tableaux commencent par 0.


Exemple d’utilisation des tableaux :
public class tabeauApplication {

public static void main(String[ ] args)


{
int[ ] tableau_Entier = new int[50]; // création
System.out.println(tableau_Entier.length);
tableau_Entier[51]=10;
}
} Résultat d’affichage
50
Tarak CHAARI java.lang.ArrayIndexOutOfBoundsException: 51
‹N
‹N°
°›
Chapitre
POO : Java

3
Le Concept Objet de Java

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.1 Les bienfaits de l'abstraction

L'abstraction dans l’approche objet permet la


représentation des entités du monde réel sous forme
d’entités informatiques de la manière la plus naturelle.
POO : Java

Etablir une association entre le modèle du problème à


résoudre et le modèle de la machine :

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.1 Les bienfaits de l'abstraction (1/2
(1/2))

L’abstraction est une représentation des éléments du


monde réel « objets réels » dans l'espace du problème (la
machine) en tant qu'« objets informatiques».
POO : Java

décrire le problème avec les termes mêmes du


problème plutôt qu'avec les termes de la machine.
un programme traitant des images doit manipuler des
structures de données représentant des images, et non leur
traduction sous forme de suite de 0 et de 1.
un programme de gestion de personnel doit représenter des
personnes avec toutes les informations pertinentes, qu’il
s’agisse de texte, de date, de nombres ou autre.

L'idée est d’adapter le programme à l'esprit du problème


réel en ajoutant de nouveaux types « objets ».
Quand on lit le code décrivant la solution, on lit aussi
Tarak CHAARI quelque chose qui décrit le problème.
‹N
‹N°
°›
3- Le Concept Objet de Java
3.1 Les bienfaits de l'abstraction (2/2
(2/2))

La complexité des problèmes et la capacité à les résoudre


sont directement proportionnelles au type et à la qualité
de nos capacités d'abstraction.
POO : Java

Un Objet :
plusieurs niveaux d ’abstraction :
de point de vue concepteur un micro-ordinateur est un
objet formé d’un ensemble d’éléments physiques appelés
matériels (hardware).

de point de vue informaticien un micro-ordinateur est un


objet résultant d’un assemblage hardware et d’un
ensemble de programmes appelé logiciels (software).

de point de vue utilisateur, un micro-ordinateur est une


boite noire qui offre un certain nombre de fonctions ou de
services qui permettent d’interagir avec elle.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (1/6
(1/6))

Un objet est semblable à une variable améliorée :


elle stocke des données qui décrivent son « état »;
mais qui possède aussi un ensemble de fonctions ou
POO : Java

méthodes « comportement », pour répondre aux «


requêtes » des utilisateurs.

L’ensemble des services (méthodes) proposées par un


objet est appelé l’interface de cet objet.

Un objet est encapsulé par son interface :


la seule manière d’interagir (demander un service)
avec cet objet est d’invoquer une des méthodes de
son interface.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (2/6
(2/6))

Exemple 1 :
Un poste de Télévision
moderne est une boite
POO : Java

ayant pour interface :


un écran, des haut-
parleurs et une
télécommande.

Pour changer de chaîne il


suffit de demander à
cette boite noire de le
faire pour nous, en
appuyant simplement Principe d’Objet
sur le bouton
correspondant. Peu
importe ce qui se passe
réellement dans le poste.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (3/6
(3/6))

Exemple 2 : Objet Rectangle R1

R1 est un objet
Rectangle de hauteur
POO : Java

10 de largeur 20, ayant


une interface qui
permet de:
calculer le périmètre du
rectangle,
sa surface,
Le diagonale Objet R1 Identité

et un dernier service pour dessiner le rectangle.

Pour utiliser l’un de ces services, il suffit d’invoquer la


Tarak CHAARI
méthode correspondante.
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (4/6
(4/6))

Un objet représente informatiquement une entité précise


du monde à modéliser, exemple : ma_voiture.
POO : Java

Il existe généralement de nombreux objets représentant le


même concept « voiture », exemple :présidence_voiture

Il est intéressant de définir le concept (classe voiture),


puis de créer autant de représentants que voulu basés
Tarak CHAARI sur ce concept.
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (5/6
(5/6))

Une classe est un moule pour fabriquer des objets de


même structure et de même comportement.
En programmation, une classe apparaît donc comme
POO : Java

un nouveau type construit par l’utilisateur.


Le nom d’une classe peut être utilisé en Java comme le type
d’un attribut ou d’une variable ou aussi comme le type de
retour d’une fonction (méthode).

Le processus de création d’un objet à partir d’une


classe est appelé en jargon objet instanciation d’un
objet ou création d’instance d’une classe .
Exemple :
String s1 = "Hello " ;
String est le nom de la classe, la variable s1 est un objet
instancié ou instance de la classe String.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.2 Approche Objet (6/6
(6/6))

Un objet :
est un élément d’une classe;
a une durée de vie et une identité.
POO : Java

L’identité d'un objet (Oid) :


Une constante : R1, R2
Unique et indépendante de la valeur des propriétés de l'objet;
Tarak CHAARI
invisible à l’utilisateur.
‹N
‹N°
°›
3- Le Concept Objet de Java
3.3 Attribut de classe, attribut d’instance

Les données membres d’une classe sont appelées dans le


jargon informatiques attribut.

Java distingues deux types d’attributs :


POO : Java

Attribut d’instance dont la valeur peut varier d’une


instance à une autre, exemple :
La valeur de l’attribut « Couleur » de la classe « Voiture »
varie d’une instance à une autre.

classe : cercle
rayon : donnée d’instance
pi : donnée de classe

Attribut de classe dont la valeur est commune pour


toutes les instances, exemple :
La valeur « pi » dans la classe « Cercle » est la même 3.14 pour
Tarak CHAARI
chaque instance de la classe.
‹N
‹N°
°›
3- Le Concept Objet de Java
3.4 Encapsulation (1/2
(1/2))

L’encapsulation d’un objet par son interface permet de


masquer son contenu :
POO : Java

i.e montrer uniquement ce qui est nécessaire pour son


utilisation :
Les données sont généralement considérées comme données
privées. Elles ne sont donc pas accessibles directement.
Les méthodes constituent l’interface d’interaction avec un objet
d’une classe. Elles sont donc accessibles (publiques).
Un objet n'est accessible qu’à travers l’interface de sa classe ;

Java propose plusieurs niveaux de visibilité (modificateur


d’accès) utilisables sur les données d'une classe pour
assurer le principe de l’encapsulation.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
2/2))
3.4 Encapsulation ((2/2

Pour respecter ce principe d'encapsulation on ne doit


interagir avec un objet que par l’invocation d’une de ces
méthodes de son interface.
POO : Java

On dit à l’objet ce qu’il doit faire, sans se préoccuper de


Tarak CHAARI
comment il doit le faire. ‹N
‹N°
°›
3- Le Concept Objet de Java
3.5 Héritage (1/2
(1/2))

L'héritage est l’un des grands intérêts des langages


orientés objet :
pouvoir définir des dépendances entres classes en factorisant les
POO : Java

propriétés communes à plusieurs classes :


ordonner hiérarchiquement les classes d’une application,
réaliser des programmes parfaitement modulaires,
disposer de modules réutilisatsables.
Exemple :
Une classe Cheval étant définie.
On peut définir une classe Zèbre est un cheval en précisant
seulement qu’un zèbre est un cheval qui possède des
rayures.

Une instance de zèbre contient les informations d’une instance de


cheval auxquelles on ajoute les informations propres d’un zèbre.
Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.5 Héritage (2/2
(2/2))

Les deux classes Personne et Forme sont appelées classes


de base
POO : Java

Les classes Ouvrier, Etudiant et Chercheur héritent


toutes les trois de la classe Personne.

Les classes Cercle, Rectangle et Triangle sont appelées


des classes dérivées de la classe Forme.

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.6 Polymorphisme

Le polymorphisme est la possibilité pour deux classes


séparées, mais dépendantes l’une de l’autre, de recevoir le
même message mais d’agir dessus de différentes façons.
POO : Java

En d’autres termes, c’est la faculté d’une méthode


héritée à pouvoir s’appliquer à des classes dérivées.

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.7 Pourquoi utiliser l’approche Objet ? (1/2
(1/2))

La motivation essentielle de cette approche est


d'augmenter les possibilités de réutilisation :
L'encapsulation des données et du code dans une
POO : Java

même entité permet de garantir la cohérence des


objets.
Cette cohérence est indispensable pour envisager de réutiliser
un objet dans un autre contexte.

La notion d'encapsulation par une interface permet de


normaliser le fonctionnement des objets :
Il est possible de changer le fonctionnement interne
d'un objet particulier, sans modifier la manière de
l'utiliser (c'est à dire le reste du programme)

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.7 Pourquoi utiliser l’approche Objet ? (2/2
(2/2))

La notion d'héritage permet de réutiliser ce qui a déjà été


défini lors de la conception d'un objet pour en créer de
nouveaux.
POO : Java

La notion de polymorphisme permet de manipuler de


manière identique et la plus naturelle possible des objets
ayant des comportements totalement différents :

des comportements qui ne sont pas obligatoirement


connus au moment où l'on définit ces manipulations :

Vouloir afficher un rectangle, un cercle ou un triangle, on est


toujours dans le même espace de problème, qui est afficher
une forme géométrique. C’est la manière d’afficher chaque
forme qui est différente.

Tarak CHAARI
‹N
‹N°
°›
3- Le Concept Objet de Java
3.8 Apports de l’approche Objet

L'amélioration de la qualité et de la productivité des


logiciels.
La modularité qui permet de :
POO : Java

décomposer un problème en modules élémentaires


faciles à écrire, à maintenir et à étendre,
créer des modules complexes par composition de
modules simples.
L'extensibilité :
les logiciels objets : ensemble de modules
incrémentalement extensibles;
L'uniformité des différents niveaux de représentation des
données.

résolution du problème de la Faille sémantique


Tarak CHAARI ("Semantic gap ").
‹N
‹N°
°›
3- Le Concept Objet de Java
3.3 Approche Procédurale vs approche Objet

Approche procédurale :
Opérations et données
sont séparées.
POO : Java

Les actions sont


décomposées de
manière hiérarchique

obj2
Approche Objet :
obj1 Pas de séparation des
données et des actions.
chaque objet peut
invoquer une méthode
d’un autre objet qui
coopère en répondant à
Tarak CHAARI cette demande.
obj3 ‹N
‹N°
°›
Chapitre
POO : Java

4
Classes et Objets en Java

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.1 Classe en Java (1/3
1/3))

Les classes constituent le concept de base de la


programmation objet.

Elles permettent de définir des nouveaux types de


POO : Java

données qui doivent se comporter comme des types pré


définis et dont les détails d'implantation sont cachés aux
utilisateurs de ces classes.

Une définition de classe est introduite par le mot clé


class.

Une classe définit généralement deux choses :


les données associées aux objets de la classe appelés
champs ou attributs de la classe,
les services interactifs que peuvent rendre les objets
de cette classe, qui sont les méthodes définies dans la
Tarak CHAARI
classe.
‹N
‹N°
°›
4- Classes et Objet en Java
4.1 Classe en Java (2/3
2/3))

Syntaxe générale d’une classe

modificateur_visibilité class nom_Class {


POO : Java

modificateur_visibilité data-type attribut1 ;


modificateur_visibilité data-type attribut2 ;
...
é data-type attributN ;
modificateur_visibilité

modificateur_visibilité Return-type nom_Method1( paramètres)


{// instructions ; }
...
modificateur_visibilité Return-type nom_Method2( paramètres)
{// instructions ; }
}

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.1 Classe en Java (3/3
3/3))

Exemple de classe :

Fichier " Date.java "


POO : Java

class Date {
private int j; // jour
private int m; // mois
private int a; // an

void initialise(int jour, int mois, int an)


{ j=jour; m=mois; a=an; }

void affiche( )
{ System.out.println(j + "/" + m + "/" + a) ; }
}

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.2 Modificateurs de visibilité (1/3
(1/3))

Valable pour un attribut ou une méthode :

« public » :
POO : Java

accessible à partir d’une instance par n’importe quelle classe.

« private »:
accessible uniquement par les méthodes de la classe.

« protected »:
accessible par la classe et ses classes dérivées.

« static »:
donnée ou méthode de classe et non pas d’instance.
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.2 Modificateurs de visibilité (1/3
(1/3))

« final » :
Une classe définie comme final ne peut pas être dérivée (on ne
peut pas créer une nouvelle classe héritant de cette classe).
POO : Java

Une méthode déclarée final ne peut pas être redéfinie dans


une classe dérivée.

Un attribut défini comme final, permet de spécifier que cet


attribut est une constante (sa valeur ne pourra jamais être
modifiée).

Un attribut final doit obligatoirement être initialisé lors de sa


déclaration (puisqu'on ne peut pas le modifier après cela ) !

rien :
Par défaut public.
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.2 Modificateurs de visibilité (2/3
(2/3))

NB1 :
static cumulable avec d’autres modificateurs.
POO : Java

NB2 :
Un attribut ou une méthode de classe est appelée à
travers la classe et non pas par l’instance.

NB3 :
Un paquetage (package) est un regroupement
thématique de classes.

NB4 :
sans modificateur de visibilité, un attribut ou une
méthode est appelée amie.
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.2 Modificateurs de visibilité (3/3
(3/3))

Fichier " Machin.java "


class Machin {
private int x;
POO : Java

public int y;
final int entier =2;
Machin ( ) { …. }; // constructeur
void modifx(int value) { x=value;}
static void truc( ) { … }; // méthode de classe
……..
Machin m= new Machin( ); // création d’une instance de Machin.
m.y = 5; // OK y est publique
m.x = 6; // ERREURE x est privée
m.entier =4; // ERREURE entier est une constante.
m.modifx(6); // OK x est modifiée par la méthode modifx.
m.truc(); // Warning truc est une méthode static.
Machin.truc( ); // OK appel d’une méthode de classe.
}
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.3 Constructeur d’une classe (1/2
(1/2))

Un constructeur est une méthode spéciale d’initialisation


d’un objet :
un constructeur n'a pas de type de retour, et se
POO : Java

nomme toujours de la même manière que sa classe


Une classe peut avoir plusieurs constructeurs qui
diffèrent par le nombre et la nature de leurs
paramètres (principe de surcharge).

Utilité d’un constructeur :


un constructeur est une méthode spéciale appelée à la
création d’un objet pour initialiser cet objet.
surcharger les constructeurs pour une même classe ce
qui permet d’initialiser les objets de diverses
manières.

NB. La surcharge peut être appliquée pour n’importe


Tarak CHAARI
quelle méthode et pas seulement pour les constructeurs.
‹N
‹N°
°›
4- Classes et Objet en Java
4.3 Constructeur d’une classe (2/2
(2/2))

Exemple de classe :

Fichier " Date.java "


POO : Java

class Date {
private int j; // jour
private int m; // mois
private int a; // an
void initialise(int jour, int mois, int an)
{ j=jour; m=mois; a=an; }
Date( ) // constructeur sans paramètres
{ j=1 ; m=1 ; a=1900 ; }
Date(int jour, int mois, int an) // constructeur avec paramètres
{ j=jour ; m=mois ; a=an ; }
void affiche( )
{ System.out.println(j + "/" + m + "/" + a) ; }
}
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.4 Appels de constructeur

Exemples 1:
Le constructeur sans arguments initialise la date d à
1/9/1900.
POO : Java

// création d’une date d


(1/1/1900)
Date d1 = new Date() ;
Exemples 2:
Le constructeur Date à 3 arguments permet
d’initialiser une date avec des valeurs quelconques.

// création d’une date d2


(1/6/2004)
Date d2 = new Date(1,6,2004) ;
Attention :
Si aucun constructeur n'est spécifié dans la définition
de la classe, un constructeur par défaut vous est
Tarak CHAARI
obligatoirement fourni, celui-ci n'admettant aucun
paramètre. ‹N
‹N°
°›
4- Classes et Objet en Java
4.5 L’attribut caché : this (1/3
1/3))

Le mot-clé this représente une référence sur l'objet


courant.
celui qui est en train d'exécuter la méthode dans
POO : Java

laquelle se trouvent les instructions concernées.

this peut être utile :


Pour déclencher un constructeur depuis un autre
constructeur.
this peut servir à lever des ambiguïtés entre des
noms d’attributs et des noms d’arguments de
méthodes
Lorsqu'une variable locale (ou un paramètre) "cache", en
portant le même nom, un attribut de la classe.

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.5 L’attribut caché : this (2/3
2/3))

Exemple d’utilisation de this pour lever des ambiguïtés.


Fichier " Date.java "
class Date {
POO : Java

private int j; // jour


private int m; // mois
private int a; // an
void initialise(int jour, int mois, int an)
{ j=jour; m=mois; a=an; }
Date( ) // constructeur sans paramètres
{ j=1 ; m=1 ; a=1900 ; }
Date(int j, int m, int a) // constructeur avec paramètres
{ this.j = j ; this.m = m ; this.a = a ; }
void affiche( )
{ System.out.println(j + "/" + m + "/" + a) ; }
}
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.5 L’attribut caché : this (3/3
3/3))

Exemple d’utilisation de this pour déclancher un


constructeur depuis un autre constructeur.
Fichier " Date.java "
POO : Java

class Date {
private int j; // jour
private int m; // mois
private int a; // an
void initialise(int jour, int mois, int an)
{ j=jour; m=mois; a=an; }

Date( ) Date( )
{ j=1 ; m=1 ; a=1900 ; } { this(1 ,1 ,1900); }

Date(int j, int m, int a) // constructeur avec paramètres


{ this.j = j ; this.m = m ; this.a = a ; }
void affiche( )
{ System.out.println(j + "/" + m + "/" + a) ; }
}
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.6 Un programme Java complet (1/2
(1/2))

Fichier " Date.java "


class Date {
private int j; // jour
private int m; // mois
POO : Java

private int a; // an
// les constructeurs de la classe
Date( ) { j=1 ; m=1 ; a=1900 ; }
Date(int j, int m, int a) { this.j = j ; this.m = m ; this.a = a ; }
// les méthodes de la classe
void affiche( ) { System.out.println(j + "/" + m + "/" + a) ; }
void initialise(int jour, int mois, int an) { j=jour; m=mois; a=an; }

public static void main(String[ ] args)


{
Date d = new Date(1,6,1997);
Date d2= new Date( );
d2.affiche( );
d.initialise(2,6,1997);
d.affiche( );
Tarak CHAARI
}
} ‹N
‹N°
°›
4- Classes et Objet en Java
4.6 Un programme Java complet (2/2
(2/2))

public static void main(String args[])


La méthode main est le point d'entrée du programme
et elle est nécessairement public, static et void :
POO : Java

public : car elle est appelée de l’extérieur de la classe par la


JVM.
static : car elle n’a pas besoin d'un objet pour être invoquée.
Elle est appelée par le JVM avant toute création d’instance
(elle est une méthode de classe).
void : car elle ne renvoie pas de valeur.
Elle a comme argument un tableau de String ce qui lui permet
de récupérer des paramètres introduits sur la ligne de
commande (comme en C++).
la commande java Date jour mois année lance l’exécution
de la classe Date avec comme paramètres jour mois année .
La méthode main de la classe date peut récupérer ainsi les
chaînes jour mois année dans args[0], args[1] et args[2].
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.7 Création d’instances de classes (1/3
(1/3))

Les instances des classes (objets) sont


systématiquement manipulées à l’aide d’une référence
(pointeur sur la zone mémoire représentant l’objet).
POO : Java

la création d’une variable instance d’une classe nécessite


deux opérations :
1- la création d’une référence qui ne pointe sur rien:

Date d1;
Date d2;

2- la réservation de la place mémoire à l’aide de


l’opérateur new et l’affectation de la donnée.

d1 = new Date( ); // le constructeur initialise la date d1 à 1/1/1900.

d2 = new Date (11, 011, 2001) ; // le constructeur initialise la date d2 à 11/9/2001.


Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.7 Création d’instances de classes (2/3
(2/3))

Schéma d’implantation en mémoire :


POO : Java

Date d1;
d1 1 2 1998 d1 = new Date(1,2,1998);

Date d2;

d2 d2 = d1;

1 1 1900 Date d3 = new Date( );


d3

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.7 Création d’instances de classes (3/3
(3/3))

Schéma de libération de mémoire :

Date d1;
POO : Java

d1 1 2 1998 d1 = new Date(1,2,1998);

Date d2;
11 9 2001
d2 d2 = d1;

1 1 1900 Date d3 = new Date( );


d3

d1 = null ;

d2=new Date(11,9,2001);

Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.8 Destruction d'un objet (1/5
(1/5))

La plupart des langages orientés objet possèdent une


méthode nommée destructeur, appelée pour détruire un
objet.
POO : Java

La destruction d’un objet consiste à libérer les ressources


qui lui ont été déjà affectées par le constructeur .
Un objet est détruit lorsqu’il ne référence aucune zone
mémoire.
En Java, la destruction des objets est prise en charge par
un mécanisme automatique appelé ramasse- miettes
(garbage collector GC).

Le GC fonctionne en arrière plan pendant l'exécution d'un


programme Java. il est géré dans une thread de faible
priorité.
difficile de savoir à quel moment le GC détruira
Tarak CHAARI
réellement votre objet. ‹N
‹N°
°›
4- Classes et Objet en Java
4.8 Destruction d'un objet (2/5
(2/5))

La récupération de mémoire peut être aussi invoquée


explicitement pas le programmeur à des moments bien
précis avec la commande System.gc().
POO : Java

Certaines situations nécessitent un nettoyage spécial que


le GC ne peut pas effectuer :
Par exemple, certains fichiers ont été ouverts pendant
la durée de vie de l’objet et vous voulez vérifier qu’ils
sont correctement fermés quand l’objet est détruit.

Pour cela, une autre méthode spéciale, appelée finalize(),


peut être définie.

Cette méthode (si elle est présente) est appelée par le GC


lorsque l'objet est détruit pour assurer ce type de
nettoyage spécial.
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.8 Destruction d'un objet (3/5
(3/5))

Fichier " Date.java "


class Date { Résultat d’affichage
private int j; //1/6/1997
jour
POO : Java

private int m; //Nettoyage


mois spécial
private int a; // an
void initialise(int jour, int mois, int an) { j=jour; m=mois; a=an; }
Date( ) { j=1 ; m=1 ; a=1900 ; }
Date(int j, int m, int a) { this.j = j ; this.m = m ; this.a = a ; }

void affiche( ) { System.out.println(j + "/" + m + "/" + a) ; }


public void finalize() { System.out.println("Nettoyage spécial" ); }
public static void main(String[ ] args)
{
Date d = new Date(1,6,1997);
d.affiche( );
d =null; // d ne désigne plus rien, il ne possède plus de référence.
// Elle n'est plus accessible. A tout moment le GC peut détruire l'objet.
System.gc( ); // appel implicite du GC
Tarak CHAARI
}
‹N
‹N°
°›
4- Classes et Objet en Java
4.8 Destruction d'un objet (4/5
(4/5))

Fichier " Date.java "


class Date { Résultat d’affichage
private int j; //1/6/1997
jour
POO : Java

private int m; // mois


private int a; // an
void initialise(int jour, int mois, int an) { j=jour; m=mois; a=an; }
Date( ) { j=1 ; m=1 ; a=1900 ; }
Date(int j, int m, int a) { this.j = j ; this.m = m ; this.a = a ; }

void affiche( ) { System.out.println(j + "/" + m + "/" + a) ; }


protected void finalize() { System.out.println("Nettoyage spécial" ); }
public static void main(String[ ] args)
{
Date d = new Date(1,6,1997);
d.affiche( );
Date d2=d;
d =null; // d ne désigne plus rien, il n’y plus de référence
System.gc( ); // appel implicite du GC
Tarak CHAARI }
‹N
‹N°
°›
4- Classes et Objet en Java
4.8 Destruction d'un objet (5/5
(5/5))

Fichier " Date.java "


class Date { Résultat d’affichage
private int j; // jour
POO : Java

1/6/1997
private int m; // mois
private int a; Nettoyage
// an spécial
void initialise(int jour, int mois, int an) { j=jour; m=mois; a=an; }
Date( ) { j=1 ; m=1 ; a=1900 ; }
Date(int j, int m, int a) { this.j = j ; this.m = m ; this.a = a ; }

void affiche( ) { System.out.println(j + "/" + m + "/" + a) ; }


protected void finalize() { System.out.println("Nettoyage spécial" ); }
public static void main(String[ ] args)
{
Date d = new Date(1,6,1997);
d.affiche( );
Date d2=d;
d =null; d2=null;
Tarak CHAARI System.gc( ); // appel implicite du GC
} ‹N
‹N°
°›
4- Classes et Objet en Java
4.9 Comparaison d’instances

Utilisation de ‘==‘ :
Il n’y a égalité que si d1 et d2 désignent la même
zone mémoire représentant une date.
POO : Java

Date d1 = new Date(1,2,2000) ;


Date d2 = new Date(1,2,2000) ;
if(d1 == d2) . . . . // il n’y a pas égalité

Date d1 = new Date(1,2,2000) ;


Date d2 = d1 ;
if(d1 == d2) . . . . // il y a égalité

Pour comparer deux objets, il faut utiliser la méthode


‘equals‘ :
Date d1 = new Date(1,2,2000) ;
Date d2 = new Date(1,2,2000) ;
Tarak CHAARI if(d1.equals(d2)). . . .// il y a égalité si « equals » est définie.
‹N
‹N°
°›
4- Classes et Objet en Java
4.10 Accès aux membres (1/2
(1/2))

Les membres sont accessibles via une instance de la


classe ou via la classe (pour les membres statiques).
On distingues 4 types d’accès aux membres d’une
POO : Java

classe :

On accède à un attribut d’une instance.


On invoque la méthode d’une instance.
On accède à un attribut statique d’une classe
On invoque une méthode statique d’une classe.

L'accessibilité des membres est pondérée par des


modificateurs de visibilité (public, private, ...)
Tarak CHAARI
‹N
‹N°
°›
4- Classes et Objet en Java
4.10 Accès aux membres (2/2
(2/2))

Exemple :
class Circle( )
{
public double x, y; // Coordonnée du centre
POO : Java

private double r; // rayon du cercle


public Circle(double r)
{
this.r = r; // On accède à l'attribut 'r' de l'instance en cours
}
public Circle( )
{
this.Circle(2.0); // On invoque la méthode Circle (constructeur) de l’instance courante.
}
private double pi()
{
return Math.PI; On accède à l'attribut statique 'PI' de la classe 'Math‘
}
public double area()
{
return pi * Math.sqrt(r); On invoque la méthode ' sqrt ' statistique de la classe ‘Math’
}
Tarak CHAARI }
‹N
‹N°
°›
4- Classes et Objet en Java
4.11 Modes de passage

Le mode de passage des paramètres dans les méthodes dépend


de la nature des paramètres :
par référence pour les objets,
par copie pour les types primitifs.
POO : Java

Fichier " Test.java "


class Test Résultat d’affichage
{
public string s; La valeur de i = 0
public int i; La valeur de s= Bonjour tout le monde
Test() { }; // constructeur
void modifier(int value, StringBuffer chaine2)
{ value++ ; chaine2.append(" tout le monde"); }
public static void main(String[ ] args)
{
Test t = new Test();
int a=0; StringBuffer chaine1= new StringBuffer ("Bonjour" );
t.modifier(a, chaine1);
System.out.println(" La valeur de i="+a);
Tarak CHAARI System.out.println(" La valeur de s="+chaine1);
} ‹N
‹N°
°›
4- Classes et Objet en Java
4.12 Les opérateurs sur les références

Les seuls opérateurs sur les références sont des


opérateurs logiques :

== : permet de tester si deux références


POO : Java

désignent le même objet.

!= : permet de tester si deux références ne


désignent pas le même objet.

equals: permet de comparer le contenu de deux


références.

instanceof: permet de tester si l'objet référencé est


une instance d'une classe donnée ou d'une de ses
sous-classes
if ( d1 instanceof Date ) {
… Traitement
Tarak CHAARI
}
‹N
‹N°
°›
Chapitre
POO : Java

5
Programmation Orientée
Objet Avancée Java

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.1 Composition de classes (1/4
(1/4))

Principe :
La réutilisation par composition :
Quand une classe est testée et elle est opérationnelle on peut
POO : Java

l’utiliser aussi en tant que nouveau type dans une autre classe.
Les données d’une classe peuvent être des instances
d’autres classes.

Class Date Classe String


{
…..
Classe Date
}

class Personne
{ Classe Personne
private String nom;
private String prénom;
private Date naissance;
Tarak CHAARI
…..
}
‹N
‹N°
°›
5- POO Avancée Java
5.1 Composition de classes (2/4
(2/4))

Classe Date :

class Date {
POO : Java

private int j; // jour


private int m; // mois
private int a; // an
void initialise(int jour, int mois, int an)
{ j=jour; m=mois; a=an; }

Date( )
{ j=1 ; m=1 ; a=1900 ; }

Date(int j, int m, int a)


{ this.j = j ; this.m = m ; this.a = a ; }
void affiche( )
{ System.out.println(j + "/" + m + "/" + a) ; }
}
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.1 Composition de classes (3/4
(3/4))

Classe Personne :

class Personne {
POO : Java

private String nom;


private String prénom;
private Date naissance;
Personne(String nom, String prénom, int jour, int mois, int an)
{
this.nom=nom;
this.cépage=prénom;
naissance=new Date(jours,mois,an);
}
void affiche()
{
System.out.println("Identité Personne : ");
System.out.println(nom+ " " +prénom);
naissance.affiche();
}
}
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.1 Composition de classes (4/4
(4/4))

Classe ApplicationPersonne :
ApplicationPersonne est une classe de lancement.
Elle sert d’enveloppe à la méthode main qui sert de «
POO : Java

programme principal ».
Résultat d’affichage
Identité Personne :
Jacques DUPONT
1/2/1947
class ApplicationPersonne {
public static void main(String args[ ])
{
Personne p = new Personne("Jacques", "DUPONT", 1,2,1947);
p.affiche();
}
}
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (1/14
(1/14))

Principe : Réutilisation par extension:


Une classe représentant un concept voisin d’une classe existante
n’a pas besoin d’être définie à partir de rien.
POO : Java

définition d’une classe comme extension d’une autre.


spécification des modifications seulement.
La deuxième classe hérite de la première.
classe initiale = classe mère ou de base.
deuxième classe = classe dérivée (héritière) de la première.
Classe Zèbre

Classe Cheval Classe Cheval


Données Données
+ +
méthodes méthodes
rayures
+
Tarak CHAARI ……
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (2/14
(2/14))

Intérêt :
L'héritage supprime, en grande partie, les
redondances dans le code.
POO : Java

Une fois la hiérarchie de classes bien établie, on peut


localiser en un point unique les sections de code
(celles-ci restantes à tous moments accessibles grâce
au mot clé super).

Si la hiérarchie des classes est bien pensée, on peut


très facilement rajouter une classe, dans la mesure où
on peut réutiliser le code des classes parentes.

Si vous n'aviez pas encore modélisé un comportement


dans une classe donnée, et que vous vouliez
maintenant le rajouter, une fois l'opération terminée,
ce comportement sera alors directement utilisable
Tarak CHAARI
dans l'ensemble des sous-classes de celle considérée.
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage ((3/14
3/14))

En Java, une classe ne peut hériter que d'une seule classe.


Syntaxe :
POO : Java

class Héritière extends mère { ... }

Les classes dérivent, par défaut, de java.lang.Object.

Une référence d'une classe C peut contenir des instances


de C ou des classes dérivées de C.

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (4/14
(4/14))

L'opérateur instanceOf permet de déterminer la classe


POO : Java

d'une instance.

Une sous-classe peut re-définir une ou plusieurs des


méthodes dont elle hérite.

Il est possible d’interdire qu’une méthode soit re-définie


dans une sous-classe en utilisant final.

Il est possible d’interdire qu’une classe puisse être héritée


en utilisant final.

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage ((5/14
5/14))

Exemple :
Une classe mère « Compteur », qui permet de créer
POO : Java

des compteurs classiques.


Dispose de méthodes d’incrémentation et de décrémentation.

class Compteur {
private int valeur ;
Compteur() { valeur = 0 ; }
void inc( ) {valeur ++ ; }
void dec( ) {valeur --; }
int vaut() { return valeur ; }
}

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (6/14
(6/14))

Exemple :
Une classe dérivée « Contrôle_Compteur » de la
classe mère « compteur » qui permet de créer des
POO : Java

compteurs capables de contrôler l’incrémentation des


compteurs classiques.

class Compteur_Controle extends Compteur


{
private int maxval;
Compteur_Controle(int maxval)
{
super();
this.maxval = maxval;
}
void inc()
{
if( vaut( ) < maxval ) super.inc( );
}
int get_maxval( ) { return maxval; }
Tarak CHAARI
}
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (7/14
(7/14))

Exemple :
TestControle_Compteur, une classe de lancement.
POO : Java

class TestControle_Compteur {
{
public static void main(String args[])
{ Compteur_Controle c = new Compteur_Controle(6);
c.inc( ); // Première incrémentation
c.inc( ); // Deuxième Incrémentation
System.out.println("valeur : "+c.vaut( ) );
c.dec( ); // Première décrémentation
c.dec( ); // Deuxième décrémentation
System.out.println("valeur : "+c.vaut( ) );
}
}
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (8/14
(8/14))

Utilisation de « super() » :

Compteur_Controle(int maxval)
POO : Java

{
super( );
this.maxval = maxval;
}

Le constructeur de Compteur_Controle appelle le


constructeur de la classe Compteur à l’aide de la
fonction super().
L’appel du constructeur de la classe mère doit être la
première instruction du constructeur de la classe
dérivée.
super() représente un appel au constructeur de la
Tarak CHAARI classe mère.
‹N
‹N°
°›
5- POO Avancée Java
9/14))
5.2 Héritage ((9/14

Utilisation de « super » et masquage des données :


void inc()
{
POO : Java

if( vaut( ) < maxval ) super.inc( );


}

Une partie du traitement de la méthode inc() de


Compteur_Controle peut être effectuée par la
méthode inc() de Compteur, c’est pourquoi inc() de
Compteur_Controle appelle inc() de Compteur en
utilisant super.inc().

super désigne l’instance en cours de la classe mère.


La méthode inc() de la classe Compteur_Controle,
masque (remplace) la méthode inc() héritée de la
classe Compteur.
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
10/14))
5.2 Héritage ((10/14

Utilisation de « super » et masquage des données :

class A class B extends A


{ int x; {
POO : Java

int y;
void m( ) {...} } void m( ) {...}
}

Class C extends B
{ int a;
……..
a = super.y; // a reçoit la valeur de la variable y de la classe B
a = super.super.x; // erreur syntaxique
a = ((B) this).y; // a reçoit la valeur de la variable y de la classe B
a = ((A) this).x; // a reçoit la valeur de la variable x de la classe A
super.m( ); // Appel à la méthode m de la classe B
}

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (11/14
(11/14))

Accès à des attributs privés de la classe mère :


class Compteur {
private int valeur ;
POO : Java

} ……

classCompteur_Controle
class Compteur_Controleextends
extends Compteur
Compteur
{{
……..
……..
voidinc()
void inc()
{{
if( valeur) << maxval
if(vaut( maxval )) super.inc(
super.inc( ););
}}
}}

L’attribut « valeur » est déclaré private.

seules les méthodes de la classe Compteur ont accès


à l’attribut « valeur ».

Tarak CHAARI
nécessité d’utiliser la fonction d’accès publique vaut().
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (12/14
(12/14))

Accès à des attributs privés de la classe mère :


class Compteur {
protected int valeur ;
POO : Java

} ……

class Compteur_Controle extends Compteur


{
……
void inc()
{
if( valeur < maxval ) super.inc( );
}
}

L’attribut « valeur » est déclaré protected.

L’attribut « valeur » est hérité par la classe


Compteur_Controle et il est donc accessible par cette
Tarak CHAARI classe.
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (13/14
(13/14))

Héritage et conversion : utilisation de « instanceof »

Compteur c1 = new Compteur( );


POO : Java

Compteur_Controle c2 = new Compteur_Controle(1000);

int maximum = c1. get_maxval( ) ; // Erreur


System.out.println((c1 instanceof Compteur_Controle)); // false
System.out.println((c1 instanceof Compteur)); // true
System.out.println((c2 instanceof Compteur_Controle)); // true
System.out.println((c2 instanceof Compteur )); // true

c1 = c2;
System.out.println((c1 instanceOf Compteur_Controle)); // true
System.out.println((c1 instanceOf Compteur)); // true

Tarak CHAARI
c2 = c1; // Erreur
‹N
‹N°
°›
5- POO Avancée Java
5.2 Héritage (14/14
(14/14))

Classe, et méthode finale :


une méthode déclarée final ne peut pas être redéfinie
dans une classe dérivée.
POO : Java

class Base class Dérivée extends Base


{ {
final void f() void f( ) // Erreur
{- - - } {- - - }
---- ----
} }

une classe déclarée final ne peut pas avoir de classes


dérivées
final class Base class Dérivée extends Base
{ {
---- ----
Tarak CHAARI
} }
‹N
‹N°
°›
5- POO Avancée Java
5.3 Les paquetages (package) (1/4
(1/4))

Regroupement de classes
les paquetages permettent de regrouper un ensemble
de classes portant sur un même thème (classes
POO : Java

d’entrées sorties, classes réseau, classes


géométriques).
Un paquetage contient des classes et des paquetages
ce qui permet de constituer une arborescence de
paquetages.
Les paquetages permettent une manipulation aisée
des groupes de classes, une limitation des espaces de
noms et un niveau de protection.

Constitution d’un paquetage


dans un fichier xxx.java la déclaration package truc au
début du texte source indique au compilateur que les
Tarak CHAARI classes contenues dans le fichier doivent être rangées
dans le paquetage truc. ‹N
‹N°
°›
5- POO Avancée Java
5.3 Les paquetages (package) (2/4
(2/4))

Nom d’un paquetage :


Les paquetages étant organisés en arborescences, la
désignation d’un paquetage s’effectue en donnant le
POO : Java

chemin sous la forme pointée.


bidule.machin.truc désigne le paquetage truc situé
dans le paquetage machin, lui même situé dans le
paquetage bidule.
Accès aux éléments d’un paquetage :
Une classe appartenant à un paquetage a un accès à
chaque élément du paquetage.
Une classe peut faire référence à une classe d’un autre
paquetage en donnant le chemin complet des
paquetages jusqu’à elle.

Tarak CHAARI paqu1.paqu2.classe1 c1 ;


‹N
‹N°
°›
5- POO Avancée Java
5.3 Les paquetages (package) (3/4
(3/4))

Importation des paquetages :


Une classe peut importer une classe d’un autre
paquetage en donnant seulement le nom de la classe
POO : Java

et le chemin d’accès à l’aide de la déclaration import


au début du fichier xxx.java.

// import de la classe classe1 du paquetage machin.truc

import machin.truc.classe1 ;

// import de toutes les classes du paquetage machin.truc

import machin.truc.* ;

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.3 Les paquetages (package) (4/4
(4/4))

Les paquetages standard :


Java.lang : contient Object, class, classloader, les
classes adaptatrices, system, runtime, String,
POO : Java

StrinBuffer, etc.

java.util : contient des structures de données (vector,


stack, hashtable, Enumeration, etc.) et des classes
comme random, date.

java.io : contient des classes pour E/S sur disque avec


filtrages divers.

java.net : contient des classes réseau (URL, sockets,


etc.).

java.awt : contient les classes pour interfaces


Tarak CHAARI graphiques.
‹N
‹N°
°›
5- POO Avancée Java
1/4))
5.4 Paquetages et protection des données ((1/4

Situations possibles des différentes classes :


POO : Java

Les classes Fille1, Fille2 et Fille3 héritent de la classe


mère.
La classe Fille3 se trouve dans un paquetage différent
Tarak CHAARI de celui des classes Fille1 et Fille2.
‹N
‹N°
°›
5- POO Avancée Java
5.4 Paquetages et protection des données (2/4
(2/4))

Attributs ou méthodes public :


POO : Java

Les attributs et méthodes public sont accessibles par


toutes instances de toutes les classes.
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.4 Paquetages et protection des données (3/4
(3/4))

Attributs ou méthodes protected :


POO : Java

Les attributs et méthodes protected d’une instance


d’une classe sont accessibles par les instances des
Tarak CHAARI classes du même paquetage et par les classes
dérivées. ‹N
‹N°
°›
5- POO Avancée Java
5.4 Paquetages et protection des données (4/4
(4/4))

Attributs ou méthodes private :


POO : Java

Les attributs et les méthodes private d’une instance


de la classe Mère ne sont accessibles que par une
Tarak CHAARI instance de la classe Mère
‹N
‹N°
°›
5- POO Avancée Java
5.5 Les classes abstraites (1/2
(1/2))

Une classe abstraite sert à mettre en facteur des attributs


et des méthodes pour des classes dérivées concrètes.

Une classe abstraite est introduite par le mot clé


POO : Java

« abstract » et elle a au moins une méthode abstraite.

Une méthode abstraite est déclarée par le mot clé abstract,


elle n’a pas de corps.

Une classe abstraite ne peut pas être instanciée (new).

Si une classe dérivée d’une classe abstraite ne redéfinit pas


toutes les méthodes abstraites alors elle est abstraite.

Pour utiliser une classe abstraite on doit définir une classe


héritière qui fournit les réalisations des méthodes
abstraites de la classe abstraite.
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.5 Les classes abstraites (2/2
(2/2))

Exemple :

class abstract Shape


{
POO : Java

public abstract double perimeter();


}

class Circle extends Shape


{
...
public double perimeter() { return 2 * Math.PI * r ; }
}

class Rectangle extends Shape


{ ...
public double perimeter() { return 2 * (height + width); }
}

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.6 Polymorphisme

Exemple :
Shape[ ] shapes = { new Circle(2),
new Rectangle(2,3),
POO : Java

……..
};

double sum_of_perimeters = 0;

for (int i = 0; i < shapes.length; i++)

sum_of_perimeters += shapes[i].perimeter( );

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (1/13
(1/13))

Principe de l’héritage multiple :


La classe Lion hérite de la classe Carnivore et Animal.
Une instance de Lion contient donc les attributs et les
POO : Java

méthodes de la classe Carnivore, les attributs et les


méthodes de la classe Animal, et enfin les attributs et
les méthodes spécifiques concernant un Lion.

Classe Lion
Carnivore Animal
Classe Animal

Classe Carnivore

Lion
+
……

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (2/13
(2/13))

Problème de l’héritage multiple en diamant :


Un attribut de la classe Personne apparaît en double
dans la classe Enseignant-Chercheur.
POO : Java

Si une méthode de la classe Personne est redéfinie


dans la classe Enseignant et dans la classe Chercheur,
laquelle est utilisée dans la classe Enseignant-
Chercheur ?

Enseignan
t

Enseignant-
chercheur
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (3/13
(3/13))

Principe de l’interface :
Une interface est introduite par le mot clé «interface»,
et se comporte comme une classe dont toutes les
POO : Java

méthodes sont abstract et dont tous les attributs sont


final.

Les mots clés final et abstract n’apparaissent pas dans


la définition d’une interface.

Une interface est un moyen de préciser les services


qu'une classe peut rendre. C’est un modèle
d'implémentation.

Une interface est inutilisable en elle-même.

Une classe doit implémenter l’interface, c’est à dire


définir les corps des méthodes abstraites de l’interface.
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces ((4/13
4/13))

Une interface est utilisée lorsque nous avons seulement


besoin de savoir que telle ou telle classe possède telles
méthodes et se comporte de telle manière, exemple :
POO : Java

On peut imaginer une interface appareilElectrique qui


définit les méthodes estEnclenche() et
alimente(boolean).

Si une classe implémente l'interface appareilElectrique,


on sait donc qu'elle possède au moins ces deux
méthodes, qu'il s'agisse d'une radio, d'une lampe ou
d'un autre appareil.

Lorsque l'on désire indiquer à un appareil qu'il est


alimenté, on exécute app.alimente(true), et pour lui
indiquer qu'il a été débranché, on exécute
app.alimente(false).
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (5/13
(5/13))

Exemple d’interface :
Appareil_Electrique
POO : Java

public interface Appareil_Electrique


{
/** teste si l'appareil est enclenche */
public boolean estEnclenche( );

/** on appelle cette methode lorsque l'on branche l'appareil


dans une source de courant active, avec true, ou false si la
source est inactive */
public void alimente(boolean alim);

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (6/13
(6/13))

Exemple d’utilisation de l’interface Appareil_Elctrique.


classe Radio.
POO : Java

class Radio implements Appareil_Electrique


{
final static int freqMiseEnRoute = 1007; // 100.7 MHz int freq;
boolean allumee = false;
public boolean estEnclenche() { return allumee; }

public void alimente(boolean a)


{
allumee = a;
if (allumee) freq = freqMiseEnRoute;
}
public boolean changeFreq(int freq)
{
if (allumee == true) { this.freq = freq; return allumee; }
return false;
Tarak CHAARI }
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (7/13
(7/13))

Le mot clé « implements » indique que la classe Radio doit


forcément donner une définition précise pour les méthodes
spécifiées dans l’interface.
POO : Java

Une classe peut implémenter plusieurs interfaces.


Elle doit dans ce cas fournir des définitions pour toutes
les méthodes spécifiées dans l’interface.

interface Truc interface class Machin implements Truc, Bidule


{ Bidule {
void e( ); { void e( ) {- - -; }
void f( ); void f( ) {- - -; }
} }
}

Plusieurs classes différentes peuvent implémenter de


manières différentes une même interface.

Tarak CHAARI
Plusieurs réalisations possibles d’une même
spécification (polymorphisme). ‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (8/13
(8/13))

Héritage multiple :
Le problème de l’héritage
en diamant peut être résolu
POO : Java

à l’aide des interfaces :


Une classe peut hériter d’une Enseignan
t
classe et implémenter
plusieurs interfaces.
Enseignant-
chercheur

interface Personne{- - -}
interface Chercheur extends Personne {- - -}
class Enseignant implements Personne {- - -}
class Enseignant-Chercheur extends Enseignant implements Chercheur {…}
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (9/13
(9/13))

Héritage multiple : Personne


Les attributs de Personne ne
POO : Java

sont pas redéfinis dans


Enseignant ni Chercheur
Enseignant Chercheur
Ils sont déclarés final.

Les méthodes de Personne Enseignant-chercheur


sont implémentées dans
Enseignant, voir redéfinies
dans Enseignant_Chercheur,
mais ne peuvent pas être classe
implémentées par Chercheur
qui est une interface. interface

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
5.7 Héritage multiple et les Interfaces (10/13
(10/13))

Les interfaces peuvent hériter de plusieurs autres


interfaces :
POO : Java

interface X {- - - -}
interface Y {- - - -}
interface Z extends X,Y {…}

Il n’y a pas de risque de duplication des attributs de X


et de Y dans Z:
Les attributs sont final donc non héritables.

Et pour les méthodes ?

Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
11/13))
5.7 Héritage multiple et les Interfaces ((11/13

Conflit de nom avec les interface X


interfaces : {
void f( int i);
POO : Java

Si les méthodes f situées


}
dans les interfaces X et Y
interface Y
ont des paramètres
{
différents et n’importe void f(char c );
comme type de retour. }

class Z implements X,Y


La classe Z aura deux
{
implémentations de la void f(int i ) {….}
méthode f qui correspond aux void f(char c) {…};
deux versions distinguées par }
Tarak CHAARI
les paramètres.
‹N
‹N°
°›
5- POO Avancée Java
12/13))
5.7 Héritage multiple et les Interfaces ((12/13

Conflit de nom avec les interface X


interfaces : {
void f( );
POO : Java

Si les méthodes f situées }

dans les interfaces X et Y interface Y


ont les mêmes paramètres {
void f( );
et le même type de retour.
}

La classe Z aura une class Z implements X,Y


{
implémentation de f void f( ) {……….};
correspondant aux deux }
spécifications identiques.
Tarak CHAARI
‹N
‹N°
°›
5- POO Avancée Java
13/13))
5.7 Héritage multiple et les Interfaces ((13/13

Conflit de nom avec les interface X


interfaces : {
void f(int i );
POO : Java

Si les méthodes f situées }

dans les interfaces X et Y interface Y


ont les mêmes paramètres {
int f(int i );
et des types de retour
}
différents.

la classe Z ne peut pas class Z implements X,Y


{
implémenter les deux ????????
}
interfaces.
Tarak CHAARI
‹N
‹N°
°›
Chapitre
POO : Java

6
Les classes de base

Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.1 Classe Object ((1/2
1/2))

La classe Object est la classe mère de toutes les classes.


Elle contient 2 méthodes que la plupart des classes
Java doivent redéfinir :
POO : Java

String toString() : qui retourne une description de l'objet.

boolean equals(Object) : qui permet de tester l'égalité


sémantique de deux objets.

Une méthode Class (non pas d’instance) getClass() qui peut être
utilisée sur tout objet pour déterminer sa nature
nom de la classe,
nom de ses ancêtres,
structure.
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.1 Classe Object (2/2
(2/2))

Exemple de manipulation de la classe Object :

Utilisation des méthodes toString, equals et getClass


POO : Java

class Personne // dérive de Object par défautRésultat d’affichage


{
Classe : Personne Objet : Jean Dupond
private String nom ;
public Personne(String nom) { this.nom = nom ; }
public String toString() { return "Classe:" + getClass().getName() + "Objet :" + nom ;}
boolean equals(Personne p) { return p.nom.equals(this.nom) ; } }

Exemple d’utilisation
Personne p1 = new Personne("Jean Dupond") ;
Personne p2 = new Personne("Jean Dupond") ;
System.out.println( p1.toString( ) ) ;
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.2 Les classes Wrapper (1/2
(1/2))

Les classes Wrapper sont des classes qui permettent de


représenter les types de base sous forme d'objets :
Boolean
POO : Java

pour représenter les types de base boolean.


Integer
pour représenter les types de base int.
Float
pour représenter les types de base float.
Double
pour représenter les types de base double.
Long
pour représenter les types de base long.
Character
Tarak CHAARI
pour représenter les types de base char.
‹N
‹N°
°›
6- Les classes de bases
2/2))
6.2 Les classes Wrapper ((2/2

Les classes Wrapper permettent en particulier de


récupérer les valeurs minimum et maximum du type de
base correspondant.
POO : Java

double f;
if (f> Integer.MIN_VALUE && f < Integer.MAX_VALUE); int i = (int) f;

Les conversions entre types de base et chaînes de


caractères sont possibles via des objets Wrapper :
Conversion d’une chaîne de caractère vers un entier :
Integer.parseInt(String s) ;
Integer(String s)).intValue( ) ;
Integer.valueOf(String s).intValue( ) ;
Conversion d’un entier en chaîne de caractère :
Integer(int i).toString( ) ;
String.valueOf(int i) ;
Tarak CHAARI "" + i ;
‹N
‹N°
°›
6- Les classes de bases
6.3 Les chaînes de caractères non modifiables (1/2
(1/2))

La classe String :
La classe String décrit des objets qui contiennent une
chaîne de caractères constante (cette chaîne ne peut
POO : Java

pas être modifiée).


s
String s ;
Voici une chaîne
s = "voici une chaîne";
Voici une autre chaîne
s = "voici une autre chaîne";

C'est aussi la seule classe qui dispose d'opérateurs


supplémentaires : + et += pour la concaténation de
chaînes de caractères.
int nombre = 3 ;
String message = "Mon nombre est " + 3 ;
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.3 Les chaînes de caractères non modifiables (2/2
(2/2))

Classe java.lang.String :
Description des méthodes utilisées :
int length( )
POO : Java

Retourne le nombre de caractères compris dans la chaîne.


int indexOf(char c, int i)
Retourne la position du caractère c en partant de la position
i
String substring(int i, int j)
Retourne une chaîne extraite de la chaîne sur laquelle est
appliquée cette méthode, en partant de la position i à la
position j
boolean equals(String s)
comparaison sémantique des chaînes.
String toLowerCase( ), String toUpperCase( )
Tarak CHAARI majuscule vers minuscule, minuscule vers majuscule.
‹N
‹N°
°›
6- Les classes de bases
6.4 Les chaînes de caractères modifiables (1/3
(1/3))

Classe java.lang.StringBuffer :

Un objet de la classe StringBuffer se caractérise par


deux tailles, qui sont retournées par les méthodes :
POO : Java

int length( ) : qui retourne le nombre exacte de caractères du


contenu de la chaîne de caractères.
int capacity( ) : qui retourne la taille actuelle du tableau
interne

Quelques méthodes supplémentaires:


StringBuffer append(p) : ajoute p en fin de chaîne (p est
n'importe quel type de base)
StringBuffer insert(int offset, p) : idem, mais en insérant p à
l'emplacement indiqué par offset.
StringBuffer reverse( ) : inversion des caractères de la chaîne.
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.4 Les chaînes de caractères modifiables (2/3
(2/3))

Exemple 1:
StringBuffer s = new StringBuffer("Bonjour");
s.append(" tout le monde");
POO : Java

System.out.println("s : "+s);
System.out.println("length : "+s.length());
System.out.println("capacity : "+s.capacity());
Résultats :
s : Bonjour tout le monde
length : 21
capacity : 23

Exemple 2 :
s.insert(2,"hop");
System.out.println("s : "+s);
Résultat :
Tarak CHAARI
Bohopnjour tout le monde
‹N
‹N°
°›
6- Les classes de bases
6.4 Les chaînes de caractères modifiables (3/3
(3/3))

Classe java.util.StringTokenizer :

Cette classe permet de construire des objets qui


savent découper des chaînes de caractères en sous-
POO : Java

chaînes.
Lors de la construction du StringTokenizer, il faut
préciser la chaîne à découper et, le ou les caractères
qui doivent être utilisés pour découper cette chaîne :

void AfficheParMots(String texte)


{
StringTokenizer st = new StringTokenizer(texte, ",:") ;
while( st.hasMoreTokens() )
{
String mot = st.nextToken() ;
System.out.print(mot + " ") ;
}
Résultat d’affichage
}
Tarak CHAARI
Lundi Mardi Mercredi;Jeudi
‹N
‹N°
°›
6- Les classes de bases
6.5 Classe Vector (1/5
(1/5))

Les objets de la classe Vector représentent des tableaux à


taille variable, c.à.d. il n'y a pas de limite au nombre
d'objets qu'il peut contenir :
POO : Java

Object elementAt(int index):


retourne (sans retirer) l'élément à la position index.

void insertElementAt(Object obj,int pos):


place l'objet obj à la position pos indiquée (remplacement)

boolean contains(Object obj):


retourne true si obj est dans le tableau.

int indexOf(Object obj):


retourne la position de obj (-1 si obj n'est pas présent)

int size() :
Tarak CHAARI retourne la taille du tableau
‹N
‹N°
°›
6- Les classes de bases
6.5 Classe Vector (2/5
(2/5))

Présentation :
Classe située dans package java.util
Vector permet de réaliser des listes d’éléments
POO : Java

quelconques pourvu qu’ils héritent de la classe Object.

Exemple d’utilisation 1:
import java.util.* ;
Vector v = new Vector() ;
v.addElement(″1″);
v.addElement(″2″);
v.addElement(″3″);
System.out.printl(v.toString()) ; //affichage du Vector

Résultat
[1,2,3]
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.5 Classe Vector (3/5
(3/5))

Exemple d’utilisation 2:

v.insertElementAt(″hop″,2) //insertion en 3eme position


POO : Java

System.out.printl(v.toString()) ; // affichage du Vector

Résultat
[1,2,hop,3]

v.setElementAt(″truc″,2) // changement d’un élément


System.out.printl(v.toString()) ; // affichage du Vector

Résultat

[1,2,truc,3]
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.5 Classe Vector (4/5
(4/5))

Parcours d’un Vector :


for(int i = 0 ; i< v.size( ) ;i++) // affichage du Vector
System.out.println(v.elementAt(i)) ;
POO : Java

for(Enumeration e = v.elements( ) ; e.hasMoreElements( ) ;)


System.out.println(e.nextElement( )) ;
NB :
« e » est un itérateur, c’est une instance de Enumeration qui
possède les méthodes nécessaires pour parcourir une liste.

Autres méthodes utiles


int num ;
num = v.indexOf(″elem2″) ; // indice d’un élément
v.removeElement(″elem2″) ; // retrait d’un élément
Tarak CHAARI System.out.println(v.lastElement( )) ;
‹N
‹N°
°›
6- Les classes de bases
6.5 Classe Vector ((5/5
5/5))

Conversion en sortie de Vector :

Un Vector peut contenir des Object (structure


polymorphe)
POO : Java

un élément retiré d’un Vector doit être converti au type


désiré

import java.util.* ;
class Bidule{- - - - - }
Bidule b;
Vector v = new Vector( ) ;
v.addElement(new Bidule(..)); // ajout d’un bidule
v.addElement(new Bidule(..)); // ajout d’un bidule
v.addElement(new Bidule(..)); // ajout d’un bidule

b = (Bidule) v.elementAt(1) ; // conversion en bidule


Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.6 Classe Hashtable (1/2
(1/2))

Présentation :

Création des tables contenant des doubles <clé,info>


quelconques pourvu qu’ils héritent de la classe Object
POO : Java

Opérations possibles sur tables : ajout, retrait,


recherche de l’info associée à une clé donnée, test de
présence de clé ou d’info, etc.

Exemples d’utilisation

import java.util.* ;
Hashtable t = new Hashtable() ; // création d’une Hashtable
Integer a, b, c ; // création de 3 Integer
Integer n ;
a = new Integer(1) ; b = new Integer(2) ; c = new Integer(3) ;
t.put(″un″,a) ; t.put(″deux″,b) ; t.put(″trois″,c) ;
Tarak CHAARI
‹N
‹N°
°›
6- Les classes de bases
6.6 Classe Hashtable (2/2
(2/2))

Méthodes utiles :
n = (integer) t.get(″deux″) ; // recherche de l’info associée à une clé
if(t.contains(c))..... // test présence d’une info
POO : Java

if(t.containsKey(″deux″) ).. // test présence d’une clé


t.remove(″deux″) ; // suppression d’une entrée

Parcours d’une Hashtable

affichage des infos :


for(Enumeration e = t.elements() ;e.hasMoreElements( ) ;)
System.out.println(e.nextElement( )) ;

affichage des clés :


for(Enumeration e = t.keys( ) ;e.hasMoreElements( ) ;)
Tarak CHAARI
System.out.println(e.nextElement( )) ;
‹N
‹N°
°›
Exercices
POO : Java

&

Corrigés

Tarak CHAARI
‹N
‹N°
°›

You might also like