Vous êtes sur la page 1sur 53

Université A. Mehri.

Constantine (2) Faculté NTIC Département MI


1ère Année MI(2015-2016) Module : Introduction à la Programmation Objet
Pr. F. Magra-Benchikha

Chapitre 1 (Exemple récapitulatif)

Chapitre 1 : Concepts de base de la Programmation Objets


1. Notion d’o jet
2. Notion de classe
3. Instanciation des Objets
4. Constructeurs (Surcharge des méthodes)
5. this v.s this()
6. Affectation des variables de référence
7. Méthodes et envoi de messages
8. Objets membres
9. Variable et méthode de classe
10. Exemple récapitulatif
Module IPO (2015-2016). MI. Constantine2/ 1
Exemple1: Réalisation de la classe Lampe
On veut réaliser la classe Lampe. Une lampe est définie par un état qui
peut être éteint ou allumé. U e la pe peut s’allu e ou s’ tei d e.
public class Lampe {

• État des la pes va ia les d’i sta e


• [Constructeurs]
• Co po te e t des la pes thodes d’i sta e
}
État d’u e la pe :
variable qui indique si la lampe est allumée ou non

allume : type String ("on" / ("off" )


ou type boolean (true ou false)

Module IPO (2015-2016). MI. Constantine2/ 2


Exemple1: Réalisation de la classe Lampe
On veut réaliser la classe Lampe. Une lampe est définie par un état qui
peut être éteint ou allumé. U e la pe peut s’allu e ou s’ tei d e.

public class Lampe {


private boolean allume;

/* Le o st u teu ’est pas essai e : O utilise le


constructeur par défaut Lampe () de java qui met la VI
allume à false */

• Co po te e t des la pes thodes d’i sta e


}
Co po te e t d’u e la pe : • allume ()
• eteint()
Module IPO (2015-2016). MI. Constantine2/ 3
Exemple1: Réalisation de la classe Lampe
On veut réaliser la classe Lampe. Une lampe est définie par un état qui
peut être éteint ou allumé. U e la pe peut s’allu e ou s’ tei d e.

D fi itio d’u e classe = D fi itio d’u ouveau type

public class Lampe {

Une classe est un modèle o u à u e se le d’o jets de


même caractéristiques : État et Comportement

Module IPO (2015-2016). MI. Constantine2/ 4


Exemple1: Réalisation de la classe Lampe
On veut réaliser la classe Lampe. Une lampe est définie par un état qui
peut être éteint ou allumé. U e la pe peut s’allu e ou s’ tei d e.
public class Lampe {

private boolean allume;

public void allume() {allume=true;}


public void eteint() {allume = false;}

}
La classe Lampe est prête pour être utilisée

Utiliser la classe Lampe = créer et manipuler des objets de


type Lampe dans une application JAVA (méthode main)
Module IPO (2015-2016). MI. Constantine2/ 5
Exemple1: Réalisation de la classe Lampe (Test)
Application
Console :
public class Lampe { Execution L'état de la lampe est : false
private boolean allume; L'état de la lampe est : true

public void allume() {allume=true;}


public void eteint() {allume = false;}

public static void main(String[] args) {


Lampe l;
l = new Lampe();
System.out.println("L'état de la lampe est : "+ l.allume);
l.allume();
System.out.println("L'état de la lampe est : "+l.allume); }
}
Module IPO (2015-2016). MI. Constantine2/ 6
Exemple1: Réalisation de la classe Lampe (Test)
Application
Lampe.java TestLampe.java

public class Lampe { Public class TestLampe {


public static void main(String[] args) {
private boolean allume; Lampe l;
l = new Lampe();
public void allume() {allume=true;} System.out.println("L'état de la
public void eteint() {allume = false;} lampe est : "+ l.allume);
} l.allume();
System.out.println("L'état de la
lampe est : "+l.allume); }}

Erreur : The field Lampe.allume is not visible

Module IPO (2015-2016). MI. Constantine2/ 7


Exemple1: Réalisation de la classe Lampe (Test)

Solution : On ajoute un accesseur en lecture ; getXxx()


Lampe.java TestLampe.java
public class Lampe { Public class TestLampe {
public static void main(String[] args) {
private boolean allume; Lampe l;
l = new Lampe();
public void allume() {allume=true;} System.out.println("L'état de la
public void eteint() {allume = false;} lampe est : "+ l.getAllume());
Public boolean getAllume() { l.allume();
return allume;} System.out.println("L'état de la
} lampe est : "+l.getAllume());
}}
Console : L'état de la lampe est : false
L'état de la lampe est : true

Module IPO (2015-2016). MI. Constantine2/ 8


Réalisation de la classe Lampe
On veut réaliser la classe Lampe. Une lampe est définie par un état qui
peut être éteint ou allumé. U e la pe peut s’allu e ou s’ tei d e.

Tout objet de type Lampe :


1. e peut t e a ipul u’à t ave s so i te fa e
o po te e t , .à.d. les thodes d’i sta e public)
• allume()
• eteint()
• getAllume()

2. toutes ses va ia les d’i sta e so t protégées (private)

C’est le principe d’encapsulation

Module IPO (2015-2016). MI. Constantine2/ 9


Exemple2 : Réalisation de la classe Interrupteur
On veut réaliser la classe Interrupteur. Un Interrupteur est défini par une position
(0 ou 1 et la la pe à la uelle il est li . U i te upteu s’allu e et s’ tei t.

public class Interrupteur{

• État des i te upteu s va ia les d’i sta e


• Constructeurs
• Co po te e t des i te upteu s thodes d’i sta e
}

État d’u i te upteu :


position : int (0 ou 1)
lampe : Lampe (objet membre)

Module IPO (2015-2016). MI. Constantine2/ 10


Exemple2 : Réalisation de la classe Interrupteur
On veut réaliser la classe Interrupteur. Un Interrupteur est défini par une position
(0 ou 1 et la la pe à la uelle il est li . U i te upteu s’allu e et s’ tei t.

public class Interrupteur{

private int position;


private Lampe lampe;

• Constructeurs
• Co po te e t des la pes thodes d’i sta e
}

Le constructeur est nécessaire car la classe possède un


objet membre

Module IPO (2015-2016). MI. Constantine2/ 11


Exemple2 : Réalisation de la classe Interrupteur
On veut réaliser la classe Interrupteur. Un Interrupteur est défini par une position
(0 ou 1 et la la pe à la uelle il est li . U i te upteu s’allu e et s’ tei t.

public class Interrupteur{

private int position;


private Lampe lampe;

public Interrupteur () {position =0; lampe = new Lampe();}

• Co po te e t des i te upteu s thodes d’i sta e


}
Co po te e t d’u i te upteu :
allume( : Qua d l’i te upteu s’allu e positio =1 , la la pe s’allu e aussitôt
eteint() : Qua d l’i te upteu s’ tei t positio =0 , la la pe s’ tei t aussitôt

Module IPO (2015-2016). MI. Constantine2/ 12


Exemple2 : Réalisation de la classe Interrupteur
On veut réaliser la classe Interrupteur. Un Interrupteur est défini par une position
(0 ou 1 et la la pe à la uelle il est li . U i te upteu s’allu e et s’ tei t.

public class Interrupteur{

private int position;


private Lampe lampe;

public Interrupteur () {position =0; lampe = new Lampe();}

public void allume() {position = 1; lampe.allume();}


public void eteint () {position = 0; lampe.eteint();}
}

Module IPO (2015-2016). MI. Constantine2/ 13


Classes : Lampe et Interrupteur (Test)
On insère des affichages sur écran pour le test.
Lampe.java
public class Lampe {
private boolean allume;
public void allume() {allume=true; System.out.println("Lampe allumée");}
public void eteint() {allume = false; System.out.println("Lampe éteinte");}
}
Interrupteur.java
public class Interrupteur{
private int position;
private Lampe lampe;
public Interrupteur () {position =0; lampe = new Lampe();}
public void allume() {position = 1; System.out.print("Interrupteur allumé et ");
lampe.allume();}
public void eteint () {position = 0; System.out.print("Interrupteur allumé et ");
lampe.eteint();}
} Module IPO (2015-2016). MI. Constantine2/ 14
Classes : Lampe et Interrupteur (Test)

TestInterrupteur.java
public class TestInterrupteur {
public static void main (String[] args) {
Interrupteur inter;
inter = new Interrupteur();
inter.allume();
inter.eteint();
}}

Console :
Interrupteur allumé et Lampe allumée
Interrupteur éteint et Lampe éteinte

Module IPO (2015-2016). MI. Constantine2/ 15


Classes : Lampe et Interrupteur améliorées
Lampe.java
public class Lampe {
private boolean allume;
public Lampe(boolean allume) {this.allume=allume;} //Constructeurs surchargés
public Lampe() {allume=false;}
public void allume() {allume=true; System.out.println("Lampe allumée");}
public void eteint() {allume = false; System.out.println("Lampe éteinte");}
public boolean getAllume() { return allume;} }

Interrupteur.java
public class Interrupteur{
private int position;
private Lampe lampe;
public Interrupteur () {position =0; lampe = new Lampe();}
public Interrupteur(int position) {this.position= position; switch (position)
{ case 0 : lampe= new Lampe(false) ;break ; case 1 : lampe= new Lampe(true) ;break ;}}
public void allume() {position = 1; System.out.print("Interrupteur allumé et ");
lampe.allume();}
public void eteint () {position = 0; System.out.print("Interrupteur allumé et ");
lampe.eteint();}
public void getPosition() { System.out.println ("Interrupteur est à la position : "+position+"
avec lampe "+lampe.getAllume());} Module IPO (2015-2016). MI. Constantine2/ 16
}
Encapsulation : Lampe et Interrupteur
Lampe lamp1

allume() Allume = true


allume
eteint()
getAllume()

Interrupteur inter1

allume() Position = 1
allume
Lampe=
eteint()
getEtat()

Module IPO (2015-2016). MI. Constantine2/ 17


Classes : Lampe et Interrupteur améliorées (Test)
Test.java
public class Test{ Console :
public static void main (String[] args) { Lampe éteinte
Lampe l;
l= new Lampe(true);
Interrupteur avec position : 0 et lampe false
l.eteint();
Interrupteur allumé et Lampe allumée
Interrupteur inter1; Interrupteur avec position : 1 et lampe true
inter1 = new Interrupteur();
inter1.getEtat(); Interrupteur avec position : 1 et lampe true
inter1.allume(); Interrupteur éteint et Lampe éteinte
inter1.getEtat(); Interrupteur avec position : 0 et lampe false

Interrupteur inter2;
inter2= new Interrupteur(1);
inter2.getEtat();
inter2.eteint();
inter2.getEtat();
}
Module IPO (2015-2016). MI. Constantine2/ 18
Variable de classe et méthode de classe
Pour compter le nombre de lampes créées en ajoute à la classe Lampe la
variable de classe nbLampe. Pour afficher ce nombre, on ajoute la méthode
de classe nombreLampe().
Lampe.java
public class Lampe {
private boolean allume;
private static int nbLampe = 0;

public Lampe(boolean allume) {this.allume=allume; nbLampe++;}


public Lampe() {allume=false; nbLampe++;}
public void allume() {allume=true; System.out.println("Lampe allumée");}
public void eteint() {allume = false; System.out.println("Lampe éteinte");}
public boolean getAllume() { return allume;} }
public static void nombreLampe() {System.out.println ("Le nombre de lampes
créées est : "+nbLampe);}

public static void getAllume() { return allume;} } Erreur


U e thode de lasse e a ipule pas les va ia les d’i sta e
Module IPO (2015-2016). MI. Constantine2/ 19
Variable de classe et méthode de classe (Test)
TestLampe.java
public class TestLampe { Console :
public static void main(String[] args) { Le nombre de lampes créées est : 2
Lampe lamp;
lamp= new Lampe();
lamp = new Lampe(true);

Lampe.nombreLampe();
} }

Questions :
Dans la classe TestLampe :
• Co ie ’a-t-il d’o jets f e s ap s e utio ?
• L’i vo atio de : lamp.nombreLampe() provoque t-elle une erreur?
• L’i vo atio de : nombreLampe() provoque t-elle une erreur?

Module IPO (2015-2016). MI. Constantine2/ 20


Université A. Mehri. Constantine (2) Faculté NTIC Département MI
1ère Année MI(2015-2016) Introduction à la Programmation Objet
Pr. F. Magra-Benchikha

Chapitre 2

Mécanismes de base de la Programmation Orientée Objet

1. Encapsulation des données


2. Héritage
3. Polymorphisme
4. Exemple récapitulatif

Module IPO (2015-2016). MI. Constantine2/ 21


1. Encapsulation des données
Principe :
L’e apsulatio u it les deu o epts suiva ts :
 la notion de module : regrouper ou encapsuler les champs et les
thodes au sei d’u e e st u tu e : la lasse;

 la otio d’a essi ilit : ui pe et de li ite l’a s des ha ps à la


classe dans laquelle ils sont déclarés. Ces champs sont encapsulés pour
e p i e u’ils fo t pa tie e lusive e t de l’i pl e tatio de leu lasse.
Les objets sont manipulés via les méthodes publiques.
Avantages
• p ote tio de l’a s au do es : a is e d’a s / odifi atio
• aug e tatio de la s u it d’u e appli atio
• fa ilit de la ai te a e de l’appli atio
public class Point {
deplace()
private double x, y;

public void deplace (double dx, double dy) {x += dx; y += dy;} Objet getY() x =1 getX()
public void identifie() {System.out.println("Je suis un point");} y =4
public double getX(){ return x;}
Identifie()
public double getY() {return y;}}

Module IPO (2015-2016). MI. Constantine2/ 22


2. M a is e d’h itage Exemple introductif)
Soient les deux classes Point et Point3D réalisées en langage Java.
Classe Point Classe Point3D
public class Point { public class Point3D {
private double x, y; private double x, y, z;

public Point(){x=0; y=0;} public Point3D(){x=0; y=0; z=0;}


public Point (double x, double y) {this.x=x; public Point3D (double x, double y, double z)
this.y=y;;} {this.x=x; this.y=y; this.z=z;}

public void deplace (double dx, double dy) public void deplace (double dx, double dy)
{x += dx; y += dy;} {x += dx; y += dy;}

public void identifie() {System.out.println("Je void deplace (double dx, double dy, double dz)
suis un point");} {x += dx; y += dy; z += dz;}

public double getX(){ return x;} public void identifie() {System.out.println("Je


suis un point3D");}
public double getY() {return y;}}
double getX(){ return x;}

double getY() {return y;}

double getZ() {return z;} 23


Module IPO (2015-2016). MI. Constantine2/
M a is e d’h itage Exemple introductif)
Classe Point Classe Point3D
public class Point { public class Point3D {
private double x, y; private double x, y, z;

public Point(){x=0; y=0;} public Point3D(){x=0; y=0; z=0;}


public Point (double x, double y) Similitude public Point3D (double x, double y, double z)
{this.x=x; this.y=y;;} Différence {this.x=x; this.y=y; this.z=z;}

public void deplace(double dx, double dy) public void deplace(double dx, double dy)
{x += dx; y += dy;} {x += dx; y += dy;}
public void identifie() void deplace(double dx, double dy, double dz)
{System.out.println("Je suis un point"); } {x += dx; y += dy; z += dz;}
public double getX(){ return x;} public void identifie() {System.out.println
public double getY() {return y;}} ("Je suis un point3D"); }
double getX(){ return x;}
double getY() {return y;}
Remarques : double getZ() {return z;}
1. Point3D est un enrichissement de Point avec de nouvelles variables (double z)
2. Point3D est un enrichissement de Point avec de nouvelles méthodes (getZ(), deplace())
3. Point3D possède le comportement défini dans Point (getX(), getY(), deplace(), identifie())
4. Point3D adapte quelques méthodes de Point en les réécrivant (Redéfinition de la méthode
identifie()) Module IPO (2015-2016). MI. Constantine2/ 24
M a is e d’h itage Exemple introductif)
Classe Point Classe Point3D
public class Point { public class Point3D {
private double x, y; private double x, y, z;

public Point(){x=0; y=0;} public Point3D(){x=0; y=0; z=0;}


public Point (double x, double y) Similitude public Point3D (double x, double y, double z)
{this.x=x; this.y=y;;} Différence {this.x=x; this.y=y; this.z=z;}

public void deplace(double dx, double dy) public void deplace(double dx, double dy)
{x += dx; y += dy;} {x += dx; y += dy;}
public void identifie() void deplace(double dx, double dy, double dz)
{System.out.println("Je suis un point"); } {x += dx; y += dy; z += dz;}
public double getX(){ return x;} public void identifie() {System.out.println
public double getY() {return y;}} ("Je suis un point3D"); }
double getX(){ return x;}
double getY() {return y;}
double getZ() {return z;}

La classe Point3D est une extension de la classe Point


OU Point3D est une spécialisation de la classe Point
Module IPO (2015-2016). MI. Constantine2/ 25
M a is e d’h itage
La classe Point3D peut être créée à partir de la classe Point en
utilisa t le a is e d’Héritage ou Sous-classe

Point
double x, y Classe de base (super-classe)

deplace()
Identifie()
getX()
getY()
Point3D hérite de Point

Point3D extends Point


Classe dérivée (sous-classe)
double z

deplace()
Identifie()
getZ()
Module IPO (2015-2016). MI. Constantine2/ 26
M a is e d’h itage
La classe Point3D est créée à partir de la classe Point en utilisant le
a is e d’Héritage ou Sous-classe
Sous-classe (classe dérivée)

Point3D extends Point Point3D


Caractéristiques double x, y Variables héritées
double z de Point3D
Variable ajoutée
double z
deplace() deplace()
Identifie() getX() Méthodes héritées
getZ() getY()
deplace()
Méthodes ajoutées
getZ()
Identifie() Méthode redéfinie

Module IPO (2015-2016). MI. Constantine2/ 27


M a is e d’h itage Ca a t isti ues d’u e sous-classe)

Point 1. Une sous-classe hérite des attributs de sa super-


double x, y classe (double x , y).
deplace()
Identifie() 2. Une sous-classe hérite des méthodes de sa
getX() super-classe (getX(), getY(), deplace()).
getY()
3. Une sous-classe spécialise sa super-classe, en
Point3D extends Point ajoutant de nouveaux attributs (double z) et/ou
de nouvelles méthodes (getZ(), deplace()).
double z
4. Une sous-classe spécialise sa super-classe, en
deplace()
Identifie() redéfinissant les méthodes de sa super-classe
getZ() (identifie()).

Module IPO (2015-2016). MI. Constantine2/ 28


M a is e d’h itage Ca a t isti ues d’u e sous-classe)

1. Une sous-classe spécialise une seule super-


classe Héritage simple: adopté dans JAVA.
L’e se le des lasses fo e une arborescence
ou u a e d’h itage.
2. Une sous-classe spécialise une ou plusieurs
super-classes Héritage multiple: Interdit
dans JAVA et adopté dans C++ et Smalltalk.
L’e se le des lasses fo e un treillis
d’h itage.
3. Une classe peut être spécialisée par une ou
plusieurs sous-classes
4. Une sous-classe peut à son tour être spécialisée
par une autre classe

Module IPO (2015-2016). MI. Constantine2/ 29


M a is e d’h itage

L’héritage est un mécanisme:

1. fondamental de la POO

2. par lequel on définit, par spécialisation, de nouvelles classes


(classes dérivées) à partir de classes existantes (classes de base)
3. d’organisation des classes en hiérarchie
4. de réutilisation de composants logiciels (Classes)

Module IPO (2015-2016). MI. Constantine2/ 30


M a is e d’h itage Création de sous-classe)
Point : Classe de base, super-classe
public class Point {
protected double x, y;

public Point(){x=0; y=0;}


public Point (double x, double y) {this.x=x; this.y=y;;}
public void deplace(double dx, double dy) {x += dx; y += dy;}
public void identifie() {System.out.println("Je suis un point");}
public double getX(){ return x;}
public double getY() {return y;}}

Point3D : Classe dérivée, sous-classe Héritage


public class Point3D extends Point {
protected double x, y, z;
Super();
Super(x, y);
public Point3D(){ x=0; y=0; z =0;}
public Point3D (double x, double y, double z)
{this.x=x; this.y=y; this.z=z;} Super.deplace(dx, dy)
ou deplace(dx, dy)
void deplace(double dx, double dy, double dz) {x += dx; y += dy; z += dz;}
public void identifie() {System.out.println("Je suis un point3D");}
public void deplace(double dx, double dy) x += dx; y += dy;}
{double getX(){ return x;}
double getY() {return y;}
double getZ() {return z;} 31
Module IPO (2015-2016). MI. Constantine2/
M a is e d’h itage Création de sous-classe)
Point : Classe de base, super-classe
public class Point {
protected double x, y; Va ia les d’i sta e h it es pa la lasse Poi t3D

public Point(){x=0; y=0;}


public Point (double x, double y) {this.x=x; this.y=y;;}

public void identifie() {System.out.println("Je suis un point");}

public double ge tX(){ return x;} M thodes d’i sta e h it es pa la lasse Poi t3D
public double getY() {return y;}}
public void deplace(double dx, double dy) {x += dx; y += dy;}

Point3D : Classe dérivée, sous-classe Héritage


public class Point3D extends Point {

protected double z; Variable ajoutée

public Point3D() { Super(); z =0;}


public Point3D (double x, double y, double z) { Super(x, y); this.z=z;}

public void identifie() {System.out.println("Je suis un point3D");}

Méthode redéfinie
public void deplace (double dx, double dy, double dz)
{ super. deplace(dx, dy); z += dz;} Méthodes ajoutées
public double getZ() {return z;} } 32
Module IPO (2015-2016). MI. Constantine2/
M a is e d’h itage Création de sous-classe)
Accessibilité :

U e thode d’u e lasse d iv e ’a pas a s au


membres privés de sa classe de base.

Le odifi ateu d’a s protected est introduit pour permettre


aux sous- lasses d’a de au e es des super-classes.

public class Point {


protected double x, y;
……
Modifi ateu s d’a s: public
private
protected

Module IPO (2015-2016). MI. Constantine2/ 33


M a is e d’h itage Création de sous-classe)
Construction et initialisation des objets dérivés : (1)

En Java, le constructeur de la classe dérivée doit prendre en charge


l’i t g alit de la o st u tio de l’o jet.
U o st u teu d’u e lasse d iv e appelle u o st u teu d’u e
classe de base en utilisant super(). super() doit obligatoirement être la
première instruction du constructeur.

public class Point {

public Point3D() { Super(); z =0;}


public Point3D (double x, double y, double z) { Super(x, y); this.z=z;}

Attention :
1. Super() ’est appel u’à pa ti d’u o st u teu .
2. L’appel pa super() ne concerne que le constructeur de la classe de base du niveau
immédiatement supérieur.

Module IPO (2015-2016). MI. Constantine2/ 34


M a is e d’h itage Création de sous-classe)
Construction et initialisation des objets dérivés : (2)
public class Point {

public Point3D() { Super(); z =0;}


public Point3D (double x, double y, double z) { Super(x, y); this.z=z;}
…}

Remarque 1:
Le constructeur Java par défaut est appli u e as d’a se e d’u o st u teu da s
la sous-classe.

Remarque 2: (super v.s super() )


super permet de pointer la super-classe immédiate
super() pe et l’appel du o st u teu de la super-classe immédiate

Module IPO (2015-2016). MI. Constantine2/ 35


M a is e d’h itage Création de sous-classe)
Redéfinition des méthodes (1)
Redéfinir une méthode consiste à créer dans une sous-classe une
méthode dont la signature (nom, nombre, type et ordre des
arguments) est identique à celle de la super-classe.
La nouvelle méthode "masque " alors celle de la super-classe.

public class Point3D extends Point {

public void identifie() { System.out.println("Je suis un point3D");}


….

Remarque 1:
La méthode identifie() est dite méthode polymorphe

Module IPO (2015-2016). MI. Constantine2/ 36


M a is e d’h itage Création de sous-classe)
surcharge (overloading) et Redéfinition (overriding) des méthodes
Surcharge : permet la définition de plusieurs méthodes de même nom
au iveau d’u e e lasse les méthodes surchargées sont
différentes par le nombre et le type de leurs arguments).

Redéfinition : permet la redéfinition (fournir un nouveau code en


préservant la signature d’u e thode de la super-classe dans une
sous-classe

Dans la classe Point3G :

public void identifie() Méthode redéfinie

public void deplace (double dx, double dy, double dz)


public void deplace(double dx, double dy) Méthodes surchargées

Module IPO (2015-2016). MI. Constantine2/ 37


M a is e d’h itage Exe ple d’éxecution)
C atio et a ipulatio d’o jets d iv s
public class TestPoint3D {

public static void main { String[] args) {

Point3D pt = new Point3D (2,3,4);

pt.identifie();

System.out.println ("Coordonnées "+ pt.getX()+" "+pt.getY()+" "+pt.getZ());

pt.deplace(1,1,1);

System.out.println ("Coordonnées "+ pt.getX()+" "+pt.getY()+" "+pt.getZ());

Exécution Console
Je suis un point3D
Coordonnées 2.0 3.0 4.0
Coordonnées 3.0 4.0 5.0
Module IPO (2015-2016). MI. Constantine2/ 38
M a is e d’h itage La Super-classe Object) (1)
Dans le langage java, toutes les classes étendent la classe générique Object.
Object définit le Comportement spécifique à tous les objets Java.

public class Point extends Object {


………..
}

Les méthodes définies dans Object peuvent être redéfinies dans les sous-
classes. Exemple :
1. La thode d’i sta e toString() retourne une chaîne (String) contenant :
• le o de la lasse o e e,
• l’ad esse de l’o jet e he ad i al p d e de @ .

2. La thode d’i sta e equals(Object o) compare les adresses des deux


objets concernés et retourne un boolean. Ainsi, avec :
Object o1 = new Point (1, 2) ;
Object o2 = new Point (1, 2) ;
L’e p essio o1.equals(o2) retourne la valeur false. 39
M a is e d’h itage La Super-classe Object) (2)
Redéfinition de la méthode toString() dans les classes : Point, Point3D.

public class Point { public class TestPoint {


protected double x, y; Public static void main(String[] args) {
…… Point monPoint;
public String toString () {
return "Mes coordonnées : "+x+ " "+y; }} monPoint = new Point(10,20);
System.out.println(monPoint);
public class Point3D extends Point{ monPoint= new Point3D(5, 6, 7);
protected double z;
System.out.println(monPoint);
…….
public String toString () {
return "Mes coordonnées : "+x+ " "+y+" "+z; } }
Exécution

Mes coordonnées : 10.0 20.0


Mes coordonnées : 5.0 6.0 7.0

Module IPO (2015-2016). MI. Constantine2/ 40


M a is e d’h itage Le modificateur final)

Les classes et les méthodes final


Une classe déclarée final ne peut pas être dérivée par une
sous-classe..

public final class nom {…..}

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


dans une classe sous-classe.

public final void nomClasse {…}

Une variable déclarée final est constante


public final double pi = 3.14;

Module IPO (2015-2016). MI. Constantine2/ 41


M a is e d’h itage Exe ple d’appli atio )
Réaliser la classe Point3DColoré. Un objet de type point3DColoré est un
point 3D qui possède une couleur. Cette dernière peut être modifiée.
public class Point3DColoré extends Point3D {
protected String couleur ;

public Point3DColoré () { super(); couleur = "Blanc " ; }


public Point3DC oloré (double x, double y, double z, String c) { super(x, y, z); couleur=c;}

public void identifie() {System.out.println("Je suis un point3D coloré");}


public void setCouleur(String c) {couleur = c;} }

Point3DColoré
double x, y, z Variables héritées
Caractéristiques String couleur; Variable ajoutée
de Point3DColoré deplace()
deplace()
getX() Méthode héritées
getY()
getZ()
Identifie() Méthode redéfinie
setCouleur() Méthode ajoutée
42
M a is e d’h itage Exe ple d’appli atio )
Caractéristiques des objets de classes dérivées
Le a is e d’h itage pe et :
1. l’h itage de ode
2. l’h itage de t pe

Point3Doloré pt = new Point3DColoré (2,3,4, "Bleu");

pt est de type Point3DColoré


Point3D
Point
Object

Remarques :
• A la atio d’u o jet de sous-classe, un emplacement est attribué à chaque variable
d’i sta e de la lasse et à ha ue va ia le d’i sta e h it e des super-classes.

• U o jet d’u e sous-classe accède à toutes les méthodes de la classe et toutes les
méthodes des super-classes .
Module IPO (2015-2016). MI. Constantine2/ 43
3. Mécanisme de Polymorphisme (Principe)
Principe :
Le pol o phis e pe et d’o te i u o po te e t adapt à
ha ue t pe d’o jet, sa s avoi esoi de teste sa atu e de uel ue
façon que ce soit.

 il se traduit par :
1. Le principe de substitution

2. Le mécanisme de liaison dynamique

Module IPO (2015-2016). MI. Constantine2/ 44


Mécanisme de Polymorphisme (Principe)
Principe de substitution:
Co siste à affe te à u e va ia le o jet d’u e lasse o seule e t
une référence à un objet de la classe, mais aussi une référence à un
o jet d’u e sous-classe Transtypage de variable

public class TestPoint3DColoré {


Type déclaré public static void main { String[] args) {

Point monPoint ;
Type réel

monPoint= new Point3D(5, 6, 7);


Type réel

monPoint= new Point3DColoré (2,3,4, "Bleu");

Module IPO (2015-2016). MI. Constantine2/ 45


Mécanisme de Polymorphisme (Principe)
Liaison dynamique: (1)
La solutio d’u e thode se fait e deu te ps :
1. au compile time : on vérifie si la méthode est possible sur le
type déclaré de l’o jet;
2. Au run time : on cherche la méthode la plus précise étant
donné le type réel ou effectif de l’o jet
mécanisme de liaison dynamique
public class TestPoint3DColoré {
public static void main { String[] args) {
Résolution de la méthode :
Point monPoint; Compite time: Méthode possible
monPoint= new Point3D(5, 6, 7); Run time: Appliquer identifie() définie dans
monPoint.identifie(); Point3D

monPoint= new Point3DColoré (2,3,4, "Bleu");


monPoint.identifie(); Résolution de la méthode :
System.out.println (monPoint.getX()) Compite time: Méthode possible
Run time: Appliquer getX() définie dans Point
Execution Je suis un point3D
Je suis un point3DColoré 2
Module IPO (2015-2016). MI. Constantine2/ 46
Mécanisme de Polymorphisme (Principe)
Liaison dynamique: (2)
Définition de
Redéfinition de la la méthode
méthode

Définition initiale
de la méthode

Le essage est e vo à l’o jet puis


transmis à la hiérarchie de classes Le essage est e vo à l’o jet
jus u’à e u’u e d fi itio soit puis transmis à la hiérarchie de
trouvée (la première) lasses jus u’à e u’u e
définition soit trouvée

Point monPoint
monPoint= new Point3DColoré (2,3,4, "Bleu");
monPoint.identifie();
System.out.println (monPoint.getX()) 47
Mécanisme de Polymorphisme (Principe)
Important
Le polymorphisme est très utile pour la création et la manipulation
d’e se les eg oupa t des o jets de lasses diff e tes o e da s
l’e e ple suiva t :

public class TestPoints {


public static void main { String[] args) {
point[] tableau = new Point[4];

tableau[0] = new Point3D(10,20,30);


tableau[1] = new Point(3,6);
tableau[2] = new Point3DColoré(4,8,9, "Blanc");
tableau[3] = new Point(7,12);

for (int i = 0 ; i < tableau.length ; i++) { tableau[i].identifie(); }


}

Execution Je suis un point3D


Je suis un Point
Je suis un point3DColoré
Je suis un Point Module IPO (2015-2016). MI. Constantine2/ 48
Mécanisme de Polymorphisme (Transtypage : custing)

public class TestPoint { Résolution de la méthode :


public static void main { String[] args) { Compite time: Méthode possible par
héritage de type (transtypage implicite)
Point3D monPoint; Run time: Appliquer deplace() définie dans
Point.
monPoint= new Point3DColoré (2,3,4, "Bleu");
monPoint.deplace(10,20); Résolution de la méthode :
Compite time: Méthode impossible
monPoint.setCouleur("Bleu"); (Unresolved compilation problem:
The method setCouleur(String) is
undefined for the type Point3D)
Solution : Transtypage explicite

public class TestPoint {


public static void main { String[] args) {

Point3D monPoint;
monPoint= new Point3DColoré (2,3,4, "Bleu");
monPoint.deplace(10,20);

((Point3DColoré) monPoint).setCouleur("Vert");
Module IPO (2015-2016). MI. Constantine2/49
Mécanisme de Polymorphisme (Transtypage : custing)

Important :
Le transtypage est déconseillé en POO. Il peut être
évité en utilisant le concept de méthode abstraite
définie dans une classe abstraite ou interface
(A voir dans le module 2ème Année licence LMD).

Module IPO (2015-2016). MI. Constantine2/ 50


Pa uetage et d oits d’a s 1)

 Un package est u o ept pe etta t d’o ga ise e hi a hie les


classes java (à la manière des répertoires);
 U pa kage e fe e les lasses d’u e th e dites friendly;
 Un package est un espace de nommage associé à un contexte (Il est
i possi le d’att i ue le e o à deu lasses diff e tes da s le e pa kage
 Chaque classe java existe dans un package défini et possède la déclaration :
package <nom-package>.<nom-classe> Ex: package java.util.ArrayList

 Pou l’utilisatio d’u e lasse appa te a t à u aut e pa kage, le a is e


d’i po t est e ploit :
import <nom-package>.<nom-classe> ;
Ex: import java.util.ArrayList (pour l’utilisatio de la classe Arraylist)
ou
import <nom-package>.* ;
Ex: import java.util.*; (pour l’utilisatio de toutes les classes du package))

51
Pa uetage et d oits d’a s 2

Ta leau su a t la visi ilit d oits d’a s

Classe Package Sous-classe Ailleurs


private oui non non non
default oui oui non non
(friendly)
protected oui oui oui Non
public oui oui oui oui

Remarque : L’o d e de p io it des odifi ateu s d’a s


est du plus restrictif au moins restrictif : private , friendly,
protected et public .

Module IPO (2015-2016). MI. Constantine2/ 52


Conseils pour la conception de classes
1. Les données doivent être privées. (Appli uez le p i ipe d’e apsulatio )
2. Initialisez toujours les données. (Insérez des constructeurs)
3. N’a usez pas des t pes de ase da s u e lasse (utilisez plutôt des classes).
4. Tous les ha ps ’o t pas esoi de thodes d’a s et de thodes
d’e odifi atio .
5. Utilisez un format standard pour la définition de vos classes.
Chaque définition de classe est organisée ainsi :
– thodes d’i sta e ;
– méthodes statiques ;
– ha ps d’i sta e ;
– champs statiques.
6. Subdivisez les classes ayant trop de responsabilités.
7. Donnez des noms significatifs à vos classes et à vos méthodes.

Fin du Programme IPO (1ère Année MI)

Module IPO (2015-2016), Pr. F.Magra-Benchikha / 53

Vous aimerez peut-être aussi