Classes et objets
Cours · programmation Java (école d'ingénieur), chapitre 7 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Jusqu'ici, nos programmes manipulaient des nombres, des caractères, des chaînes et des tableaux. Mais le monde que l'on veut décrire n'est pas fait de nombres : il est fait d'étudiants, de comptes bancaires, de points d'une figure, de produits d'un panier. Un étudiant a un nom, un âge, une moyenne ; un compte a un titulaire et un solde, et l'on peut y déposer ou en retirer de l'argent. La programmation objet permet d'écrire ces notions telles quelles dans le programme : on définit une classe Etudiant, puis on fabrique autant d'objets étudiants que nécessaire.
Ce chapitre est le premier de la partie consacrée à l'objet. Il pose le vocabulaire (classe, objet, attribut, méthode, constructeur, référence) et, surtout, le modèle de la mémoire qui permet de comprendre ce que fait vraiment un programme objet.
Objectifs du chapitre
- Définir une classe avec ses attributs, ses méthodes et ses constructeurs, et créer des objets avec
new. - Comprendre qu'une variable de type objet contient une référence, et en déduire le comportement de l'affectation, de la comparaison
==et du passage en paramètre. - Reconnaître et éviter la
NullPointerException. - Écrire une méthode
toString, manipuler des tableaux d'objets, organiser un programme en plusieurs classes.
7.1 Des tableaux aux objets
Pour décrire trois étudiants avec ce que nous savons déjà faire, il faut trois tableaux « parallèles » : la case i de chacun décrit le même étudiant.
public class EtudiantsTableaux {
public static void main(String[] args) {
String[] noms = {"Alice", "Bilal", "Chloé"};
int[] ages = {19, 20, 18};
double[] moyennes = {14.5, 11.25, 16.0};
for (int i = 0; i < noms.length; i++) {
System.out.printf("%s, %d ans, moyenne %.2f%n", noms[i], ages[i], moyennes[i]);
}
}
}
Alice, 19 ans, moyenne 14.50
Bilal, 20 ans, moyenne 11.25
Chloé, 18 ans, moyenne 16.00
Ce programme fonctionne, mais il est fragile. Rien ne garantit que les trois tableaux ont la même longueur ; trier les étudiants par moyenne oblige à permuter les trois tableaux en même temps ; ajouter une information (une adresse) oblige à créer un quatrième tableau et à modifier chaque boucle ; et une méthode qui traite « un étudiant » doit recevoir trois paramètres. Le défaut est toujours le même : la notion d'étudiant n'existe pas dans le programme. Elle n'existe que dans la tête du programmeur.
Une classe donne une existence à cette notion : elle regroupe en une seule entité les données d'un étudiant et les opérations qui le concernent.
7.2 Classe, objet, attribut, méthode
Une classe est un modèle : elle décrit les données (attributs) et les opérations (méthodes) communes à toute une famille d'objets. Un objet est un exemplaire de la classe, aussi appelé instance : il possède ses propres valeurs pour chacun des attributs.
La classe Point décrit les points du plan : chaque point a une abscisse et une ordonnée, sait calculer sa distance à l'origine et peut être déplacé.
// Une première classe : Point, et un programme qui l'utilise.
class Point {
double x; // abscisse
double y; // ordonnée
// Distance de ce point à l'origine.
double distanceOrigine() {
return Math.sqrt(x * x + y * y);
}
// Déplace ce point de (dx, dy).
void deplacer(double dx, double dy) {
x = x + dx;
y = y + dy;
}
}
public class TestPoint {
public static void main(String[] args) {
Point a = new Point(); // un objet Point, ses attributs valent 0.0
a.x = 3;
a.y = 4;
System.out.println("a = (" + a.x + ", " + a.y + ")");
System.out.println("distance à l'origine : " + a.distanceOrigine());
a.deplacer(1, -1);
System.out.println("après déplacement : (" + a.x + ", " + a.y + ")");
Point b = new Point(); // un second objet, indépendant du premier
System.out.println("b = (" + b.x + ", " + b.y + ")");
}
}
a = (3.0, 4.0)
distance à l'origine : 5.0
après déplacement : (4.0, 3.0)
b = (0.0, 0.0)
Plusieurs points sont à remarquer.
- Les attributs
xetysont déclarés dans la classe, hors de toute méthode. Chaque objet en possède son propre exemplaire : déplacerane change pasb. - Les deux méthodes n'ont pas le mot-clé
static: ce sont des méthodes d'instance. Elles s'appliquent à un objet, avec la notation pointée (le nom de l'objet, un point, puis l'appel) :
a.distanceOrigine()
Elles lisent ou modifient les attributs de cet objet-là.
new Point()crée un nouvel objet. Ses attributs reçoivent une valeur par défaut :0pour les nombres,falsepour les booléens,nullpour les objets. C'est une différence avec les variables locales, qui n'ont pas de valeur par défaut.- Le fichier contient deux classes. Une seule peut être déclarée
public, et le fichier doit porter son nom :TestPoint.java. Nous y revenons à la section 7.9.
Si o désigne un objet, o.attribut désigne l'attribut de cet objet et o.methode(...) appelle la méthode sur cet objet. À l'intérieur d'une méthode d'instance, un attribut écrit seul (x) désigne l'attribut de l'objet sur lequel la méthode a été appelée.
7.3 Constructeurs
Dans TestPoint, l'objet est d'abord créé avec des coordonnées nulles, puis rempli attribut par attribut. Entre les deux, il existe dans un état qui n'a pas de sens. Un constructeur permet de créer un objet directement dans l'état voulu.
Un constructeur est une méthode particulière qui porte le nom de la classe, n'a pas de type de retour (pas même void), et est appelée automatiquement par new. Son rôle est d'initialiser les attributs du nouvel objet.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.