Keyboard shortcuts

Touchez ← ou → pour naviguer les chapitres

Touchez S ou / pour chercher dans le livre

Touchez ? pour afficher ce message

Touchez Esc pour masquer ce message

Accueil > Classes et objets >

📚 Les objets

Survol et attentes

Si vos projets Java jusqu’à prĂ©sent tenaient dans une seule classe, ces projets n’utilisaient pas le plein potentiel, ni mĂȘme l’objectif, du langage Java. Ce langage a Ă©tĂ© dĂ©veloppĂ© quand l’Internet est devenu accessible au public pour crĂ©er des projets orientĂ©s-objet plus sĂ©cures et plus facilement distribuable que ce qui existaient dĂ©jĂ .

Mais pour des projets orientĂ©-objet, il faut dĂ©finir des objets, ce que vous n’avez pas fait intentionnellement jusqu’à prĂ©sent.

Définitions
Objet
Une abstraction - un modĂšle informatique - pour quelque chose qui existe dans le monde rĂ©el (ou dans notre imagination). Un objet est dĂ©fini dans une classe qui contient des attributs et des mĂ©thodes. On crĂ©e des instances de l’objet en dĂ©clarant des variables du type de l’objet. Par exemple, Scanner input = new Scanner(System.in); crĂ©e une instance de Scanner nommĂ©e input.
Encapsulation
Le regroupement des donnĂ©es et des mĂ©thodes qui les manipulent dans une seule entitĂ©.1 Les classes Java sont un exemple d’encapsulation, notamment les classes qui dĂ©finissent des objets.
Classe objet
Une classe dĂ©finissant un modĂšle pour un objet en dĂ©clarant des attributs pour ses informations et des mĂ©thodes pour ses comportements. Ces classes encapsulent dans une seule entitĂ© les donnĂ©es avec les mĂ©thodes qui les manipulent afin de crĂ©er un modĂšle adĂ©quatement complet de l’objet.2
Instance
Un objet en mémoire avec sa propre copie de chaque attribut de la classe objet et qui peut utiliser toutes les méthodes de la classe.
Classe pilote
Une classe qui contient la mĂ©thode main pour la logique globale du programme. C’est la classe qui est lancĂ©e pour exĂ©cuter le programme. Elle crĂ©e et utilise des instances d’autres classes objets.
Mot-clé new
UtilisĂ© pour crĂ©er une instance d’un objet correspondant au modĂšle dĂ©fini dans une classe. Par exemple, new Scanner(System.in) crĂ©e une instance de la classe Scanner qui lit l’entrĂ©e standard.
Mot-clé this
UtilisĂ© dans les mĂ©thodes d’une classe objet pour faire rĂ©fĂ©rence Ă  l’instance spĂ©cifique qui a fait l’appel de la mĂ©thode. C’est utile pour diffĂ©rencier les attributs de l’instance de variables locales dans la mĂ©thode comme les paramĂštres.
Attribut
Une variable dĂ©finie Ă  la racine d’une classe objet.
Méthode
Une fonction définie dans une classe objet. Ces fonctions opÚrent directement sur les attributs de la classe.
Commande javac
Commande nĂ©cessaire pour compiler un projet Java comportant plus qu’un fichier .java. Si tous les fichiers sont dans le dossier racine directement, la commande javac *.java compile tous les fichiers .java dans le dossier, gĂ©nĂ©rant les fichiers .class correspondants. On lance ensuite le programme avec java NomDeLaClassePilote (sans l’extension .class ou .java).

Objectifs d’apprentissage

À la fin de cette leçon vous devrez ĂȘtre en mesure de :

  • DĂ©crire la structure d’un projet Java orientĂ©-objet, notamment le rĂŽle de la classe pilote et des classes objets.
  • DĂ©finir les termes attribut, mĂ©thode et instance.
  • Expliquer le rĂŽle des mot-clĂ©s new et this.

CritĂšres de succĂšs

  • Je peux Ă©crire une classe pilote qui crĂ©e et utilise des instances d’une ou plusieurs classes objets que j’ai Ă©galement Ă©crites.
  • Je peux lancer un programme Java comportant plusieurs fichiers.

Structure de projet orienté-objet Java

Un projet orienté objet tient dans plusieurs classes - typiquement une classe par fichier, notamment :

  • Une classe qui contient la mĂ©thode main pour la logique globale du programme -> on l’appelle la classe pilote. Voici quelques exemples de noms pour la classe pilote :
    • Driver.java
    • Main.java
    • App.java
  • Une ou plusieurs classes qui dĂ©finissent des objets. On crĂ©e des instances de ces objets dans le pilote ou dans d’autres objets.
  • Classes pour les tests unitaires afin de valider le comportement des mĂ©thodes dans les classes objets un par un.

Les outils Java standard créent des structures de projets avec des dossiers pour les sources, les tests et les ressources. Les fichiers sources (comme le pilote et les objets) sont dans le dossier src et les fichiers tests dans le dossier test.

Pour le moment, nous crĂ©erons des projets simples sans structure spĂ©cifique : tous les fichiers .java seront dans le mĂȘme dossier. La structure des fichiers pour un projet simple pourrait ressembler Ă  ceci :

.
├── App.java
├── Person.java
└── TestPerson.java

Pour compiler ce projet, on ouvre le terminal dans le dossier racine du projet et on tape :

javac *.java

Ce qui ajoute les fichiers .class au dossier s’il n’y a pas d’erreurs de compilation. En cas d’erreurs de compilation, les messages d’erreur seront affichĂ©s Ă  la console. Il faut faire cette Ă©tape de compilation Ă  chaque modification du projet, sinon les fichiers .class utilisĂ©s pour lancer le programme ne seront pas Ă  jour.

Finalement, pour lancer le programme, on tape :

java App

On ignore le fichier TestPerson.java ici parce que ce fichier est souvent gĂ©nĂ©rĂ© et utilisĂ© par des outils de test comme JUnit accessibles dans votre EDI. Pour plus d’information sur les tests unitaires, voir les notes du cours ICS3U

Les objets

Un objet est une abstraction - un modÚle informatique - pour quelque chose qui existe dans le monde réelle (ou dans notre imagination). Le modÚle pour un objet est défini dans une classe qui contient des :

  • informations -> ce qu’on appelle les attributs de l’objet. Ce sont des variables dĂ©finies Ă  la racine de la classe.
  • comportements -> ce qu’on appelle les mĂ©thodes de l’objet.

Voici quelques exemples d’objets qu’on utilise dĂ©jĂ  :

  • String : un modĂšle pour un texte
  • Scanner : un modĂšle pour un lecteur de texte
  • File : un modĂšle pour un Ă©lĂ©ment du systĂšme de fichiers.

Ces objets sont dĂ©finies dans une classe du mĂȘme nom dans les fichiers String.java, Scanner.java et File.java Ă  divers endroits dans la trousse de dĂ©veloppement de Java (JDK).

Définir un objet

Pour dĂ©finir un objet, il suffit de crĂ©er une nouvelle classe dans un fichier .java du mĂȘme nom, de dĂ©clarer ses attributs et de dĂ©finir des mĂ©thodes.

Par exemple, dans Person.java :

class Person {
    // attributs
    String name;
    int age;

    // méthode
    void speak() {
        System.out.println(name + "dit 'AllĂŽ!'");
    }
}

Notez qu’il n’y a pas de mĂ©thode main dans cette classe, seulement les informations qui reprĂ©sentent notre modĂšle simple d’une personne (name et age) et d’un comportement associĂ© (speak).

Utiliser un objet, partie 1 - créer des instances

Pour utiliser un objet, on dĂ©clare une variable du type de l’objet dans une mĂ©thode ou une classe. Chaque objet ainsi nommĂ© s’appelle une instance de l’objet.

Exemple 1 : input est une instance de Scanner

import java.util.Scanner;

class App {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
    }
}

Exemple 2 : jenny et andrew sont des instances de Person

class Main {
    public static void main(String[] args) {
        Person jenny = new Person();
        Person andrew = new Person();
    }
}
  • Chaque instance a son propre bloc en mĂ©moire pour sa propre copie des attributs. Par exemple, l’instance jenny a son propre bloc en mĂ©moire pour name et age. De mĂȘme, l’instance andrew a son propre bloc en mĂ©moire pour name et age.
  • Chaque instance peut utiliser toutes les mĂ©thodes de la classe.

Utiliser un objet, partie 2 - utiliser les attributs et les méthodes

Pour utiliser les attributs et les mĂ©thodes d’une instance, on utilise l’opĂ©rateur . aprĂšs le nom de l’instance suivi par le nom de l’attribut ou de la mĂ©thode.

class Main {
    public static void main(String[] args) {
        Person jenny = new Person();
        // Modifier les attributs
        jenny.name = "Jenny";
        jenny.age = 16;
        // Utiliser les méthodes
        jenny.speak();
        // Afficher les attributs
        System.out.println(jenny.name + " a " + jenny.age + " ans.");
    }
}

Tentez de noter chaque fois que vous avez vu l’opĂ©rateur . dans les programmes que vous avez produits en ICS3U et en ICS4U jusqu’à prĂ©sent (comme System.out.println()). Chaque fois, c’était pour accĂ©der Ă  un attribut ou une mĂ©thode d’un objet.

Par exemple, System.out.println() : out est un attribut de type PrintStream dans la classe System, et println() est une mĂ©thode de la classe PrintStream accessible par l’instance out.

Mot-clé this

Reprenons l’exemple de l’objet Person dĂ©finit plus haut et ajoutons les mĂ©thodes changeName() et happyBirthday().

Person.java

class Person {
    String name;
    int age;

    void speak() {
        System.out.println(name + "dit 'AllĂŽ!'");
    }

    void changeName(String name) {
        this.name = name;
    }

    void happyBirthday(){
        age += 1;
    }
}

Main.java

class Main {
    public static void main(String[] args) {
        Person jenny = new Person();
        jenny.name = "Jenny";
        jenny.age = 16;

        Person andrew = new Person();
        andrew.name = "Andrew";
        andrew.age = 17;

        andrew.happyBirthday();
        // andrew.age est maintenant 18

        jenny.changeName("Jen");
        // jenny.name est maintenant "Jen"
    }
}

Le mot-clĂ© this dans les mĂ©thodes de la classe objet est utilisĂ© pour faire rĂ©fĂ©rence Ă  l’instance spĂ©cifique qui fait appel Ă  la mĂ©thode.

Dans l’exemple ci-dessus, on le voit Ă  un seul endroit, dans la mĂ©thode changeName(). On utilise this.name pour diffĂ©rencier la variable de l’instance name de la variable locale name passĂ©e en paramĂštre. Si vous copiez cette exemple dans votre IDE, en cliquant sur chaque name dans la mĂ©thode changeName(), vous verrez que celui prĂ©cĂ©dĂ© par this. surligne Ă©galement la dĂ©claration de l’attribut name de la classe tandis que l’autre surligne la dĂ©claration du paramĂštre name. Si vous enlevez le this., le compilateur ne saura pas quelle variable name vous voulez modifier et vous donnera une erreur (surlignĂ©e en rouge).

Notez que dans les mĂ©thodes speak() et happyBirthday(), on n’a pas besoin de this. parce qu’il n’y a pas de confusion possible. En l’absence de variables locales, les rĂ©fĂ©rences Ă  name et age peuvent seulement ĂȘtre celles de l’instance. Dans de tels cas, vous pouvez tout de mĂȘme utiliser this. pour plus de clartĂ©, mais ce n’est pas nĂ©cessaire.

Exercices

📚 Tester la comprĂ©hension

Quiz de vérification sur les objets

đŸ› ïž Pratique

Produire une classe pilote et une classe qui dĂ©finit un objet. Pour l’objet, modĂ©lisez quelque chose de votre vie qui existe en plusieurs instances. p. ex.: films, jeux, vĂ©los, vĂ©hicules, artistes/athlĂštes/politiciens prĂ©fĂ©rĂ©s, etc. CrĂ©er une ou deux instances de votre objet dans la mĂ©thode main() du pilote, assigner des valeurs Ă  chaque attribut et tester les diffĂ©rentes mĂ©thodes. Afficher les valeurs au besoin avec des System.out.println().


  1. Plusieurs dĂ©finitions de l’encapsulation incluent aussi l’idĂ©e de cacher les dĂ©tails d’implĂ©mentation pour protĂ©ger les donnĂ©es, gĂ©nĂ©ralement en rendant les attributs privĂ©s et en fournissant une interface publique de mĂ©thodes pour les manipuler. Voir la leçon sur le masquage de l’information pour plus de dĂ©tails. ↩

  2. Dans les langages multi-paradigmes (comme Python) ou fonctionnelles (comme JavaScript, Rust), il y a d’autres façons d’encapsuler des donnĂ©es et des comportements Ă  part les classes, notamment les fermetures / clĂŽtures (closures en anglais). Par contre, la programmation orientĂ©e-objet utilise presque toujours les classes pour l’encapsulation. ↩

© 2022-2025 David Crowley