Programmation Par Objets et Langage Java
Partie III. La Programmation Objets en Java

Najib Tounsi

Table des matières

  1. Table des matières
  2. Les Concepts de la POO
  3. Objets et Classe d'Objets
  4. Champ, Méthode, Envoie de Message
  5. Exemple
  6. Instanciation d'objet
  7. Instanciation d'objet
  8. Notation
  9. Référence this
  10. Accès au données d'un objet
    1. Consulter un attribut de l'objet
  11. Accès au données d'un objet
    1. Caractéristique publiques / privées d'un objet
  12. La Classe Article en Java
  13. La Classe Article en Java
  14. Relations Entre Classes
  15. Première Relation Entre Classe
    1. Relation Utilise «Uses »
  16. Relation Utilise «Uses»
    1. Relation utilise «uses»
  17. Relation Utilise «Uses »
    1. Considérations sémantiques
  18. La classe Article En Java
  19. La Relation Utilise En Java
  20. Les Constructeurs
  21. Les Constructeurs Article
    1. Constructeurs de classe Article
  22. Les Constructeurs Article
  23. Constructeur par Copie
  24. Destruction d'objets (le ramasse-miettes)
  25. Destruction d'objets (le ramasse-miettes)
  26. Méthode finalize
  27. 2e Relation Entre Classes: Héritage de Classe
    1. Relation Hiérarchique «ISA»
  28. Héritage de Classes: Relation «ISA»
  29. Héritage de Classes: Relation «ISA»
  30. Héritage de Classes: Relation «ISA»
  31. Héritage de Classes: Relation «ISA»
  32. Arbre d'héritage
  33. Sous Classes en Java - Exemple1
  34. Sous Classes en Java - Exemple1
  35. Sous Classes en Java - Exemple1 (Constructeurs)
  36. Sous Classes en Java - Exemple2  (notion de override)
  37. Sous Classes en Java (notion de protected)
  38. Les Sous Classes en Java
  39. Polymorphisme
  40. Polymorphisme
  41. Polymorphisme
  42. Polymorphisme
    1. Autre Exemple
  43. Polymorphisme
  44. Polymorphisme
  45. A propos des méthodes static
  46. La Superclasse Object
  47. Les méthodes héritées de Object ...
  48. Les méthodes héritées de Object
  49. Méthode equals () ...
  50. Méthode equals () ...
  51. Méthode equals () ...
  52. Méthode equals()
  53. Méthode clone (), Copie d'Objets
  54. Méthode clone (), Copie d'Objets
  55. Méthode clone (), Copie d'Objets
    1. Clonage superficiel. @@@
  56. Méthode clone(), Copie d'Objets
    1. Copie en profondeur
  57. Classes Abstraites
  58. Classes Abstraites
  59. Les Interfaces Java
  60. Implémentation des Interfaces
  61. Héritage "Multiple"
  62. Héritage "Multiple"


Les Concepts de la POO

Objets et Classe d'Objets

✔   Objets et Classes d'Objets              

Une classe, est une implantation d'un TAD. Un TAD définit un ensemble d'objets caractérisé par les opérations qui leur sont applicables.

Champ, Méthode, Envoie de Message

Figure de classe
Encapsulation des données et des traitements
dans une classe, ici une pile


Champ :       Donnée faisant partie de la représentation d'un objet
Méthode :
Opération de manipulation d'un objet
Envoie de message :
demande d'exécution d'une méthode sur un objet


Note: Champs et méthodes sont appelés membres (field member, method member) en Java et C++.

Exemple

Une classe Article de commerce.

Classe Article
champs
    numéro;
    nom;
    prixHT;
    qte;
méthodes
    prixTTC () { return prixHT * 1.14; }
    ajouter (int q) { qte = qte + q; }
    retirer (int q) { qte = qte - q; }
fin
 
Champs et Méthodes  ➪
caractéristiques (features).
Identificateurs  ➪ sélecteurs



Champs  dits aussi: attributs, propriétés

Instanciation d'objet


Une classe, deux instances (objets) A et B

A
Classe Article

B
Une classe, deux instances

En Java, on parle de  variables d'instance (les champs) et de méthodes d'instance (les opérations). Voir plus loin, plus à ce sujet.

Instanciation d'objet

Dans une classe utilisatrice

Notation

Envoi de message à un objet (appel d'une méthode d'instance). Trois notations:

  1. Envoyer_message (Instance, Méthode, Paramètres).
    • envoyer_message (a, ajouter, 5);
    (cf.  CALL, anciens langages)
  2. Méthodes (Instance, Paramètres)
    • ajouter (a, q);

  3. Instance.Méthode (Paramètres)
    • a.ajouter (5);

Intérêt de 3.

  1. Forme contractée programmation méthodes
    • Avec notations 1 et 2 on programme la méthode  {a.qte = a.qte + q;}
  2. Mise en évidence envoie de message à un objet a
    • a.ajouter (5);
  3. Avec notation 3 on programme la méthode { qte = qte + q;}

Référence this

Appel opération Méthode associée

a.ajouter(q);

Ajouter (entier q) {qte = qte + q;}

qte = qte + q;       this.qte = this.qte + q;
  ☝

Accès au données d'un objet

Consulter un attribut de l'objet

Accès au données d'un objet

Caractéristique publiques / privées d'un objet

Bonne pratique

Il est utile de ne laisser visibles à l'extérieur que certains sélecteurs (publiques) et de cacher les autres (privés). La bonne pratique c’est : seules les méthodes sont publiques.

La Classe Article en Java

Sans constructeurs (voir plus loin)

public class Article {

// Champs
private int numero = 0;
private String designation = new String("spécimen");
private double prixHT = 1.;
private int qte = 0;

// Méthodes

// Méthodes spécifiques
public double prixTTC () { return prixHT * 1.10; }
public void ajouter (int q) { qte = qte + q; }
public void retirer (int q) { qte = qte - q; }

// Fonctions d'accès...
public int getNumero(){return numero;}
public double getPrixHT(){return prixHT;}
public String getDesignation(){return designation;
public int getQte(){return qte;}

} // Fin classe

Source  complet.

La Classe Article en Java

Article art = new Article();
System.out.println (art.getDesignation());    // spécimen
System.out.println (art.getPrixHT()); // 1.0
System.out.println (art.prixTTC()); // 1.10
art.ajouter(5);
System.out.println (art.getQte()); // 5

public void ajouter (int qte) { this.qte =  this.qte + qte; }

Relations Entre Classes

La Programmation Orientée Objets est la construction d'un système
logiciel comme une collection structurée de classes.   -- B. Meyer --

Première Relation Entre Classe

Relation Utilise «Uses »

A Uses B

Relation Utilise «Uses»

Relation utilise exemple

classe Commande     
champs
   Article e;
   ...
méthodes
   facturer(){
   ...
   e.prixTTC();
   }
   ...
fin
classe Article     
  ...
  prixTTC () {...}
  ...
fin

Commande Uses Article

Relation Utilise «Uses »

Considérations sémantiques

La classe Article En Java

La Relation Utilise En Java

import java.lang.*;           // import du package lang
import java.lang.String;          // import de la classe String

Les Constructeurs


Les Constructeurs Article

Constructeurs de classe Article

public Article(){
numero = 0; // ou au autre numéro
designation = new String("@@@"); // idem
prixHT = 1.0 ; // idem
qte = 0; // idem
}
Article art = new Article();

Les Constructeurs Article


public Article(int n, String m, double p, int  q){
numero = n;
designation = new String(m);
prixHT = p;
qte = q;
}
Article art = new Article(10, "chemise", 249., 100 );

Constructeur par Copie

Article art2 = new Article(art),
public Article(Article a){
numero = a.getNumero();
designation = new String(a.getDesignation());
prixHT = a.getPrixHT();
qte = a.getQte();
}

Destruction d'objets (le ramasse-miettes)

...
{ Article a = new Article ();
// l'article désigné par a est accessible
...
}
// a n'existe plus.
// La mémoire occupée par l'objet doit être libérée

Destruction d'objets (le ramasse-miettes)

Article mien = new Article ();
     ...
{
Article tien = mien;
// l'article est accessible par la référence tien
...
}
// la référence tien à disparu, mais l'article existe toujours!
// la référence mien est valable.

Méthode finalize


2e Relation Entre Classes: Héritage de Classe

Relation Hiérarchique «ISA»



Héritage de Classes: Relation «ISA»


Who's who

Who's Who

Héritage de Classes: Relation «ISA»


Un objet de classe B est un objet de classe A (aussi) s'il possède les caractéristiques de A plus d'autres qui lui sont propres.

Héritage de Classes: Relation «ISA»

Relation d'hértitage ISA

Exercice : Quelles sont toutes les caractéristiques de Vêtement et de ArticleLuxe?

Héritage de Classes: Relation «ISA»

Arbre d'héritage

arbre héritage
Exemple tiré du livre "Les Langages à Objets", G. Masini et al.


NB. Article classe mère directe de Vêtement. Classe mère aussi de Chemise etc.

Sous Classes en Java - Exemple1

class Vetement extends Article {
private byte taille;
private String coloris;
};

Sous Classes en Java - Exemple1

 Vetement v = new Vetement();
v.ajouter(5); // La méthode héritée de la classe Article s'applique.

Sous Classes en Java - Exemple1 (Constructeurs)

class Vetement extends Article {
private byte taille;
private String coloris;

public Vetement(){

super();

taille = 6;
coloris = new String("blanc");
}
};

Sous Classes en Java - Exemple2  (notion de override)

class ArticleLuxe extends Article {
// ...
public double prixTTC () { return prixHT * 1.25; }

};

Sous Classes en Java (notion de protected)

 protected int numero = 0;
protected String nom = new String("spécimen");
protected double prixHT = 1.;
protected int qte;

Les Sous Classes en Java

Dans une sous classe on peut donc: (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)

Polymorphisme

Polymorphisme

Article  a     = new Article(1, "Pomme", 10, 100 );
ArticleLuxe al = new ArticleLuxe(2, "iPhone", 200, 100);

a = al ; // affectation juste!
al = a ;         // incompatible types
// found : Article required: ArticleLuxe

Polymorphisme

System.out.println( a.prixTTC() );      //  donne 11     ( 10 * 1.10)
System.out.println( al.prixTTC() ); // donne 250 (200 * 1.25)
a = al;
System.out.println( a.prixTTC() ); // donne 250 maintenant!

Polymorphisme

Autre Exemple

 Article[] chariot = new Article[3];
chariot [0] = new Article(1, "Pomme", 10, 100 );
chariot [1] = new ArticleLuxe(2, "iPhone", 200, 100);
chariot [2] = new Vetement(3, "Chemise", 30, 100, "Vert", XL );
double montant = 0;
for (Article p:chariot) {
montant += p.prixTTC();
}
System.out.println(montant); // 294

Polymorphisme

Le polymorphisme peut intervenir dans plusieurs autres endroits :

Polymorphisme

Le polymorphisme est très important car il permet à une classe de déléguer à ses classes descendantes le fait de définir elles-même et selon leur besoin le code des méthodes héritées.

La classe Article peut se contenter de définir prixTTC() avec un code par défaut et laisser les sous classes Vetement, ArticleLuxe, ... le soin de fournir elles-même le code qui leur est adapté.

Plus encore, la classe Article peut se contenter de déclarer  prixTTC() sans en donner un code. Méthode abstraite. (Voir plus loin les classes abstraites.)

A propos des méthodes static

La Superclasse Object

Les méthodes héritées de Object ...

Trois méthodes particulièrement intéressantes sont:

Les méthodes héritées de Object

Et aussi

Ainsi que d'autres méthodes liées au parallélisme en Java (programmation concurrente).

Méthode equals () ...

Article a = new Article(2, "moto", 10, 10);
Article b = new Article(3, "vélo", 10, 10);
if (a==b) ... // toujours faux, car deux objets différents
// même si b peut être initialisé avec les mêmes valeurs

a = b;
if (a==b) ... // toujours vrai, exactement le même objet ("vélo" ici)
equals equals
a et b deux objets différents
a == b faux
a et b désignent un même objet
a == b vrai
if ( a.equals(b) ) ...  // même résultat que ci-dessus 

Méthode equals () ...

 equals3

a et b deux objets (distincts) de même valeurs
(égalité en profondeur)

Méthode equals () ...

class Article {
...
public boolean equals (Object x){
// deux articles sont égaux s'ils ont le même numéro
return (numero == ((Article)x).getNumero());
}
}
  • On aura alors
Article a = new Article(2, "moto", 10, 10);
Article b = new Article(2, "moto", 10, 10);
System.out.println (a.equals(b)); // donnera true
  • Noter (1): le profile de la méthode avec comme paramètre Object. Sinon, ce ne serait pas un Override (cf. exercice ci-après)
  • Noter (2): la conversion explicite de  x vers Article avant d'appliquer la méthode getNumero().

Le choix de programmation de la méthode  equals() pour une classe utilisateur donnée dépend donc de l'application: égalité des clés, égalité de toutes les valeurs, etc.

Méthode equals()

public boolean equals (Article x){
return (numero == x.getNumero());
}
 Object o = new Article(2, "moto", 10, 10);  
// Object instancié avec un article
System.out.println (a.equals(o)); // false
// pourtant a et o ont le même n° article

Méthode clone (), Copie d'Objets

Simple copie Copie superficielle
Copie en profondeur
(1) Simple Copie (2) Copie superficielle (3) Copie en profondeur
 Article a = new Article(2, "moto", 10, 10);
Article b = new Article();
b = a;

Méthode clone (), Copie d'Objets

Article b = new Article (a);

Méthode clone (), Copie d'Objets

Clonage superficiel.

class Article implements Cloneable {... corps de Article ...} 
try {
b = (Article) a.clone();
}
catch (CloneNotSupportedException e){...}

Méthode clone(), Copie d'Objets

Copie en profondeur

public Object clone()  throws CloneNotSupportedException { 
Article w = new Article();
w.numero = this.numero;
w.designation = new String(this.designation);
w.prixHT = this.prixHT;
w.qte = this.qte;
return w;
}

Classes Abstraites

abstract class Article {
// ...
abstract public double prixTTC ();
// ...
}

Classes Abstraites

abstract class FigureGeometrique {
int x, y;
// ...
void deplacer(int newX, int newY) {
// ...
}
abstract void dessiner();
abstract int surface();
}
class Cercle extends FigureGeometrique
 {
    void dessiner() {
        ...
    }
    int surface() {
        ...
    }
  }

class Rectangle extends FigureGeometrique { void dessiner() { ... } int surface() { ... } }
final int surface(){
...
}

Les Interfaces Java

interface Pile {
final int MAX = 8;
public void empiler(char c);
public char sommet();
// ...
};

Implémentation des Interfaces

class PileTableau implements Pile {

char[] t = new char[MAX];
int top=-1;

public void empiler(char c) {
t[++top] = c;
}

public char sommet() {
return t[top];
}
};

Héritage "Multiple"

Héritage multiple

figure tirée du livre "Les Langages à Objets", G. Masini et al.

Héritage "Multiple"

interface Transport { 
public int prixTransport();
...
}

interface Fragile extends Transport { // héritage d'interface!
public double prixTransport();
...
}

class Article {...}

class ArticleLuxe extends Article {...}
class Televiseur extends ArticleLuxe implements Fragile {
public double prixTransport() {
// Calcul effectif du prix transport de téléviseur
}
...
}
class Televiseur extends ArticleLuxe implements Fragile, AlimElectrique {
public double prixTransport() {
// Calcul effectif du prix transport televiseur
}
public double consommation() {
// Calcul de la consommation de téléviseur
}
...
}
interface AlimElectrique {
int voltage = 120;
public double consommation();
...
}