Vous êtes sur la page 1sur 37

Cour de la programmation en JAVA

De l’école supérieure de technologie de Guelmim


Université Ibn Zohr

Chap.2

Programmation Orientée Objet (POO)

1
Plan de ce chapitre
 Objets, instances et classes

 Classes en Java

 Variables d’instance

 Méthodes d’instance

 Encapsulation et droits d'accès

 L’objet this et le masquage


Rappel: Programmation procédurale
opèrent sur

traitements données

influencent

Instructions et expressions Variables


branchements conditionnels Tableaux
les boucles conditionnelles Chaine de caractères
fonctions Pointeurs
Structures
3
SEDKI A.
Programmation procédurale: exemple
class exemple{
public static void main(String[] args) {
double largeur = 2.0;
double hauteur= 3.0;
System.out.println("Surface du rectangle : " +
surface( largeur, hauteur) );
}

static double surface(double largeur, double hauteur)


{
return (largeur * hauteur);
}
} 4
SEDKI A.
Programmation Orienté Objet (POO): exemple
class Rectangle
{
double hauteur;
double largeur;
double surface ( )
{
return hauteur * largeur;
}
}

class Principale
{
public static void main (String[] args) {
Rectangle rect = new Rectangle();
rect.hauteur = 3.0;
rect.largeur = 4.0;
System.out.println("surface : " + rect.surface()); }
}
5
Programmation Orienté Objet (POO):
Un des objectifs principaux de POO :
 organiser des programmes complexes grâce aux
notions :

 d’encapsulation
 d’héritage
 et de polymorphisme

6
SEDKI A.
Notions d’Encapsulation
Principe d’encapsulation :
 regrouper en une seule entité informatique les données et les
traitements qui lui sont spécifiques :
 attributs (champs) = les données
 méthodes : les fonctions (= traitements)

 Le résultat des processus d’encapsulation s’appelle une classe


 La notion de classe généralise la notion de type
 La notion d’objet généralise la notion de variable

7
SEDKI A.
Les classes en Java
 En Java une classe se déclare par le mot-clé class:
Syntaxe : Exemple :
class nom_classe class Rectangle
{ {
... ...
} }

 Ceci définit un nouveau type Rectangle.

 La déclaration d’un objet (une instance) d’une classe se


fait de façon similaire à la déclaration d’une variable classique :
Syntaxe : Exemple :
nom_classe nom_objet; Rectangle rect1;
 Ceci déclare une variable rect1 de la classe Rectangle.
8
SEDKI A.
Déclaration des attributs et méthodes
Une classe est constituée de :
 variables, ici appelées attributs (ou champs)
 fonctions manipulant les attributs, ici appelées méthodes

class Rectangle
{
double hauteur;
double largeur;

double surface ()
{
return hauteur * largeur;
}
}
9
SEDKI A.
Définition des méthodes
 La syntaxe de la définition des méthodes d’une classe est la
syntaxe normale de définition des fonctions.
 mais elles sont simplement mises dans la classe elle-même.
Exemple : la méthode surface() class Rectangle
de la classe Rectangle : {
double hauteur;
double largeur;
double surface ( )
{
return hauteur * largeur;
}
mais où sont passés les paramètres ?
}
double surface(double hauteur, double largeur)
{
return hauteur * largeur;
}
10
SEDKI A. (Portée des attributs: transp. suivant)
Portée des attributs
 Les attributs d’une classe constituent des variables
directement accessibles par toutes les méthodes de la
classe (i.e. « des variables globales à la classe »).

 Il ne faut donc pas passer les attributs comme


paramètres aux méthodes de la classe !

class Rectangle
{
double hauteur; accessibles par
double largeur; toutes les méthodes
de la classe Rectangle
double surface ()
{
return hauteur * largeur;
}
}
11
SEDKI A.
Paramètres des méthodes
Les méthodes peuvent avoir des paramètres de
l'extérieur de la classe ceux qui sont nécessaires.

class Rectangle
{
double hauteur;
double largeur;

// ...
void initialise(double h, double l)
{
// ...
}
}

12
SEDKI A.
Déclaration-intialisation d’un objet
L’instruction :
nomClasse objet = new nomClasse();
 crée un objet de type nomClasse et initialise tous
ses attributs avec des valeurs par défaut :
int 0
double 0.0
boolean false
objet null
Exemple :
class ClassePrincipale {
public static void main (String[] args) {
Rectangle rect1 = new Rectangle();
// ....
}
}
13
SEDKI A.
Où déclarer les classes ?
Déclaration de plusieurs classes dans le même projet: la classe Rectangle
et la classe qui l’utilise (ClassePrincipale) déclarées dans le même projet
class Rectangle
{
double hauteur;
double largeur;
// ....
}

class ClassePrincipale
{
public static void main (String[] args)
{
Rectangle rect1 = new Rectangle();
// ....
}
} 14
SEDKI A.
Accès aux attributs
class Rectangle L’accès aux valeurs des
{
double hauteur; attributs d’un objet:
double largeur;
nomObjet.nomAttribut
}
class Exemple
{
public static void main (String[] args)
{
Rectangle rect1 = new Rectangle();
rect1.hauteur = 2.0;
rect1.largeur = 3.0;
System.out.println("hauteur : " + rect1.hauteur);
}
}
SEDKI A. 15
Appels aux méthodes
class Rectangle
{
double hauteur;
double largeur;
double surface ()
{
return hauteur * largeur;
}
} nom_objet. nom_methode(par1, ...);
class Exemple
{
public static void main (String[] args)
{
Rectangle rect = new Rectangle();
rect.hauteur = 3.0;
rect.largeur = 4.0;
System.out.println("surface : " + rect.surface());
}
}
SEDKI A. 16
Résumé : Accès aux attributs et méthodes
 Chaque objet (instance) a ses propres attributs :
 aucun risque de confusion d’un objet à une autre.

Exemple :
rect1 rect2

rect1.hauteur 1.5 3.5 rect2.hauteur

rect2.largeur
rect1.largeur 2.0 4.0
rect2.surface() : méthode surface de la classe Rectangle
s’appliquant à rect2
17
SEDKI A.
Résumé : Accès aux attributs et méthodes
 Chaque objet (instance) a ses propres attributs :
 aucun risque de confusion d’un objet à une autre.

Exemple :

18
SEDKI A.
Exercice: Volume d’un Cône
Écrivez un programme qui calcule le volume d’un cône.
Vous utiliserez une classe Cone :

class Cone
{
...
}

V=

19
SEDKI A.
Fonctions mathématiques
Java fournit les fonction mathématiques usuelles, ainsi que des
constantes comme PI.

 Ces fonctions et constantes s'utilisent en suivant la notation:

Math.nomMethode(expression1, expression2, ...);

Math.nomConstante;

class ExempleMathematique
{
public static void main(String[] args) {
double angle = 10 * Math.PI / 180;
double s = Math.sin(angle);
}
}
20
SEDKI A.
Exercice
Définir une classe Point permettant de manipuler un point
d’un plan. On prévoira :

1. une méthode pour initialise les coordonnées d’un point

2. une méthode deplace effectuant une translation pour


modifier les coordonnées d’un point

3. une méthode affiche pour affiche les coordonnées d’un


point.

4. Écrire un petit programme d’essai (main) initialisant un


point, l’affichant, le déplaçant et l’affichant à nouveau.

21
SEDKI A.
Objets en mémoire
 Pour désigner des objets dans une classe, on utilise des
variables d’un type particulier : les références (adresses)
 Une référence contient l’adresse d’un objet

 Déclarer une référence ne crée pas d’objet


 une référence n’est pas un objet, c’est un
nom pour accéder à un objet

Rectangle rect = new Rectangle();


class Rectangle {
double hauteur;
double largeur;
0.0 rect.hauteur

0.0 rect.largeur double surface () {


return hauteur * largeur;
}
rect
}
(une référence) 22
SEDKI A.
Encaspuslation

En plus du regroupement des données et des traitements


relatifs à une classe, l’encapsulation permet en effet de
définir deux niveaux de perception :

 Le niveau externe : partie « visible (public) » (par les


utilisateurs) de l’objet : c’est l’interface de l’objet avec
l’extérieur.

 Le niveau interne : partie « cachée (privée) » (par le


programmeur) détails d’ implémentation de l’objet.

23
SEDKI A.
Les droits d'accès
En générale, il existe deux droits d'accès différents :
public : l'attribut ou la méthode peut être utilisé depuis
l'extérieur de la classe.
private : l'attribut ou la méthode ne peut pas être utilisé
depuis l'extérieur de la classe.
class Rectangle
{
private double hauteur;
private double largeur;

public double surface ()


{
return hauteur * largeur;
}
}
24
SEDKI A.
Droit d’accès private
 private = inaccessible depuis l'extérieur de la classe.
class Rectangle
{
private double hauteur;
private double largeur;
public double surface ()
{
return hauteur * largeur;
}
}
class Exemple
{
public static void main (String[] args)
{
Rectangle rect1 = new Rectangle();
rect1.hauteur = 3.0; Erreur de compilation:
} error: hauteur has private
} access in Rectangle 25
SEDKI A.
Encapsulation
En générale, pour respecter le class Rectangle
principe de l’encapsulation: {
private double hauteur;
 private : private double largeur;
Tous les attributs
public double surface ()
 Public : {
Quelques méthodes bien return hauteur * largeur;
choisies (interface) }
}
class Exemple
{
Tous les attributs sont privés ! public static void main (String[] args)
Et si on a besoin de les {
utiliser depuis l’extérieur Rectangle rect1 = new Rectangle();
de la classe ?! rect1.hauteur = 3.0;
}
} 26
SEDKI A.
Méthodes d’accès aux données
Si le programmeur le juge utile, pour accéder aux quelques
attributs de la classe, il faut inclure les méthodes d’accès
correspondantes qui sont publiques:

1. Accesseurs (« méthodes get ») :


 Accès en consultation (affichage)
 Retour de la valeur d’un attribut de l’objet.
public double getHauteur() { return hauteur; }
public double getLargeur() { return largeur; }

2. Manipulateurs (« méthodes set ») :


 Accès en modification.
 Affectation de l’argument à un attribut de l’objet
public void setHauteur(double h) { hauteur = h; }
public void setLargeur(double l) { largeur = l; }
27
SEDKI A.
Notre exemple
class Rectangle class Exemple
{ {
private double hauteur;
public static void main (String[] args)
private double largeur;
{
public double getHauteur() Rectangle rect = new Rectangle();
{ return hauteur; } rect.setHauteur(3.0);
public double getLargeur()
rect.setLargeur(4.0);
{ return largeur; }
System.out.println("hauteur : "
public void setHauteur(double h)
+ rect.getHauteur());
{ hauteur = h; }
}
public void setLargeur(double l)
}
{ largeur = l; }
public double surface()
{ return hauteur * largeur; }
} 28
SEDKI A.
Intérêt encapsulation et « Accesseurs », « Manipulateurs »

 Fastidieux d’écrire des « Accesseurs »/« manipulateurs » :


 pourquoi ne pas tout laisser en public !! ?

class Rectangle
{
public double hauteur;
public double largeur;
}

 mais dans ce cas . . .


Rectangle rect = new Rectangle();
rect.hauteur = -36;

29
SEDKI A.
Intérêt encapsulation (2)
Masquer l’implémentation facilite évolution du logiciel

Modification de
l’implémentation sans
impact sur le code utilisant
la classe si la partie
publique (l’interface de la
classe) demeure inchangée
SEDKI A. 30
Masquage
 masquage = un identificateur « cache » un autre identificateur
 situation typique en POO : un paramètre cache un attribut

public void setHauteur(double hauteur)


{
hauteur = hauteur; //ambiguïté
}

31
SEDKI A.
Masquage et this
Si, dans une méthode, un attribut est masqué alors la valeur de
l’attribut peut être référencée à l’aide du mot réservé this.

 this est une référence à l’objet courant (ayant appelé la


méthode).

public void setHauteur(double hauteur)


{
this.hauteur = hauteur;
}

 L’utilisation de this est obligatoire dans les situations


de masquage (mais on peut éviter ces situations en
choisissant des noms différents)
32
SEDKI A.
Droit d’accès par défaut
En Java, il est possible de regrouper les classes relatives à
un concept commun en package (bibliothèques).

 Si aucun droit d’accès n’est spécifié, alors les


attributs/méthodes sont par défaut publiquement
accessibles par toutes les autres classes du même
package, mais pas en dehors de celui-ci !

 Il est recommandé de mettre explicitement public

33
SEDKI A.
Droit d’accès - Portée des attributs (résumé)

class MaClasse {
private int x;
private int y;

public void uneMethode( int x )


{
... y ...
... x ...
... this.x ...
}
} 34
SEDKI A.
Exercice: Volume d’un Cône
Écrivez un programme qui calcule le volume d’un cône.
Vous utiliserez une classe Cone :

class Cone
{
...
}

V=

35
SEDKI A.
Exercice d’application
 Le but de cet exercice est de reprendre les exemples du cours illustrant les
notions d'objet et de classe :
Commencez par créer un projet TP1 et ouvrir un fichier MainRectangle.java et
définissez-y la classe Rectangle qui a deux champs largeur et longueur.
class Rectangle
{
private double largeur;
private double longueur;
//………………
}

1) Ajoutez à la classe Rectangle une méthode initialise permettant


d’initialiser leurs champs.
2) Ajoutez à votre classe une méthode surface, qui calcule la surface du
rectangle.
3) Testez votre programme en déclarant et initialisant deux objets rect1 et
rect2 de la classe Rectangle et en affichez la surface.

36
SEDKI A.
 Supposons maintenant que nous souhaitions modifier les valeurs des
champs dans le programme principal:
……….
class MainRectangle {

public static void main(String[] args) {


..................
rect.largeur = 5.2;
rect.longueur = 6.8;
System.out.println("longueur= "+rect.largeur + ", longueur= "+
rect.longueur);
}
}
4) Essayez de recompiler votre programme. Que se passe-t-il ?
Tous les champs sont privés. Cela veut dire qu'on ne peut pas les utiliser hors
de la classe (on n'a pas le droit de faire, par exemple, rect.largeur).
Pour rendre un champ accessible depuis l'extérieur de sa classe, ajoutez à
votre classe les méthodes "set" et "get" correspondantes à chaque champ, de
sorte à ne pas mettre des valeurs négatives aux champs (l'accès direct aux
champs, sans passer par des méthodes, n'offre pas cette sécurité).
5) Dans le programme principal, modifiez les valeurs initiales des champs
par des valeurs fournies au clavier. 37
SEDKI A.

Vous aimerez peut-être aussi