Vous êtes sur la page 1sur 108

Programmation Orientée Objet

Java
3ème année
Brahim BAKKAS
ENSAM -Mekness
Version 1.0/23
Programmation Orientée Objet: javapour modifier le style du titre
Cliquez

Brahim BAKKAS Programmation Orientée Objet Java 2


Prérequis Cliquez pour modifier le style du titre

Fonctions et programmation modulaire


•Savoir définir une fonctions
•Appel, passage par valeurs et adresse
Les tableaux
•Déclarer un tableau
•Allocation de mémoire ( new)
Structure de données

Brahim BAKKAS Programmation Orientée Objet Java 3


Bibliographie Cliquez pour modifier le style du titre

• Livres

Brahim BAKKAS Programmation Orientée Objet Java 4


Outils Cliquez pour modifier le style du titre

Brahim BAKKAS Programmation Orientée Objet Java 5


Plan Cliquez pour modifier le style du titre

⚫Introduction à la POO
⚫Introduction au langage JAVA
⚫Bases du langage
⚫Classes et objets
⚫Héritage
⚫Héritage et polymorphisme
⚫Les indispensables : package, collections et exception
⚫Les interfaces graphiques (GUI)

6
Brahim BAKKAS Programmation Orientée Objet Java 6
INTRODUCTION
À LA POO

7
Introduction Cliquez pour modifier le style du titre

⚫Critères de qualité d’un logiciel:


⚫ La correction : Un logiciel doit exécuter exactement les tâches définies par sa spécification et
fournir exactement les résultats demandés.
⚫ Robustesse : le logiciel est capable de bien fonctionner dans des conditions anormales.

⚫ L’extensibilité : Les programmes doivent s’adapter facilement aux changements de spécification afin
d’intégrer facilement de nouvelles fonctionnalités
⚫ L’efficience : Temps d’exécution, taille mémoire, etc.

⚫ La portabilité : C’est la facilité avec laquelle on peut exploiter un même logiciel dans différentes
implémentations.
⚫ La réutilisabilité : C’est la possibilité d’utiliser certaines parties du logiciel pour résoudre un autre
problème.

8
Brahim BAKKAS Programmation Orientée Objet Java 8
Programmation Procédurale (PP)Cliquez pour modifier le style du titre

⚫Principe: Repose sur l’équation suivante :


• Programme = Structures de données + Algorithmes
⚫Dans la PP, la conception d’un programme est conduite par traitements :
➔Consiste à décomposer le programme en fonctions (modules)

simples. main()
Données

init() calcule()
Données
trie()
factorise()
6
compare() permute()
Brahim BAKKAS Programmation Orientée Objet Java 9
Programmation Orientée
CliquezObjet (POO)
pour modifier le style du titre

⚫Basée sur les données :


⚫Déterminer les données à traiter.
⚫Réaliser les fonctions qui permettent de les manipuler.

Données Données

init() calcule() trie()

factorise() compare() permute()

Brahim BAKKAS Programmation Orientée Objet Java 10


Programmation Procédurale
Cliquez pourVS POOle style du titre
modifier

⚫ Objectifs de la POO
⚫ Facilité la réutilisation de code, encapsulation et abstraction
⚫ Facilité de l’évolution du code
⚫ Améliorer la conception et la maintenance des grands systèmes
⚫ Programmation par « composants ». Conception d’un logiciel à la manière de la fabrication d’une
voiture.
⚫ Programmation Procédurale
⚫ Unité logique : le module
⚫ Une zone pour les variables
⚫ Une zone pour les fonctions
⚫ Chaque fonction résout une partie du problème
⚫ Structuration « descendante » du programme

Brahim BAKKAS Programmation Orientée Objet Java 11


Programmation Orientée
CliquezObjet (POO)
pour modifier le style du titre

OBJET = Données + Méthodes.


⚫Un objet est une association de données et de fonctions (méthodes)
qui agissent sur ces données.

⚫POO: Programmation dans laquelle un programme est organisé comme


un ensemble d'objets coopérant ensemble.

Brahim BAKKAS Programmation Orientée Objet Java 12


Les Concepts de base de la POOCliquez pour modifier le style du titre

⚫ Un Objet a :
⚫Ses propres données (attributs) qui peuvent être des données simple (entier, texte, …)
ou d’autres objets.
⚫Ses propres méthodes (fonctions membres) qui représente son comportement.
➔Ce sont les traitements qu'on peut appliquer aux données.
⚫Une identité qui permet de l'identifier parmi les autres objets.
⚫ Exemple :
▪ Marque : Renault
▪ Modèle : Megane
▪ Couleur : Noir
Moteur : Diesel; 85 Cheveaux
▪ Etat : En Marche
Démarrer() Arrêter() Peindre(NouvColor) GetEtat () …

Brahim BAKKAS Programmation Orientée Objet Java 13


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Un objet possède également une durée de vie :


➔la durée de temps entre sa création et sa destruction.
⚫On conçoit un objet comme une représentation abstraite d’un
composant du système vu par l’utilisateur.

➔Formule à retenir :

Objet= Etat (Attributs) + Comportement (Méthodes)+ Identité

Brahim BAKKAS Programmation Orientée Objet Java 14


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Les objets communiquent entre eux par des envoies de


messages.
⚫Un objet peut recevoir un message qui déclenche:
⚫une méthode qui modifie son état
et/ou
⚫une méthode qui envoie un message à un autre objet

MaVoiture Démarrer() LeMoteur

Brahim BAKKAS Programmation Orientée Objet Java 15


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Les objets qui ont les mêmes états et les mêmes


comportements sont regroupés : classe
⚫Les classes servent de « moules » pour la création des objets.
⚫Un objet est une instance (exemplaire) d’une classe.
⚫Un programme OO est constitué de classes qui permettent de
créer des objets qui s’envoient des messages.

Brahim BAKKAS Programmation Orientée Objet Java 16


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Classe :
⚫généralisation de la notion de type.
⚫décrit les caractéristiques générales d’un ensemble (famille) d’objets similaires :
➔Les objets similaires sont des instances (exemplaires) de la même classe.
⚫Possède des membres :
⚫ Attributs : les éléments données de la classe
⚫ Méthodes : fonctions qui donne accès ou modifie les attributs.
⚫Exemple :
Classe Livre
- titre Germinal
E. Zola Le seigneur des anneaux
- auteur J.R.R.Tolkien

Brahim BAKKAS Programmation Orientée Objet Java 17


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Masquage de l’information :
⚫Consiste à limiter l'accès aux données d’une classe.
⚫Normalement, les valeurs des attributs d’un objet ne sont pas
accessibles directement par un autre objet.
➔On dit que les attributs sont masqués à l’intérieur d’un objet.
➔Les attributs masqués sont dits privés.
➔Ceux qui ne sont pas masqués sont appelés attributs publiques.
➔L'accès aux attributs privés est effectué via des méthodes.

Brahim BAKKAS Programmation Orientée Objet Java 18


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫Encapsulation des données :


⚫L'encapsulation est un mécanisme consistant à rassembler les données
et les méthodes au sein d'une même classe en cachant l'implémentation
de l'objet, c'est-à-dire en empêchant l'accès aux données par un autre
moyen que les méthodes proposés.

Données

Méthodes

Brahim BAKKAS Programmation Orientée Objet Java 19


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

Accès aux attributs d'un objet :


• Syntaxe :NomObjet.Attribut
• Exemple : P est un objet de la classe Etudiant qui un attribut
Matricule de type entier
P.Matricule = 234;
⚫Accès aux méthodes d'un objet :
⚫ Syntaxe : NomObjet.Méthode(arguments)
⚫Exemple :
C est un objet de la classe Compte qui a une méthode Verser qui verse
un montant dans le compte :
C.Verser(4000); // verser 4000 dans le compte C

Brahim BAKKAS Programmation Orientée Objet Java 20


Les Concepts de base de la POO…
Cliquez pour modifier le style du titre

⚫ Stratégie de développement OO :
1. Identifier les objets et leurs attributs Exemple :
CompteBancaire
2. Identifier les opérations (Exemple: Verser, Retirer, …).
3. CompteBancaire on pourra
Établir la visibilité. Par exemple, pour un objet
avoir accès à toutes les actions (Verser, Retirer, …) mais ne pourra pas voir
l'accès directement au solde pour le modifier.
4. Établir l’interface : description de chaque opération avec ses arguments (Exemple :
boolean Verser( float M) )
5. Implanter chaque objet.

Brahim BAKKAS Programmation Orientée Objet Java 21


Présentation du langage Cliquez pour modifier le style du titre

⚫Sun définit le langage Java comme:


⚫Objet :
⚫ Inspiré du C++, Objective C et Smalltalk , Java est un langage fortement objet.
⚫Simple :
⚫ Il est toutefois allégé de toutes les sources d’erreurs du C++ (pointeurs, gestion mémoire, etc.) et
des fonctionnalités "tordues" et peu utilisées.
⚫Distribué :
⚫ Java contient un ensemble de classes permettant d'utiliser des protocoles TCP/IP tels que HTTP et
FTP. L'utilisation des URLse fait aussi "simplement" que l'ouverture de fichiers locaux.
⚫Robuste :
⚫ Le maximum de vérifications sont faites à la compilation (protection des classes,…).
⚫ Pas de gestion explicite de la mémoire (GC en thread), pas de pointeur, ..
⚫Sécurisé :
⚫ Java est très sécurisé (SecurityManager).

Brahim BAKKAS Programmation Orientée Objet Java 22


Présentation du langage... Cliquez pour modifier le style du titre

⚫Interprété :
⚫ Avantage au développement.
⚫ Mais est pour l'instant un inconvénient à l'exécution (performances).
⚫Indépendant de l'architecture :
⚫ C'est la machine virtuelle qui assure cette indépendance.
⚫Portable :
⚫ Contrairement au C/C++ Java n'est pas dépendant de l'implémentation, les types de base ont des tailles
fixes.
⚫Multithread :
⚫ C'est la possibilité d'exécuter plusieurs tâches simultanément.
⚫Dynamique :
⚫ Java a été conçu pour fonctionner dans un environnement évolutif.
⚫Compact :
⚫ L'interpréteur Java n'a besoin que de 215Ko.
⚫ Chargement dynamique des classes.

Brahim BAKKAS Programmation Orientée Objet Java 23


Le Langage JAVA Cliquez pour modifier le style du titre

⚫ Informations Générales
⚫ Conçu par Sun Microsystems (Write Once RunAnywhere)
⚫ Langage orienté objet, inspiré de C+ +
⚫ De nombreuses fonctionnalités Réseau et Internet
⚫ Langage fortement typé
⚫ Gestion du multitâche
⚫ Gestion mémoire réalisée par un Garbage Collector
⚫ Langage compilé vers du pseudo code binaire nommé "ByteCode", interprété au sein d'une
machine virtuelle (VM)
• ➔Portabilité = disponibilité de la machine virtuelle Java

Java Source Exécution

ByteCode
Compilation MachineVirtuelle
21
Brahim BAKKAS Programmation Orientée Objet Java 24
BASES DU LANGAGE
JAVA
25
Premier exemple de programme enleJava
Cliquez pour modifier style du titre

public class PremierProg {


public static void main(String[] argv) {
System.out.println("Bienvenue, mon Premier Programme Java");
}
}

⚫ public class PremierProg : Nom de la classe


⚫ public static void main : Lafonction principale équivalent à la fonction main du C/C++.
⚫ String[] argv : Permet de récupérer des arguments transmis au programme au moment de son lancement
⚫ System.out.println("Bienvenue, ...") : Méthode d'affichage dans la fenêtre console.

Brahim BAKKAS Programmation Orientée Objet Java 26


Mise en œuvre Cliquez pour modifier le style du titre

⚫Pas de séparation entre définition et codage des opérations


⚫Un seul fichier "NomDeClasse.java".
⚫Nom de la classe = Nom du fichier java
⚫Pas de fichier d’en tête comme C/ C++.
⚫Compilation
javac NomDeClasse.java
javac *.java quand plusieurs classes
⚫Génération d’un fichier Byte-Code "NomDeClasse.class"
⚫Pas d’édition de liens (seulement une vérification)
⚫Exécution
• java NomDeClasse
⚫Choisir la classe principale à exécuter

Brahim BAKKAS Programmation Orientée Objet Java 27


Types primitifs de Java Cliquez pour modifier le style du titre

⚫ Ne sont pas des objets !!!


⚫ Occupent une place fixe en mémoire réservée à la déclaration
⚫ Types primitifs :
⚫ Entiers : byte (1 octet), short (2 octets), int (4 octets) et long (8 octets).

⚫ Flottants : float (4 octets) et double (8 octets)

⚫ Booléens : boolean (true ou false)

⚫ Caractères : char (codage Unicode sur 16 bits)


⚫ Chacun des types simples possède un alter-ego objet disposant de méthodes de
conversion (à voir dans la partie Classes et Objets).
⚫ L’autoboxing introduit depuis la version 5.0 convertit de manière transparente les
types primitifs en références.

Brahim BAKKAS Programmation Orientée Objet Java 28


Initialisation et constantes Cliquez pour modifier le style du titre

⚫ Initialisation
⚫ Une variable peut recevoir une valeur au moment de sa déclaration :
int n = 15;
boolean b = true; Penser à l’initialisation au risque d’une erreur de
compilation int n;
⚫ Cette instruction joue le même rôle : System.out.println(" n = " + n);
int n;
n = 15;
boolean b;
b = true;
⚫ Constantes
⚫ Ce sont des variables dont la valeur ne peut affectée qu'une fois
⚫ Elles ne peuvent plus être modifiées
⚫ Elles sont définies avec le mot clé final
final int n = 5;
final int t;
...
t = 8;
n = 10; // erreur : n est déclaré final

Brahim BAKKAS Programmation Orientée Objet Java 29


Structure de contrôle: Choix Cliquez pour modifier le style du titre

⚫ choix simple ⚫ choix multiple


if condition { if condition {
... ...

} }else {
...
⚫ choix imbriqués }
if condition {
... ⚫ Sélection bornée
} else { Switch var{
if condition { case val0:
... case val1:
}else { case val2:
... . . .
} default : ….
} }
Brahim BAKKAS Programmation Orientée Objet Java 30
Structure de contrôle : Itérations
Cliquez pour modifier le style du titre
⚫ Pour
for (initialisation;condition; modification){ ...}
⚫ For each
for (Type var : Collection) { ...}

⚫ Tant que ⚫ Faire jusqu’à

while(condition) { do{
... ...
} } while(condition)

Brahim BAKKAS Programmation Orientée Objet Java 31


Structure de contrôle Cliquez pour modifier le style du titre

⚫ Exemple : structure de contrôle


public class SwitchBreak {
public static void main(String[] argv) {
int n = 10;
System.out.println("Valeur de n :" + n);
switch (n) {
case 0: System.out.println("nul"); break;
case 1:
case 2: System.out.println("petit"); break;
case 3:
case 4:
case 5: System.out.println("moyen"); break;
default:
System.out.println("grand");
}
System.out.println("Au revoir...");
}
}

28
Brahim BAKKAS Programmation Orientée Objet Java 32
Opérateurs sur les types primitifs
Cliquez pour modifier le style du titre

⚫ Opérateurs arithmétiques.
▪ Unaires : +a, -b
▪ Binaires : a+b, a-b, a*b, a%b
▪ Incrémentation et décrémentation : a++, b—
▪ Affectation élargie : +=, -=, *=, /=
⚫ Opérateurs comparaisons
▪ a==b, a!=b, a>b, a<b, a>=b, a<=b
⚫ Opérateurs logiques
▪ Et : a && b, a & b
▪ Ou : a || b, a | b
⚫ Conversion de type explicite (cast)
▪ (NouveauType)variable

Brahim BAKKAS Programmation Orientée Objet Java 33


Opérateurs sur les types primitifs
Cliquez pour modifier le style du titre
⚫ Exemple :
public class ExempleTypesPrimitifs {
public static void main(String[] argv) {
int compteur = 0;
while (compteur != 100) {
// Prend un nombre aléatoire
double nbreAleatoir = Math.random() * 1000;
// Etablie un index de 0 à 10
int index = compteur % 10;
// Construction de l’affichage
System.out.println("Index:"+ index + "Nbre Aléatoire:"+ (int)
nbreAleatoir);
// Incrémentation de la boucle
compteur += 1;
}
}
}

Brahim BAKKAS Programmation Orientée Objet Java 34


Affectation, recopie et comparaison
Cliquez pour modifier le style du titre

⚫Affecter et recopier un type primitif


▪ a=b : signifie a prend la valeur de b
▪ a et b sont distincts
▪ Toute modification de a n’entraîne pas celle de b
⚫Comparer un type primitif
▪ a == b : retourne true si les valeurs de a et b sont identiques

Brahim BAKKAS Programmation Orientée Objet Java 35


Les tableaux en Java Cliquez pour modifier le style du titre

⚫Les tableaux sont considérés comme des objets


⚫Fournissent des collections ordonnées d’éléments
⚫Les éléments d’un tableau peuvent être:
▪ Des variables d’un type primitif (int, boolean, double, char,)
▪ Des références sur des objets (à voir dans la partie Classes et Objets)
⚫Création d’un tableau
1. Déclaration : déterminer le type du tableau
2. Dimensionnement : déterminer la taille du tableau
3. Initialisation : initialiser chaque case du tableau

Brahim BAKKAS Programmation Orientée Objet Java 36


Les tableaux en Java : Déclaration
Cliquez pour modifier le style du titre

1. Déclaration
⚫La déclaration précise simplement le type des éléments du tableau
int[] monTableau;
⚫Peut s’écrire également
int monTableau[];

Une déclaration de tableau ne doit pas préciser de


dimensions
int monTableau[5]; // Erreur
Brahim BAKKAS Programmation Orientée Objet Java 37
Les tableaux en Java :Cliquez
Dimensionnement
pour modifier le style du titre

2. Dimensionnement
⚫Le nombre d’éléments du tableau sera déterminé quand l’objet tableau sera
effectivement créé en utilisant le mot clé new
⚫La taille déterminée à la création du tableau est fixe, elle ne pourra plus être
modifiée par la suite
⚫Longueur d’un tableau :
monTableau.length
⚫La création d’un tableau par new
▪ Alloue la mémoire en fonction du type de tableau et de la taille
▪ Initialise le contenu du tableau à 0 pour les types simples

int[] monTableau; // Déclaration


monTableau = new int[3]; // Dimensionnement

Brahim BAKKAS Programmation Orientée Objet Java 38


Les tableaux en Java : Initialisation
Cliquez pour modifier le style du titre

3. Initialisation
⚫ Comme en C/ C++ les indices commencent à zéro
⚫ L’accès à un élément d’un tableau s’effectue suivant cette forme:
monTab[varInt]; // varInt >= 0 et <monTab.length

⚫ Java vérifie automatiquement l’indice lors de l’accès (exception levée)

⚫ Autre méthode : en donnant explicitement la liste de ses éléments entre


{…}
int[] monTab = {1, 2, 3}
⚫ est équivalent à :
monTab = new int[3];
monTab[0] = 1; monTab[1] = 2; monTab[2] = 3;

Brahim BAKKAS Programmation Orientée Objet Java 39


Les tableaux en Java : SynthèseCliquez pour modifier le style du titre

• Déclaration ⚫ Ou 1, 2 et 3 (délation et initialisation )


int[] monTableau; int[] monTab = {1, 2, 3};

• Dimensionnement for (int i = 0; i < monTableau.length; i++) {


monTableau = new int[3]; System.out.println(monTableau[i]);
}

• Initialisation
monTableau[0] = 1;
for (int current : monTableau) {
monTableau[1] = 2; System.out.println(current);
}
monTableau[2] = 3;

36
Brahim BAKKAS Programmation Orientée Objet Java 40
Les tableaux en Java :Cliquez
Multidimensionnels
pour modifier le style du titre

• Tableaux dont les éléments sont eux mêmes des tableaux


⚫ Déclaration
type[][] monTableau;
⚫ Tableaux rectangulaires
⚫ Dimensionnement :
monTableau = new type[2][3];
⚫ Tableaux non-rectangulaires
⚫ Dimensionnement :
monTableau = new type[2];
monTableau[0] = new type[2];
monTableau[1] = new type[3];

Brahim BAKKAS Programmation Orientée Objet Java 41


Petite précision du System.out.
Cliquez pour modifier le style du titre

⚫ Usages : affichage à l’écran


⚫ System.out.println(…) revient à la ligne
⚫ System.out.print(…) ne revient pas à la ligne
⚫ Différentes sorties possibles
⚫ out : sortie standard
⚫ err : sortie en cas d’erreur
⚫ Tout ce que l’on peut afficher…
⚫Objets, nombres, booléens, caractères, …
⚫ Tout ce que l ’on peut faire …
⚫Concaténation sauvage entre types et objets avec le "+"

System.out.println("a=" + a + "donc a < 0 est " + a < 0);

Brahim BAKKAS Programmation Orientée Objet Java 42


Objet :
Voiture
Blanche

Instanciation Objet :
Classe :
Voiture
Voiture
rouge

Objet :
Voiture
CLASSES ET OBJETS verte

43
Classe et définition Cliquez pour modifier le style du titre

⚫Une classe est constituée


⚫Données ce qu'on appelle des attributs
⚫Procédures et/ou des fonctions ce qu'on appelle des méthodes
⚫Une classe est un modèle de définition pour des objets
⚫Ayant même structure (même ensemble d'attributs)
⚫Ayant même comportement (même méthodes)
⚫Ayant une sémantique commune
⚫Les objets sont des représentations dynamiques, du modèle défini
pour eux au travers de la classe (instanciation)
⚫Une classe permet d'instancier (créer) plusieurs objets
⚫Chaque objet est instance d'une classe et une seule

Brahim BAKKAS Programmation Orientée Objet Java 44


Classe et notation UML Cliquez pour modifier le style du titre

Brahim BAKKAS Programmation Orientée Objet Java 45


Codage de la classe « Voiture »Cliquez pour modifier le style du titre

public class Voiture {


private int puissance;
private boolean estDemarree;
private double vitesse;

public int deQuellePuissance() {


return puissance;
}

public void demarre() {


estDemarree = true;
}

public void accelere(double v) { if


(estDemarree) {
vitesse = vitesse + v;
}
}
}

Brahim BAKKAS Programmation Orientée Objet Java 46


Classe et visibilité des attributsCliquez pour modifier le style du titre

⚫Caractéristique d’un attribut


⚫Variables « globales » de la classe
⚫Accessibles dans toutes les méthodes de la classe
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;

public int deQuellePuissance() {


return puissance;
}
public void demarre() {
estDemarree = true;
}

public void accelere(double v) {


if (estDemarree) {
vitesse = vitesse + v;
}
}
43 }
Brahim BAKKAS Programmation Orientée Objet Java 47
Distinction entre attributs et variables
Cliquez pour modifier le style du titre

⚫ Caractéristique d’une variable


⚫Visible à l’intérieur du bloc qui le définit
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;

public int deQuellePuissance() {


return puissance;
}
public void demarre() {
estDemarree = true;
}
public void accelere(double v) {
if (estDemarree) {
double avecTolerance;
avecTolerance = v + 25;
vitesse = vitesse + avecTolerance;
}
}
44 }
Brahim BAKKAS Programmation Orientée Objet Java 48
Conventions en Java :Cliquez
de lapourrigueur
modifier leet dedula
style classe …
titre

⚫ Conventions de noms
⚫CeciEstUneClasse
⚫celaEstUneMethode(…)
⚫jeSuisUneVariable
⚫JE_SUIS_UNE_CONSTANTE
⚫ Un fichier par classe, une classe par fichier
⚫ Classe "Voiture" décrite dans le fichier Voiture.java
⚫ Il peut exceptionnellement y avoir plusieurs classes par fichier (cas des Inner classes)

Respecter les minuscules et les majuscules des noms

Brahim BAKKAS Programmation Orientée Objet Java 49


Objet et définition Cliquez pour modifier le style du titre

⚫Un objet est instance d’une seule classe


▪ Se conforme à la description que celle-ci fournit
▪ Admet une valeur propre à l’objet pour chaque attribut déclaré dans la
classe
▪ Les valeurs des attributs caractérisent l’état de l’objet
▪ Possibilité de lui appliquer toute opération (méthode) définie dans la
Classe
⚫Tout objet est manipulé et identifié par sa référence
▪ Utilisation de pointeur caché (plus accessible que le C++)
▪ On parle indifféremment d’instance, de référence ou d’objet

Brahim BAKKAS Programmation Orientée Objet Java 50


Cliquez pour modifier le style du titre

Brahim BAKKAS Programmation Orientée Objet Java 51


Objet et notation UML Cliquez pour modifier le style du titre

• maClio est une instance de la classe Voiture


Brahim BAKKAS Programmation Orientée Objet Java 52
États des objets Cliquez pour modifier le style du titre

⚫Chaque objet qui est une instance de la classe , il possède ses


propres valeurs d’attributs

Brahim BAKKAS Programmation Orientée Objet Java 53


Affectation et comparaison Cliquez pour modifier le style du titre

⚫Affecter un objet
▪ a = b : signifie a devient identique à b
▪ Les deux objets a et b sont identiques et toute modification de a entraîne
celle de b
⚫Comparer deux objets
▪ a == b retourne true si les deux objets sont identiques
▪ C’est-à-dire si les références sont les mêmes, cela ne compare pas les
attributs

Brahim BAKKAS Programmation Orientée Objet Java 54


Affectation et comparaison Cliquez pour modifier le style du titre

class ExempleEgale {
private int x,y;
public static void main(String[] args) {
ExempleEgale a, b, c;
a=new ExempleEgale();
b=new ExempleEgale();
a.x=1; a.y=2;
b.x=3; b.y=4;
System.out.println(a.x +" "+a.y);
System.out.println(b.x +" "+b.y);
a=b;
b.x=30; b.y=40;
System.out.println(a.x +" "+a.y +"\n");
System.out.println(b.x +" "+b.y+"\n");
System.out.println(" objet a egal b:"+ (a==b));
}
}

Brahim BAKKAS Programmation Orientée Objet Java 55


// selectingCliquez pour
the operand formodifier le style du titre
the calculations
System.out.print(
"Choose and Enter the type of operation you want to perform (+, -, *, /,
%) - ");
char op = sc.next().charAt(0);
solve(a, b, op);
}
public static int solve(int a, int b, char op)
{
int ans = 0;
// addition
if (op == '+') {
ans = a + b;
// subtraction
}
else if (op == '-') {
ans = a - b;
// multiplication
}
else if (op == '*') {
ans = a * b;
// modulo
}
Brahimelse if (op == '%') {
BAKKAS Programmation Orientée Objet Java 56
Affectation et comparaison Cliquez pour modifier le style du titre

⚫L’objet maClio et saClio ont les mêmes attributs (états identiques)


mais ont des références différentes.
• maClio != saClio

Le test de comparaison (== et !=) entre


objets ne concerne que les references et
non les attributs !!!!

Brahim BAKKAS Programmation Orientée Objet Java 57


Affectation et comparaison Cliquez pour modifier le style du titre

⚫Recopier les attributs d’un objet avec la méthode: clone()


a= b.clone()
⚫Les deux objets a et b sont distincts
⚫Toute modification de a n’entraîne pas celle de b

⚫ Comparer le contenu des objets : "equals(Object o)"


• Renvoyer « true » si les objets a et b peuvent être considérés comme identique au vu de leurs
attributs.

Brahim BAKKAS Programmation Orientée Objet Java 58


Structure des objets Cliquez pour modifier le style du titre

⚫ Un objet est constitué d’une partie « statique » et d’une partie « dynamique »


⚫ Partie « statique »
⚫Ne varie pas d’une instance de classe à une autre
⚫Permet d’activer l’objet
⚫Constituée des méthodes de la classe
⚫ Partie « dynamique »
⚫Varie d’une instance de classe à une autre
⚫Varie durant la vie d’un objet
⚫Constituée d’un exemplaire de chaque attribut de la classe

Brahim BAKKAS Programmation Orientée Objet Java 59


Cycle de vie d’un objet Cliquez pour modifier le style du titre

⚫Création
⚫Usage d’un Constructeur
⚫L’objet est créé en mémoire et les attributs de l’objet sont initialisés
⚫Utilisation
⚫Usage des Méthodes et des Attributs (non recommandé)
⚫Les attributs de l’objet peuvent être modifiés
⚫Les attributs (ou leurs dérivés) peuvent être consultés

⚫Destruction et libération de la mémoire lorsque


⚫Usage (éventuel) d’un Pseudo-Destructeur
⚫L’objet n’est plus référencé, la place mémoire occupée est récupérée
L’utilisation d’un objet non construit provoque
une exception de type NullPointerException
Brahim BAKKAS Programmation Orientée Objet Java 60
Création d’objets : déroulementCliquez pour modifier le style du titre

⚫ La création d’un objet à partir d’une classe est appelée une instanciation
⚫ L’objet créé est une instance de la classe
⚫ Déclaration
⚫ Définit le nom et le type de l ’objet
⚫ Un objet seulement déclaré vaut « null » (mot réservé du langage)
⚫ Création et allocation de la mémoire
⚫ Appelle de méthodes particulières : les constructeurs
⚫ La création réserve la mémoire et initialise les attributs
⚫ Renvoi d’une référence sur l’objet maintenant créé

monObjet != null

Brahim BAKKAS Programmation Orientée Objet Java 61


Création d’objets : réalisation Cliquez pour modifier le style du titre

⚫La création d’un nouvel objet est obtenue par l’appel à :


new Constructeur(paramètres)
⚫ Il existe un constructeur par défaut qui ne possède pas de paramètre (si
aucun autre constructeur avec paramètre n’existe)
public class TestMaVoiture {
public static void main (String[] argv) {
// Déclaration puis création
Voiture maVoiture;
maVoiture = new Voiture();
// Déclaration et création en une seule
ligne
Voiture maSecondeVoiture = new Voiture();
}
}

Brahim BAKKAS Programmation Orientée Objet Java 62


Création d’objets : réalisation Cliquez pour modifier le style du titre

• Exemple : construction d’objets


public class TestMaVoiture {
public static void main(String[] argv) {
// Déclaration puis création
Voiture maVoiture;
maVoiture = new Voiture();
// Déclaration d’une deuxième voiture
Voiture maVoitureCopie;
// Attention!! pour l’instant maVoitureCopie vaut null
// Test sur les références.
if (maVoitureCopie == null) {

// Création par affectation d’une autre référence


maVoitureCopie = maVoiture;
// maVoitureCopie possède la même référence que maVoiture
}
// ...
}
}

Brahim BAKKAS Programmation Orientée Objet Java 63


Le constructeur de « Voiture » Cliquez pour modifier le style du titre

⚫ Actuellement
⚫ On a utilisé le constructeur par défaut sans paramètre
⚫ On ne sait pas comment se construit la « Voiture »
⚫ Les valeurs des attributs au départ sont indéfinies et identique pour chaque objet
(puissance, etc.)
⚫ Rôle du constructeur en Java
⚫ Effectuer certaines initialisations nécessaires pour le nouvel objet créé
⚫ Toute classe Java possède au moins un constructeur
⚫ Si une classe ne définit pas explicitement de constructeur, un constructeur par
défaut sans arguments et qui n’effectue aucune initialisation particulière est
invoquée
Les constructeurs portent le
même nom que la classe et
n’ont pas de valeur de retour

Brahim BAKKAS Programmation Orientée Objet Java 64


Le constructeur de « Voiture » Cliquez pour modifier le style du titre

⚫Le constructeur de Voiture permet d’initialiser les attributs:


⚫vitesse à zéro
⚫ estDemaree à faux
⚫puissance à la valeur passée en paramètre du constructeur
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;
public Voiture(int p) {
puissance = p;
estDemarree = false;
vitesse = 0;
}
//...
}
Brahim BAKKAS Programmation Orientée Objet Java 65
Construire une « Voiture » de 7CV
Cliquez pour modifier le style du titre

⚫ Création de laVoiture
⚫ Déclaration de la variable maVoiture
⚫ Création de l’objet avec la valeur 7 en paramètre du constructeur

public class TestMaVoiture {


public static void main(String[] argv) {
// Déclaration puis création
Voiture maVoiture;

maVoiture = new Voiture(7);

Voiture maSecVoiture;
// Sous entendu qu’il existe
// explicitement un constructeur : Voiture(int)
maSecVoiture = new Voiture(); // Erreur
}
}

Brahim BAKKAS Programmation Orientée Objet Java 66


Cliquez pour modifier le style du titre

Brahim BAKKAS Programmation Orientée Objet Java 67


Constructeur sans arguments Cliquez pour modifier le style du titre
⚫ Lorsque l’on doit créer un objet sans pouvoir décider des valeurs de ses attributs au
moment de la création
⚫ Il remplace le constructeur par défaut qui est devenu inutilisable dès qu’un constructeur
(avec paramètres) a été défini dans la classe.
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;
public Voiture() { public class TestMaVoiture {
puissance = 4; public static void main (String[] argv){
estDemaree = false; // Déclaration puis création
vitesse = 0;
Voiture maVoiture;
}
public Voiture(int p) {
maVoiture = new Voiture(7);
puissance = p; Voiture maSecVoiture;
estDemaree = false; maSecVoiture = new Voiture(); // OK
vitesse = 0; }
} }
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 68


Constructeurs multiples Cliquez pour modifier le style du titre

⚫Intérêts
⚫Possibilité d’initialiser un objet de plusieurs manières différentes
⚫On parle alors de surchage (overloading)
⚫Le compilateur distingue les constructeurs en fonction
⚫de la position des arguments public class Voiture {
//...
⚫du nombre public Voiture() {
puissance = 4; //...
⚫du type }
public Voiture(int p) {
puissance = p; //...
}
public Voiture(int p, boolean estDemaree) {
Chaque constructeur possède
//...
le même nom (le nom de la classe)
}
}

Brahim BAKKAS Programmation Orientée Objet Java 69


Accès aux attributs Cliquez pour modifier le style du titre

⚫Pour accéder aux données d’un objet on utilise une notation pointée
idObjet.nomAttribut
public class TestMaVoiture {
public static void main (String[] argv) {
// Déclaration puis création
Voiture v1 = new Voiture();
Voiture v2 = new Voiture();
// Accès aux attributs en écriture
v1.puissance = 110;
// Accès aux attributs en lecture
System.out.println("Puissance de v1 = " + v1.puissance);
}
}

Il n’est
70
pas recommandé d’accéder directement aux attributs d’un objet
Brahim BAKKAS Programmation Orientée Objet Java 70
Envoi de messages : appel demodifier
Cliquez pour méthodes
le style du titre

⚫Pour « demander » à un objet d’effectuer un traitement il


faut lui envoyer un message
⚫Un message est composé de trois parties :
oUne référence permettant de désigner l’objet à qui le message est
envoyé
oLe nom de la méthode ou de l’attribut à exécuter
oLes éventuels paramètres de la méthode
identificationObjet.nomDeMethode(Paramètres)
⚫Envoi de message similaire à un appel de fonction
⚫Le code défini dans la méthode est exécuté
⚫Le contrôle est retourné au programme appelant
71
Brahim BAKKAS Programmation Orientée Objet Java 71
Envoi de messages : appel demodifier
Cliquez pour méthodes
le style du titre

• Appel des méthodes:

public class TestMaVoiture {


public static void main (String[] argv) {
// Déclaration puis création
Voiture maVoiture = new Voiture();
// La voiture démarre
maVoiture.demarre();
if (maVoiture.deQuellePuissance() == 4) {
System.out.println("Pas très Rapide…");
}
// La voiture accélère
maVoiture.accélère(123.5);
}
}

Ne pas oublier les parenthèses pour les appels aux méthodes

Brahim BAKKAS Programmation Orientée Objet Java 72


Envoi de messages : passage de paramètres
Cliquez pour modifier le style du titre

⚫Un paramètre d’une méthode peut être


⚫Une variable de type simple
⚫Une référence d’un objet typée par n’importe quelle classe
⚫En Java tout est passé par valeur
⚫Les paramètres effectifs d’une méthode
⚫La valeur de retour d’une méthode (si différente de void)
⚫Les types simples
⚫Leur valeur est recopiée
⚫Leur modification dans la méthode n’entraîne pas celle de l’original
⚫Les objets
⚫Leur modification dans la méthode entraîne celle de l’original!!!
⚫Leur référence est recopiée et non pas les attributs

73
Brahim BAKKAS Programmation Orientée Objet Java 73
Envoi de messages : passage de paramètres
Cliquez pour modifier le style du titre

• Exemple : passage de paramètres


public class TestMaVoiture {
public static void main (String[] argv) {
// Déclaration puis création 1 Voiture
maVoiture = new Voiture();
// Déclaration puis création 2
Voiture maSecondeVoiture = new Voiture();
// Appel de la méthode compare(voiture) qui
// retourne le nombre de différence
int p = maVoiture.compare(maSecondeVoiture);
System.out.println("Nbre différence :" + p);
}
}

74
Brahim BAKKAS Programmation Orientée Objet Java 74
L’objet « courant » Cliquez pour modifier le style du titre

⚫ L’objet « courant » est désigné par le mot clé this


⚫ Permet de désigner l’objet dans lequel on se trouve
⚫ Désigne une référence particulière qui est un membre caché

Ne pas tenter d’affecter une nouvelle valeur à this !!!!


this = ... ; // Ne pas y penser

⚫ Utilité de l’objet « courant »


⚫ Rendre explicite l’accès aux propres attributs et méthodes définies dans la classe
⚫ Passer en paramètre d’une méthode la référence de l’objet courant.

75
Brahim BAKKAS Programmation Orientée Objet Java 75
L’objet « courant » : attributs et méthodes
Cliquez pour modifier le style du titre

⚫ Désigne des variables ou méthodes définies dans une classe

public class Voiture {


...
private boolean estDemarree;
private double vitesse;
public int deQuellePuissance() {
...
}
public void accelere(double vitesse) {
if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}
}

this n’est pas nécessaire lorsque


les identificateurs de variables ne
68 présentent aucun équivoque
Brahim BAKKAS Programmation Orientée Objet Java 76
Notion d’UML… Cliquez pour modifier le style du titre

⚫ Association : les objets sont sémantiquement liés


⚫ Exemple : uneVoiture est conduite par un Conducteur
⚫ Agrégation : cycle de vie indépendant
⚫ Exemple : uneVoiture et une Galerie
⚫ Composition : cycle de vie identiques
⚫ Exemple : voiture possède un moteur qui dure la vie de la voiture

Les losanges sont attachés à


la classe qui contient

Brahim BAKKAS Programmation Orientée Objet Java 77


Codage de l'association : composition
Cliquez pour modifier le style du titre

• L'objet de classe Voiture peut envoyer des messages à l'objet de classe


Moteur :
Solution 1

public class Voiture {


private Moteur leMoteur;
//...
public Voiture(int p) {
leMoteur = new Moteur(p);
...
}
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 78


Codage de l'association : composition
Cliquez pour modifier le style du titre

• L'objet de classe Moteur n'envoie pas de message à l'objet de classe


Voiture :
Solution 1

public class Moteur {


private int puissance;
//...
public Moteur(int p) {
puissance = p;
//...
}
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 79


Codage de l'association : composition
Cliquez pour modifier le style du titre

⚫Il peut être nécessaire que les deux objets en composition s'échangent
des messages :
Solution 2
⚫L’objet Voiture « voit » l’objet Moteur

public class Voiture {


private Moteur leMoteur;
//...
public Voiture(int p) {
leMoteur = new Moteur(p,this);
...
}
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 80


Codage de l'association : composition
Cliquez pour modifier le style du titre

⚫ Il peut être nécessaire que les deux objets en composition s'échangent des messages :

Solution 2
⚫L’objet Moteur « voit » l’objet Voiture

public class Moteur {


private int puissance;
private Voiture laVoiture;
//...
public Moteur(int p, Voiture v) {
puissance = p;
laVoiture = v;
//...
}
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 81


Codage de l’association : agrégation
Cliquez pour modifier le style du titre

• L'objet de classe Galerie n’envoie pas de message à l’objet de classe


Voiture

public class Voiture {


private Galerie laGalerie;
//...
public Voiture(Galerie g) {
laGalerie = g;
//...
}
//...
}

Brahim BAKKAS Programmation Orientée Objet Java 82


Destruction et ramasse-miettesCliquez pour modifier le style du titre

⚫ La destruction des objets se fait de manière implicite


⚫ Le ramasse-miettes ou Garbage Collector se met en route
⚫ Automatiquement
⚫ Si plus aucune variable ne référence l’objet
⚫ Si le bloc dans lequel il est défini se termine Préférer définir une méthode et
de l’invoquer avant que tout objet
⚫ Si l’objet a été affecté à « null » ne soit plus référencé : detruit()
⚫ Manuellement :
⚫ Sur demande explicite par l’instruction « System.gc() »
⚫ Un pseudo-destructeur « protected void finalize() » peut
être défini explicitement par le programmeur
⚫ Il est appelé juste avant la libération de la mémoire par la machine
virtuelle, mais on ne sait pas quand
⚫ Conclusion : pas très sûr!!!!

Brahim BAKKAS Programmation Orientée Objet Java 83


Destruction et ramasse-miettes Cliquez pour modifier le style du titre

public class Voiture {


private boolean estDemarree;
//...
protected void finalize() {
estDemarree = false; Pour être sûr que finalize s'exécute
System.out.println("j’arrete le Moteur"+estdemarre); il faut absolument appeler
} explicitement System.gc()
//...
}

public class TestMaVoiture {


public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture();
maVoiture.demarre();
// maVoiture ne sert plus à rien
maVoiture = null;
// Appel explicite du garbage collector
System.gc();
// Fin du programme
System.exit(0);
System.out.println("Message non visible");
}
76 }
Brahim BAKKAS Programmation Orientée Objet Java 84
Gestion des objets Cliquez pour modifier le style du titre

⚫ Afficher son type et sa place mémoire : System.out.println()

System.out.println(maVoiture) // Voiture@119c082

⚫ Récupérer son type : méthode « Class getClass() »

maVoiture.getClass(); // Retourne un objet de type Class


// Class est une classe!!!
Class classVoiture = maVoiture.getClass();

⚫ Tester son type : opérateur « instanceof » mot clé « class »

if (maVoiture instanceof Voiture) {...} // C’est vrai


ou
if (maVoiture.getClass() == Voiture.class) {...} // C’est vrai
// également

Brahim BAKKAS Programmation Orientée Objet Java 85


Surcharge Cliquez pour modifier le style du titre

⚫Lasurcharge (overloading)n’est pas limitée aux constructeurs, elle est


possible également pour n’importe quelle méthode.
⚫Possibilité de définir des méthodes possédant le même nom mais dont
les arguments diffèrent.
⚫Quand une méthode surchargée est invoquée le compilateur
sélectionne automatiquement la méthode dont le nombre et le type
des arguments correspondent au nombre et au type des paramètres
passés dans l’appel de la méthode.

Des méthodes surchargées peuvent avoir des types de retour


différents à condition qu’elles aient des arguments différents

Brahim BAKKAS Programmation Orientée Objet Java 86


Surcharge Cliquez pour modifier le style du titre

⚫ Exemple : une voiture surchargée


public class Voiture {
private double vitesse;
//...
public void accelere(double vitesse) {
if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}
public void accelere(int vitesse) {
if (estDemaree) {
this.vitesse = this.vitesse + (double)vitesse;
}
} public class TestMaVoiture {
//... public static void main (String[] argv) {
} // Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture();
// Accélération 1 avec un double
maVoiture.accelere(123.5);
// Accélération 2 avec un entier
maVoiture.accelere(124);
}
}
Brahim BAKKAS Programmation Orientée Objet Java 87
Constructeurs multiples : le retour
Cliquez pour modifier le style du titre

⚫ Appel explicite d’un constructeur de la classe à l’intérieur d’un autre constructeur.


⚫ Doit se faire comme première instruction du constructeur
⚫ Utilise le mot-clé this (paramètres effectifs)

public class Voiture {


⚫ Exemple : //...
public Voiture() {
Implantation du constructeur sans this(7);
}
paramètre deVoiture public Voiture(int p) {
this(p, new Galerie());
à partir du constructeur avec }
public Voiture(int p, Galerie g) {
paramètres puissance = p;
moteur = new Moteur(puissance);
galerie = g;
//...
}
//...
80 }
Brahim BAKKAS Programmation Orientée Objet Java 88
Encapsulation Cliquez pour modifier le style du titre

⚫Possibilité d’accéder aux attributs d’une classe Java mais pas


recommandé car contraire au principe d’encapsulation.
⚫Les données (attributs) doivent être protégés et accessibles pour
l’extérieur par des sélecteurs.
⚫Possibilité d’agir sur la visibilité des membres (attributs et
méthodes) d’une classe vis à vis des autres classes.
⚫Plusieurs niveaux de visibilité peuvent être définis en précédant d’un
modificateur la déclaration d’un attribut, méthode ou constructeur.
⚫private
⚫public
⚫protected

Brahim BAKKAS Programmation Orientée Objet Java 89


Encapsulation : visibilitéCliquez
des membres
pour modifierd’une classe
le style du titre

+ public - private
classe La classe peut être utilisée Utilisable uniquement par les classes
par n’importe quelle définies à l’intérieur d’une autre classe.
classe Une classe privée n’est utilisable
que par sa classe englobante
attribut Attribut accessible Attribut restreint à la classe où est faite
partout où sa classe est la déclaration
accessible. N’est pas
recommandé du point de
vue encapsulation
méthode Méthode accessible Méthode accessible à
partout où sa classe est l’intérieur de la définition
accessible. de la classe

Brahim BAKKAS Programmation Orientée Objet Java 90


Encapsulation Cliquez pour modifier le style du titre

• Exemple : encapsulation Une méthode privée ne peut plus


public class Voiture {
être invoquée en dehors du code de
private int puissance; la classe où elle est définie
//...
public void demarre() {
//...
}
private void makeCombustion() {
//...
}
} public class TestMaVoiture {
public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture();
// Démarrage de maVoiture
maVoiture.demarre();
maVoiture.makeCombustion();//err
}
}
Brahim BAKKAS Programmation Orientée Objet Java 91
Les chaînes de caractères « String » pour modifier le style du titre
Cliquez

⚫ Ce sont des objets traités comme des types simples …


⚫ Initialisation
String maChaine = "Bonjour!"; // Cela ressemble à un type simple

⚫ Longueur
maChaine.length(); // Avec les parenthèses car c'est une méthode

⚫ Comparaison
maChaine.equals("Bonjour!"); // Renvoi vrai

⚫ Concaténation
String essai = "ess" + "ai";
String essai = "ess".concat("ai"); Faites attention à la comparaison
de chaînes de caractères.
maChaine == "toto";
84 Comparaison sur les références !!
Brahim BAKKAS Programmation Orientée Objet Java 92
Les Chaînes modifiables «pour
Cliquez StringBuffer
modifier le style»du titre

⚫ Elles sont modifiables par insertion, ajouts, conversions, etc


⚫ On obtient une « StringBuffer » avec ses constructeurs
StringBuffer mCM = new StringBuffer(int length);
StringBuffer mCM = new StringBuffer(String str);

⚫ On peut les transformer en chaînes normales String


String s = mCM.toString();

⚫ On peut leur ajouter n’importe (surcharge) quoi


mCM.append(...); // String, int, long, float, double, boolean, char

⚫ On peut leur insérer n’importe (surcharge) quoi


mCM.insert(int offset, ...); // String, int, long, float, double,
// boolean, char

85
Brahim BAKKAS Programmation Orientée Objet Java 93
Les chaînes décomposables
Cliquez pour:« StringTokenizer
modifier le style du titre »

⚫ Elles permettent la décomposition en mots ou éléments suivant un délimiteur


this is a test => this
is
a
test

⚫ On obtient une « StringTokenizer » avec ses constructeurs


StringTokenizer mCM = new StringTokenize(String str); // Délimiteur = blanc
StringTokenizer rMCM = new StringTokenizer(String str, String delim);

⚫ Exemple :
import java.util.StringTokenizer;
public class chaine {
public static void main(String[] args) {
StringTokenizer st =
new StringTokenizer("Bonjour, le monde|de|Java",", |");
while(st.hasMoreElements())
System.out.println("Element : " + st.nextElement());
}
}
Brahim BAKKAS Programmation Orientée Objet Java 94
Variables de classe Cliquez pour modifier le style du titre

⚫Il peut être utile de définir pour une classe des attributs
indépendamment des instances : nombre deVoitures créées
⚫Utilisation des Variables de classe comparables aux « variables globales »
⚫Usage des variables de classe
⚫Variables dont il n’existe qu’un seul exemplaire associé à sa classe de
définition
⚫Variables existent indépendamment du nombre d’instances de la classe
qui ont été créés
⚫Variables utilisables même si aucune instance de la classe n’existe

Brahim BAKKAS Programmation Orientée Objet Java 95


Variables de classe Cliquez pour modifier le style du titre

⚫ Elles sont définies comme les attributs mais avec le mot-clé


static
Attention à l’encapsulation. Il est
public static int nbVoitureCreees; dangereux de laisser cette
variable de classe en public.

⚫ Pour y accéder, il faut utiliser non pas un identificateur mais


le nom de la classe.
Voiture.nbVoitureCreees = 3;

Il n’est pas interdit d’utiliser une variable de classe


comme un attribut (au moyen d ’un identificateur)
mais fortement déconseillé

Brahim BAKKAS Programmation Orientée Objet Java 96


Constantes de classe Cliquez pour modifier le style du titre

⚫ Usage
⚫ Ce sont des constantes liées à une classe
Une constante de classe est
⚫ Elles sont écrites en MAJUSCULES généralement toujours visible

⚫ Elles sont définies (en plus) avec le mot-clé final


public class Galerie {
public static final int MASSE_MAX = 150;
}

⚫ Pour y accéder, il faut utiliser non pas un identificateur


d’objet mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}

Brahim BAKKAS Programmation Orientée Objet Java 97


Variables et Constantes de classe
Cliquez pour modifier le style du titre

⚫ Exemple : constantes de classe


public class Voiture {
public static final int PTAC_MAX = 3500;
private int poids;
public static int nbVoitureCreees;
public Voiture(int poids, ...) {
this.poids = poids;
nbVoitureCrees++;
//...
}
}

public class TestMaVoiture {


public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture(2500);
//...
System.out.println("Poids maxi:" +
Voiture.PTAC_MAX);
System.out.println(Voiture.nbVoitureCreees);
//...
}
}
Brahim BAKKAS Programmation Orientée Objet Java 98
Méthodes de classe Cliquez pour modifier le style du titre

⚫ Usage
⚫ Ce sont des méthodes qui ne s'intéressent pas à un objet particulier
⚫ Utiles pour des calculs intermédiaires internes à une classe
⚫ Utiles également pour retourner la valeur d'une variable de classe en
visibilité private
⚫ Elles sont définies comme les méthodes d'instances, mais avec le
mot clé static
public static double vitesseMaxToleree() {
return vitesseMaxAutorisee*1.10;
}

⚫ Pour y accéder, il faut utiliser non pas un identificateur d'objet


mais le nom de la classe (idem variables de classe)
Voiture.vitesseMaxToleree()

91
Brahim BAKKAS Programmation Orientée Objet Java 99
Méthodes de classe Cliquez pour modifier le style du titre

⚫ Exemple : méthode de classe


public class Voiture {
private static int nbVoitureCreees;
//...
public static int getNbVoitureCreees(){
return Voiture.nbVoitureCreees;
}
}

public class TestMaVoiture {


public static void main (String[] argv) {
// Déclaration puis création de
maVoiture
Voiture maVoiture = new Voiture(2500);
//...
System.out.println("Nbre Instance :" +
Voiture.getNbVoitureCreees());
}
}
92
Brahim BAKKAS Programmation Orientée Objet Java 100
Méthodes de classe :Cliquez
erreurpour classique
modifier le style du titre

⚫ Exemple (suite) : méthode de classe

public class Voiture {


private Galerie laGalerie;
//...
public Voiture(Galerie g) {
laGalerie = g;
//...
}
public static boolean isGalerieInstall() {
return (laGalerie != null)
}
}

On ne peut pas utiliser de variables


d'instance dans une méthode de
classe!!!!

Brahim BAKKAS Programmation Orientée Objet Java 101


Méthodes de classe Cliquez pour modifier le style du titre

⚫ Rappel : les types simples (int, double, etc.) possède un alter-ego objet
disposant de méthodes de conversion
⚫ Par exemple la classe Integer « encapsule » le type int
⚫ Constructeur à partir d’un int ou d’une chaîne de caractères
public Integer(int value);
public Integer(String s);

⚫ Disponibilité de méthodes qui permettent la conversion en type simple


Integer valueObjet = new Integer(123);
int valuePrimitif = valueObjet.intValue();
Ou
int valuePrimitif = valueObjet; // (AutoBoxing)

⚫ Des méthodes de classe très utiles qui permettent à partir d’une chaîne de
caractères de transformer en type simple ou type object
String maValueChaine = new String("12313");
int maValuePrimitif = Integer.parseInt(maValueChaine);

Attention aux erreurs de conversion. Retour d’une


94 exception.Voir dans la dernière partie du cours
Brahim BAKKAS Programmation Orientée Objet Java 102
Les tableaux en Java :Cliquez
application
pour modifierObjets
le style du titre

1. Déclaration ⚫ Ou 1, 2 et 3
Voiture[] monTableau; Voiture[] monTab = {
new Voiture(5),
1. Dimensionnement new Voiture(7),
monTableau = new Voiture[3]; new Voiture(8)
};
2. Initialisation
monTableau[0] = new Voiture(5);
monTableau[1] = new Voiture(7);
monTableau[2] = new Voiture(8);

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


System.out.println(monTableau[i].demarre());
}

Brahim BAKKAS Programmation Orientée Objet Java 103


Varargs : passage de paramètres enle nombre
Cliquez pour modifier style du titre indéfini

⚫ Varargs est une nouveauté Java 5 permettant de passer en


paramètre un nombre indéfini de valeurs de même type.
⚫ Avant la version Java 5, il fallait passer en paramètre un
tableau d’un type donné pour réaliser la même chose.

public ajouterPassager(String[] tab)

⚫ La syntaxe de varargs est la suivante : utilisation de « … »


public ajouterPassager(String... tab)

Brahim BAKKAS Programmation Orientée Objet Java 104


Varargs : passage de paramètres enle nombre
Cliquez pour modifier style du titre indéfini

⚫ Du côté de la méthode où le varargs est défini, les données sont manipulées comme
un tableau
public ajouterPassager(String... tab) {
for (String current : tab) {
System.out.println(current)
}
}

⚫ Du côté client qui fait un appel à la méthode, les données peuvent être envoyées comme
un
⚫ Tableau

String passagers = {"Tony", "Luck", "John"};


maVoiture.ajouterPassager(passagers);

⚫ Ensemble de paramètres

maVoiture.ajouterPassager("Tony", "Luck", "John");

Brahim BAKKAS Programmation Orientée Objet Java 105


Varargs : passage de paramètres enle nombre
Cliquez pour modifier style du titre indéfini

⚫ Comme un varargs est considéré comme un tableau, le


contenu peut être vide
public Voiture(int... carac) { ... }
public static void main(String[] argv) {
new Voiture();
}

⚫ Si un varargs est accompagné d’un ou plusieurs autres


paramètres, le varargs doit obligatoirement être placé en
dernier
public Voiture(String mod, int... carac) { ... }

public Voiture(int... Carac, String mod) { ... }

Brahim BAKKAS Programmation Orientée Objet Java 106


Varargs : passage de paramètres enle nombre
Cliquez pour modifier style du titre indéfini

⚫ Problématiques liées à la surcharge d’une méthode utilisant


un varargs
⚫ Dans le cas de la surcharge d’une méthode la méthode
contenant le varargs a la priorité la plus faible
public class Voiture {
public Voiture(int... carac) {
//...
}
public Voiture(int caract1, int caract2) {
//...
}
public static void main(String[] argv) {
new Voiture(12, 23);
new Voiture(12);
}
}

Brahim BAKKAS Programmation Orientée Objet Java 107


Cliquez pour modifier le style du titre

On souhaite créer une application qui permet de manipuler des segments.


Un segment est défini par la valeur de ses deux extrémités extr1 et extr2.
Pour créer un segment, il faut préciser les valeurs de extr1 et extr2.
Les opérations que l’on souhaite exécuter sur le segment sont :
• ordonne() : méthode qui permet d’ordonner extr1 et extr2 si extr1 est supérieur à extr2
▪ getLongueur() : méthode qui retourne la longueur du segment.
▪ extr1 extr2 58
▪ appartient(int x) : retourne si x appartient au segment ou non.
▪ toString() : retourne une chaîne de caractères de type SEGMENT[extr1,extr2]
▪ Faire une représentation UML de la classe Segment.
▪ Implémenter en java la classe Segment
▪ Créer une application TestSegment qui permet de :
▪ Créer objet de la classe Segment avec les valeurs extr1=24 et extr2=12.
▪ Afficher l’état de cet objet en utilisant la méthode toString().
▪ Afficher la longueur de ce segment.
▪ Afficher si le point x=15, appartient à ce segment.
▪ Changer les valeurs des deux extrémités de ce segment.

Brahim BAKKAS Programmation Orientée Objet Java 108

Vous aimerez peut-être aussi