Programmation par objets Objets et Classes
Notions du cours comprendre les principes des classes et des objets les constructeurs de classe la méthode tostring() attributs public et private méthodes et variables statiques et d instances
Introduction aux objets La programmation par objets est une méthode qui fonde la structure des programmes autour des objets Chaque objet peut être considéré comme un fournisseur de services utilisés par d autres objets, les clients Un objet peut être à la fois fournisseur et client Les services offerts par les objets sont : des données qui sont nommées attributs des actions (cf fonctions) qui sont nommées méthodes Important : chaque objet n est pas décrit individuellement, la POO fournit une construction la classe qui décrit les objets possédant les mêmes propriétés
Classes et objets int i; la variable i est de type primitif entier Personne p; la variable p est de type Personne (qui est une classe) Une classe est une combinaison de types primitifs et éventuellement d autres classes. Par exemple, la classe Personne peut contenir un nom de type String, age de type int et la variable adresse. adresse peut être elle-même une classe qui contient des éléments comme : nom de rue, numéro dans la rue, Un objet est une instance de classe. Par exemple ici, p est une Personne Les noms de classes commencent par une majuscule (TOUJOURS)
Différences classes/objets les classes sont des descriptions ou encore des squelettes des objets. Ce ne sont pas des objets en tant que tels Les classes sont des «moules» servant à créer des objets La déclaration d une classe ne crée aucun objet Les objets sont créés à partir des classes, on parle alors d instances de classes. L opération de création d un objet à partir d une classe est aussi appelée instanciation Les objets (instances) créés possède tous les attributs et (méthodes) de la classe dont ils sont issus Les objets sont différents les uns des autres (chaque rectangle a a priori une longueur et largeur différente)
Les classes en Java La syntaxe de déclaration des classes en Java est la suivante : public class Rectangle { public double largeur, longueur ; La création d un objet se fait par le mot-clef new et son initialisation grâce à un constructeur dont le nom est celui de la classe Rectangle r = new Rectangle() Note : nous avons déjà vu des classes Random toto = new Random()
Exemple de classe La déclaration d une classe correspond à la déclaration d un nouveau type. Par exemple, la classe Rectangle décrit des objets de type Rectangle qui contiennent deux attributs de type réel : longueur et largeur Note : il est d usage (en particulier en Java) de commencer les classes par une majuscule Rectangle - largeur : réel - longueur : réel
Instanciation d objets Les attributs de l objet prennent des valeurs initiales données par un constructeur. Pour chaque classe, il existe un constructeur par défaut en pseudo-code : variable r type Rectangle créer Rectangle() crée une instance de la classe Rectangle avec comme identificateur r. (cf page suivante). Les attributs sont initialisés à 0 par le constructeur. Attention : l affectation d objets de type classe ne fonction pas comme les données élémentaires. L affectation q r affecte à q la référence de l objet désigné par r. q et q correspondent au même objet
Illustration Rectangle r largeur = 0.0 longueur = 0.0 Rectangle r largeur = 0.0 longueur = 0.0 q
Les classes en Java L accès aux attributs de fait en Java par l utilisation de la notation pointée vue précédemment. L autorisation d accès aux attributs se fait par la notation pointée vue précédemment grâce au mot-clef public ou private (accès restreint aux objets de la classe) Par convention, l objet courant est désigné par this. this.largeur ou largeur désignent le même attribut de l objet courant chaque objet possède un attribut this qui est une référence à lui-même (nous reviendrons sur ce concept) Un attribut précédé du mot-clef static le rend partagé par tous les objets de la classe
Accès aux attributs L accès à un attribut est valide si ce dernier existe, c est-àdire s il a été créé au préalable. Cet accès se fait simplement en le nommant Dans une classe, toute référence aux attributs définis dans la classe elle-même s applique à l instance courante de l objet, que l on appelle objet courant L accès aux attributs d autres objets de fait par une notation pointée de la forme n.a, où n est un nom qui désigne l objet, et a un attribut particulier Par défaut, nous considérons que tous les attributs d une classe sont privés et ne sont pas directement accessibles. Les attributs accessibles seront explicitement nommés public
Exemple classe Rectangle public largeur, longueur type réel finclasse Rectangle déclaration explicite d accès public des attributs de la classe Rectangle variable r type Rectangle créer Rectangle() Pour accéder aux attributs : r.largeur r.longueur Rectangle + largeur : réel + longueur : réel Dans notre cours, les attributs ne seront jamais publics
Les méthodes Le second type de service offert par un objet à ses clients est un ensemble d opérations sur les attributs. Ces opérations sont appelées méthodes. Pour toutes les instances d une même classe, il n existe qu un exemplaire de chaque méthode de la classe ( attributs) On peut rapprocher le principe des méthodes aux fonctions qui ne s appliquent que sur des objets d une classe donnée Comme dans le cas des attributs, les méthodes peuvent être publiques (public) ou privées (private)
Ajout de méthodes à la classe Rectangle public class Rectangle { /* les attributs */ largeur, longueur : double ; /* les méthodes */ public double périmètre() { return 2*(largeur + longueur) ; public double surface() { return largeur * longueur ; Rectangle - largeur : réel - longueur : réel + périmètre() : réel + surface() : réel cf : méthode Point de la classe java
Utilisation en Java Déclaration d une variable de type Rectangle (ie instanciation d un objet de type Rectangle) Rectangle r1 = new Rectangle() ; Calcul du périmètre et de la superficie p = r1.perimetre() ; s = r1.surface() ; Les méthodes peuvent bien sûr accepter des paramètres (cf plus loin)
Surcharges de méthode Les méthodes peuvent avoir des en-têtes différentes bien qu elles aient le même nom, elles sont considérées comme distinctes et dites surchargées La notion de surcharge est importante en POO Attention, elle peut être source d erreurs
Ajout de méthodes à la classe Rectangle classe Rectangle /* les attributs */ largeur, longueur type réel /* les méthodes */ public fonction périmètre() : réel retourner 2x(largeur + longueur) finfonc public fonction surface() : réel retourner largeur x longueur finfonc finclasse Rectangle Rectangle - largeur : réel - longueur : réel + périmètre() : réel + surface() : réel cf : méthode Point de la classe java
Notion de constructeur Nous avons déjà vu que lors de la construction d un objet (instanciation), les attributs étaient initialisés à des valeurs par défaut, grâce à un constructeur par défaut ; il est possible et très commun de redéfinir le constructeur par défaut ; exemple pour la classe Rectangle.
Constructeur de Rectangle classe Rectangle public largeur, longueur type réel constructeur Rectangle() largeur 1 longueur 1 fincons { les méthodes... finclasse Rectangle
suite Bien souvent, il est souhaitable de proposer plusieurs constructeurs. Par exemple, un second constructeur pour permettre de choisir explicitement les attributs d un «rectangle» constructeur Rectangle() largeur 1 longueur 1 fincons constructeur Rectangle(lar, long : réel) largeur larg longueur long fincons Rectangle - largeur : réel - longueur : réel + Rectangle() + Rectangle(larg,long) + périmètre() : réel + surface() : réel
Utilisation Rectangle r1 = new Rectangle() ; Rectangle r2 = new Rectangle(3.0,2.0) ; r1 est de taille 1x1 r2 est de taille 3x2
Traduction en Java public class Rectangle { private double largeur, longueur; // les constructeurs public Rectangle(){ largeur = longueur = 1.0; public Rectangle(double larg, double long){ largeur = larg; longueur = long; // les méthodes public double perimetre(){ return 2.0*(largeur + longueur); public double surface(){ return largeur*longueur; Rectangle - largeur : réel - longueur : réel + Rectangle() + Rectangle(larg,long) + périmètre() : réel + surface() : réel
Attributs partagés Chaque objet possède ces attributs (chaque rectangle a une largeur et longueur différentes) Il est possible de partager un attribut dit attribut de classe pour toutes les instances d une classe dans le cas de la classe Rectangle, un tel attribut peut être par exemple le nombre de côtés On utilisera dans le cas du pseudo-code, le mot-clef partagé Rectangle - largeur : réel - longueur : réel partagé nbcôté : entier
Accesseurs / Modificateurs En général, on évite de modifier directement les attributs à l extérieur du programme ; On utilise plutôt le principe d encapsulation (c est-à-dire que l on utilise une méthode pour positionner un attribut) // accesseurs - modificateurs public void changerlongueur(double lg){ longueur = lg; public void changerlargeur(double lg){ largeur = lg; public double getlongueur(){ return longueur; Rectangle - largeur : réel - longueur : réel + Rectangle() + Rectangle(larg,long) + périmètre() : réel + surface() : réel + changerlongueur(lg) + changerlargeur(lg) + getlongeur() : réel
Encapsulation Mécanisme de protection des membres d'un objet, en limitant leur visibilité / accessibilité privé : visible de la classe publique : visible/accessible de partout protégé : visible de la classe et des classes enfants package : visible des classes du même package
Paradigme objets et notation UML La notation UML (Unified Modeling Language), issue de l'omg (Object Management Group) un langage base sur un meta - modèle un ensemble de diagrammes qui permettent la représentation visuelle d'un système selon différents angles aspects statiques du système (description) aspects dynamiques du système (comportements) La notion de classe décrit les objets du système : classe, membres attributs et méthodes communs à une classe d'objets des relations entre classes objet, instance d'une classe, un exemplaire particulier Le diagramme de classes représente l'aspect statique d'un système
Notation graphique UML
Autre exemple un dé Rappel : les classes contiennent : des variables que l'on appelle des attributs des fonctions permettant d'interagir sur les attributs que l'on appelle des méthodes les attributs sont en général «private». Cela signifie que personne en dehors de la classe ne peut y accéder. Le monde extérieur interagit sur les attributs de classe par l'intermédiaire des méthodes public class De{ private int valeurdé; public void setvalue(int value){ valeurdé = value; public int getvalue(){ return valeurdé;
Interface de la classe private: int valeurdé public : void setvalue(int) int getvalue() interface de classe classe Dé
Remarques Ces méthodes présentées ici qu'on appelle des accesseurs et modificateurs n'ont a priori pas à être utilisées ici il faut s'interroger : que doit faire notre classe? si on veut simuler un dé, il faut s'y prendre autrement Notes : les accesseurs sont des méthodes pour obtenir la valeur d'un attribut les modificateurs permettent de les positionner
Une meilleure implémentation public class Dé{ private int valeurdé; public void lancedé(){ valeurdé = getrandomvaleurdé(); public int getvalue(){ if(valeurdé >=1 && valeurdé <=6){ return valeurdé; else { return -1; private int getrandomvaleurdé() { return (int) (Math.random() * 6 + 1);
Créer et utiliser des objets Créer un nouveau dé Dé de = new Dé() ; Lancement du dé (et positionnement de l attribut valeurde) de.lancerdé() ; Obtention de la valeur du dé System.out.println(de.getValue()) ;
Notes sur les constructeurs Les constructeurs sont des méthodes particulières qui ne sont appelées que lors de la création de l objet. Ce sont donc des méthodes. Un constructeur n a pas de type de retour, même pas void. Le(s) constructeur(s) a(ont) exactement le même nom que la classe Les constructeurs sont en général de type public Les méthodes de type constructeurs ne sont jamais appelées directement. Elles sont appelées par l intermédiaire du motclef new. A l intérieur de la classe, les constructeurs peut appeler un autre constructeur en utilisant le mot-clef this.
public class Dé{ private int valeurdé; public Dé(){ lancerde(); public Dé(int value){ dievalue = value; private int getrandomdievalue() { return (int) (Math.random() * 6 + 1);... Il y a ici deux constructeurs pour la classe Dé Dans le deuxième constructeur, value est le paramètre formel qui sera affecté à l attribut valeurdé
Exemple d utilisation des Dé d1 = new Dé(3); constructeurs System.out.println(d1.getValue()); Die d2 = new Dé(); System.out.println(d.getValue()); for(int i = 0; i<50; i++){ d2.lancerdé(); System.out.println(d2.getValue()); L utilisation de new permet l appel au constructeur Nous créons deux dés par l utilisation de deux constructeurs d1 et d2 cf De.java
Quelques rappels Jusqu à maintenant : créer un nouveau dé Dé d = new Dé() ; lancer le dé et positionner sa valeur d.lancerdé() ; obtenir la valeur du dé System.out.println(d.getValue()) ; si... l attribut valeurdé avait été public (mais pour nous ce ne sera jamais le cas) System.out.println(d.valeurDé) ; ou encore pire d.valeurdé = 6 ; pourquoi est-ce dangereux?
Attributs d instances dans la classe Rectangles, les variables largeur et longueur sont des variables d instance Cela signifie que les attributs largeur et longueur sont créés pour chaque objet de type Rectangle. Si on crée 10 objets de type Rectangle, on créera 10 variables largeur et longueur (qui auront des valeurs a priori différentes) Par exemple pour la classe Dé, si l attribut valeurdé était public, pour le modifier pour l objet de, il suffirait d écrire de.valeurde = 6 ; (on ne le fera pas bien entendu) si l attribut est privé, on utilisea de.lancerdé() ;
Attributs de classe (ou partagés) Les attributs de classe sont associés à la classe et non individuellement aux objets de la classe on utilise le mot-clef static devant un attribut pour indiquer qu il est partagé par toute la classe quelques exemples d attributs statiques : nombre d objets créés dans la classe (très classique cf exercice) constantes (taille max et min du rectangle par exemple) variables globales utilisées par les objets
Méthodes d instances / de classes Comme pour les attributs, il est possible d avoir des méthodes d instance ou de classe Une méthode de classe est appelée sur la classe et non sur les objets Elle est introduite comme pour un attribut de classe par le mot-clef static. Pour l appeler, on appelle le nom de la classe suivi du nom de la méthode. Ex : Math.abs() méthode de classe calculant la valeur absolue d un nombre de la classe Math
Exercices Créer une classe Etudiant nom, prénom :chaînes de caractères année de naissance : entier tableau de 20 notes nbnotes entier indiquant le nombre de notes jusqu à présent Écrire la classe avec ses attributs (en Java) Écrire deux constructeurs un avec nom, prénom un avec nom, prénom et année de naissance les constructeurs initialiseront tous le tableau de notes à 0 ainsi que la variable nbnotes Écrire les méthodes suivantes :
Exercices moyenne : pour calculer la moyenne des notes max qui retournera la meilleure note min qui retournera la note la plus faible -ajouternote(int n) : pour ajouter la note n à l étudiant -anneenaissance : méthode qui retourne l année de naissance de l étudiant Écrire un programme qui affiche la nouvelle moyenne d'un étudiant à chaque entrée d'une nouvelle note Écrire un programme principal qui à partir de deux étudiants dit lequel est le plus vieux utilisation des attributs de classe (static) : utiliser les attributs de classe pour conserver le numéro d ordre de l étudiant (étudiant n 1, n 2,...)