37
Notes de cours Programmation I INF1120 Version 1.2 7 janvier 2017 Les classes et les objets Mélanie Lord UQAM

Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord [email protected]

Embed Size (px)

Citation preview

Page 1: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Notes de cours Programmation I

INF1120

Version 1.2 7 janvier 2017

Les classes et les objets

Mélanie Lord UQAM

Page 2: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

2

Table des matières

1.NOTIONSDEBASE 31.1LANOTIONDECLASSE 31.2LANOTIOND’OBJET 31.3DROITSD’ACCÈS 3

2.DÉFINITIONDECLASSES 42.1DÉFINITIOND’ATTRIBUTSD’INSTANCE 42.2DÉFINITIONDEMÉTHODESD’INSTANCE 52.3DÉFINITIONDECONSTRUCTEURS 72.4DÉFINITIOND’ATTRIBUTSETDEMÉTHODESDECLASSE 92.5DÉFINITIOND'ATTRIBUTSCONSTANTS(FINAL) 102.6EXEMPLESRÉCAPITULATIFS 122.7APPELD’UNCONSTRUCTEURDANSUNAUTRECONSTRUCTEUR 18

3.UTILISATIONDECLASSES 233.1INSTANCIATIOND’OBJETS 233.2UTILISATIOND’OBJETS 24

4.LERAMASSE-MIETTES 27

5.PRINCIPED’ENCAPSULATIONDESDONNÉES 285.1NOTIOND’ENCAPSULATION 285.2CONTRATD’UNECLASSE 285.3IMPLÉMENTATIOND’UNECLASSE 28

6.EXERCICES 296.1.DESSINDEL'ÉTATDELAMÉMOIRE 296.2.CONCEPTIONETUTILISATIONDECLASSES 30

7.SOLUTIONSDESEXERCICES 337.1SOLUTIONSDESEXERCICESDELASECTION6.1 337.2SOLUTIONSDESEXERCICESDELASECTION6.2 34

Page 3: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

3

1. Notions de base

1.1 La notion de classe § Généralisation de la notion de type. § Comporte des attributs qui définissent le contenu de la classe. § Comporte des méthodes qui définissent le comportement de la classe. § Les attributs et méthodes sont appelés les membres de la classe.

1.2 La notion d’objet § Généralisation de la notion de variable. § Un peu comme la déclaration de variable de types primitifs, on peut instancier des objets

d’un type classe. Un objet est donc une instance d’une classe. § Chacun des objets d’un type classe spécifique possède (est caractérisé par) tous les

attributs et toutes les méthodes de cette classe. § Chaque objet peut cependant avoir des valeurs différentes pour chaque attribut d’instance

c.-à-d. chaque objet est une instance particulière d’une classe.

1.3 Droits d’accès Les droits d’accès (définissent la portée des classes et des membres d'une classe) :

Droits d’accès aux classes

§ Classe publique : Lorsqu’on définit une classe avec le mot-clé public, celle-ci est accessible à toutes les autres classes (on doit cependant parfois utiliser l’instruction import).

Note : Il ne peut y avoir qu'une seule classe publique par fichier .java et celle-ci doit obligatoirement porter le nom du fichier .java.

§ Classe sans indication de droit d'accès (défaut) : En l'absence d’un modificateur d'accès, une classe n’est accessible qu’aux classes du même paquetage (package). Note : Nous ne verrons pas, dans le cadre de ce cour, la notion de paquetage (package). L’absence ou la présence du mot clé public lors de la définition d’une classe ne fait aucune différence dans notre cas, mais nous utiliserons le modificateur d’accès public.

§ Il existe d'autres modificateurs d'accès pour les classes (internes) : protected et private. Nous ne les verrons pas dans le cadre de ce cours.

§ La classe qui contient la méthode main doit être publique (public) pour permettre à la machine virtuelle d’y avoir accès.

Droits d’accès aux membres d’une classe (attributs, constantes, méthodes) :

§ Membre public : Si un membre d’une classe est défini avec le mot clé public, il est accessible de partout.

§ Membre privé : Si un membre d’une classe est défini avec le mot-clé private, il n’est accessible qu'à l'intérieur de cette classe.

§ Membre protégé : Lorsqu'un membre d'une classe est défini avec le mot-clé protected, il n'est accessible que par les sous-classes (du même paquetage ou non) ou par des classes quelconques du même paquetage (package) que la classe dans laquelle il est défini.

Pas dans le cadre du cours.

Page 4: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

4

§ Membre sans indication de droit d'accès (défaut) : En l'absence d’un modificateur d'accès, un membre d'une classe n'est accessible que dans les classes du même paquetage (package) que la classe où il est défini. Pas dans le cadre du cours.

Notes : § Peu importe le modificateur d’accès, tous les membres d'une classe sont toujours

accessibles dans la classe où ils sont définis.

§ Dans le cadre de ce cours, nous n'utiliserons que les modificateurs d'accès public et private pour les membres d'une classe.

En résumé (en ce qui concerne ce cours) :

Visibilité(portée) public private

Danslamêmeclasse Oui Oui

Dansuneautreclasse Oui Non

Lorsqu’une méthode d’instance ou un attribut d’instance est défini public, on peut y accéder directement depuis une autre classe, avec la notation pointée, comme ceci : nomObjet.nomAttribut; nomObjet.nomMethode(…); //ex : String s = "bulle"; s.charAt(0);

2. Définition de classes

2.1 Définition d’attributs d’instance Les attributs d’instances (ou variables d’instance):

§ Peuvent être placés n’importe où dans le bloc qui définit la classe. Notes : dans le cadre de ce cours, toutes les variables d’instance (ou de classe) ainsi que les constantes doivent être déclarées au début de la classe.

§ Principe d’encapsulation : C’est une bonne pratique de programmation (dans la plupart des cas) de déclarer les attributs d’une classe comme étant privés.

§ Valeurs d’initalisation par défaut des attributs Tableau 2.1

1.

Type de l’attribut Valeur par défaut

boolean false

char Caractère nul - ne pas confondre avec null

entier (byte, short, int, long) 0

réel (float, double) 0.0f ou 0.0

Objet (type classe) null

Page 5: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

5

Exemple date : Définition d’une classe représentant une date avec 3 attributs. public class Date0 { private int annee = 2000; //l'annee de cette date private int mois = 1; //le mois de cette date private int jour = 1; //le jour de cette date }

2.2 Définition de méthodes d’instance Les observateurs / accesseurs (getters) et les modificateurs / mutateurs (setters) : puisqu’en général, les attributs d’instance sont private, il est commun de définir des méthodes d'instance public qui permettent de consulter ou de modifier la valeur des attributs pour un objet particulier.

Les observateurs (getters)

§ Permettent la consultation des valeurs des attributs d’instance d’un objet depuis une autre classe que celle de l’objet.

§ Selon le style Java, le nom de ces méthodes est composé du mot "get" + "nom de l’attribut à consulter". Par exemple, pour l’attribut annee, la méthode d’accès à cet attribut aurait pour nom getAnnee.

§ On peut faire une méthode d’accès par attribut si nécessaire (non obligatoire). § Les getters retournent la valeur de l’attribut concerné et typiquement ne prennent pas de

paramètres. Les modificateurs (setters)

§ Permettent de modifier la valeur des attributs d’instance d’un objet depuis une autre classe que celle de l’objet.

§ Selon le style Java, le nom de ces méthodes est composé du mot "set" + "nom de l’attribut à modifier". Par exemple, pour l’attribut annee, la méthode d’altération de cet attribut aurait pour nom setAnnee.

§ On peut faire une méthode d’altération (setter) par attribut si nécessaire (non obligatoire). § Les setters prennent en paramètre une valeur du type de l’attribut à modifier et c’est cette

valeur qui est affectée à l’attribut concerné. Typiquement, les setters ne retournent rien (mais pas toujours).

Autres méthodes d’instances Une classe peut aussi contenir une quantité d’autres méthodes qui s’avèrent utiles dans la gestion de son type d’objet. Exemple date (suite) : ajout de méthodes d'instances

public class Date1 { //ATTRIBUTS (VARIABLES D'INSTANCES) private int annee = 2000; //l'annee de cette date private int mois = 1; //le mois de cette date private int jour = 1; //le jour de cette date

Page 6: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

6

//GETTERS public int getAnnee() { return annee; } public int getMois() { return mois; } public int getJour() { return jour; } //SETTERS public void setAnnee(int annee) { this.annee = annee; } public void setMois(int mois) { this.mois = mois; } public void setJour(int jour) { this.jour = jour; } //AUTRES METHODES D'INSTANCE PUBLIQUES public boolean estBissex() { return (annee % 400 == 0) || (annee % 4 == 0 && annee % 100 != 0); } public String formater() { String sJour = String.valueOf(jour); String sMois = String.valueOf(mois); if (jour > 0 && jour <= 9) { sJour = "0" + jour; } if (mois > 0 && mois <= 9) { sMois = "0" + mois; } return sJour + "/" + sMois + "/" + annee; } } Note : On peut aussi ajouter des méthodes d’instance privées, on en verra un exemple dans la classe Date finale.

Page 7: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

7

2.3 Définition de constructeurs

Le constructeur d’une classe est une méthode spéciale qui sert à construire (instancier) un objet du type de cette classe.

§ Porte toujours le même nom que la classe § Ne retourne rien (pas même void) § Peut contenir zéro, un ou plusieurs paramètres

Le constructeur peut :

§ Initialiser les attributs d’instance contenus dans la classe. § Contenir des instructions diverses à être exécutées au moment de la construction

(instanciation) d’un objet. § Appeler un autre constructeur de la même classe (ou d’une super-classe – pas dans le

cadre de ce cours).

Une classe peut contenir plusieurs constructeurs (surdéfinitions).

§ Ce qui différencie les constructeurs les uns des autres, puisqu’ils ont tous le même nom, est le nombre et le type de ses paramètres (dans l’ordre).

On appelle un constructeur avec l’opérateur new.

Note : si un constructeur est déclaré private, il ne pourra pas être utilisé pour instancier des objets.

Constructeur par défaut

En l'absence d’un constructeur explicitement défini, Java fournit un pseudo-constructeur sans argument qui ne fait rien.

Exemple : public class Exemple { //aucun constructeur //... } public class TestExemple { public static void main (String[] params) { //Construction d’un objet de type exemple //avec le constructeur par défaut Exemple e = new Exemple(); } }

Au moment où un constructeur (avec ou sans arguments) est défini explicitement dans la classe, le constructeur par défaut n’existe plus.

Page 8: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

8

Exemple date (suite): Ajout de deux constructeurs. public class Date2 { //ATTRIBUTS (VARIABLES D'INSTANCES) private int annee = 2000; //l'annee de cette date private int mois = 1; //le mois de cette date private int jour = 1; //le jour de cette date //CONSTRUCTEURS public Date2() { //vide } public Date2(int annee, int mois, int jour) { this.annee = annee; this.mois = mois; this.jour = jour; } //GETTERS public int getAnnee() { return annee; } public int getMois() { return mois; } public int getJour() { return jour; } //SETTERS public void setAnnee(int annee) { this.annee = annee; } public void setMois(int mois) { this.mois = mois; } public void setJour(int jour) { this.jour = jour; }

Page 9: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

9

//AUTRES METHODES D'INSTANCES PUBLIQUES public boolean estBissex() { return (annee % 400 == 0) || (annee % 4 == 0 && annee % 100 != 0); } public String formater() { String sJour = String.valueOf(jour); String sMois = String.valueOf(mois); if (jour > 0 && jour <= 9) { sJour = "0" + jour; } if (mois > 0 && mois <= 9) { sMois = "0" + mois; } return sJour + "/" + sMois + "/" + annee; } } Exemple d’utilisation de la classe Date2 ci-dessus //Declaration et instanciation de deux variables de type Date2 Date2 date1 = new Date2(); Date2 date2 = new Date2(2014, 8, 23); //Utilisation des variables System.out.println(date1.getAnnee()); //affiche 2000 System.out.println(date1.getMois()); //affiche 1 System.out.println(date1.getJour()); //affiche 1 System.out.println(date2.formater()); //affiche 23/08/2014 System.out.println(date2.estBissex()); //affiche false date1.setAnnee(1987); date1.setMois(12); date1.setJour(3); System.out.println(date1.formater()); //affiche 03/12/1987 System.out.println(date1); //affiche, par exemple, Date2@7f31245a

2.4 Définition d’attributs et de méthodes de classe Les attributs et méthodes de classe

§ Permettent aux objets de disposer d'informations collectives. § Permettent de regrouper des services (méthodes) ayant un point commun, mais qui

ne sont pas liés à des objets particuliers. Par exemple, la classe Clavier regroupe des services de saisie et la classe Math regroupe des services d'opérations mathématiques.

§ Mot réservé : static

Page 10: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

10

Attributs de classe

§ Attributs qui au lieu d'exister dans chacune des instances de la classe, n'existent qu'en un seul exemplaire pour toutes les instances d'une même classe : données partagées par toutes les instances d'une même classe (données collectives).

§ Accès via méthodes de classe ou méthodes d’instance.

Méthodes de classe

§ Méthodes qui agissent sur des attributs de classe (ne peuvent pas agir sur des attributs d'instance) : les méthodes de classes (static), étant indépendante de toute instance de cette classe, n’ont pas accès aux variables d’instance.

§ Peuvent être appelées indépendamment de tout objet en préfixant le nom de la méthode du nom de la classe où elle est définie.

Ex : Clavier.lireInt(), Math.pow(2,3) § Peuvent aussi être appelées sur une instance, mais déconseillé.

Initialisation d'un attribut de classe Contrairement aux attributs d'instance qui sont initialisés à la création de l'objet (new), l'initialisation d’un attribut de classe doit être faite avant la première utilisation de la classe.

1. Initialisation par défaut (implicite) – voir tableau 2.1 2. Initialisation explicite (possiblement)

2.5 Définition d'attributs constants (final) Règles pour l'initialisation d'un attribut constant (final) :

§ Doit être initialisé au plus tard par un constructeur. § Pas d'initialisation par défaut (implicite). § Toute tentative de modification ultérieure = erreur compilation.

Note : Lorsqu’un attribut static est déclaré final (constante de classe), il doit alors absolument être initialisé explicitement au moment de sa déclaration :

§ En tant que final : ne peut pas être initialisé implicitement.

§ En tant que static : ne peut pas être initialisé par un constructeur.

Page 11: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

11

Exemples d’initialisation de constantes : //Initialisation a la declaration public class A { private final int I = 20; } //Initialisation dans le constructeur public class B { private final int I; public B () { I = 20; } } //Initialisation dans le constructeur avec une valeur //passee en parametre. public class C { private final int I; public C (int j) { I = j; } } public class D { private final int I; public void initI () { I = 9; //Erreur de compilation } }

Dans l'exemple de la classe A ou B, il serait préférable d'introduire une constante de classe. Dans le cas de la classe C, chaque objet pourra avoir un attribut constant d'une valeur différente.

Page 12: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

12

2.6 Exemples récapitulatifs Classe Date.java /** * Cette classe represente une date formee d'une annee, d'un mois, et * d'un jour. * NOTE : Les methodes et le constructeur qui modifient le mois, le * jour ou l'annee de cette date n'empechent pas la formation * d'une date invalide. */ public class Date { //CONSTANTES DE CLASSE public static final int ANNEE_MIN = 1900; //annee min valide public static final int ANNEE_MAX = 2015; //annee max valide public static final int MOIS_MIN = 1; //mois min valide public static final int MOIS_MAX = 12; //mois max valide public static final int JOUR_MIN = 1; //jour min valide public static final int JOUR_MAX = 31; //jour max valide //ATTRIBUTS (VARIABLES D'INSTANCE) private int annee = 2000; //l'annee de cette date private int mois = 1; //le mois de cette date private int jour = 1; //le jour de cette date //CONSTRUCTEURS /** * Constructeur sans argument qui ne fait rien. */ public Date() { //vide } /** * Constructeur qui initialise l'annee, le mois et le jour de cette * date. * * @param annee l'annee de cette date. * @param mois le mois de cette date. * @param jour le jour de cette date. */ public Date(int annee, int mois, int jour) { this.annee = annee; this.mois = mois; this.jour = jour; }

Page 13: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

13

//GETTERS /** * Methode qui permet d'obtenir la valeur de l'attribut annee. * @return l'annee de cette date. */ public int getAnnee() { return annee; } /** * Methode qui permet d'obtenir la valeur de l'attribut mois. * @return le mois de cette date. */ public int getMois() { return mois; } /** * Methode qui permet d'obtenir la valeur de l'attribut jour. * @return le jour de cette date. */ public int getJour() { return jour; } //SETTERS /** * Cette methode permet de modifier la valeur de l'attribut annee. * @param annee la nouvelle valeur pour l'annee. */ public void setAnnee(int annee) { this.annee = annee; } /** * Cette methode permet de modifier la valeur de l'attribut mois. * @param mois la nouvelle valeur pour le mois. */ public void setMois(int mois) { this.mois = mois; } /** * Cette methode permet de modifier la valeur de l'attribut jour. * @param jour la nouvelle valeur pour le jour. */ public void setJour(int jour) { this.jour = jour; }

Page 14: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

14

//AUTRES METHODES D'INSTANCE PUBLIQUES /** * Cette methode determine si l'annee de cette date est bissextile * ou non. * @return true si l'annee est bissextile, false sinon. */ public boolean estBissex() { return (annee % 400 == 0) || (annee % 4 == 0 && annee % 100 != 0); } /** * Cette methode retourne cette date sous forme de chaine de * caracteres, sous le format jj/mm/aaaa. Si la date est invalide, * le format retourne peut ne pas etre tout a fait juste. * @return une chaine de caracteres representant cette date. */ public String formater() { String sJour = String.valueOf(jour); String sMois = String.valueOf(mois); if (jour > 0 && jour <= 9) { sJour = "0" + jour; } if (mois > 0 && mois <= 9) { sMois = "0" + mois; } return sJour + "/" + sMois + "/" + annee; } /** * Cette methode determine si cette date est une date valide. * Une date valide est formee : * - d'une annee entre ANNEE_MIN et ANNEE_MAX inclusivement. * - d'un mois entre MOIS_MIN et MOIS_MAX * - d'un jour entre JOUR_MIN et 28 ou 29 ou 30 ou JOUR_MAX selon * le mois et selon que l'annee est bissextile ou non. * * @return true si cette date est valide, false sinon. */ public boolean estDateValide() { return annee >= ANNEE_MIN && annee <= ANNEE_MAX && mois >= MOIS_MIN && mois <= MOIS_MAX && jourValide(); }

Page 15: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

15

//METHODE D'INSTANCE PRIVEE /** * Determine si le jour de cette date est valide selon le mois de * cette date et selon que l'annee de cette date est bissextile ou * non. * @return true si le jour de cette date est valide, false sinon. */ private boolean jourValide() { boolean valide; if (jour < JOUR_MIN) { valide = false; } else { //mois de 31 jours if (mois == 1 || mois == 3 || mois == 5 || mois == 7 || mois == 8 || mois == 10 || mois == 12) { valide = jour <= JOUR_MAX; //mois de fevrier } else if (mois == 2) { valide = (estBissex() && jour <= JOUR_MAX - 2) //29 jours || (jour <= JOUR_MAX - 3); //28 jours //mois de 30 jours } else { valide = jour <= JOUR_MAX - 1; //30 jours } } return valide; } } Classe Employe.java public class Employe { //ATTRIBUT DE CLASSE private static int dernierNumero = 0; //le dernier numero d'employe //attribue //ATTRIBUTS D'INSTANCE private String nom; //le nom de cet employe private String prenom; //le prenom de cet employe private int numero; //le numero (id unique) de cet employe private int nbrAnnees; //le nbr d'annees d'anciennete de cet //employe private double salaire; //le salaire annuel de cet employe

Page 16: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

16

//CONSTRUCTEUR /** * Constructeur d'initialisation. * @param nom le nom de cet employe * @param prenom le prenom de cet employe * @param nbrAnnees le nombre d'annees d'anciennete de cet employe * @param salaire le salaire annuel de cet employe */ public Employe(String nom, String prenom, int nbrAnnees, double salaire) { this.nom = nom; this.prenom = prenom; this.nbrAnnees = nbrAnnees; this.salaire = salaire; dernierNumero = dernierNumero + 1; numero = dernierNumero; } //GETTERS /** * Permet d'obtenir le nom de cet employe. * @return le nom de cet employe */ public String getNom() { return nom; } /** * Permet d'obtenir le prenom de cet employe. * @return le prenom de cet employe. */ public String getPrenom() { return prenom; } /** * Permet d'obtenir le numero de cet employe. * @return le numero de cet employe. */ public int getNumero() { return numero; } /** * Permet d'obtenir le nombre d'annees d'anciennete de * cet employe. * @return le nombre d'annees d'anciennete de cet employe */ public int getNbrAnnees() { return nbrAnnees; }

Page 17: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

17

/** * Permet d'obtenir le salaire de cet employe. * @return le salaire de cet employe. */ public double getSalaire() { return salaire; } //SETTERS /** * Permet de modifier le nom de cet employe. * @param nom le nouveau nom pour cet employe. */ public void setNom(String nom) { this.nom = nom; } /** * Permet de modifier le prenom de cet employe. * @param prenom le nouveau prenom de cet employe. */ public void setPrenom(String prenom) { this.prenom = prenom; } /** * Permet de modifier le nombre d'annees d'anciennete * de cet employe. * @param nbrAnnees le nouveau nombre d'annees d'anciennete de cet employe. */ public void setNbrAnnees(int nbrAnnees) { this.nbrAnnees = nbrAnnees; } /** * Permet de modifier le salaire de cet employe. * @param salaire le nouveau salaire de cet employe. */ public void setSalaire(double salaire) { this.salaire = salaire; } //AUTRES METHODES D'INSTANCE PUBLIQUES public String toString() { String s; s = nom + ", " + prenom + " [" + numero + "]\n"; s = s + "Anciennete : " + nbrAnnees + " annee(s)\n"; s = s + "Salaire : " + salaire + "$"; return s; }

Page 18: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

18

/** * Teste si cet employe est egal a autreEmploye. Deux employes sont * consideres egaux s'ils ont le meme nom et le meme prenom. * @param autreEmploye l'employe a comparer avec cet employe. * @return true si autreEmploye est egal a cet employe, false sinon. */ public boolean estEgalA (Employe autreEmploye) { return this.nom.equals(autreEmploye.nom) && this.prenom.equals(autreEmploye.prenom); } //METHODE DE CLASSE (STATIC) /** * Permet de consulter le dernier numero d'employe attribue. * @return le dernier numero d'employe attribue. */ public static int dernierNumero() { return dernierNumero; } }

2.7 Appel d’un constructeur dans un autre constructeur Le mot réservé this fait référence à l’objet courant : this object. On peut l’utiliser pour :

§ désigner un attribut de "cet" objet § appeler un constructeur de "cet" objet dans un autre constructeur de "cet" objet. Dans ce

cas, l’appel du constructeur appelé doit toujours être la première instruction dans le constructeur appelant.

Exemple : classe Livre public class Livre { //variables de classe private static int nbrLivresCrees = 0; private static int nbrLivresSansDatePub = 0; //constantes de classe private final static String DEFAUT_ISBN = "ISBN"; private final static String DEFAUT_NOM = "NOM"; private final static String DEFAUT_PRENOM = "PRENOM"; private final static int DEFAUT_NBR_PAGES = 0; private final static Date DEFAUT_DATE_PUB = null; //Variables d'instance private String ISBN = DEFAUT_ISBN; //ISBN de ce livre private String titre; //titre de ce livre private String nomAuteur = DEFAUT_NOM; //nom auteur de ce livre private String prenomAuteur = DEFAUT_PRENOM; //prenom auteur de ce livre private int nbrPages = DEFAUT_NBR_PAGES; //nbr de pages de ce livre private Date datePublication = DEFAUT_DATE_PUB; //date de publication de //ce livre

Page 19: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

19

//----------------------------- //CONSTRUCTEURS //----------------------------- /** * Constructeur qui initialise le titre, le nom de l'auteur, le * prenom de l'auteur, le ISBN, la date de publication, et le nombre * de pages de ce livre avec les valeurs passees en parametres. * @param ISBN le ISBN de ce livre. * @param titre le titre de ce livre. * @param nomAuteur le nom de l'auteur de ce livre. * @param prenomAuteur le prenom de l'auteur de ce livre. * @param nbrPages le nombre de pages de ce livre. * @param datePub la date de publication de ce livre. */ public Livre(String ISBN, String titre, String nomAuteur, String prenomAuteur, int nbrPages, Date datePub) { this.ISBN = ISBN; this.titre = titre; this.nomAuteur = nomAuteur; this.prenomAuteur = prenomAuteur; this.nbrPages = nbrPages; datePublication = datePub; //ajustement des variables de classe if (datePub == null) { nbrLivresSansDatePub ++; } nbrLivresCrees++; } /** * Constructeur qui initialise le titre de ce livre avec la valeur * passee en parametre. Le reste des attributs est initialise * comme suit : * - ISBN = DEFAUT_ISBN * - nom = DEFAUT_NOM * - prenom = DEFAUT_PRENOM * - nbrPages = DEFAUT_NBR_PAGE; * - datePublication = DEFAUT_DATE_PUB (null) * * @param titre le titre de ce livre. */ public Livre(String titre) { //Appel du constructeur a 6 parametres this(DEFAUT_ISBN, titre, DEFAUT_NOM, DEFAUT_PRENOM, DEFAUT_NBR_PAGES, DEFAUT_DATE_PUB); }

Page 20: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

20

/** * Constructeur qui initialise le titre, le nom de l'auteur et le * prenom de l'auteur de ce livre avec les valeurs passees en * parametres. * Le reste des attributs est initialise comme suit : * - ISBN = DEFAUT_ISBN * - nbrPages = DEFAUT_NBR_PAGE * - datePublication = DEFAUT_DATE_PUB (null) * * @param titre le titre de ce livre. * @param nomAuteur le nom de l'auteur de ce livre. * @param prenomAuteur le prenom de l'auteur de ce livre. */ public Livre(String titre, String nomAuteur, String prenomAuteur) { //Appel du constructeur a 6 parametres this(DEFAUT_ISBN, titre, nomAuteur, prenomAuteur, DEFAUT_NBR_PAGES, DEFAUT_DATE_PUB); } //----------------------------- //METHODES D'INSTANCE PUBLIQUES //----------------------------- /** * Permet de consulter le ISBN de ce livre. * @return le ISBN de ce livre. */ public String getISBN() { return ISBN; } /** * Permet de consulter le titre de ce livre. * @return le titre de ce livre. */ public String getTitre() { return titre; } /** * Permet de consulter le nom de l'auteur de ce livre. * @return le nom de l'auteur de ce livre. */ public String getNomAuteur() { return nomAuteur; } /** * Permet de consulter le prenom de l'auteur de ce livre. * @return le prenom de l'auteur de ce livre. */ public String getPrenomAuteur() { return prenomAuteur; }

Page 21: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

21

/** * Permet de consulter le nombre de pages de ce livre. * @return le nombre de pages de ce livre. */ public int getNbrPages() { return nbrPages; } /** * Permet de consulter la date de publication de ce livre. * @return la date de publication de ce livre. */ public Date getDatePublication() { return datePublication; } /** * Permet de modifier le ISBN de ce livre. * @param ISBN le nouveau ISBN. */ public void setISBN(String ISBN) { this.ISBN = ISBN; } /** * Permet de modifier le titre de ce livre. * @param titre le nouveau titre. */ public void setTitre(String titre) { this.titre = titre; } /** * Permet de modifier le nom de l'auteur de ce livre. * @param nom le nouveau nom. */ public void setNomAuteur(String nom) { nomAuteur = nom; } /** * Permet de modifier le prenom de l'auteur de ce livre. * @param prenom le nouveau prenom. */ public void setPrenomAuteur(String prenom) { prenomAuteur = prenom; } /** * Permet de modifier le nbr de pages de ce livre. * @param nbrPages le nouveau nombre de pages. */ public void setNbrPages(int nbrPages) { this.nbrPages = nbrPages; }

Page 22: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

22

/** * Permet de modifier la date de publication de ce livre. * @param datePub la nouvelle date de publication. */ public void setDatePublication(Date datePub) { //ajustement de la variable static if (datePub == null && datePublication != null) { nbrLivresSansDatePub ++; } else if (datePub != null && datePublication == null) { nbrLivresSansDatePub --; } datePublication = datePub; } /** * Construit une representation sous forme de chaine de caracteres * de ce livre. Format : NOM, P. (annee pub), titre, nbrPages pages. * @return une chaine de caracteres decrivant les attributs de ce * livre. */ public String toString() { String reference = ""; char initiale = 'X'; if (prenomAuteur != null && !prenomAuteur.isEmpty()) { initiale = prenomAuteur.charAt(0); } reference = nomAuteur + ", " + initiale + "."; if (datePublication == null) { reference = reference + ", " + titre + ", " + nbrPages + " pages."; } else { reference = reference + " ("+ datePublication.getAnnee() + "), " + titre + ", " + nbrPages + " pages."; } return reference; } //----------------------------- //METHODES DE CLASSE PUBLIQUES //----------------------------- /** * Permet d'obtenir le nombre de livres crees qui n'ont pas de date * de publication (date pub est null). * @return le nombre de livres sans date de publication. */ public static int getNbrLivresSansDatePub () { return nbrLivresSansDatePub; } /** * Permet d'obtenir le nombre total de livres crees. * @return le nombre total de livres crees. */ public static int getNbrLivresCrees () { return nbrLivresCrees; } }

Page 23: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

23

3. Utilisation de classes

3.1 Instanciation d’objets Après avoir défini une classe comme la classe Date, nous pouvons définir et manipuler des objets de cette classe. Déclaration d’un objet de type Date : Date uneDate; //déclaration

(représentation mémoire)

La déclaration ci-dessus réserve en mémoire un emplacement pour une référence (une adresse mémoire) contrairement à la déclaration d’une variable d’un type primitif (int i par exemple qui aurait eu pour effet de réserver 4 octets en mémoire). L’emplacement pour l’objet uneDate ne sera alloué que lors de l’instanciation de cet objet avec l’opérateur new. Instanciation de l’objet uneDate : uneDate = new Date(); //instanciation : crée un objet de type

//Date et place sa référence dans uneDate

(représentation mémoire)

La classe Date contient un constructeur sans argument, mais qui ne fait rien. Les attributs d’instance sont donc initialisés avec les valeurs qu’on a données lors de la déclaration des attributs : annee = 2000, mois = 1 et jour = 1.

Cependant, les attributs ne sont pas toujours initialisés lors de leur déclaration dans la classe et dans ce cas, an moment de l’instanciation, Java initialise ces attributs avec des valeurs par défaut déterminées selon le type des attributs (voir tableau 2.1). Étapes lors de la construction d'un objet :

1. Allocation de mémoire pour l’objet. 2. Initialisation implicite : initialisation des attributs avec les valeurs par défaut – voir

tableau 2.1. 3. Initialisation explicite : initialisation des attributs avec les valeurs données à la

déclaration (s'il y a lieu). 4. Exécution du constructeur : initialisations effectuées par le constructeur (s'il y a lieu).

Page 24: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

24

Exemple d’utilisation du constructeur d’initialisation de la classe Date. uneDate = new Date(1984, 2, 29);

(représentation mémoire)

3.2 Utilisation d’objets Exemple : programme ageMajeureOuMineure avec l’utilisation du type Date. /** * Cette application demande a l'utilisateur d'entrer la date * de naissance d'un personne et affiche ensuite si cette * personne est majeure ou mineure. * * @author Melanie Lord * @version novembre 2015 */ public class AgeMajeureOuMineure { //constantes de classe public final static Date DATE_REF = new Date(2007, 5, 12); public final static int AGE_MAJEUR = 18; //Age de la majorite /** * Affiche une breve presentation du logiciel. */ public static void presenterLogiciel () { System.out.println("Ce programme permet de determiner " + "si une personne est majeure \nou mineure, en " + "date du " + DATE_REF.formater() + "."); System.out.print("\nTaper ENTREE pour continuer..."); Clavier.lireFinLigne(); System.out.println(); } public static void finProgramme () { System.out.println("\nFin normale du programme.\n"); }

Page 25: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

25

/** * Demande a l'utilisateur d'entrer l'annee, le mois et * le jour d'une date et retourne cette date. * Cette methode ne valide pas si la date formee par * les entrees de l'utilisateur est valide ou non. * @return la date saisie. */ public static Date lireDate() { //date de naissance a lire et retourner Date date = new Date(); System.out.print("Entrez l'annee de la date de naissance : "); date.setAnnee (Clavier.lireInt()); System.out.print("Entrez le mois de la date de naissance : "); date.setMois (Clavier.lireInt()); System.out.print("Entrez le jour de la date de naissance : "); date.setJour (Clavier.lireInt()); return date; } /** * Afficher si la date de naissance donnee correspond a * une personne majeure ou mineure en date de DATE_REF. * @param dateNaissance la date de naissance de la personne dont * on veut determiner si elle est majeure * ou mineure. */ public static void afficherMajeurOuMineur (Date dateNaissance) { if (estMajeure(dateNaissance)) { System.out.println("\nCette personne est majeure.\n"); } else { System.out.println("\nCette personne est mineure.\n"); } } /** * Verifie si une personne avec la date de naissance donnee * en parametre est majeure ou mineure en date de DATE_REF. * @param dateNaissance la date de naissance de la personne dont * on veut determiner si elle est majeure * ou mineure. * @return true si la personne est majeure, faux sinon. */ public static boolean estMajeure(Date dateNaissance) { //nombre d'annees de difference avec la date de reference. int nbrAnnee = DATE_REF.getAnnee() - dateNaissance.getAnnee(); boolean estMajeur = false; if (nbrAnnee > AGE_MAJEUR) { estMajeur = true; } else if (nbrAnnee == AGE_MAJEUR) { if (DATE_REF.getMois() > dateNaissance.getMois()) {

Page 26: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

26

estMajeur = true; } else if (DATE_REF.getMois() == dateNaissance.getMois()) { if (DATE_REF.getJour() >= dateNaissance.getJour()) { estMajeur = true; } } } return estMajeur; } /** * Saisit et valide la reponse de l'utilisateur a savoir * s'il veut recommencer ou terminer le programme. * Une reponse valide est 'o' ou 'O' pour OUI et * 'n' ou 'N' pour non. * @return true si l'utilisateur a entre 'o' ou 'O', false sinon. */ public static boolean encore() { char rep; //reponse de l'utilisateur System.out.print("Voulez-vous entrez une autre date (o/n): "); rep = Clavier.lireCharLn(); rep = Character.toUpperCase(rep); while (rep != 'O' && rep != 'N') { System.out.println("\nRepondez par (o)ui ou (n)on !"); System.out.print("Voulez-vous entrer une autre date (o/n): "); rep = Clavier.lireCharLn(); rep = Character.toUpperCase(rep); } return rep == 'O'; } public static void main(String[] params) { Date dateNaissance; //La date de naissance d'une personne presenterLogiciel(); do { dateNaissance = lireDate(); if (dateNaissance.estDateValide()) { afficherMajeurOuMineur(dateNaissance); } else { System.out.println("\nErreur, date invalide !"); System.out.println("Note : l'annee d'une date valide " + "doit etre entre " + Date.ANNEE_MIN + " et " + Date.ANNEE_MAX + ".\n"); } } while (encore()); finProgramme(); } }

Page 27: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

27

Note sur les objets null On ne peut pas appeler une méthode sur un objet null => lève une NullPointerException qui fait planter le programme (lorsque non gérée). Exemple : public class A { public static void main (String [] args) { String s = null; char c = s.charAt(0); //erreur à l’exécution } //NullPointerException } Note sur la comparaison d’objets (test d’égalité) Les opérateurs == et != s'appliquent aux objets mais comparent leur référence. Pour comparer le contenu et non l'adresse (référence) des objets, il faut implémenter des méthodes de comparaison (comme la méthode equals de la classe String, par exemple ou la méthode estEgalA de la classe Employe). Exercice : Dessinez l’état de la mémoire pour les variables d1, d2, d3 et d4 après l’exécution des instructions suivantes. Date d1 = new Date(); Date d2 = new Date(2005, 8, 18); Date d3 = new Date(1967, 3, 9); Date d4 = new Date (1998, 10, 10); d1.setAnnee(1999); d4 = d2; d3.setMois(11); d2.setJour(7); d4.setJour(30); d2 = d3; d3 = d1; d2.setJour(16); d1.setJour(9);

4. Le ramasse-miettes Il n'existe pas, en Java, d'opérateur permettant de détruire un objet dont on n'a plus besoin. Le ramasse-miettes (garbage collector) est un mécanisme de gestion automatique de la mémoire. Lorsqu'un objet est déréférencé, il devient un candidat au ramasse-miettes qui, à un certain moment, libérera la mémoire de cet objet.

Page 28: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

28

5. Principe d’encapsulation des données

5.1 Notion d’encapsulation L’encapsulation est une bonne pratique de programmation :

§ Consiste à cacher les données d'une classe aux autres classes (attributs private). § L’encapsulation oblige à passer par des méthodes pour accéder aux données. Ces

méthodes permettent alors d’effectuer les traitements ou vérifications nécessaires pour assurer la cohérence des données.

Exemple : dans la classe Date, les méthodes de modifications (setters) pourraient vérifier si une date demeurera valide avant d’affecter les nouvelles valeurs.

§ L’encapsulation permet de modifier l’implémentation d’une classe sans en modifier le contrat et donc, sans que les programmes qui utilisent cette classe aient à être modifiés.

5.2 Contrat d’une classe Le contrat d’une classe définit les services (méthodes publiques) offerts par cette classe. C’est ce que l’utilisateur doit connaître pour utiliser cette classe. C’est tout ce qui est public (Javadoc).

§ Les en-têtes des méthodes non privées (nom de la méthode, type de retour, nombre et type des paramètres à fournir, exceptions lancées).

§ Le comportement des méthodes non privées - décrit dans la Javadoc d’une méthode (ce que les méthodes font et sous quelles conditions).

Exemple : contrat de la classe Date

Javadoc de la classe Date : http://labunix.uqam.ca/~lord_mel/INF1120/site/exemples/classesEtObjets/Date.html

5.3 Implémentation d’une classe L’implémentation d’une classe fait référence à la manière dont cette classe fait les choses et aux structures de données utilisées. C’est tout ce qui est caché.

§ Les attributs privés § Les méthodes privées § Le corps des méthodes publiques

L’utilisateur n’a pas à connaître l’implémentation d’une classe pour utiliser cette classe, seulement son contrat (la Javadoc).

Exemples de modifications de l’implémentation de la classe Date, sans modifier le contrat :

§ Modification de la structure de données : utilisation un tableau d’entiers de longueur 3 au lieu de 3 variables d’instances de type entier.

§ Modification du corps des méthodes en fonction de la nouvelle structure de données utilisée.

Page 29: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

29

//l'annee le mois et le jour de cette date //avec initialisation explicite. private int [] anneeMoisJour = {2000, 1, 1}; //CONSTRUCTEUR public Date (int annee, int mois, int jour) { anneeMoisJour[0] = annee; anneeMoisJour[1] = mois; anneeMoisJour[2] = jour; } //GETTERS public int getAnnee() { return anneeMoisJour[0]; } ... //SETTERS... public void setMois(int mois){ anneeMoisJour[1] = mois; } ...

6. Exercices

6.1. Dessin de l'état de la mémoire Exercice 1 Étant donné la classe Date de la page 12, dessinez l’état de la mémoire pour les variables d1, d2, d3, d4, d5 et d6 après l’exécution des instructions suivantes.

Date d1 = new Date(2000, 11, 24); Date d2 = new Date(2003, 2, 12); Date d3 = new Date(1990, 8, 18); Date d4 = new Date(1943, 10, 5); Date d5 = new Date(); Date d6 = null; d1.setAnnee(d4.getAnnee()); d6 = d2; d5.setAnnee(1); d3.setMois(9); d3.setJour(d4.getMois()); d2 = d5; d6.setJour(1); d2.setMois(12); d1 = d3; if (!d2.estDateValide()) { d2 = null; }

Page 30: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

30

Exercice 2 Étant donné la classe Employe de la page 15, dessinez l’état de la mémoire pour les variables e1, e2, e3, et e4 après l’exécution des instructions suivantes. Employe e1 = new Employe("Mill", "Sarah", 4, 44000); Employe e2 = new Employe("Morin", "Gus", 10, 63000); Employe e3 = new Employe("Lavoie", "Luc", 1, 36000); Employe e4; e2.setNbrAnnees(e3.getNumero() + 2); e1.setSalaire(e1.getSalaire() + 2000); e4 = e3; e2.setSalaire(43500); e3 = new Employe("Doe", "Jane", 2, 40000); e2 = e1; e2.setNom("Millet"); e1 = e3; if (e1.getNbrAnnees() == e3.getNbrAnnees()) { e4.setNbrAnnees(Employe.dernierNumero()); }

6.2. Conception et utilisation de classes Exercice 1 Vous devez concevoir une classe nommée Tirelire qui modélise une tirelire pouvant contenir des pièces de 25 cents, 10 cents, 5 cents et 1 cent selon les spécifications suivantes : Attributs d’instance :

- le nombre de pièces de 25 cents (type int) - le nombre de pièces de 10 cents (type int) - le nombre de pièces de 5 cents (type int) - le nombre de pièces de 1 cent (type int)

Constructeurs : Vous devez concevoir deux constructeurs :

1. Un constructeur sans paramètre qui initialise tous les attributs d’instance avec la valeur 0.

2. Un constructeur qui prend 4 paramètres (nombre 25 cents, nombre 10 cents, nombre 5 cents, et nombre 1 cent), et qui initialise les attributs d’instance avec les valeurs reçues en paramètres.

Accesseurs et Modificateurs : Écrivez les getters et setters pour chacun des attributs d’instance. Autres méthodes publiques : Ajoutez la méthode montantTotalEnSous qui ne prend aucun paramètre, et qui retourne le montant total (int) dans cette tirelire, en cents. Ajoutez la méthode montantTotalEnDollars qui ne prend aucun paramètre, et qui retourne le montant total (double) dans cette tirelire, en dollars.

Note : vous devez respecter le principe d’encapsulation.

Page 31: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

31

Exercice 2

Dans une classe nommée GererTirelire, écrivez un programme (une méthode main + autres méthodes) qui affiche un menu de différentes options pour gérer le nombre de pièces de chaque type, dans une tirelire. Évidemment, vous devez utiliser la classe Tirelire que vous avez conçue à l’exercice précédent. Le programme commence en affichant le menu de 7 options suivant :

----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter

Les options 1 à 4 demandent à l’utilisateur d’entrer le nombre de pièces de la sorte choisie (25, 10, 5 ou 1), et le programme modifie ensuite le nombre de cette sorte de pièce dans la tirelire, par le nombre entré par l’utilisateur. Les options 5 et 6 affichent le montant total dans la tirelire respectivement en sous, et en dollars. L’option 7 permet de quitter le programme. Note : pour cet exercice, vous n’avez pas à valider les saisies du nombre de pièces pour les options 1 à 4. Voici un exemple d’exécution : ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : d Choississez une option du menu! Appuyez sur <Entree> pour continuer... ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 1 Entrez le nombre de 25 cents : 4

Page 32: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

32

----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 2 Entrez le nombre de 10 cents : 4 ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 3 Entrez le nombre de 5 cents : 4 ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 5 Le montant total en sous : 160 cent(s) Appuyez sur <Entree> pour continuer... ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 4 Entrez le nombre de 1 cents : 133 ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 6

Le montant total en dollars : 2.93 $

Page 33: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

33

Appuyez sur <Entree> pour continuer... ----- Menu ----- 1. Modifier le nombre de 25 cents 2. Modifier le nombre de 10 cents 3. Modifier le nombre de 5 cents 4. Modifier le nombre de 1 cent 5. Calculer le montant total en sous 6. Calculer le montant total en dollars 7. Quitter Choisir une option au menu : 7 FIN NORMALE DU PROGRAMME

7. Solutions des exercices

7.1 Solutions des exercices de la section 6.1 Exercice 1

Exercice 2

Page 34: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

34

7.2 Solutions des exercices de la section 6.2

Exercice 1 /** * Cette classe modelise une tirelire qui peut contenir des pieces de 25 cents, * de 10 cents, de 5 cents et de 1 cent. * @author Melanie Lord * @version novembre 2015 */ public class Tirelire { private int nombre25; //nombre de 25 cents private int nombre10; //nombre de 10 cents private int nombre5; //nombre de 5 cents private int nombre1; //nombre de 1 cent /** * Constructeur d'initialisation. Construit une tirelire qui contient * zero 25 cents, zero 10 cents, zero 5 cents et zero 1 cent. */ public Tirelire() { nombre25 = 0; nombre10 = 0; nombre5 = 0; nombre1 = 0; } /** * Constructeur d'initialisation. Construit une tirelire contenant nb25 * 25 cents, nb10 10 cents, nb5 5 cents et nb1 1 cent. * @param nb25 le nombre de 25 cents dans cette tirelire. * @param nb10 le nombre de 10 cents dans cette tirelire. * @param nb5 le nombre de 5 cents dans cette tirelire. * @param nb1 le nombre de 1 cent dans cette tirelire. */ public Tirelire(int nb25, int nb10, int nb5, int nb1) { nombre25 = nb25; nombre10 = nb10; nombre5 = nb5; nombre1 = nb1; } /** * Permet d'obtenir le nombre de 25 cents dans cette tirelire. * @return le nombre de 25 cents dans cet objet Tirelire. */ public int getNombre25() { return nombre25; } /** * Permet d'obtenir le nombre de 10 cents dans cette tirelire. * @return le nombre de 10 cents dans cet objet Tirelire. */ public int getNombre10() { return nombre10; }

Page 35: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

35

/** * Permet d'obtenir le nombre de 5 cents dans cette tirelire. * @return le nombre de 5 cents dans cet objet Tirelire. */ public int getNombre5() { return nombre5; } /** * Permet d'obtenir le nombre de 1 cent dans cette tirelire. * @return le nombre de 1 cent dans cet objet Tirelire. */ public int getNombre1() { return nombre1; } /** * Modifie le nombre de 25 cents par la valeur donnee en parametre. * @param nb25 le nouveau nombre de 25 cents. */ public void setNombre25(int nb25) { nombre25 = nb25; } /** * Modifie le nombre de 10 cents par la valeur donnee en parametre. * @param nb10 le nouveau nombre de 10 cents. */ public void setNombre10(int nb10) { nombre10 = nb10; } /** * Modifie le nombre de 5 cents par la valeur donnee en parametre. * @param nb5 le nouveau nombre de 5 cents. */ public void setNombre5(int nb5) { nombre5 = nb5; } /** * Modifie le nombre de 1 cent par la valeur donnee en parametre. * @param nb1 le nouveau nombre de 1 cent. */ public void setNombre1(int nb1) { nombre1 = nb1; } /** * Permet d'obtenir le montant total dans cette tirelire, en sous. * @return le montant total en sous */ public int montantTotalEnSous() { return nombre25 * 25 + nombre10 * 10 + nombre5 * 5 + nombre1 * 1; } /** * Permet d'obtenir le montant total dans cette tirelire, en dollars. * @return le montant total en dollars. */ public double montantTotalEnDollars() { return (double) montantTotalEnSous() / 100.0; } }

Page 36: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

36

Exercice 2 public class GererTirelire { public static final String MSG_CHOIX_MENU = "\nChoisir une option au menu : "; public static final String MSG_ERR_CHOIX_MENU = "\nChoississez une option du menu!"; public static final String MSG_NB25 = "Entrez le nombre de 25 cents : "; public static final String MSG_NB10 = "Entrez le nombre de 10 cents : "; public static final String MSG_NB5 = "Entrez le nombre de 5 cents : "; public static final String MSG_NB1 = "Entrez le nombre de 1 cents : "; public static final String MSG_ENTER = "\nAppuyez sur <Entree> pour continuer..."; public static final String MSG_FIN = "\n\nFIN NORMALE DU PROGRAMME"; public static void afficherMenu() { System.out.println("\n-----\nMenu\n-----" + "\n1. Modifier le nombre de 25 cents" + "\n2. Modifier le nombre de 10 cents" + "\n3. Modifier le nombre de 5 cents" + "\n4. Modifier le nombre de 1 cent" + "\n5. Calculer le montant total en sous" + "\n6. Calculer le montant total en dollars" + "\n7. Quitter"); } public static int lireNombreDePieces (char noOption, String msg) { int nombre; System.out.print(msg); nombre = Clavier.lireInt(); return nombre; } public static void afficherMontantTotalEnSous (Tirelire tirelire) { System.out.print("\nLe montant total en sous : " + tirelire.montantTotalEnSous() + " cent(s)" + MSG_ENTER); Clavier.lireFinLigne(); System.out.println(); } public static void afficherMontantTotalEnDollars (Tirelire tirelire) { System.out.print("\nLe montant total en dollars : " + tirelire.montantTotalEnDollars() + " $" + MSG_ENTER); Clavier.lireFinLigne(); System.out.println(); } public static void afficherErreurMenu () { System.out.print(MSG_ERR_CHOIX_MENU + MSG_ENTER); Clavier.lireFinLigne(); System.out.println(); }

Page 37: Les classes et les objets - LabUnixlabunix.uqam.ca/.../NotesCours_classesEtObjets_v1.2.pdf · Programmation I – INF1120 Les classes et les objets Mélanie Lord lord.melanie@uqam.ca

Programmation I – INF1120 Les classes et les objets

Mélanie Lord [email protected]

37

public static void main(String[] args) { char choixMenu; boolean quitter = false; int nombre; Tirelire tirelire = new Tirelire(); //vide au debut while (!quitter) { afficherMenu(); System.out.print(MSG_CHOIX_MENU); choixMenu = Clavier.lireCharLn(); if (choixMenu == '1') { nombre = lireNombreDePieces(choixMenu, MSG_NB25); tirelire.setNombre25(nombre); } else if (choixMenu == '2') { nombre = lireNombreDePieces(choixMenu, MSG_NB10); tirelire.setNombre10(nombre); } else if (choixMenu == '3') { nombre = lireNombreDePieces(choixMenu, MSG_NB5); tirelire.setNombre5(nombre); } else if (choixMenu == '4') { nombre = lireNombreDePieces(choixMenu, MSG_NB1); tirelire.setNombre1(nombre); } else if (choixMenu == '5') { afficherMontantTotalEnSous(tirelire); } else if (choixMenu == '6') { afficherMontantTotalEnDollars(tirelire); } else if (choixMenu == '7') { quitter = true; } else { afficherErreurMenu (); } } System.out.println(MSG_FIN); } }