Éléments de programmation objet

Rappels : structures de données

Types primitifs

Les données informatiques sont construites à partir des types « primitifs » :

Les chaînes de caractères de type String ne sont pas un type primitif. On en reparlera quand on aura mieux cerné le concept d’objet.

Enregistrements

Dans certains cas, il est plus lisible de regrouper des types primitifs au sein d’un seul type appelé « enregistrement » :

Références

Les enregistrements sont souvent manipulés par des références : une variable de type Point ne contient pas les deux double mais seulement un pointeur sur l’emplacement où ils se trouvent en mémoire.

En conséquence :

En cas de création d’un tableau de Point, toutes les cases sont initialisées avec null

Données de taille non bornées

Certaines information que l’on souhaite stocker dans un ordinateur n’ont pas une taille préféfinie lors de l’écriture du programme. Ça n’est que lorsque l’on exécute le programme que l’utilisateur pour fournir cette information : une carte, une liste d’élève, les données du jeu minecraft.

Pour représenter ces données, on a deux possibilités :

Notez que la plupart des structures de données complexes utilisent l’une et/ou l’autre mécanisme.

Programmation objet

Concept

La programmation objet pousse plus loin le concept d’aggrégation de données au sein d’une entité logique.

Constructeur

Comme déclarer une variable de type Point ne fait qu’allouer de la place pour une référence vers les données d’un point, il faut un mécanisme pour allouer de la place pour ces données.

Les constructeurs les plus simples :

On appelle un constructeur avec new suivi du nom de la classe puis des paramètres du constructeur :

new Point(1,2);
new Chrono();
new Alarm(1000000);

Appeler new alloue en mémoire de la place pour les données de l’objet puis appelle le constructeur pour les remplir :

this représente cet emplacement mémoire

Bien évidemment, pour utiliser cet objet, il faut soit stocker sa référence dans une variable :

Chrono chrono = new Chrono();

soit passer sa référence à une fonction (pas d’exemple pour le moment).

Classes, objet, instance

Considérons la classe Point ci-dessous :

class Point {
  float x;
  float y;
  
  Point(float x, float y) {
    this.x = x;
    this.y = y;
  }
}

Une classe est un type de donnée (comme intou float[]) : la classe Point des objets de type Point

Point p = new Point(10,12);

Fonction

En Java, les fonctions doivent se trouver au sein d’une classe.

On peut très bien créer une classe sans champs juste pour cela et c’est une bonne pratique

Elles sont déclarées comme en Javascool mais précédées par le mot-clef static

class Prog {

  static double aireCercle(double rayon) {
    return Math.PI*rayon*rayon;
  }
     
  static void afficheAireCercle(double rayon) {
    System.out.println(aireCercle(rayon));
  }
}

La méthode principale a une syntaxe spéciale : elle prend en paramètre un tableau de String et il faut ajouter public devant static (un peu pour indiquer que le lanceur de programme a le droit d’y accéder)

class Prog {
    
  public static void main(String[] args) {
    double ratyon = 20;
    afficheAireCercle(rayon);
  }
   
  static double aireCercle(double rayon) {
    return Math.PI*rayon*rayon;
  }
     
  static void afficheAireCercle(double rayon) {
    System.out.println(aireCercle(rayon));
  }
     
}

Plusieurs fonctions dans plusieurs classes

Il est possible de séparer les fonctions dans différentes classes. Pour appeler une fonction d’une autre classe, il suffit de mettre son nom avant :

class CercleUtil {

  static double aireCercle(double rayon) {
    return Math.PI*rayon*rayon;
  }
     
  static void afficheAireCercle(double rayon) {
    System.out.println(aireCercle(rayon));
  }

}
   
class Prog {

  public static void main(String[] args) {
     double ratyon = 20;
     CercleUtil.afficheAireCercle(rayon);
  }
 
}

Mais pourquoi ne pas mettre les fonctions de CercleUtil dans la classe Cercle ?

Bibliothèque standard

Java est fourni avec de nombreuses classes utilitaires. Aujourd’hui, nous avons vu :