Classes et objets Plan Programme/application Java Exécution d`un
Transcription
Classes et objets Plan Programme/application Java Exécution d`un
Objectif de cette partie : écrire ses propres classes Classes et objets Université de Nice - Sophia Antipolis Richard Grin Version 1.0.1 – 23/11/10 Richard Grin Plan Classes et objets page 2 Programme/application Java Une application Java est composée d’une ou plusieurs classes Le plus souvent il est composé de plusieurs classes principale p dont la Une des classes est la classe p méthode main est lancée pour lancer l’application Classe Constructeurs Méthodes Variables « this » Protection des accès Variables et méthodes de classe Richard Grin Classes et objets page 3 Richard Grin Classes et objets page 4 Exécution d’un programme Au début de l’exécution, seule la classe principale est chargée en mémoire centrale Les autres classes sont chargées au fur et à mesure, lorsque le programme a besoin d’elles Le plus souvent une classe est chargée lorsqu’une instance de la classe est créée par le programme Richard Grin Classes et objets page 5 Les classes Richard Grin Classes et objets page 6 1 Eléments d’une classe Regrouper les objets Les objets qui collaborent dans une application sont souvent très nombreux On peut dégager des types d’objets Par exemple, tous les livres dans une application de gestion d’une d une bibliothèque La notion de classe correspond à cette notion de types d’objets Richard Grin Classes et objets 7 Les constructeurs (il peut y en avoir plusieurs) servent à créer des objets appelés instances de la classe Quand une instance est créée, son état est conservé dans les variables d’instance Les méthodes déterminent le comportement des instances de la classe quand elles reçoivent un message Richard Grin Exemple : classe Livre Variables d’instance class TestLivre { public static void main(String[] args) { Livre livre = new Livre("Les Misérables", "Victor Hugo"); livre.setNbPages(450); System.out.println(livre.getAuteur()); } } Constructeurs Méthodes Classes et objets 9 Richard Grin Rôles d’une classe Classes et objets Classes et objets page 10 Une classe est un type Une classe est un type qui décrit une structure (variables d’état) et un comportement (méthodes) un module pour décomposer une application en entités plus petites un générateur d’objets (par ses constructeurs) Une classe permet d’encapsuler les objets : les membres public sont vus de l’extérieur mais les membres private sont cachés Richard Grin 8 Utilisation d’une classe public class Livre { private String titre, auteur; private int nbPages; // Constructeur public Livre(String unTitre, String unAuteur) { titre = unTitre; auteur = unAuteur; } public String getAuteur() { // accesseur return auteur; } public void setNbPages(int nb) { // modificateur nbPages = nb; } } Richard Grin Classes et objets 11 Comme les types primitifs, une classe peut être utilisée pour typer une variable dans sa déclaration ou pour typer un tableau Exemples : Livre l; Livre[] livres; (un tableau dont chaque élément est un livre) livres = new Livre[100]; (crée un tableau de 100 livres et l’affecte à la variable livres ; les 100 éléments sont initialisés à null) Richard Grin Classes et objets page 12 2 Conventions pour les identificateurs Les noms de classes commencent par une majuscule (ce sont les seuls avec les constantes) : Cercle, Object Les mots contenus dans un identificateur commencent par une majuscule : UneClasse, uneMethode, uneAutreVariable Les constantes sont en majuscules avec les mots séparés par le caractère souligné « _ » : Les constructeurs UNE_CONSTANTE Richard Grin Classes et objets 13 15 Plusieurs constructeurs (surcharge) Classes et objets Richard Grin Classes et objets 16 Désigner un constructeur par this() public class Employe { private String nom, prenom; private double salaire; // 2 Constructeurs public Employe(String n, String p) { nom = n; prenom = p; } public Employe(String n, String p, double s) { nom = n; prenom = p; salaire = s; } . . . e1 = new Employe("Dupond", "Pierre"); e2 = new Employe("Durand", "Jacques", 1500); Richard Grin 14 public class Employe { variables private String nom, prenom; private double salaire; d’instance // Constructeur public Employe(String n, String p) { nom = n; prenom = p; } . . . public static void main(String[] args) { Employe e1; e1 = new Employe("Dupond", "Pierre"); e1.setSalaire(1200); création d’une instance . . . de Employe } } Chaque classe a un ou plusieurs constructeurs qui servent à créer les instances initialiser l’état l état de ces instances Un constructeur a le même nom que la classe n’a pas de type retour Classes et objets Classes et objets Création d’une instance Constructeurs d’une classe Richard Grin Richard Grin public class Employe { private String nom, prenom; private double salaire; // Ce constructeur appelle l'autre constructeur public Employe(String n, String p) { this(n, p, 0); } public Employe(String n n, String p p, double s) { nom = n; prenom = p; salaire = s; } . . . e1 = new Employe("Dupond", "Pierre"); e2 = new Employe("Durand", "Jacques", 1500); 17 Richard Grin Classes et objets 18 3 Constructeur par défaut Lorsque le code d’une classe ne comporte pas de constructeur, un constructeur sera automatiquement ajouté par Java Pour une classe Classe, ce constructeur par défaut est : [public] Classe() { } Les méthodes Même accessibilité que la classe (public ou non) Richard Grin Classes et objets 19 Richard Grin Classes et objets 20 Accesseurs Autres types de méthode Deux types de méthodes servent à donner accès aux variables depuis l’extérieur de la classe : les accesseurs en lecture pour lire les valeurs des variables ; « accesseur en lecture » est souvent abrégé b é é en « accesseur » ; getter tt en anglais l i les accesseurs en écriture, ou modificateurs, pour modifier leur valeur ; setter en anglais La plupart des méthodes permettent aux instances de la classe d’offrir des services plus complexes aux autres instances Enfin, des méthodes (private) servent de « sousprogrammes » utilitaires aux autres méthodes de la classe Richard Grin Classes et objets 21 Richard Grin Paramètres d’une méthode Classes et objets 22 Type retour d’une méthode Souvent les méthodes ou les constructeurs ont besoin qu’on leur passe des données initiales sous la forme de paramètres On doit indiquer le type des paramètres dans la déclaration de la méthode : setSalaire(double unSalaire) calculerSalaire(int indice, double prime) Quand la méthode renvoie une valeur, on doit indiquer le type de la valeur renvoyée dans la déclaration de la méthode : double calculSalaire(int indice, double prime) Le pseudo pseudo-type type void indique qu qu’aucune aucune valeur n’est n est renvoyée : void setSalaire(double unSalaire) Quand la méthode ou le constructeur n’a pas de paramètre, on ne met rien entre les parenthèses : getSalaire() Richard Grin Classes et objets 23 Richard Grin Classes et objets 24 4 Exemples de méthodes Surcharge d’une méthode public class Employe { Modificateur . . . public void setSalaire(double unSalaire) { if (unSalaire >= 0.0) salaire = unSalaire; } public double getSalaire() { return salaire; Accesseur } public boolean accomplir(Tache t) { ... } } Richard Grin Classes et objets En Java, on peut surcharger une méthode, c’est-àdire, ajouter une méthode qui a le même nom mais pas la même signature qu’une autre méthode : calculerSalaire(int) calculerSalaire(int, double) indice dans la grille des salaires 25 Richard Grin Surcharge d’une méthode (2) Classes et objets R. Grin Introduction à Java 26 On a vu qu’en Java les paramètres sont passés par valeur et qu’une méthode ne peut donc modifier les valeurs des paramètres effectifs qu’on lui passe en paramètre (la méthode utilise une copie i d de lla valeur l d du paramètre) èt ) Si le paramètre n’est pas de type primitif, c’est l’adresse de l’objet qui est copiée dans l’espace mémoire de la méthode La méthode peut donc modifier l’état de l’objet passé en paramètre 27 Exemple de passage de paramètres public static void m(int ip, Employe e1p, Employe e2p) { ip = 100; e1p.salaire = 800; e2p = new Employe("Pierre", 900); } public static void main(String[] args) { Employe e1 = new Employe("Patrick", 1000); Employe e2 = new Employe("Bernard", 1200); int i = 10; m(i, e1, e2); System.out.println(i + '\n' + e1.salaire + '\n' + e2.nom); } Classes et objets Passage d’objets en paramètre En Java, il est interdit de surcharger une méthode en changeant seulement le type de retour Autrement dit, on ne peut différencier 2 méthodes par leur type retour Par P exemple, l il estt interdit i t dit d’avoir d’ i ces 2 méthodes éth d dans une classe : int calculerSalaire(int) double calculerSalaire(int) Richard Grin prime accordées aux commerciaux Richard Grin Classes et objets main() : Employe e1 = new Employe("Patrick", 1000); Employe e2 = new Employe("Bernard", 1200); int i = 10; page 28 Passage de paramètres Que sera-t-il affiché ? Patrick P t i k 1000 Il sera affiché 10 800.0 Bernard i 10 main e1 e2 Pile 29 Bernard 1200 R. Grin Tas Introduction à Java 30 5 Passage de paramètres main() : m(i, e1, e2); ip e1p 10 e2p m (pas de variables locales) i 10 main ip e1p 100 e2p i 10 main e2 Tas Introduction à Java ip = 100; e1p.salaire = 800; e2p = new Employe("Pierre", 900); m (pas de variables locales) i 10 main e1 Pile 31 Passage de paramètres m() : ip e1p 100 e2p Introduction à Java ip = 100; e1p.salaire = 800; e2p = new Employe("Pierre", 900); R. Grin i 10 main Introduction à Java System.out.println(i + '\n' + e1.salaire + '\n' + e2.nom); Pile 33 Bernard 1200 e2 Pile R. Grin Bernard 1200 Tas Introduction à Java 34 toString() Il est conseillé d’inclure une méthode toString dans toutes les classes que l’on écrit Cette méthode renvoie une chaîne de caractères qui décrit l’instance Cette description peut être très utile lors de la mise au point des programmes La description doit être compacte et précise System.out.println(objet) affiche la valeur retournée par objet.toString() Patrick P t i k 800 e1 R. Grin Passage de paramètres Pierre 900 i 10 e1 Patrick P t i k 800 e2 Tas main() : main Pierre 900 ip e1p 100 e2p (pas de variables locales) Bernard 1200 32 Passage de paramètres m() : m Patrick P t i k 800 Tas R. Grin e2 Pile Bernard 1200 e1 e2 Pile R. Grin Patrick P t i k 1000 (pas de variables locales) Bernard 1200 e1 ip = 100; e1p.salaire = 800; e2p = new Employe("Pierre", 900); m Patrick P t i k 1000 Passage de paramètres m() : Tas Introduction à Java 35 Richard Grin Classes et objets page 36 6 Exemple public class Livre { ... public String toString() { return "Livre [titre=" + titre + ",auteur= auteur=" + auteur + ",nbPages=" + nbPages + "]"; } } Richard Grin Classes et objets Les variables page 37 Richard Grin Les variables d’instances sont déclarées en dehors de toute méthode conservent l’état d’un objet, instance de la classe sont accessibles et partagées par toutes les méthodes de la classe Les variables locales sont déclarées à l’intérieur d’une méthode conservent une valeur utilisée pendant l’exécution de la méthode ne sont accessibles que dans le bloc dans lequel elles ont été déclarées Classes et objets 39 Initialisation d’une variable Classes et objets Il arrive d’hésiter entre référencer une valeur par une variable locale d’une méthode d instance de la classe ou par une variable d’instance Si la valeur est utilisée par plusieurs méthodes de la classe, elle devra être référencée par une variable d’instance Richard Grin Classes et objets 40 Initialisation d’une variable (2) Une variable doit être initialisée (recevoir une valeur) avant d’être utilisée dans une expression Si elle n’est pas initialisée par le code, une variable d’instance (idem pour les variables de classe étudiées plus loin) reçoit la valeur par défaut de son type (0 pour les types numériques, par exemple) L’utilisation d’une variable locale non initialisée par le code provoque une erreur (pas d’initialisation par défaut) Richard Grin 38 Variable locale ou variable d’instance ? Types de variables Richard Grin Classes et objets 41 On peut initialiser une variable en la déclarant La formule d’initialisation peut être une expression complexe : Employe e1 = new Employe( Employe("Dupond", Dupond , "Jean"); Jean ); double salaire = prime + 500.0; Richard Grin Classes et objets 42 7 Déclaration / création Déclaration / création (2) public static void main(String[] args) { Employe e1; e1.setSalaire(1200); provoque une erreur … OK ? NullPointerException } Il aurait fallu écrire : public static void main(String[] args) { Employe e1; e1 = new Employe("Dupond", "Pierre"); e1.setSalaire(1200); . . . } Il ne faut pas confondre déclaration d d’une une variable création d’un objet référencé par cette variable « Employe e1; » déclare que l’on va utiliser une variable e1 qui référencera un objet de la classe Employe, mais aucun objet n’est créé Richard Grin Classes et objets 43 Richard Grin Classes et objets 44 Désigner les variables d’une instance Soit un objet o1 ; la valeur d’une variable v de o1 est désignée par o1.v Par exemple, Accès aux membres d’une d une classe Cercle c1 = new Cercle(p1, 10); System.out.println(c1.rayon); // affiche 10 Remarque : le plus souvent les variables sont private et on ne peut pas y accéder directement en dehors de leur classe Richard Grin Classes et objets 45 Richard Grin private : seule la classe dans laquelle il est déclaré a accès (à ce membre ou constructeur) public : toutes les classes sans exception y ont accès Sinon, par défaut, seules les classes du même paquetage t que la l classe l d dans llequell il estt dé déclaré l é y ontt accès (un paquetage est un regroupement de classes ; cette notion sera étudiée plus loin dans le cours) Java permet plusieurs degrés d’encapsulation pour les membres (variables et méthodes) et les constructeurs d’une classe Classes et objets 46 Types d’autorisation d’accès Degrés d’encapsulation Richard Grin Classes et objets 47 Richard Grin Classes et objets 48 8 Protection de l’état interne d’un objet Granularité de la protection des attributs d’une classe Autant que possible l’état d’un objet (les variables d’instance) doit être private En Java, la protection des membres se fait classe par classe, et pas objet par objet j a accès à tous les membres d’un objet j de la Un objet même classe, même les membres privés Richard Grin Classes et objets 49 Si on veut autoriser la lecture d’une variable depuis l’extérieur de la classe, on lui associe un accesseur, avec le niveau d’accessibilité que l’on veut Si on veut autoriser la modification d’une variable, on lui associe un modificateur, qui permet la modification tout en contrôlant la validité de la modification Richard Grin Classes et objets 50 this Le code d’une méthode d’instance désigne l’instance qui a reçu le message (l’instance courante), par le mot-clé this Désigner l’instance qui reçoit le message « this message, thi » Richard Grin Classes et objets donc, les membres de l’instance courante en les préfixant par « this. » Lorsqu’il n’y a pas d’ambiguïté, this est optionnel pour désigner un membre de l’instance courante 51 Richard Grin public class Employe { private double salaire; . . . public void setSalaire(double unSalaire) { salaire = unSalaire; } Implicitement public double getSalaire() { this.salaire return salaire; } Implicitement . . . this.salaire } Classes et objets 52 this explicite Exemple de this implicite Richard Grin Classes et objets 53 this est utilisé surtout dans 2 occasions : pour distinguer une variable d’instance et un paramètre qui ont le même nom : public void setSalaire(double salaire) this.salaire = salaire; } un objet passe une référence de lui-même à un autre objet : salaire = comptable.calculeSalaire(this); Dans quelle classe peut-on trouver ce code ? Richard Grin Comptable, calcule le salaire de moi Classes et objets 54 9 Variables de classe Certaines variables sont partagées par toutes les instances d’une classe. Ce sont les variables de classe (modificateur static) Si une variable de classe est initialisée dans sa déclaration cette initialisation est exécutée une déclaration, seule fois quand la classe est chargée en mémoire Méthodes et variables de classe R. Grin Introduction à Java 55 R. Grin Une méthode de classe (modificateur static en Java) exécute une action indépendante d’une instance particulière de la classe Une méthode de classe peut être considérée comme un message envoyé à une classe Exemple : public class Employe { private String nom, prenom; private double salaire; private static int nbEmployes = 0; // Constructeur public Employe(String n, String p) { nom = n; prenom = p; nbEmployes++; } . . . } Introduction à Java 56 Méthodes de classe Exemple de variable de classe R. Grin Introduction à Java public static int getNbEmployes() { return nbEmployes; } 57 R. Grin Désigner une méthode de classe Introduction à Java 58 Méthodes de classe Pour désigner une méthode static depuis une autre classe, on la préfixe par le nom de la classe : int n = Employe.getNbEmploye(); Comme une méthode de classe exécute une action indépendante d’une instance particulière de la classe, elle ne peut utiliser de référence à une instance courante (this) Il serait, it par exemple, l iinterdit t dit d’é d’écrire i static double tripleSalaire() { return this.salaire * 3; } R. Grin Introduction à Java 59 R. Grin Introduction à Java 60 10