Chapitre 2 Les classes et les objets LICENCE
Chapitre 2: Les classes et les objets LICENCE LMD 2 eme année - Abdelkader ALEM 1
Introduction q. Le premier chapitre a exposé de façon théorique les concepts de base de la P. O. O. , en particulier ceux de classe et d’objet. Nous avons vu que la notion de classe généralise celle de type : qune classe comporte à la fois des champs (ou données) et des méthodes. qnotion d’objet généralise celle de variable : un type classe donné permet de créer (on dit aussi instancier) un ou plusieurs objets du type, chaque objet comportant son propre jeu de données. q En P. O. O pure, on réalise ce qu’on nomme l’encapsulation des données ; cela signifie qu’on ne peut pas accéder aux champs d’un objet autrement qu’en recourant aux méthodes prévues à cet effet. LICENCE LMD 2 eme année - Abdelkader ALEM 2
Introduction q Nous allons aborder la notion de classe dans toute sa généralité, telle qu’elle apparaît dans les concepts de P. O. O: Ø comment définir une classe et l’utiliser en instanciant des objets; Ø Nous étudierons ensuite ce que l’on nomme les champs et les méthodes de classe; Ø Les constructeurs et destructeurs ØLes méthodes d’accès ØEncapsulation LICENCE LMD 2 eme année - Abdelkader ALEM 3
La notion de Classe q Une classe Etudiant représente plusieurs choses: q. Une unité de compilation: La compilation d'un programme qui contient une classe Etudiant produir a un fichier Etudiant. class q. La définition du type Etudiant: Il peut servir à déclarer des variables comme Etudiant e; q. Un moule pour la création d'objets de type Etudiant: cela nécessite en général la définition d'un ensemble de champs (fields) décrivant l’état d'un objet de ce type et d'un ensemble de méthodes défin issant son comportement ou ses fonctionnalités q. Chaque objet de la classe Etudiant : dispose de son propre état (la valeur de ses champs) et répond au même comportement (via les méthodes de la classe) LICENCE LMD 2 eme année - Abdelkader ALEM 4
La Structure d'une classe q. Une classe est définie par son nom et son package d'appartenance (exemple: java. lang. String). ØEn l'absence de directive, les classes sont dans un package dit « par défaut » (pas de package). q Une classe peut contenir trois sortes de membres: Ø Des champs (fields) ou attributs, ØDes méthodes (methods) et constructeurs, ØDes classes internes. q Les membres statiques (static) sont dits membres de classe ØIls sont définis sur la classe et non sur les objets q. Les membres non statiques (ou d'instance) ne peuvent exister san s un objet. LICENCE LMD 2 eme année - Abdelkader ALEM 5
Les membres: champs et méthodes d'une classe q Dans une classe, il y a grossièrement ØUne zone avec des déclarations de champs: Ils définissent ce qui sera stocké dans chaque objet de cette classe. ØUne zone avec des déclarations de méthodes: Elles définissent les actions/fonctionnalités/comportements accepté par les objets de cette classe q. Chaque méthode à deux parties: ØSa signature (type de retour, nom, types des paramètres) ØSon code, qui est constitué de blocs imbriqués q. Il peut également y avoir aussi quelques blocs d’initialisation, constructeur, ou autre classe interne. LICENCE LMD 2 eme année - Abdelkader ALEM 6
Les membres: champs et méthodes d'une classe q Nous proposons de définir une classe nommée Etudiant, destinée à gérer des étudiant dans une université: public class Etudiant { // instructions de définition des champs et des méthodes de la classe } q Définition des champs: Nous supposerons ici qu’un objet de type Etudiant sera représenté par trois attributs. Ils nous suffira de les déclarer ainsi : Ø private String nom; // nom de l’étudiant Ø private int age ; // l’age de l’étudiant Ø private String adr ; // l’adresse de l’étudiant q. Ces déclarations peuvent être placées où vous voulez à l’intérieur de la définition de la classe, et pas nécessairement avant les méthodes. En général, on place les champs et méthodes privées à la fin. LICENCE LMD 2 eme année - Abdelkader ALEM 7
Les membres: champs et méthodes d'une classe q. Définition des méthodes: Supposons que nous souhaitions disposer des trois méthodes suivantes : Ø initialise pour attribuer des valeurs aux attribut d’un étudiant, Øchangeadr pour modifier l’adresse de l’étudiant. Øaffiche pour afficher un les caractéristiques d’un étudiant (nom, age et adresse) q La définition d’une méthode ressemble à celle d’une procédure ou d’une fonction dans les autres langages. Elle se compose d’un en-tête et d’un bloc. Ainsi, la définition de la méthode initialise pourra se présenter comme ceci : public void initialise (String n, int a, String ad) { nom =n ; age= a; adr=ad; LICENCE LMD 2 eme année - Abdelkader ALEM } 8
Les membres: champs et méthodes d'une classe q. L’en-tête précise : • le nom de la méthode, ici initialise ; • le mode d’accès : nous avons choisi public pour que cette méthode soit effectivement utilisable depuis un programme quelconque ; • les arguments qui seront fournis à la méthode lors de son appel, que nous avons choisi de nommer n, a et ad. • le type de la valeur de retour ; nous verrons plus tard qu’une méthode peut fournir un résultat, c’est-à-dire se comporter comme ce que l’on nomme une fonction dans la plupart des langages (et aussi en mathématiques) ; ici, notre méthode ne fournit aucun résultat, ce que l’on doit préciser en utilisant le mot-clé void. 2014/2015 9 LICENCE LMD 2 eme année - Abdelkader ALEM
Les membres: champs et méthodes d'une classe q. Les définitions des autres méthodes de la classe Etudiant ne présentent pas de difficulté particulière. Voici la définition complète de notre classe Etudiant: class Etudiant { public initialise (String n, String a, Int g) { nom = c ; adresse = a ; age= g ; } public void affiche () { System. out. println ("Etudiant de nom " + nom + " habite à " + adresse + " son age est " + age ) ; } public void Change. Adresse (String adr) { adresse = adr ; } private String nom ; // nom de l’étudiant private String adresse ; // adresse de l’étudiant private int age ; // age de l’étudiant 2014/2015 10 LICENCE LMD 2 eme année - Abdelkader ALEM }
Utilisation de la classe Etudiant q L’utilisation d’une classe ne pourra se faire que depuis une autre méthode puisque, en Java, toute instruction appartient toujours à une méthode. Mais il pourra s’agir de la méthode particulière main, et c’est ainsi que nous procéderons dans notre exemple de programme complet. Ø La démarche : À l’intérieur d’une méthode quelconque, une déclaration telle que : Etudiant e ; est tout à fait correcte. Cependant, contrairement à la déclaration d’une variable d’un type primitif (comme int n ; ), elle ne réserve pas d’emplacement pour un objet de type Etudiant, mais seulement un emplacement pour une référence à un objet de type Etudiant. L’emplacement pour l’objet proprement dit sera alloué sur une demande explicite du programme, en faisant appel à un opérateur unaire nommé new. Ainsi, l’expression : new Etudiant() // attention à la présence des parenthèses ( crée un emplacement pour un objet de type Etudiant et fournit sa référence en résultat. Par exemple, on pourra procéder à cette affectation : a = new Etudiant() ; // crée d’un objet de type Point et place sa référence dans a LICENCE LMD 2 eme année - Abdelkader ALEM 11
Utilisation de la classe Etudiant q La situation peut être schématisée ainsi : ? ? e ? nom age adresse q. Une fois qu’une référence à un objet a été convenablement initialisée, on peut appliquer n’importe quelle méthode à l’objet correspondant. Par exemple, on pourra appliquer la méthode initialise à l’objet référencé par e, en procédant ainsi : e. initialise (mohamed, 25, Tiaret) ; // appelle la méthode initialise du type Etudiant // en l’appliquant à l’objet de référence e, et // en lui transmettant les arguments Mohamed, 25 et Tiaret Remarque : Nous dirons que a est une variable de type classe. Nous ferons souvent l’abus de langage consistant à appeler objet a l’objet dont la référence est contenue dans a. 12 LICENCE LMD 2 eme année - Abdelkader ALEM
Utilisation de la classe Etudiant q Exemple: Comme nous l’avons déjà dit, nous pouvons employer notre classe Etudiant depuis toute méthode d’une autre classe, ou depuis une méthode main. A priori, nous pourrions faire de main une méthode de notre classe Etudiant. Mais la démarche serait alors trop particulière . nous préférons donc qu’elle appartienne à une autre classe. Voici un exemple complet d’une classe nommée Tst. Point contenant (seulement) une fonction main utilisant notre classe Etudiant: public class Tst. Etud { public static void main (String args[]) { Etudiant e 1 = new Etudiant ('Mohamed', ‘Tiaret’, ‘ 20’) ; e 1. affiche() ; Etudiant e 2 = new Etudiant (‘amine’, ‘Alger’, ‘ 21’) ; e 2. affiche() ; String c=’’ Tiare’’ e 2. Change. Adresse(c) ; e 2. affiche() ; } } 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 13
Mise en œuvre d’un programme comportant plusieurs classes q Jusqu’ici, nos programmes étaient formés d’une seule classe. Il suffisait de la compiler et de lancer l’exécution. Avec plusieurs classes, les choses sont légèrement différentes et plusieurs démarches sont possibles: ØUn fichier source par classe. §Chaque classe doit être enregistré dans un fichier qui porte le nom de la classe § exemple: Etudiant. java, Tst. Etud. java ØPlusieurs classes dans un même fichier source § En fait, Java n’est pas tout à fait aussi strict. Il vous impose seulement de respecter les contraintes suivantes : • un fichier source peut contenir plusieurs classes mais une seule doit être publique • la classe contenant la méthode main doit obligatoirement être publique, afin que la machine virtuelle y ait accès ; • une classe n’ayant aucun attribut d’accès reste accessible à toutes les classes du même paquetage donc, dans ce cas du même fichier source. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 14
La notion de constructeur q Un constructeur n’est rien d’autre Øqu’une méthode, sans valeur de retour, portant le même nom que la classe. Ø Il peut disposer d’un nombre quelconque d’arguments; q Exemple de classe comportant un constructeur Considérons la classe Etudiant présentée précedemment et transformons simplement la méthode initialise en un constructeur en la nommant Etudiant. La définition de notre nouvelle classe se présente alors ainsi : class Etudiant { public Etudiant (String n, String a, Int g) // constructeur { nom = c ; adresse = a ; age= g ; } public void affiche () { … } public void Change. Adresse (String adr) {…} … } LICENCE LMD 2 eme année - Abdelkader ALEM 15
La notion de constructeur q Quelques règles concernant les constructeurs 1. un constructeur ne fournit aucune valeur. Dans son en-tête, aucun type ne doit figurer devant son nom. Même la présence (logique) de void est une erreur : class Truc {. . . public void Truc () // erreur de compilation : void interdit ici {. . . } } 2. Une classe peut ne disposer d’aucun constructeur (c’était le cas de notre première classe Etudiant). On peut alors instancier des objets comme s’il existait un constructeur par défaut sans arguments (et ne faisant rien) par des instructions telles que : Etudiant e = new Etudiant() ; // OK si Etudiant n’a pas de constructeur LICENCE LMD 2 eme année - Abdelkader ALEM 16
La notion de constructeur q Quelques règles concernant les constructeurs - Mais dès qu’une classe possède au moins un constructeur ce pseudoconstructeur par défaut ne peut plus être utilisé, comme le montre cet exemple : class A { public A(int) {. . . } // constructeur à un argument int . . . } . . . A a 1 = new A(5) ; // OK A a 2 = new A() ; // erreur - On notera que l’emploi d’un constructeur sans arguments ne se distingue pas de celui du constructeur par défaut. Si, pour une classe T donnée, l’instruction suivante est acceptée : T t = new T() ; cela signifie simplement que : • soit T ne dispose d’aucun constructeur, • soit T dispose d’un constructeur sans arguments. LICENCE LMD 2 eme année - Abdelkader ALEM 17
La notion de constructeur q Quelques règles concernant les constructeurs 3. Un constructeur ne peut pas être appelé directement depuis une autre méthode. Par exemple, si Etudiant dispose d’un constructeur à 3 arguments : Etudiant e = new Etudiant (ali, 25, Alger) ; . . . e. Etudiant (ali, 25, Alger); // interdit 4. Un constructeur peut appeler un autre constructeur de la même classe. Cette possibilité utilise la surdéfinition des méthodes et nécessite l’utilisation du mot-clé super ; nous en parlerons plus loin. 5. Un constructeur peut être déclaré privé (private). Dans ce cas, il ne pourra plus être appelé de l’extérieur, c’est-à-dire qu’il ne pourra pas être utilisé pour instancier des objets : class A { private A() {. . . } // constructeur privé sans arguments . . . }. . . A a() ; // erreur : le constructeur correspondant A() est privé LICENCE LMD 2 eme année - Abdelkader ALEM 18
La notion de constructeur q Construction et initialisation d’un objet Ø la création d’un objet entraîne toujours, par ordre chronologique, les opérations suivantes : • une initialisation par défaut de tous les champs de l’objet • une initialisation explicite lors de la déclaration du champ, • l’exécution des instructions du corps du constructeur. Ø Initialisation par défaut des champs d’un objet: Dès qu’un objet est créé, et avant l’appel du constructeur, ses champs sont initialisés à une valeur par défaut "nulle" ainsi définie : 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 19
La notion de constructeur q Construction et initialisation d’un objet Ø Initialisation explicite lors de la déclaration du champ: Une variable locale peut être initialisée lors de sa déclaration. Il en va de même pour un champ. Considérons : class A { public A (. . . ) {. . . } // constructeur de A. . . private int n = 10 ; private int p ; } L’instruction suivante : A a = new A (. . . ) ; entraîne successivement : • l’initialisation (implicite) des champs n et p de a à 0, • l’initialisation (explicite) du champ n à la valeur figurant dans sa déclaration, soit 10, • l’exécution des instructions du constructeur. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 20
La notion de constructeur q Construction et initialisation d’un objet Ø Appel du constructeur Le corps du constructeur n’est exécuté qu’après l’initialisation par défaut et l’initialisation explicite. Voici un exemple d’école dans lequel cet ordre a de l’importance : public class Init { public static void main (String args[]) { A a = new A() ; // ici a. n vaut 5, a. p vaut 10, mais a. np vaut 200 a. affiche() ; }} class A { public A() { // ici, n vaut 20, p vaut 10 et np vaut 0 np = n * p ; n = 5 ; } public void affiche() { System. out. println ("n = " + n + ", p = " + p + ", np = " + np) ; } private int n = 20, p = 10 ; private int np ; } // le résultat n = 5, p = 10, np = 200 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 21
La notion de constructeur q Construction et initialisation d’un objet Ø Cas des champs déclarés avec l’attribut final déclarer une variable locale avec l’attribut final. Dans ce cas, sa valeur ne devait être définie qu’une seule fois. Cette possibilité se transpose aux champs d’un objet. Examinons quelques exemples, EXEMPLE 1 class A {. . . private final int n = 20 ; // la valeur de n est définie dans sa déclaration . . . } - Ici, la valeur de n est une constante fixée dans sa déclaration. Notez que tous les objets de type A posséderont un champ n contenant la valeur 10 LICENCE LMD 2 eme année - Abdelkader ALEM 22
La notion de constructeur q Construction et initialisation d’un objet Ø Cas des champs déclarés avec l’attribut final EXEMPLE 2 class A { public A() { n = 10 ; } private final int n ; } § Ici, la valeur de n est définie par le constructeur de A. On a affaire à une initialisation tardive, comme pour une variable locale. § Ici encore, telle que la classe A a été définie, tous les objets de type A auront un champ n comportant la même valeur 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 23
La notion de constructeur q Construction et initialisation d’un objet Ø Cas des champs déclarés avec l’attribut final EXEMPLE 3 Considérez maintenant : class A { public A(int nn) { n = nn ; } private final int n ; } §Cette fois, les différents objets de type A pourront posséder des valeurs de n différentes. LICENCE LMD 2 eme année - Abdelkader ALEM 24
La notion de constructeur q Construction et initialisation d’un objet Ø Cas des champs déclarés avec l’attribut final Quelques règles - Comme une variable locale, un champ peut donc être déclaré avec l’attribut final, afin d’imposer qu’il ne soit initialisé qu’une seule fois. Toute tentative de modification ultérieure conduira à une erreur de compilation - Un champ déclaré final doit être initialisé au plus tard par un constructeur (ce qui est une bonne précaution). - D’autre part, il n’est pas permis de compter sur l’initialisation par défaut d’un tel champ. Le schéma suivant conduira à une erreur de compilation : class A { A() { // ici, on ne donne pas de valeur à n } private final int n ; // ici, non plus --> erreur de compilation } LICENCE LMD 2 eme année - Abdelkader ALEM 25
La notion de destructeur q Un destructeur permet d'exécuter du code lors de la libération de la place mémoire occupée par l'objet. q En C++ ØL’opérateur delete permet de détruire un objet (dynamique) créé par new. Les objets automatiques sont automatiquement détruits lors de la sortie du bloc correspondant. La destruction d’un objet (dynamique ou automatique) entraîne l’appel d’une méthode particulière dite destructeur. q EN JAVA Ø il n’existe aucun opérateur permettant de détruire un objet dont on n’aurait plus besoin. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 26
La notion de destructeur q EN JAVA En fait, la démarche employée par Java est un mécanisme de gestion automatique de la mémoire connu sous le nom de ramassse-miettes (en anglais Garbage Collector). Son principe est le suivant : Ø À tout instant, on connaît le nombre de références à un objet donné. On notera que cela n’est possible que parce que Java gère toujours un objet par référence. Ø Lorsqu’il n’existe plus aucune référence sur un objet, on est certain que le programme ne pourra plus y accéder. Il est donc possible de libérer l’emplacement correspondant, qui pourra être utilisé pour autre chose. Ø Cependant, pour des questions d’efficacité, Java n’impose pas que ce travail de récupération se fasse immédiatement. En fait, on dit que l’objet est devenu candidat au ramasse-miettes. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 27
La notion de destructeur q EN JAVA Remarque §On peut créer un objet sans en conserver la référence, comme dans cet exemple artificiel : (new Point(3, 5)). affiche() ; §Ici, on crée un objet dont on affiche les coordonnées. Dès la fin de l’instruction, l’objet (qui n’est pas référencé) devient candidat au ramasse -miettes. §Avant qu’un objet soit soumis au ramasse-miettes, Java appelle la méthode finalize de sa classe. En théorie, on pourrait se fonder sur cet appel pour libérer des ressources qui ne le seraient pas automatiquement. En pratique, cependant, on est fortement limité par le fait qu’on ne maîtrise pas le moment de cet appel. Dans bon nombre de cas d’ailleurs, le ramasse-miettes ne se déclenche que lorsque la mémoire commence à se faire rare. . . LICENCE LMD 2 eme année - Abdelkader ALEM 28
Typologie des méthodes d’une classe q Parmi les différentes méthodes que comporte une classe, on a souvent tendance à distinguer : Ø les constructeurs ; Øles méthodes d’accès (en anglais accessor) qui fournissent des informations relatives à l’état d’un objet, c’est-à-dire aux valeurs de certains de ses champs (généralement privés), sans les modifier ; Les accesseur Ø les méthodes d’altération (en anglais mutator) qui modifient l’état d’un objet, donc les valeurs de certains de ses champs; les modificateurs Ø Par convention, les accesseurs en lecture commencent par get et les modificateur commencent par set LICENCE LMD 2 eme année - Abdelkader ALEM 29
Typologie des méthodes d’une classe q Exemple : private int valeur = 13; public int get. Valeur(){ return(valeur); } public void set. Valeur(int val){ valeur = val; } LICENCE LMD 2 eme année - Abdelkader ALEM 30
Affectation et comparaison d’objets q Nous avons étudié le rôle de l’opérateur d’affectation sur des variables d’un type primitif. Par ailleurs, nous venons de voir qu’il existe des variables de type classe, destinées à contenir des références sur des objets. Comme on peut s’y attendre, ces variables pourront être soumises à des affectations. Mais celles-ci portent sur les références et non sur les objets eux-mêmes, ce qui modifie quelque peu la sémantique (signification) de l’affectation. C’est ce que nous allons examiner à partir de deux exemples: q Exemple 1 Supposons que nous disposions d’une classe Point possédant un constructeur à deux arguments entiers et considérons ces instructions : Point a, b ; . . . a = new Point (3, 5) ; b = new Point (2, 0) ; Après leur exécution, on aboutit à cette situation : LICENCE LMD 2 eme année - Abdelkader ALEM 31
Affectation et comparaison d’objets q Exemple 1 (suite) Exécutons maintenant l’affectation : a=b; Celle-ci recopie simplement dans a la référence contenue dans b, ce qui nous conduit à : Dorénavant, a et b désignent le même objet, et non pas deux objets de même valeur. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 32
Affectation et comparaison d’objets q Exemple 2 Considérons les instructions suivantes : Point a, b, c ; . . . a = new Point (1, 10) ; b = new Point (2, 20) ; c = a ; a = b ; b = c ; Après leur exécution, on aboutit à cette situation : Remarque Le fait qu’une variable de type classe soit une référence et non une valeur aura aussi des conséquences dans la transmission d’un objet en argument d’une méthode. 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 33
Affectation et comparaison d’objets q. La notion de clone Nous venons de voir que l’affectation de variables de type objet se limite à la recopie de références. Elle ne provoque pas la recopie de la valeur des objets. Si on le souhaite, on peut bien entendu effectuer explicitement la recopie de tous les champs d’un objet dans un autre objet de même type. la démarche la plus réaliste consiste plutôt à prévoir dans la classe correspondante une méthode destinée à fournir une copie de l’objet concerné, comme dans cet exemple: class A { public A(abs, int ord) { x = abs ; y = ord ; } public A-copie () // renvoie une référence à un objet de type A { A a = new A(x, y) ; a. x = x ; a. y = y ; return a ; } private int x, y ; }. . . A a = new A(1, 2) ; 2014/2015 A b = a. copie() ; // b est une copie conforme de a LICENCE LMD 2 eme année - Abdelkader ALEM 34
Affectation et comparaison d’objets q. La notion de clone Cette démarche est utilisable tant que la classe concernée ne comporte pas de champs de type classe. Dans ce cas, il faut décider si leur copie doit, à son tour, porter sur les objets référencés plutôt que sur les références. On voit apparaître la distinction usuelle entre : Ø la copie superficielle d’un objet : on se contente de recopier la valeur de tous ses champs, y compris ceux de type classe, Ø la copie profonde d’un objet : comme précédemment, on recopie la valeur des champs d’un type primitif mais pour les champs de type classe, on crée une nouvelle référence à un autre objet du même type de même valeur. § la copie profonde peut être récursive; § La démarche la plus rationnelle pour traiter cette copie profonde qu’on nomme clonage en Java, consiste à faire en sorte que chaque classe concernée par l’éventuelle récursion dispose de sa propre méthode LICENCE LMD 2 eme année - Abdelkader ALEM 35
L’encapsulation q. L’encapsulation est la possibilité de ne montrer de l’objet que ce qui est nécessaire à son utilisation. q. L’encapsulation permet d’offrir aux utilisateurs d’une classe la liste des méthodes et éventuellement des attributs utilisables depuis l’extérieur. Cette liste de services exportables est appelée l’interface de la classe et elle est composée d’un ensemble des méthodes et d’attributs dits publics (Public). q. Les méthodes et attributs réservés à l’implémentation des comportements internes à l’objet sont dits privés (Private). Leur utilisation est exclusivement réservée aux méthodes définies dans la classe courante. q. Les avantages de l’encapsulation sont : ØSimplification de l’utilisation des objets, ØMeilleure robustesse du programme, Ø 2014/2015 Simplification de la maintenance globale de l’application 36 LICENCE LMD 2 eme année - Abdelkader ALEM
Modificateurs de visibilité et Accès q. Modificateurs de visibilité Les attributs et les méthodes sont précédés lors de la déclaration par l’un des modificateurs de visibilité « public» , « private» , « protected» et Néant suivants: §Une méthode, classe ou attribut sont déclarés comme publiques « public» s’ils doivent être visibles à l’intérieur et à l’extérieur quelque soit leur package. §Une méthode, classe ou attribut ne sont pas précédés par un modificateur de visibilité explicite (Néant) ne vont être visibles qu’à l’intérieur de même package. C'est-à-dire seules classes de même package peuvent accéder aux attributs et méthodes de classes « amies» . Ce modificateur de visibilité est aussi appelé «modificateur de package» ou modificateur «freindly» . LICENCE LMD 2 eme année - Abdelkader ALEM 37
Modificateurs de visibilité et Accès q. Modificateurs de visibilité §Une méthode ou attributs définis comme étant privés « private» s’ils sont accessibles uniquement par les méthodes de la classe en cours. Ils ne sont pas accessibles ailleurs. §Une méthode ou attribut sont définis comme protégés « protected» s’ils ne peuvent être accessibles qu’à travers les classes dérivées ou les classes de même package. LICENCE LMD 2 eme année - Abdelkader ALEM 38
Modificateurs de visibilité et Accès q Tableaux récapitulatifs des droits d’accès Ø Modificateurs d’accès des classes et interfaces 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 39
Modificateurs de visibilité et Accès q Tableaux récapitulatifs des droits d’accès Ø Modificateurs d’accès pour les membres et les classes internes LICENCE LMD 2 eme année - Abdelkader ALEM 40
Modificateurs de visibilité et Accès q Accès aux membres privés Ø Pour accéder aux attributs de l’intérieur de la classe, il suffit d’indiquer le nom de l’attribut que l’on veut y accéder. Ø-Pour accéder de l’extérieur de la classe, on utilise la syntaxe suivante: <nom_méthode>. <nom_attribut> q. Exemple 1 Si longueur et largeur étaient des attributs publics de Rectangle, on peut écrire le code suivant dans la méthode «main» de la classe Test_Rectangle r = new Rectangle (); r. longueur = 20; r. largeur = 15; 2014/2015 41 int la = r. longueur LICENCE ; LMD 2 eme année - Abdelkader ALEM
Modificateurs de visibilité et Accès q. Exemple 1 Si longueur et largeur étaient des attributs privés « private» , les instructions suivantes seront refusées par le compilateur r. longueur = 20; //faux r. largeur = 15; //faux int la = r. longueur ; //faux Il fallait dans le deuxième cas définir des méthodes d’accés « setlong (int)» et «setlarg (int)» qui permettent de modifier les valeurs des attributs et les méthodes d’accès « getlong()» et « getlarg()» pour retourner les valeurs de longueur et de largeur d’un objet Rectangle. Dans ce cas, les instructions seront les suivantes: r. setlong(20); //juste r. setlarg(15); //juste int la = r. getlong() ; //juste LICENCE LMD 2 eme année - Abdelkader ALEM 42
Modificateurs de visibilité et Accès q. Exemple 2 public class Rectangle { Private int longueur; private int larg; Rectangle (int l, int a) //Le premier constructeur {longueur= l; larg= a; } Rectangle() // Le deuxième constructeur {longueur= 20; larg= 10; } Rectangle (int x) //Le troisième constructeur {longueur= 2*x; larg= x; } int getlong ()//pour retourner la valeur de longueur {return (longueur); } qint getlarg () //Pour retourner la largeur {return (larg); } 2014/2015 LICENCE LMD 2 eme année - Abdelkader ALEM 43
Modificateurs de visibilité et Accès q. Exemple 2 (suite) void setlong (int l) //pour modifier la longueur {longueur=l; } void setlarg (int l) //pour modifier la largeur {larg=l; } int surface() //Pour calculer la surface {return(longueur*larg); } int périmètre() //pour calculer le périmètre { return((larg+longueur)*2); } void allonger(int l) //Pour allonger la longueur d’un rectangle { longueur+=l; } void affiche() //pour afficher les caractéristiques d’un rectangle { System. out. println("Longueur=" + longueur + " Largeur =" + larg ); } } LICENCE LMD 2 eme année - Abdelkader ALEM 44
Modificateurs de visibilité et Accès q. Exemple 2 (suite) Code de la classe Test_Rect class Test_Rec { public static void main(String []args) { Rectangle r = new Rectangle(10, 5); Rectangle r 3; r 3= new Rectangle (14); Rectangle r 2 = new Rectangle(); r. affiche(); r 2. affiche(); r 3. affiche(); r 2. setlong(50); r 2. setlarg(30); r 2. affiche(); System. out. println("Rectangle 1" ); System. out. println("Surface= " + r. surface()); System. out. println("Périmetre= " + r. perimetre()); r. allonger(40); System. out. println("Aprés allongement"); r. affiche(); } LICENCE LMD 2 eme année - Abdelkader ALEM 45
- Slides: 45