Académique Documents
Professionnel Documents
Culture Documents
POO en Java
Ch. III
PLAN
Rappels: Concepts de l’orienté objet avec Java
I. Création d’une classe
II. Création et manipulation d’Objets
1. Introduction
2. Etapes de création des Objets
2.1. Déclaration d’un objet:
2.2. Création d’un objet
2.3. Initialisation par défaut
III. Définition des méthodes
IV. Accès aux membres d’un objet
1. Accès aux attributs(données membres)
2. Accès aux méthodes: appels des méthodes
V. Encapsulation (accessibilité)
IV. Méthodes d’accès aux valeurs des variables depuis
l’extérieur
V. Autoréférences: emploi de this
VI. Champs et méthodes de classe
1. Champs de classe (variable de classe)
2. Méthodes de classe
VII. Le mot clé final
1
08/04/2020
• Exemples:
– Une Fenêtre :
• Etat: position, taille, bordure, titre, couleur,...
• Opérations: dessiner, déplacer, agrandir,...
– Un Fichier
• Etat: nom, directory, id, protections, propriétaire, contenu,…
• Opérations: ouvrir, fermer, détruire,…
2
08/04/2020
démarrer()
accélérer()
Comportement
freiner()
Rappels: Classe
• La classe décrit le domaine de définition d’objets.
3
08/04/2020
• Une classe est définie par les attributs et les opérations (méthodes).
1) Attributs:
Appelés également champs, ou données membres,
correspondent aux propriétés de la classe.
Ils sont définis par un nom, un type de données et
éventuellement une valeur initiale.
Un attribut est une variable qui stocke des données.
Employe
code : int
nom : String
nbEmployes : static int
Trois attributs de la classe Employe
7
4
08/04/2020
Exemple: Rectangle est une classe utilisée pour créer des objets
représentant des rectangles particuliers.
• Elle regroupe 4 données de type entier qui caractérisent le rectangle:
longueur, largeur et origine (x,y) (la position en abscisse et en
ordonnée de son origine).
• On suppose qu’on effectue les opérations de déplacement et de calcul
de la surface du rectangle.
• Les symboles + et – sont les spécificateurs d’accès (voir plus loin)
Exemple (notation UML (Unified Modeling Language)
- : private
Rectangle Nom de la classe # : protected
- longueur + : public
- largeur Description des attributs (champs) $ (ou souligné) : static
-x
-y
+ déplacer(int,int)
+ calculSurface() Description des méthodes (comportements)
10
5
08/04/2020
11
Classe : déclaration.
En Java, pour déclarer une classe on utilise le mot-clé class suivi
du nom de la classe.
public class Rectangle {
...
}
Règles
1. La première lettre du nom d’une classe doit toujours être
une lettre Majuscule (ex : Chat).
2. Mélange de minuscule, majuscule avec la première lettre de
chaque mot en majuscule (ex : ChatGris).
3. Une classe se trouve dans un fichier portant son nom
suivi de l’extention .java (ex : ChatGris.java)
12
6
08/04/2020
Classe : écriture
On peut placer une seule classe par fichier source. Mais, Java n’est pas tout à fait aussi
strict, il vous impose seulement de respecter les règles suivantes dans le :
Règles
1. un fichier source peut contenir plusieurs classes
mais une seule doit être publique
2. la classe contenant la méthode main doit obligatoirement
être publique, afin que la machine virtuelle y ait accès
3. une classe n’ayant aucun spécificateur d’accès reste accessible à toutes
les classes du même paquetage donc, a fortiori, du même fichier source
13
• Une fois la classe est définie, on peut créer des objets (=variables)
14
7
08/04/2020
15
Rectangle
« instance»
8
08/04/2020
Voiture
« instance»
VW BM Honda
- Marque: Polo - Marque: X5 - Marque: Civic
- Coleur: Rouge - Coleur: Blanche - Coleur: Noire
- Vitesse: 5 - Vitesse: 6 - Vitesse: 5
- Porte: 3 - Porte: 5 - Porte: 5
- Déclaration de l’objet
- Création de l’objet
18
9
08/04/2020
Attention:
- La déclaration d’une variable de type primitif réserve un emplacement
mémoire pour stocker la variable
- Par contre, la déclaration d’un objet, ne réserve pas une place mémoire
pour l’objet, mais seulement un emplacement pour une référence
à cet objet
les objets sont manipulés avec des références
19
Exemple:
Considérons la classe ClasseTest
class ClasseTest {
// corps de la classe ClasseTest
}
l’instruction:
ClasseTest objA;
- Déclare objA comme objet (variable) de type ClasseTest
- Définit le nom et le type de l’objet.
- Déclare que la variable objA est une référence à un objet de la classe
ClasseTest. Cela veut dire qu’on va utiliser une variable objA qui
référencera un objet de la classe ClasseTest.
- Aucun objet n’est créé: un objet seulement déclaré vaut « null ».
objA null
20
10
08/04/2020
21
Exemple
class ClasseTest {
/* Corps de la classe ClasseTest */
}
En générale:
1. Chaque objet met ses données membres dans sa propre zone mémoire.
2. Les données membres ne sont pas partagées entre les objets de la même classe.
22
11
08/04/2020
23
Rectangle rectangleR1;
– déclare que l’on va utiliser une variable rectangleR1
qui référencera un objet de la classe Rectangle
– mais aucun objet n’est créé
24
12
08/04/2020
Plan de construction
Classe « Chemise »
Objet 1 Objet 2
Référence 1 Référence 2
13
08/04/2020
27
Attention:
Cette garantie d’initialisation par défaut
ne s’applique pas aux variables locales
(variables déclarées dans un bloc, par exemple
variables locales d’une méthode)
(voir plus loin)
28
14
08/04/2020
– un type de retour
– un nom
– une liste (éventuellement vide) de paramètres typés en entrée
– une suite d’instructions (un bloc d’instructions) qui constitue le corps
de la méthode
/*
corps de la méthode qui peut contenir l’instruction
*/
}
29
30
15
08/04/2020
31
16
08/04/2020
Remarques importantes
1) La portée d’une variable locale est limitée au bloc constituant la
méthode où elle est déclarée. De plus, une variable locale ne doit pas
posséder le même nom qu’un argument muet de la méthode :
void f(int n)
{ float x ; // variable locale à f
float n ; // interdit en Java
.....
}
void g ()
{ double x ; // variable locale à g, indépendante de x locale à f
.....
}
34
17
08/04/2020
nomObjet.nomAttibut
nomObjet = nom de la référence à l’objet
nomAttribut =nom de la donnée membre (attribut).
35
class ClasseTest {
Exemple 1: boolean b;
double x;
Pour les objets objA et objB }
ClasseTest objA = new ClasseTest();
de la classe ClassTest ClasseTest objB = new ClasseTest();
qui sont déjà créés:
36
18
08/04/2020
class Etudiant {
Exemple 2: String nom;
int age;
Soient 2 objets Etud1 et Etud2 }
Etudiant etud1 = new Etudiant();
de la classe Etudiant Etudiant etud2 = new Etudiant();
37
Exercice: Soit Rectangle une classe utilisée pour créer des objets représentant
des rectangles particuliers
• Elle regroupe 4 données de type entier qui caractérisent le rectangle: longueur,
largeur et origine (x,y) (la position en abscisse et en ordonnée de son origine).
• On suppose qu’on effectue l’opération d’instanciation suivante:
Rectangle
19
08/04/2020
Solution :
public class Rectangle{
int longueur, largeur;
int x, y;
public static void main (String args[]) {
Rectangle rectangleR1=new Rectangle ();
rectangleR1.longueur=10; rectangleR1.largeur=2;
rectangleR1.x=0; rectangleR1.y=0;
Rectangle rectangleR2=new Rectangle ();
rectangleR2.longueur=5; rectangleR2.largeur=7;
rectangleR2.x=1; rectangleR2.y=2;
Rectangle rectangleR3=new Rectangle ();
rectangleR3.longueur=3; rectangleR3.largeur=5;
rectangleR3.x=2; rectangleR3.y=0;
}
} 39
Classe chemise
public class Chemise{
int id;
char couleur;
float prix;
String description;
int quantite;
}
Objet 1 Objet 2
Référence 1 Référence 2
20
08/04/2020
Notion de référence1/5
Chemise maChemise;
maChemise=new Chemise();
maChemise
maChemise.couleur=‘R’;
}
}
Stack Heap
(pile) (tas)
21
08/04/2020
Stack Heap
Stack Heap
22
08/04/2020
Stack Heap
Mémoire
0x034009
public class Test{
id 0
public static void main(String[] args){ maChemise couleur R
prix 0.0f
Chemise maChemise=new Chemise() 0x034009
description null
quantite 0
maChemise.couleur=‘R’;
} id 0
} taChemise
couleur '\u0000’
Stack Heap
23
08/04/2020
Mémoire
0x034009
public class Test{
id 0
public static void main(String[] args){ maChemise couleur R
prix 0.0f
Chemise maChemise=new Chemise() 0x034009
description null
quantite 0
maChemise.couleur=‘R’;
maChemise.couleur=‘B’; id 0
taChemise B
couleur
maChemise.quantite=1; 0x99f311 prix 0.0f
} description null
} quantite 1
Stack Heap
48
24
08/04/2020
class ClasseTest {
float x;
int i;
boolean b;
double div(int x, int y) {
// corps de la fonction div()
return x/y;
}
}
ClasseTest objA = new ClasseTest(); // créer un objet objA
double j = objA.div(5,3); // affecte à j la valeur retournée par div()
49
50
25
08/04/2020
51
Exercice: Soit Rectangle une classe utilisée pour créer des objets représentant
des rectangles particuliers
• Elle regroupe 4 données de type entier qui caractérisent le rectangle: longueur,
largeur et origine (x,y) (la position en abscisse et en ordonnée de son origine).
• On suppose qu’on effectue l’opération d’instanciation suivante sachant que
tous les rectangles auront initialement la même origine (0,0):
Rectangle
26
08/04/2020
Solution :
public class Rectangle{
int longueur, largeur;
int x, y;
void initialiseOrigine(int x0, int y0) {
x=x0; y=y0;
}
public static void main (String args[]) {
Exercice: Soit Rectangle une classe utilisée pour créer des objets représentant
des rectangles particuliers
• Elle regroupe 4 données de type entier qui caractérisent le rectangle: longueur,
largeur et origine (x,y) (la position en abscisse et en ordonnée de son origine).
• On suppose qu’on effectue l’opération d’instanciation suivante sachant que
tous les rectangles auront initialement des origines différentes:
Rectangle
27
08/04/2020
Solution :
public class Rectangle{
int longueur, largeur;
int x, y;
void initialiseOrigine(int x0, int y0) {
x=x0; y=y0;
}
public static void main (String args[]) {
28
08/04/2020
Prix:20.5 Dh
Une société de textile vend des chemises par catalogue.
Couleur:B
On veut développer un programme pour cette société.
Taille:XL
On sait qu’une chemise possède les caractéristiques suivantes:
Description:40%P,35%N, Slim Fit
• un identifiant- code à barre
Quantité:10
• est disponible en plusieurs coloris– bleu, vert, etc
• est disponible en plusieurs tailles
Chemise2
• a un prix
• a une description – type du tissu, style, etc ID:1266
• une quantité dans le stock Prix:28.5 Dh
Couleur:V
On peut ajouter ou diminuer des chemises du stock. Taille:L
On peut afficher les informations de chaque chemise. Description:30%P,45%N, Large
Quantité:20
Chemise1
ID:1234
Prix:20.5 Dh
Créer les objets chemise 1 et 2 et afficher les Couleur:B
informations les concernant Taille:XL
Description:40%P,35%N, Slim Fit
Quantité:60
57
Classe chemise
public class Chemise{
int id;
char couleur;
float prix;
String description;
int quantite;
void afficherInfoChemise() {
System.out.println(id+ info);
}
}
29
08/04/2020
V. Encapsulation (accessibilté)
• Une classe permet d’envelopper les objets : un objet est vu par le
reste du programme comme une entité opaque.
• L'enveloppement [wrapping] des attributs et méthodes à l'intérieur
des classes plus (+) le contrôle d'accès aux membres de l’objet est
appelé encapsulation.
• Le contrôle d'accès aux membres de l’objet est appelé cacher
l'implémentation: les membres publiques sont vus de l'extérieur
mais les membres privés sont cachés.
L'encapsulation est un mécanisme consistant à rassembler les
données et les méthodes au sein d'une structure 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 services proposés.
59
60
30
08/04/2020
Spécificateurs d’accès:
L'encapsulation permet de définir 3 niveaux de visibilité des éléments de
la classe.
Ces 3 niveaux de visibilité (public, private et protected) définissent les
droits d'accès aux données suivant le type d’accès:
• public: accès depuis l’extérieure (par une classe quelconque)
• private : accès depuis l’intérieure (accès par une méthode de la classe
elle-même)
• protected: se comporte comme private avec moins de restriction. Une
classe dérivée a un accès aux membres protected mais pas aux
membres private.
• Accès par défaut: lorsqu’aucun de ces spécificateurs n’est mentionné.
61
62
31
08/04/2020
ClassA
Déclaration d’un package
ClassB
package pack1;
Package 2
Import d’un package
ClassC
import pack2.ClassC;
ClassD
import pack2.*;
Package 21
64
32
08/04/2020
65
66
33
08/04/2020
67
class A class C
public int x;
private int y;
int z;
protected w; class B class D
private int y La variable private n'est accessible que depuis l'intérieur même de la classe.
34
08/04/2020
Accesseur Mutateur
Getters Setters
getNomDonnee() setNomDonnee ()
70
35
08/04/2020
Exemple:
class Etudiant {
private int cne;
}
72
36
08/04/2020
class Etudiant {
private int cne;
public void setCNE (int cne){
this.cne=cne;
}
}
public class EtudiantTest{
public static void main(String[] args) {
Etudiant e= new Etudiant();
e.setCNE(23541654);
}
}
73
37
08/04/2020
class A class C
public int x;
private int y;
int z;
protected w; class B class D
class A class C
public void meth1(){};
private void meth2(){};
void meth3(){};
protected void meth4(){}; class B class D
38
08/04/2020
class ClasseA {
….
public void f(….) {
…… // ici l’emploi de this désigne la référence à l’objet
// ayant appelé la méthode f
}
}
77
Exemple:
class Etudiant {
private String nom, prenom;
public initialise(String st1, String st2) {
nom = st1;
class Etudiant {
prenom = st2; private String nom, prenom;
} public initialise(String nom, String prenom){
} this.nom=nom;
this.prenom=prenom;
}
}
Comme les identificateurs st1 et st2 sont des arguments muets pour
la méthode initialise(), alors on peut les noter nom et prenom qui
n’ont aucune relation avec les champs private nom et prenom.
Dans ce cas la classe Etudiant peut s’écrire comme suit:
78
39
08/04/2020
class Personne
{
public String nom; Pour lever l’ambiguïté sur le mot « nom »
Personne (String nom) et déterminer si c’est le nom du paramètre
{ ou de l’attribut
this.nom=nom;
}
}
79
objA1.n objA2.n
objA1.y objA2.y
objet objA1 objet objA2 80
40
08/04/2020
81
Considérons la classe:
class ClasseTest {
static int n; // la valeur de n est partagée par toutes les instances
double y;
}
Soient objA1 et objA2 deux instances différentes.
ClasseTest objA1=new ClasseTest(), objA2=new ClasseTest();
objA1 et objA2 partagent la même variable n:
objA1.n et objA2.n désignent la même donnée.
La valeur de l’attribut n est indépendante de l’instance (objet).
- Pour y accéder, on utilise le nom de la classe
ClasseTest.n // champs (statique) de la classe ClasseTest
41
08/04/2020
83
Exemple1:
class ClasseTest {
int n;
double y;
}
public class MethodeStatic{
public static void main(String[] args) {
ClasseTest objA1=new ClasseTest();
objA1.n +=4; // objA1.n vaut 4 puisque n vaut 0
// initialisation par défaut des attributs
ClasseTest objA2=new ClasseTest();
// objA2.n = ?
// objA2.n vaut 0 : initialisation par défauts des attributs.
}
}
84
42
08/04/2020
Exemple2:
class ClasseTest {
static int n; // la valeur de n est partagée par toutes les instances
float y;
}
public class MethodeStatic{
public static void main(String[] args) {
ClasseTest objA1=new ClasseTest();
objA1.n +=4; // objA1.n vaut 4
// équivalent à ClasseTest.n=4;
ClasseTest objA2=new ClasseTest();
// objA2.n = ?
// objA2.n vaut 4 car champs statique .
}
}
85
Variable d’instance:
Etudiant [class]
Chaque instance de la classe possède
ses propres valeurs des variables.
Class Etudiant{
String nom;
etud1 [instance1] etud2 [instance2]
Etudiant(String nom){ nom nom
this.nom=nom; Ahmed Sara
}
}
43
08/04/2020
Etudiant(String nom){
this.nom=nom; etud1 [instance1]
nbrEtudiants++; nom etud3 [instance3]
Ahmed
} nom
} Fatima
Un attribut statique d’une classe est un attribut qui appartient à la classe et qui est partagé par
tous les objets de cette classe.
Un attribut statique est considéré comme étant une variable globale à tous les objets.
Les attributs statiques ne sont pas instanciés dans les objets.
Variable de classe:
On invoque les variables static avec le nom de la classe
class Etudiant{
String nom;
class Test{
static int nbrEtudiants;
public static void main(String[] args){
Etudiant(String nom){
System.out.println(Etudiant.nbrEtudiants);
this.nom=nom;
nbrEtudiants++;
}
}
}
}
44
08/04/2020
Après exécution :
obj1.x = 101
obj1.y = 100
obj2.x = 101
obj2.y = 20
obj3.x = 101
obj3.y = 20
AppliStatic.x = 99
Après exécution :
obj1.x = 101
obj1.y = 100
obj2.x = 101
obj2.y = 20
obj3.x = 101
obj3.y = 20
AppliStatic.x = 99
45
08/04/2020
Variables de classe
Variable de classe
public class UneClasse
{
public static int compteur = 0;
public UneClasse () Utilisation de la variable de classe
{
compteur++; compteur dans le constructeur de
} la classe
}
class AutreClasse
{
public void uneMethode() Utilisation de la variable de classe
{ compteur dans une autre classe
int i = UneClasse.compteur;
}
}
91
class Obj
{ private static long nb=0 ;
public Obj()
{ System.out.print ("++creation objet Obj ; ") ;
nb ++ ;
System.out.println ("il y en a maintenant " + nb) ;
}
}
public class TstObj
{ public static void main (String args[])
Exécution
{ Obj a ;
System.out.println ("Main 1") ; Main 1
a = new Obj() ; ++ creation objet Obj ; il y en a maintenant 1
System.out.println ("Main 2") ; Main 2
Obj b ;
Exécution ???
Main 3
System.out.println ("Main 3") ; ++ creation objet Obj ; il y en a maintenant 2
b = new Obj() ; ++ creation objet Obj ; il y en a maintenant 3
Obj c = new Obj() ;
Main 4
System.out.println ("Main 4") ;
}
} 92
46
08/04/2020
class Obj
{ private static long nb=0 ;
public Obj()
{ System.out.print ("++creation objet Obj ; ") ;
nb ++ ;
System.out.println ("il y en a maintenant " + nb) ;
}
}
public class TstObj
{ public static void main (String args[])
Exécution
{ Obj a ;
System.out.println ("Main 1") ; Main 1
a = new Obj() ; ++ creation objet Obj ; il y en a maintenant 1
System.out.println ("Main 2") ; Main 2
Obj b ;
Exécution ???
Main 3
System.out.println ("Main 3") ; ++ creation objet Obj ; il y en a maintenant 2
b = new Obj() ; ++ creation objet Obj ; il y en a maintenant 3
Obj c = new Obj() ;
Main 4
System.out.println ("Main 4") ;
}
} 93
2. Méthodes de classe/statique
Ce sont des méthodes qui ont un rôle indépendant d’un objet
spécifique. Elles exécutent une action indépendante d’une
instance particulière de la classe.
La déclaration d’une méthode de classe se fait à l’aide du
mot clé static.
L’appel d’une telle méthode ne nécessite que le nom de la
classe correspondante.
47
08/04/2020
Exemple
class Test{
…
private static int n; // attribut de classe
private float x; // attribut d’instance
public static void f() { // méthode de classe
… //ici, on ne peut pas accéder au champs x car champs d’instance
… // ici on peut accéder au champs statique n
}
………
Test obj=new Test() ;
Test.f() ; // appel la méthode de classe f() de la classe Test
obj.f() ; // reste autorisé, mais déconseillé
95
48
08/04/2020
49
08/04/2020
99
Constantes de classe
• Usage
– Ce sont des variables de classes déclarées avec le mot-clé final
– Ce sont des constantes liées à une classe
– Elles sont écrites en MAJUSCULES
– Pour y accéder, il faut utiliser non pas un identificateur d’objet
mais le nom de la classe
Exemple:
public class Galerie {
public static final int MASSE_MAX = 150;
}
if (maVoiture.getPoidsLimite() <= Galerie.MASSE_MAX)
{...}
100
50
08/04/2020
101
51