Programmation Orientée Objet Langage JAVA

Programmation Orientée Objet Langage JAVA

Classes

Données et procédures sont réunies dans une classe. Une classe est une construction syntaxique. Elle représente un modèle sur lequel on pourra construire autant d’objets semblables qu’on pourra le souhaiter.

Un objet est une instance d’une classe. Tous les objets d’une même classe seront semblables, mais différents. Les différences entre eux proviendront des données qui leurs sont associées.

procédures nommées Méthodes

Une méthode s’applique à un objet de sa classe (en première approximation)

Hiérarchisation

exemple : un point sur l’écran

x et y : coordonnées du point toString() : méthode présentant l’objet sous forme de chaîne

ajout des informations de couleur :

définition d’une sous-classe nommée Pixel

Pixel :

  • hérite des champs x et y ;
  • ajoute r, v et b.

toString() traduit un pixel en caractères ; elle appelle toString() de Point, et ajoute le traitement de r, v et b ;

 Si p est de type Point, p.toString() appelle la méthode toString() de Point :

Point p = new Point();

p.toString(); // écrit les valeurs de x et y

Si p est de type Pixel, p.toString() appelle la méthode toString() de Pixel :

Pixel p = new Pixel();

p.toString();  // écrit x, y, r, v et b

Le programmeur définit un seul nom pour toutes les méthodes qui font le même travail, quel que soit l’objet auquel elles s’appliquent ; par exemple, laver une voiture et laver du linge utilise en français le même verbe, et utilisera en java le même identificateur.

Comparez avec un autre langage, dans lequel vous devez inventer des noms différents pour indiquer une même fonction appliquée à des types différents. Remarquez toutefois que ceci ne s’applique pas aux types primitifs. En résumé, le programmeur ne s’adapte plus aux exigences du compilateur c’est le compilateur qui s’adapte.

La classe Point peut servir à d’autres usages :

Définition d’un rectangle par deux coins (haut-gauche, et bas-droit):D’où découle une organisation naturelle en arbre des diverses classes. Des classes définies par des personnes indépendantes devraient être compatibles entre elles au sens de la hiérarchie, donc faire partie d’un même arbre. Pour cela, il faut que la racine de l’arbre soit commune, ce doit être une classe ancêtre de toutes les autres. En Java elle s’appelle Object.

La hiérarchie complète de l’exemple est donc :

Tout ce qui est défini dans la classe Object sera donc utilisable dans tous les objets que nous créerons, puisqu’ils en hériteront tous.

Encapsulation

Habillage des données dans l’objet :

  • données locales invisibles de l’extérieur (choix du programmeur)
  • impossible de les modifier par erreur

Toute variable cachée est manipulée par des méthodes soigneusement mises au point, donc fiables.

Liens entre les variables maintenus par ces méthodes.

Exemple :

Soit une classe qui représente les comptes clients d’un banque (isolée des autres banques) ;

  • variable cachée : un tableau indiquant l’avoir de chaque client.
  • seule opération : débiter un client ; créditer un autre du même montant
  • le total des comptes reste constant.

En cachant le tableau à l’intérieur de la classe, on assure que seules les méthodes de celle-ci peuvent le manipuler.

Polymorphisme

On veut déplacer un point :

on donne 1 entier : x = x + delta; y = y + delta
on donne 2 entiers : x = x + deltaX ; y = y + deltaY

 

EnPascal ou C, il faut définir 2 procédures portant des noms différents.

En Java, on peut redéfinir la même méthode (portant le même nom) mais avec une liste de paramètres différente :

deplacer(int delta); deplacer(int deltaX, int deltaY);

Nous sommes capables de les distinguer, donc le compilateur aussi. Remarque : deplacer(5) peut se traduire par deplacer(5, 5).Autrement dit : on définira la forme la plus générale (à deux paramètres) ; la définition de l’autre se contentera d’appeller la forme générale en redoublant le paramètre. L’abstraction, l’encapsulation, l’héritage et le polymorphisme sont les caractéristiques partagées par tous les langages à objets.

Liaison dynamique

La liaison est l’opération qui consiste à associer une entité du code en mémoire, à un identificateur dans le programme source. Dans les langages tels que Pascal ou C, la liaison est statique, c’est à dire que l’association est faite par le compilateur au moment de la génération du code. En java, cette liaison est normalement rejetée à l’exécution du programme, ce qui donne une puissance expressive bien supérieure, mais en contre-partie une moindre efficacité. Les objets java en mémoire contiennent implicitement une information correspondant à leur type. Ceci permet le contrôle dynamique. La liaison dynamique s’applique aux méthodes.

Exemple :

  Point p = new Pixel();

La variable p et l’objet créé ne sont pas de même type !

Mais un Pixel n’est qu’un cas particulier de Point, donc c’est un Point… et l’affectation est possible.

A quoi ça sert ? Soit :

   Point p1 = new Point();

p1.toString(); appelle la méthode toString() définie dans Point

p.toString(); appelle la méthode toString() définie dans Pixel.

Soit le programme suivant :

  Point p;

  if (a == 1)

     p = new Point();

  else p = new Pixel;

  String s = p.toString();

Au moment de la compilation, la valeur de a est inconnue. Le compilateur ne sait donc pas quel sera le type de l’objet désigné par p dans la dernière instruction. Il ne peut pas générer complètement l’appel de la méthode toString().L’objet désigné par p contenant son type réel, il sera possible au moment de l’exécution de lancer la méthode associée.Dans l’exemple ci-dessus, si a vaut 1, ce sera la méthode toString() de Point qui sera appellée, et dans le cas contraire celle de Pixel.Ceci s’applique aux tableaux :soit tab un tableau de Point ; tab[2] peut être un objet de type Point, ou de type Pixel.On peut appeller une méthode sur un élément de tableau sans connaître son type précis.Ce procédé permet de traiter des objets, sans connaître le détail du traitement !

Donc d’étendre des programmes déjà définis sans les recompiler.

Soit :

ecrire() utilise toString() pour écrire sous forme de texte tous les éléments du tableau.

Elle connait Point et Pixel définies avant elle.

 Définissons APRES la classe Pixel3D qui intégrera la troisième dimension :

ecrire() va écrire correctement tous les éléments ;

elle utilise toString() de Point ; la liaison dynamique accède à toString() de Pixel3D.

ecrire() fait ce qu’on attend, alors qu’elle a été écrite avant que l’existence d’un Pixel3D ait été envisagée !

Types primitifs

byte entier signé sur 8 bits ;
short entier signé sur 16 bits ;
int entier signé sur 32 bits ;
long entier signé sur 64 bits ;
float nombre flottant codé sur 32 bits (Norme IEEE 754-1985) ;
double nombre flottant codé sur 64 bits (Norme IEEE 754-1985) ;
boolean true ou false ;
char caractère codé sur 16 bits, dans le nouveau code UNICODE ;

On remarquera que les formats des types primitifs sont fixés par des normes IEEE. Ceci signifie qu’un int aura toujours le même codage en machine, dans toutes les implémentations de java (toutes les machines virtuelles). Egalement, toute expression arithmétique, avec les mêmes paramètres, aura une valeur partout identique.

Classes enveloppes

A chaque type primitif correspond une classe qui contient des méthodes adaptées à ce type. Les classes se nomment :

type classe constructeurs
byte, short, int Integer public Integer(int value);

public Integer(String s);

long Long public Long(long value);

public Long(String s);

float Float public Float(double value);

public Float(float value);

public Float(String s);

double Double public Double(double value);

public Double(String s);

boolean Boolean public Boolean(boolean value);

public Boolean(String s);

char Character public Character(char value);

La méthode toString() est redéfinie dans toutes ces classes, de manière à fournir une représentation correcte du type correspondant. Ces classes contiennent par ailleurs de nombreuses méthodes adaptées au traitement des types primitifs. Il est conseillé de les examiner dans la documentation de java.

Objets, références et ramasse-miettes

On appelle Référence un accès à un objet.

Une variable de type Point contient une référence à un objet Point et non l’objet lui-même.

Vous pouvez faire une analogie avec les pointeurs de C pour vous fixer les idées. Mais attention, elle ne va pas beaucoup plus loin : il y a de grandes différences entre les pointeurs C et leur usage, et une référence Java.

Une référence est un pointeur idéal

débarrassé de toutes ses imperfections matérielles.

String s = « une chaîne de caractères »;

Cette déclaration crée un objet chaîne, et range la référence de cet objet dans le champ s.

Une instruction telle que :

   s = s +  » particulière »;

crée un nouvel objet String (la valeur de l’expression en partie droite), qui existe à côté de l’ancien, et modifie la référence s à l’objet. Après l’instruction, les deux chaînes « une chaîne de caractères » et « une chaîne de caractères particulière » existent en mémoire, et la référence s désigne la seconde. La première est inaccessible, le ramasse-miettes sera capable de s’en apercevoir, et de la supprimer.

Cours gratuitTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *