đ 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 deScannernomméeinput. - 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
mainpour 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 classeScannerqui 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 *.javacompile tous les fichiers .java dans le dossier, gĂ©nĂ©rant les fichiers .class correspondants. On lance ensuite le programme avecjava 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
newetthis.
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
mainpour 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 texteScanner: un modÚle pour un lecteur de texteFile: 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
jennya son propre bloc en mĂ©moire pournameetage. De mĂȘme, lâinstanceandrewa son propre bloc en mĂ©moire pournameetage. - 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 (commeSystem.out.println()). Chaque fois, câĂ©tait pour accĂ©der Ă un attribut ou une mĂ©thode dâun objet.Par exemple,
System.out.println():outest un attribut de typePrintStreamdans la classeSystem, etprintln()est une mĂ©thode de la classePrintStreamaccessible par lâinstanceout.
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().
-
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. â©
-
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. â©