0% ont trouvé ce document utile (0 vote)
107 vues51 pages

POO

Transféré par

Fabrice ESSOVI
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
107 vues51 pages

POO

Transféré par

Fabrice ESSOVI
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
5/10/2028 16:33 Daveloppons en Java - POO avec Java 4, La programmation orientée objet Niveau EEE Elementaire LLidée de base de la programmation orientée objet est de rassembler dans une méme entité appelée objet es données et les traitements qui s'y appliquent. Ce chapitre contient plusieurs sections. = Leconcept de classe : présente le concept et a syntaxe de la déclaration d'une classe 1 Les objats : présente la création d'un objet, sa durée de vie, le clonage d'objets, les références et Ia comparaison objets, objet null, les variables de classes, la variable this et 'opérateur instanceot. = Les modificateurs d'accis : présente les modificateurs d'accas des entités classes, méthodes et attibuts ainsi que les ‘mots clés qui permettent de qualifier ces entités * Les pronriétés ov attnbuts : présente les données d'une classe: les propriétés ou attributs 1» Les méthodes : présente la déclaration d'une méthode, la transmission de paramétres, 'émission de messages, la surcharge, la signature d'une méthode et le polymorphisme et des méthodes particulléres : les constructeurs, le destructeur et les accesseurs = Lihéritage : présente Ihéritage : son principe, sa mise en oeuvre, ses conséquences. II présente aussi la redefinition dune méthode héritée et les interfaces * Les packages : présente la définition et Iutilisation des packages = Les classes internes : présente une extension du langage Java qui permet de deéfinir une classe dans une autre, 1 La gestion dynamique des objets: présente rapidement la gestion dynamique des objets grice 3 introspection 4.1. Le concept de classe Une classe est le support de l'encapsulation : cest un ensemble de données et de fonctions regroupées dans une méme ‘entité, Une classe est une description abstraite d'un objet. Les fonctions qui opérent sur les données sont appelées des méthodes. Instancier une classe consiste & créer un objet sur son modele. Entre classe et objet ily a, en quelque sorte, le méme rapport qu’entre type et variable Java est un langage orienté objet: tout appartient 8 une classe sauf les variables de types primitives. Pour accéder 8 une classe il faut en déclarer une instance de classe ou objet Une classe comporte sa déclaration, des variables et les défintions de ses méthodes. [Link] sist 5/10/2028 16:33 Daveloppons en Java - POO avec Java Une classe se compose de deux parties : un en-téte et un corps. Le corps peut atte divsé en 2 sections : la déclaration des données et des constantes et la définition des méthodes. Les méthodes et les données sont pourvues d'attributs de visibilitée qui gérent leur accessibilité par les composants hors de la classe 4.1.1, La syntaxe de déclaration d'une classe La syntaxe de déclaration c'une classe est la suivante modificateurs class nom_de_classe [extends classe_mere) [implements interfaces] (..) Les modificateurs de classe (ClassModifiers) sont Modificateur | Réle la classe contient une ou des méthodes abstraites, quin‘ont pas de définition explicite, Une classe abstract | déclarée abstract ne peut pas étre instanciée il faut définir une classe qui hérite de cette classe et qui implémente les méthodes nécessaires pour ne plus étre abstraite la classe ne peut pas étre modifiée, sa redéfiition grace a Vhéritage est interdite. Les classes déclarées final final ne peuvent donc pas avoir de classes filles. private la classe n'est accessible qu'a partir du fichier ol elle est définie public La classe est accessible partout Les modificateurs abstract et final ainsi que public et private sont mutuellement exclusfs. Marquer une classe comme final peut permettre au compilateur et & Ia JVM de réaliser quelaues petites optimisations Le mot clé extends permet de spécifier une superclasse éventuelle: ce mot clé permet de préciser la classe mére dans une relation d'hertage. Le mot clé implements permet de spécifier une ou des interfaces que la classe implémente. Cela permet de récupérer quelques avantages de 'héritage multiple. LLordire des méthodes dans une classe n'a pas diimportance. Si dans une classe, on rencontre dabord la méthode A puis la méthode 8, 8 peut dre appelée sans problame dans A. 42. Les objets Les objets contiennent des attributs et des méthodes. Les attibuts sont des variables ou des objets nécessaires au fonctionnement de l'objet. En Java, une application est un objet. La classe est la description d'un objet. Un objet est une instance d'une classe. Pour chaque instance d'une classe, le code est le méme, seules les données sont différentes & chaque objet. 42.1. La création dun objet: instancier une classe Ii est nécessaire de définir la déclaration d'une variable ayant le type de Mobjet désiré. La déclaration est de la forme rnom_de.casse nom de_variable Exemple T] waclasse ay 2 | string chaines [Link] 281 5/10/2028 16:33 Daveloppons en Java - POO avec Java Lopérateur new se charge de créer une instance de la classe et de Vassocier 8 la variable Exemple Ta = new PatlasseOy Il est possible de tout réunir en une seule déclaration Exemple T | atlasse wo new WaclasseOs ‘Chaque instance d'une classe nécessite sa propre variable. Plusieurs variables peuvent désigner un méme objet. En Java, tous les objets sont instanciés par allocation dynamique. Dans exemple, la variable m contient une référence sur Tobjet instancié (contient adresse de objet quielle désigne : attention toutefois, il n'est pas possible de manipuler ou Gleffectuer des opérations directement sur cette adresse comme en C), Si m2 désigne un objet de type MaClasse, instruction m2 = m ne définit pas un nouvel objet mais m et m2 désignent tous les deux le mame objet. Lopérateur new est un opérateur de haute priorité qui permet diinstancier des objets et d'appeler une méthode particulire de cet objet: le constructeur. I fait appel & la machine virtuelle pour obtenir Tespace mémoire nécessaire & la Feprésentation de Vobjet puls appelle le constructeur pour intialiser Vobjet dans emplacement obtenu, Il renvoie une valeur qui référence Fobjet instancié Si 'opérateur new n'obtient pas Fallocation mémoire nécessaire, il lave exception OutOfMemoryEtror (caiman ceveameue Les objets ne sont pas des éléments statiques et leur durée de vie ne correspond pas forcément 3 la durée d'exécution du programme, La durée de vie d'un objet passe par trois étapes ‘+ Ia déclaration de objet et linstanciation grice & lopérateur new Exemple 1] nomde_classe nor} j_objet = new non de_classe(- ) ‘+ utilisation de objet en appelant ses méthodes ‘+ la suppression de Vobjet : elle est automatique en Java grace & la machine virtuele. La restitution de la mémoite inutiisée est prise en charge par le récupérateur de mémoire (garbage collector) I rvexiste pas diinstruction delete comme en C++, 423. Les références et la comparaison d'abjets Les variables de type objet que lon déclare ne contiennent pas un objet mais une référence vers cet objet. Lorsque l'on écrit 1 = c2 (cl et c2 sont des objets) on copie la référence de objet c2 dans c1. cl et c2 font référence au méme objet is pointent sur le méme objet. Lopérateur == compare ces références. Deux objets avec des propriétés identiques sont deux objets distinets [Link] sist 5/10/2028 16:33 Daveloppons en Java - POO avec Java Exemple T) Rectangle Pi = new Rectangle(i00,50); 2 | Rectangle r2 = new Rectangle(102,50) ; 3 | Af (rt == mt) (2. ) df vrai 4 | if (Pt = ra) C2.) UY faux Pour comparer légalité des variables de deux instances il faut munir la classe d'une méthode a cet effet : Ia méthode equals) heritée de Object Pour s'assurer que deux objets sont de la méme classe, il faut utiliser la méthode getClass0) de la classe Object dont toutes les classes héritent. Exemple TT Cobst getCTass() cael (ob}2, getClass) 424, Le littéral null Le littéral null est utiisable partout ol il est possible utiliser une référenc 8 un objet. II n'appartient pas & une classe mais il peut étre utilisé & la place d'un objet de n‘importe quelle type ou comme paramétre. null ne peut pas étre utilisé comme tun objet normal: il ny a pas ¢'appel de méthodes et aucune classe ne peut en heriter. Le fat daffecter null une variable référencant un objet pourra permettre au ramasse-miettes de libérer la mémoire allouge 4 Fobjet si aucune autre référence n’existe encore suru 425, Les variables de classes Elles ne sont définies qu'une seule fois quel que soit le nombre c'objets instanciés de la classe. Leur déclaration est accompagnée du mot clé static Exemple 1) public class Matlasse() { 2 static int compteur 3 LLappartenance des variables de classe & une classe entiére et non 8 un objet spécifique permet de remplacer le nom de la variable par le nom de la classe. Exemple T] naclasse m= new NaclasseQs 2 | int €1 = mcompteur; 3 | int ¢2 = [Link]; 4| 11 chet c2 posstdent 1a méne valeur. Ce type de variable est utile pour, par exemple, compter le nombre diinstanciations de la classe. 42.6. La variable this, [Link] 451 5/10/2028 16:33 Daveloppons en Java - POO avec Java Cette variable sert& référencer dans une méthode l'nstance de l'objet en cours d'utilisation this est un objet qui est égal & instance de objet dans lequelil est utilisé Exemple T] private Int nosbres 2 | public maclasse(int nombre) < 3| nombre = nonbre; // varsable de classe = variable en paranétre du constructeur aly lest préférable de préfixer la variable dinstance parle mot clé this, Exemple T] tiiscnonbre = nombres Cette référence est habituellement implicite Exemple T) class maclasseQ) ( 2| String chaine = " test "5 3.| public String getchaine() { return chaines } 4 | // est équivalent 4 public String getchaine() { return [Link]; ) 3/3 This est aussi utilisé quand objet doit appeler une méthode en se passant lul-méme en parametre de lapel 427, Lopérateur instanceof Lopérateur instanceof permet de déterminer la classe de l'objet qui lui est passé en paramatre. La syntaxe est objet instanceof classe Exemple T] void testclasse(opject 0) { 2| af (o instanceof maClasse ) 3 [Link](" 0 est une instance de la classe MaClasse “); 4 5 else [Link](” 0 n'est pas un objet ce la classe MaClasse Dans le cas cisdessus, méme si o est une instance de MaClasse, iln’est pas permis d'appeler une méthode de MaClasse car ‘est de type Objet. Exemple 1] void affichethaine(Object 0) { 2 Af (0 instanceof MaClasse) 3 ‘[Link]([Link]()); 4a // erreur 3 1a conpil car 1a méthode getchaine() 5 /in'est pas définie dans 1a classe object 6 [Link] sist 5/10/2028 16:33 Daveloppons en Java - POO avec Java Pour résoudre le probléme, il faut utiliser la technique du casting (conversion) Exemple 1] void affichethaine(Object 6) { 2| 4 (0 instanceof MaClasse) { 3 Naclasse m= (MaClasse) 0; 4 [Link]([Link]()); 5 // OU [Link]( ((MaClasse) 0).getchaine() ); 6 7 43. Les modificateurs daccés Ils stappliquent aux classes, aux méthodles et aux attributs lls ne peuvent pas étre utlisés pour qualifier des variables locales: seules les variables d'instances et de classes peuvent en profiter. lis assurent le contréle des conditions d'hértage, daccés aux éléments et de modification de données par les autres objets. 43.1. Les mots clés qui gérentla visiblité des entités De nombreux langages arientés objet introduisent des attributs de visibilité pour réglémenter acces aux classes et aux ‘objets, aux méthodes et aux données. En plus de Ia valeur par défaut, il existe 3 modificateurs explicites qui peuvent étre utilises pour définir les attributs de visibilité des entités (classes, méthodes ou attributs) : public, private et protected. Leur utilisation permet de definir des riveaux de protection différents (présentés dans un ordre croissant de niveau de protection offert) package-private Modifiateur | Réle Une variable, méthode ou classe déclarée public est visible par tous les autres objets. Depuls la vote version 1.0, une seule classe public est permise par fichier et son nom doit correspondre & celui du Pp fichier. Dans la philosophie orientée objet aucune donnée d'une classe ne devrait étre déclarée publique : i est préférable 6'écrire des méthodes pour la consulter et la modifier par dé Unvexiste pas de mot clé pour définir ce niveau, qui est le niveau par défaut lorsqu'aucun modificateur n'est précisé. Cette déclaration permet & une entité (classe, méthode ou variable) d'étre Visible par toutes les classes se trouvant dans le méme package, Sine méthode ou une variable est déclarée protected, seules les méthodes présentes dans le protected méme package que cette classe ou ses sous-classes pourront y accéder. On ne peut pas qualifier une classe avec protected est le niveau de protection le plus fort. Les composants ne sont visibles qu'a 'ntérieur de la classe proste ils ne peuvent étre modifiés que par des méthodes définies dans la classe et prévues & cet effet. Les méthodes déclarées private ne peuvent pas étre en méme temps déclarées abstract car elles ne peuvent pas étre redéfinies dans les clases filles. Ces modificateurs d'accés sont mutuellement exclusits [Link] 951 5/10/2028 16:33 Daveloppons en Java - POO avec Java 432 Le mot clé static Le mot clé static s'applique aux variables et aux méthodes, Les variables dinstance sont des variables propres & un objet. Il est possible de définir une variable de classe qui est partagée entre toutes les instances d'une méme classe : ele n‘existe donc qu'une seule fois en mémoire, Une tele variable permet de stocker une constante ou une valeur modifiée tour 3 tour par les instances de la classe. Elle se définit avec le mot clé static Exemple 1) public class Cercle { 2| static float pi = 3.1016F; 3| float rayon; 4| public Cercle(Float rayon) { [Link] = rayon; } 5 | public float surface() { return rayon * rayon * pj) el Il est aussi possible par exemple de mémoriser les valeurs min et max d'un ensemble d'abjets de méme classe. Une méthade static est une méthode qui niagit pas sur des variables d'instance mais uniquement sur des variables de classe, Ces méthodes peuvent étre utilisées sans instancier un abjet de la classe, Les méthades ainsi définies peuvent tre appelées avec [a notation classemethode0 au lieu de objet methodet) : la premiére forme est fortement recommandée pour éviter toute confusion. Il nvest pas possible d'appeler une méthode distance ou d'accéder a une variable diinstance a partir d'une méthode de classe statique, 433, Le mot clé final Le mot clé final s‘applique aux variables de classe ou diinstance ou locales, aux méthodes, aux parameétres d'une méthode cet aux classes il permet de rendre lentité sur laquelle il s'applique non modifiable une fois qu'elle est déclarée pour une méthode ou une classe et intialisée pour une variable, Une variable qualifiée de final signifie que Ia valeur de la variable ne peut plus étre modifige une fois que celle-ci est initialise. Exemple package Fr [Link] public class Constante? { public final int constante; public Constante2() { ‘[Link] = 10; Une fois la variable déclarée final iniialisée, i nest plus possible de modifier sa valeur. Une verification est opérée par le ‘compilateur Exemple 1) package #r. [Link] 2 [Link] 7181 5/10/2028 16:33 Daveloppons en Java - POO avec Java {| puotie class constantet { 5 int tne conse 5 | pubiic static Final int constante 7 Z| pubic constanten() 8 | [Link] = 25 |, Résultat T ] Cr pgavac Constantel Java 2 | [Link]:é: cannot assign a value to final variable constante 3 | [Link] = 105 a| 3 5 | 2 error Les canstantes sont qualifiges avec les modficateurs inal et static exemple TT] public static Final Fost PES SAAT; Une méthode déclarée final ne peut pas étre redéfinie dans une sous-classe, Une méthode possédant le modifcateur final pourra étre optimisée par le compilateur car il est garanti qu'elle ne sera pas sous-classée. Lorsque le modifcateur final est ajouté & une classe, il est interdit de créer une classe qui en hérite, Pour une méthode ou une classe, on renonce & Ihéritage mais ceci peut s‘avérer nécessaire pour des questions de sécu ‘ou de performance, Le test de validité de lappel d'une méthode est bien souvent repoussé & lexécution, en fonction du type de Fobjet appelé (cest la notion de polymorphisme qui sera détallée ultérieurement). Ces tests ont un cout en termes de performance. ‘Quatre types de variables sont implictement déclarés final ‘+ un champ ct'une interface ‘+ une variable locale déclarée comme ressource d'une instruction try-with-resources ‘+ Un paramatve d'exception d'une clause multi-catch ‘+ un champ correspondant a un composant d'un record Remarque : un unique paramétre d'exception d'une clause catch rest jamais déclaré final implicitement, mais peut étre cffectivement final 43.4, Le mot clé abstract Le mot clé abstract s'applique aux méthodes et aux classes. Abstract indique que la classe ne pourra étre instanciée telle quelle, De plus, toutes les méthodes de cette classe abstract ne sont pas implémentées et devro' tre redéfinies par des méthodes complétes dans ses sous-classes. Abstract permet de créer une classe qui sera une sorte de moule. Toutes les classes détivées pourront profiter des méthodes héritées et r’auront & implémenter que les méthodes déclarées abstract. Exemple T] abstract class Classeabstraite ( 2 | ClasseAbstraite() ( ... //eode du constructeur } 3 [Link] 351 5/10/2028 16:33 Daveloppons en Java - POO avec Java void methode() { ... // code partagé par tous les descendants } abstract vold methodesbstraite(); class ClasseConplete extends Classeabstraite { ClasseComplete() { super(); ++. } void methodeabstraite() { ... // code de 1a méthode } // void methode est héritée 4 5 s/t 7 8 9 Une méthode abstraite est une méthode déclarée avec le modificateur abstract et sans corps. Elle correspond & une méthode dont on veut forcer limplémentation dans une sous-classe. L'abstraction permet une validation du codage : une sous-classe sans le modificateur abstract et sans definition explicite d'une ou des méthodes abstraites génére une erreur dde compilation, Une classe est automatiquement abstraite ds qu'une de ses méthodles est déclarée [Link] est possible de définir une classe abstraite sans méthodes abstraites. 4355, Le mot elé synchronized Ii permet de gérer 'accis concurrent aux variables et méthodes lors de traitements de threads (exécution « simultanée » de plusieurs petites parties de code du programme) 43.6, Le mot dlé volatile Le mot clé volatile ‘applique aux variables. Ii précise que la variable peut étre changée par un périphérique ou de maniére asynchrone. Cela indique au compllateur de ne pas stocker cette variable dans des registres. A chaque utilisation, sa valeur est lue et -8écrite immeédiatement si elle a changé. 437. Le mot clé native Une méthode native est une méthode qui est implémentée dans un autre langage. Liutlisation de ce type de méthode limite Ia portabilté du code mais permet une vitesse d'exécution plus rapide. 44, Les propriétés ou attributs Les données d'une classe sont contenues dans des variables nommées propriétés ou attributs. Ce sont des variables qui peuvent étre des variables d'instances, des variables de classes ou des constantes, 44.1. Les variables dinstances Une variable d'instance nécessite simplement une déclaration de la variable dans le corps de la classe. Exemple 1] public class vatlasse { 2| public int valeurt ; 3 | int valeurz ; 4| protected int valeur3 5 5 [Link] 951 5/10/2028 16:33 Daveloppons en Java - POO avec Java 6 | _ private ant valeuné ; } ‘Chaque instance de la classe a accés & sa propre occurrence de la variable. ‘4.2. Les variables de classes Les variables de classes sont définies avec le mot clé static Exemple (code Java 1.1) 1 | public class MaClasse { 2| static int compteur ; 3] CChaque instance de la classe partage la méme variable, 443. Les constantes Les constantes sont définies avec le mot cl final : leur valeur ne peut pas étre modifige une fois qu’elles sont intialisées. Exemple (code Java 1.1) T] public class vaClasse 2| Final double pi=3.14 ; 3] 45. Les méthodes Les méthodes sont des fonctions qui implémentent les traitements de la classe. 45.1, La syntaxe de la déclaration La syntaxe de la déclaration d'une méthode est modificateurs type_retourné nom_méthode (argi, ..)(.)// définition des variables locales et du bloc d'instructions. Le type retourné peut étre élémentaire ou correspondre & un objet. Sila méthode ne retourne rien, alors on utilise void Le type et le nombre d'arguments déclarés doivent correspondire au type et au nombre d'arguments transmis. I! n'est pas possible d'indiquer des valeurs par défaut dans les paramétres, Les arguments sont passés par valeur : la méthode fait une copie de la variable qui lui est locale. Lorsqu'un objet est transmis comme argument & une méthode, cette demiére resoit une référence qui désigne son emplacement mémoire d'origine et qui est une copie de la variable, II est possible de modifier objet grace & ses méthodes mais il n'est pas possible de remplacer la référence contenue dans la variable passée ‘en paramatre : ce changement n’aura lieu que lacalement 4 la méthode. Les modificateurs de méthodes sont [Link] 10151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Modifcateur ale public Ia méthode est accessible aux méthodes des autres classes private usage de la méthode est réservé aux autres méthodes de la méme classe protected lath pet Br vogue po embod da as de se final la méthode ne peut étre modifée (edéfinition lors de "heritage interdite) la méthode appartientsimultanément 3 tous les objets de la classe (comme une state constante déclarée& intérieur de a classe). Il est inutile d'instancier la classe pour appeler la méthocle mais la méthode ne peut pas manipuler de variable d'nstance. Elle ne peut utiliser que des variables de classes, la méthode fait partie d'un thread. Lorsqu’elle est appelée, elle barre 'accés & son synchronized instance. Linstance est & nouveau libérée 3 la fin de son exécution native le code source de la méthode est écrit dans un autre langage Sans modificateur, la méthode peut étre appelée par toutes autres méthodes des classes du package auquel appartient la classe. La valeur de retour de la méthode doit tre transmise par instruction return. Ele indique la valeur que prend la méthode at termine celle-ci: toutes les instructions qui suivent return sont donc ignorées, Exemple 1) int add(int a, int b) { 2 | return a + bs 3] Il est possible diinclure une instruction return dans une méthode de type void : cela permet de quitter la méthode. La méthode main) de la classe principale d'une application doit étre déclarée de la facon suivante : public static void main (String argst) (..) Exemple T] public class vonappi 2 3 | public static void main(stringl] args) { 4 Syston. out. print1n("Bonjour"); s| > 6] Cette déclaration de la méthode main est imposée par la machine virtuelle pour reconnaitre le point d'entrée dune application. Sila déclaration de la méthode maind dlffére, une exception sera levée lors de la tentative d'exécution par la machine virtuelle Exemple T] public class Vannppe 2 3| public static int main(stringt) args) { 4 systen. out. println("Bonjour"); 5 return @; [Link] 151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Résultat, 1] Ciisiavac Monappa java C:\>Java MonApp2 Exception in thread “nain" [Link]-NoSuchMethodError: main Sila méthode retourne un tableau alors les caractéres (] peuvent étre précisés aprés le type de retour ou aprés la liste des 1) intl] getvalewrsQ) {~ 2 | int getvaleurs()() ( 452, La transmission de paramatres Lorsqu'un objet est passé en paramétre, ce n'est pas Vobjet Iui-méme qui est passé mais une référence sur Vobjet. La référence est bien transmise par valeur et ne peut pas étre modifiée mais l'objet peut étre modifié par un message (appel une méthode) Pour transmettre des arguments par référence 4 une méthode, il faut les encapsuler dans un objet qui prévoit les méthodes nécessaires pour les mises a jour. Si un objet o transmet sa variable cinstance v en paramétre & une méthode m, deux situations sont possibles ‘+ siv est une variable primitive alors elle est passée par valeur: i est impossible de la mocifier dans m pour que v en retour contienne cette nouvelle valeur. «+ sivest un objet alors m pourra modifier Fobjet en utilisant une méthode de l'objet passé en paramatre, 453, Lemission de messages Un message est émis lorsqu'on demande a un objet dexécuter lune de ses méthode. La syntaxe d'appel d'une méthode est : nom _objetinom_méthode(parametre,..) Sila méthode appelée ne contient aucun paramatre il faut laisser les parenthéses vides. 45.4, Lenchainement de références 3 des variables et & des méthodes Exemple T] Syston. out. printing bonjour"y Deux classes sont impliquées dans linstruction : System et PrintStream. La classe System posséde une variable nommée ‘out qui est un objet de type PrintStream, Printing est une méthode de la classe PrintStream. Linstruction signifie: « utilise la méthode printing de la variable out de la classe System » [Link] 12151 5/10/2028 16:33 Daveloppons en Java - POO avec Java 455, Les arguments variables (varargs) type & une méthode, Ceci va éviter de devoir encapsuler ces données dans une collection, Ele utilise un notation pour préciser la répétition d'un type @argument utilisant trois petits points Depuis Java 1.5, les varargs, spécifiés dans la JSR 207, permettent de passer un nombre non défin d'arguments d'un méme Exemple (ava 1.5) T] public class Testwarargs 2 3| public static void main(string[) args) ( 4 [Link]("valeur 1 = " + additionner(1,2,3))3 5 [Link]("valeur 2 = " + additionner(2,5,6,8,1@)); 6 7 | public static int adéitionnen(int ... valeurs) ( 9 int total = 85 1 u for (int val : valeurs) ( 2 total t= val; B } u“ 5 return total; w) > vi} Résultat 1) Ci\tigerjava Testvarares 2 | valeur 1 = 6 3 | valeur 2 = 31 sont traités comme un tableau: il est cailleurs possible de fournir les valeurs sous la forme d'un tableau. LLutlisation de la notation ... permet le passage d'un nombre indéfini de paramatres du type précisé, Tous ces parameétres Exemple (ava 1.5) T] public class Testvarargss ( 2 3 | public static void main(string[) args) ( 4 int{] valeurs = (1,2,3,4); 5 [Link]("valeur 1 = " + additionner(valeurs)); 6| > 7 2 | public static int adéitionner(int ... valeurs) ( 9 int total = 95 2 u for (int val : valeurs) ¢ 2 total += val B x 4 8 return total; w| > vit Résultat [Link] 19951 5/10/2028 16:33 Daveloppons en Java - POO avec Java T] Ci\tigersjava Testvarargs2 valeur 2 = 10 Il n'est cependant pas possible de mixer des éléments unitaires et un tableau dans la liste des éléments fournis en Exemple (java 1.5) T] public class Testvarargss { 2 3 | public static void main(stringl] args) { 4 Ae{] valeurs = (1,2,3,4); 5 [Link]("valeur 1 = " + additionner(5,6,7, valeurs)) ; aly 8 | public static int additionner(int ... valeurs) ( 9 int total = @; rr ree for (int val : valeurs) ¢ 2 total += val; B y 6 return total; 16 ra Résultat T] Ci\tigersjavac ~source 1-5 ~target 1.5 Testvarangss. java 2 | [Link][Link] additionner(int(]) in TestVarargs3 cannot be applied to (in 3 | tyint,int, int[]) 4 [Link]("valeur 1 = " + additionner(5,6,7,valeurs)); . a 6 | 1 error 456. La surcharge de méthodes La surcharge dune méthode permet de definir plusieurs fois une méme méthode avec des arguments différents, Le choisi la méthode qui doit étre appelée en fonction du nombre et du type des arguments. Ceci permet de compilateu simplifierVinterface des classes vis & vis des autres classes, Une méthode est surchargée lorsqurelle exécute des actions différentes selon le type et le nombre de paramétres transmis. lest done possible de donner le méme nom 8 deux méthodes différentes & condition que les signatures de ces deux méthodes soient différentes. La signature d'une méthode comprend le nom de la classe, le nom de la méthode et les types des paramatres, Exemple Class afFicher public void affichevaleur(int 4) { [Link](" nombre entier = public void affichevaleur(float #) { T 2 3 4) s 6 7 [Link](” nonbre flottant = "+ #); [Link] 14151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Ii n'est pas possible d'avoir deux méthodes de méme nom dont tous les paramétres sont identiques et dont seul le type retourné différe Exemple T | class affichet 2 3 public Float convert (int 4)( 4 rreturn((float) 4); 5 > 6 7 public double convert (int 4) 8 return( (double) 4); 9 t w| > Résultat T] Cipjavac Affiche. java 2 | [Link][Link] Methods can't be redefined with a different return type: double 3 | convert(int) was float convert(int) 4 | public double convert(int ){ 5 a 6 | 1 error 457. Les consteucteurs La décaration d'un objet est suivie d'une sorte diinitiasation par le moyen d'une méthode particullére appelée constructeur pour que les variables aient une valeur de départ. Elle n'est systématiquement invoquée que lors de la création d'un objet Le constructeur suit a défintion des autres méthodes excepté que son nom dott obligatoirement correspondre celui de la classe et quill n'est pas typé, pas méme void, done il ne peut pas y avoir dinstruction return dans un consteucteur. On peut surcharger un constructeur, La définition dun constructeur est facultative, Si aucun constructeur rest explicitement défini dans la classe, le compilateur va créer un constructeur par défaut sans argument. Dés qu'un constructeur est explictement défini, le ‘compilateur considére que le programmeur prend en charge la création des constructeurs at que le mécanisme par défaut, ‘qui correspond 8 un constructeur sans parametres, n'est pas mis en oeuvre Si on souhaite maintenir ce mécanisme, il faut |} Exemple : déclaration d'une interface & laquelle doit se conformer tout individus Tnterface Inaivigy ( String getNom(); String getPrenom(); Date getDateNaiss(); Toutes les méthodes d'une interface sont abstrates : elles sont implicitement déclarées comme telles. Une interface peut étre d'accés public ou package, Si elle est publique, toutes ses méthodes sont implicitement publiques méme si elles ne sont pas déclarées avec le modificateur public. Si elle est d'accés package, il s'agit d'une interface 6 | 1 errr Pour régler le probléme, Ia classe doit explicitement redefinir la méthode, éventuellement en invoquant la méthode par éfaut de interface. Si aucune des interfaces ne propose de méthodes par défaut, alors i nly a pas d'ambiguité et cette situation est celle qui pouvait existe avant Java 8, Une classe qui implémente ces interfaces doit fourir une implémentation pour chacune des méthodes ou étre déclarée abstraite. Il est possible quiune classe hérite d'une classe et implémente une interface avec une mel implémentée par la classe mére, ode par défaut qui est Exemple ( code Java 8) package fr jndoudoux. de}. javaey public class MonService implements Servicettendy { Exemple ( code Java 8) T] package #r-jndoudoux. de}. javaey public class ServiceConptable extends MonService inplenents Service Exemple ( code Java 8) 1) package #7. jndoudoux. de}. javats public class TestMethodePardefaut { public static void main(string[] args) { Service service = new ServiceConptable(); service. afficherNon(); [Link] 26151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Résultat, T | Won du service etendu 7 nconna Dans ce cas, c'est la classe mére qui prévaut et la méthode par défaut de I En application de la ragle «implementation d'une classe ou super-classe est prioritaies, c'est la méthode getName() héritée de la classe MonService qui est utilisé Les méthodes par défaut sont viruelles comme toutes les méthodes en Java, race Service est ignorée par le compilateur Exemple ( code Java 8) package fr jndoudoux. dey. javaey public interface Servicettendu extends Service ( Goverride default vold afficherNom() { [Link]("Now du service etendu : inconnu"); Exemple ( code Java 8) T package fr jndoudoux. dey. javeey public interface Servicebedie extends Service { Exemple ( code Java 8) T 2 3 4 5 package fr jndoudoux. de javeey public class MonService implements Servicebedie, Servicettendu { Exemple ( code Java 8) package fr jndoudoux. de. javeey public class TestNethodePardefaut ¢ public static void main(string[] args) { Monservice monService = new Monservice(); [Link]() Service service 1ew MonService()s service. afficherNom(); [Link] 27151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Résultat T 2 Ton du service etendu + inconna Non du service etendu : inconnu ‘Comme la méthode par défaut n'est pas redéfinie, le compilateur applique les régles pour déterminer Implementation de la méthode par defaut 8 utiliser: dans le cas ci-dessus, cest celle de linterface ServiceEtendu qui est la plus spécifique car lle redéfinit la méthode héritée de Interface Service. Peu importe le type de la variable, c'est limplémentation de Vinstance créée qui est utilisée, La régle qui veut quune implementation d'une classe prévale toujours sur une méthode par défaut implique plusieurs choses lle assure la compatibilté avec les classes antérieures Java 8 : lajout de méthodes par défaut n'a pas deffet sur du code qui fonctionnait avant '3jout des méthodes par défaut elle empéche de définir de maniére utile les méthodes de la classe Object. Le compilateur lave une erreur si une méthode ayant la signature d'une des méthodes toString0), equals() ou hashCoded de la classe Object est définie comme étant par défaut dans une interface Exemple ( code Java 8) T] package rjndoudoux. dey javeey 2 3 | public interface Service { 4 5 | default string tostring() ¢ 6 return "5 8 9| default boolean equals(object 0) { ey return false; n 2 13 | default public int hashcode() ( 4 return 0; 8 1 |} Résultat BEEN ES oevoneunn Ti\java\Testiava\sroojav ac -cp . con/jrdoudoux/test/java8/Service. java con\jndoudoux\test\javaB\Service. jav[Link] error: default method toString in inter Face Service overrides a menber of [Link] default String tostring() { con\jndoudoux\test\Java8\[Link][Link] error: default method equals in interfe ce Service overrides a menber of [Link] default boolean equals(Object 0) { com\ jndoudoux\test\ java8\Service. Jav[Link] error: default method hashCode in inte face Service overrides a menber of java. lang.0oject default public int hashCode() ( 3 errors [Link] 28151 5/10/2028 16:33 Daveloppons en Java - POO avec Java 46.72. Les interfaces locales Jusqu’’ Java 15, iIn'est pas possible de définir des interfaces locales. Exemple (code Java 15) 1] public class Testinterfacetocal { 2 3| public void traiter() ¢ 4 5 Interface MonInterface ()3 6 7 Résultat T | Ci\javanjavac -version 2 | javac 15 3 4 | C:\java>javac [Link] 5 | [Link][Link] error: interface not allowed here 6 interface MonInterface (}; ; a 8 | 1 error 9 we | c:\java> defies Java 16 permet de définir des interfaces locales, qui ne pourront donc étre utilisées que dans la classe ot elles sont Exemple ( code Java 16) T] public class Interfacelocale { 2 3| public void traiter() { 4 5 interface MonInterface { 6 7 public default void afficher() { 8 [Link] .println ("Hello 9 } 2 h u (new Moninterface() {))-afficher(); 2 Bl} 6 par exemple Les interfaces locales ne peuvent pas capturer les variables du contexte englobant comme les parameétres de la méthode Exemple (code Java 16) public class Interfacetocale { public void traiter(int valeur) ¢ Interface Montnterface { [Link] 20151 5/10/2028 16:33 Daveloppons en Java - POO avec Java 7 5 public default void afficher() ( 5 ‘[Link]..orintln(valeur) ; ~w t n h 2 (new Montaterface() {}).afficher(); Résultat 1 | C:\Java>javac Interfacelocale. java 2 | InterfaceLocale. jav[Link] error: non-static variable valeur cannot be referenced from a static 3 | context 4 [Link] .printIn(valeur) ; 5 * 6 | 1 error 7 8 | c:\java> Les interfaces locales peuvent capturer les variables static du contexte englobant. Exemple ( code Java 16) T] public class Taterfacetocale { 2 3| static int valeur = 10; 4 5 | public void traiter() ¢ 6 7 interface HonInterface { 8 9 public default void afficher() 2 [Link]..printin(valeur); n » 2 y 3 (new Montnterface() {}).aFFicher()5 ul) a5 |} 16 46.8. Lhéritage de méthodes statiques Toutes les méthodes, incluant les méthodes statiques, sont héritées d'une super-classe du moment qu'elles soient accessibles par la classe file Exemple 1) package #r_jndoudouxjavas 2 3 | public class MaClasseMere ( 4 5 | public static void maMethode() { 6 System. [Link]("maClasseMere"); 7; > 3|y [Link] 30051 5/10/2028 16:33 Daveloppons en Java - POO avec Java Exemple 1) package #[Link] der 2 3 | public class MaClasseFille extends MaClasseMere { al} Exemple T | package #r. jndoudoux. di 2 3 | public class TestHeritagestatic { 4 5 | public static void main(Steing[] args) { 6 [Link](); 7 [Link](); 8 9 Résultat T] Naclassevere 2 | MaClasseMere Dans le cas des méthodes statiques, ly a cependant une restriction qui interdit de redefinir une méthode statique hérité. Pourtant, il est possible rire Exemple 1) package #r, jndoudoux.dey5 2 3 | public class MaClasseFille extends MaClasseMere ( 4 5 | public static void maMethode() { 6 system. out. printin("MaClasseFille"); 7; > s/s Résultat de l'exécution de la méthode TestHeritageStatic 7] Nalassevere 2 | maClasseFille Une méthode static ne peut pas étre redéfinie (overtiden) mais il est possible de définir une méthode dans la classe fille avec la méme signature, Si une méthode statique définie dans une classe mére est définie de maniére identique dans une classe fille, celle-ci nest pas une redéfinition mais elle masque (hidden) la méthode de la classe mére. Exemple T] package rJndoudoux. ders 2 3 | public class MaClasseMere ( 4 5 | public static void maMethode() { [Link] 3151 5/10/2028 16:33 Daveloppons en Java - POO avec Java s [Link]("MaClasseMere") ; 8 3 | public static void mondutreMethode() { 1° maMethode(); n ni) Exemple 1] package fr. jndoudoux. dei; 2 3 | public class MaClasseFille extends MaClasseMere { 4 5| public static void maMethode() { 6 [Link]. printIn("MaClasseFille"); 7 aly Exemple 1] package fr, jndoudoux. dei; 2 3.| public class TestHeritagestatic 4 5 | public static void main(Stringl] args) { 6 [Link](); 7 [Link](); 8 [Link](); 9 [Link] ); w} } al} Résultat Ty] NaClassemere 2 | MaClasseMere 3.) MaClasseFille 4 | MaClassetere n'est done pas possible d'utiliser lannotation @Override. Exemple ( code Java 6) 1] package fr. jndoudoux. dei; 2 3.| public class MaClasseFille extends MaClasseMere { 4 5) @override 6 | public static void maMethode() { 7 [Link]. printIn("MaClasseFille"); 8) > 9|} Résultat [Link] 32151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Ci\java Test \src\com Jndoudoux\desjavec NaClasseFille. java MaClasseFille. jav[Link] error: cannot find synbol public class MaClasseFille extends MaClasseMere { synbol: class MaClasseHere NaClasseFille. java:s error: method does not override or implement a method from a supertype 12 | Goverride n| + 12 | 2 errors Il 'est pas possible de redéfinir une mi ode statique dans une classe fille si cette redéfintion n'est pas statique. Exemple 1) package #r. jndoudouxjavas 2 3 | public class MaClasseFille extends MaClasseMere { 4 5 | public void maMethode() ¢ 6 [Link]("MaClasseFille"); S| y |} Résultat 1] Crusers\jmworkspace\Test\sre>javac_con/jedoudoux/Java/[Link] 2 | com\;ndoudoux\ java\MaClasseFille. jav[Link] 3 | error: maMethode() in MaClasseFille cannot override maMethode() in MaClasseMere 4 | public void matethode() { 5 * 6 | overridden method is static 7 | a error polymorphisme sur des méthodes statiques, celles-ci étant résolues par le compilateur. La redefinition des méthodes d'instances implique une résolution 3 Vexécution. Les méthodes statiques sont des méthades de classes : leurs résolutions sont toujours faites par le compilateur & la compilation, Il n'est donc pas possible utiliser le Exemple 1] package #r_Jndoudouxjavar 2 3 | public class Test { 4 5 | public static void main(Stringl] args) { 6 MaClasseMere mere = new NaClasseMere(); 7 [Link](); 8 MaClasseFille fille = new MaClasseFille(); 9 [Link](); ey mere = new NaClasseFille() nu [Link](); 2 Bly [Link] 33151 5/10/2028 16:33 Daveloppons en Java - POO avec Java Résultat T | waclassevere 2 | MaclasseFille 3 | MaClasseMere Ce comportement est dau fait que la méthode n'est pas redéfinie mais masquée. Les accés aux méthades statiques sont toujours résolus a la compilation : le compllateur utilise le type de la variable et pas le type de l'nstance qui invoque la méthode. Linvocation d'une méthode statique 3 partir d'une instance est possible en Java mais le compilateur émet un avertissement pour préconiser l'utilisation de la classe pour invoquer la méthode et ainsi éviter toute confusion sur la méthode invoguée. Le compilateur remplace Tinstance par la classe de son type, ce qui permet 3 lexemple ci-dessous de se compiler et de Slexécuter correctement, Exemple T] package Fr jndoudouxjavas 2 3 | public class Test { 4 5 | public static void main(steing[] args) ( 6 | maClassehere mere = null; 7 | [Link](); 8 ae Résultat T | NaClassevere La redéfinition (overriding) est une fonctionnalité offerte par les langages de POO qui permet de mettre en ouvre une forme de polymorphisme. Une sous-classe fournit une implémentation dédiée d'une méthode héritée de sa super-classe les signatures des deux méthodes doivent étre les mémes, Le choix de la méthode & exécuter est déterminé a lexécution €en fonction du type de objet qui linvoque. La surcharge (overload) est une fonctionnalité offerte par les angages de POO qui permet de mettre en oeuvre une forme de polymorphisme. Elle permet de définir différentes méthodes ayant le méme nom avec le nombre et/ou le type des paramatres different. Le choix de la méthode 3 exécuter est déterminée statiquement par le compilateur en fonction des paramétres utilisés & invocation, (a9. Des ona sr tnetoge } Lors de la création d'une classe « mare » il faut tenie compte des points suivants, ‘+ la definition des accas aux variables dinstances, tras souvent privées, doit étre réfléchie entre protected et private ‘+ pour empécher la redefinition d'une méthode ou sa surcharge, l faut la déclarer avec le modificateur final Lors de la création d'une classe fille, pour chaque méthode héritée qui n'est pas fina, il faut envisager les cas suivants ‘+ la méthode héritée convient ala classe file: on ne doit pas la redéfinir ‘+ la méthode héritée convient mais partiellement du fait de la spécialisation apportée par la classe fille il faut la redefinir voire la surcharger. La plupart du temps une redefinition commencera par appeler la méthode héritée (en Utliant le mot clé super) pour garantie 'évolution du code [Link] 34151 5/10/2028 16:33 Daveloppons en Java - POO avec Java ‘+ la méthode héritée ne convient pas il faut redéfinir ou surcharger la méthode sans appeler la méthode héritée lors de la redefinition [47 Les packages } En Java, il existe un moyen de regrouper des classes voisines ou qui couvrent un méme domaine : ce sont les packages. Pour réaliser un package, on écrit un nombre quelconque de classes dans plusieurs fichiers d'un méme répertoire et au début de chaque fichier on met la directive ci-dessous ot! nom-du-package doit étre composé des répertoires séparés par un caractére point package nom-du-package; La hiérarchie d'un package se retrouve dans larborescence du disque dur puisque chaque package est dans un répertoire nommé du nom du package, Dune facon générale, instruction package associe toutes les classes qui sont définies dans un fichier source 4 un méme package, Le mot clé package doit tre la premidre instruction dans un fichier source et il ne doit étre présent qu'une seule fois dans le fichier source (une classe ne peut pas appartenir & plusieurs packages). 472. Les importations Pour pouvoir utiliser un type en Java, i faut utlser le nom pleinement qualifé du type qui inclue le nom du package avec la notation utilisant un point {fin de réduire la verbosité lors de Futiisation de type, il est possible ¢ utiliser les imports. Ils utiisent le mot lé import qui 7 Java 1.5 propose une solution pour rédluite le code a écrire concernant les membres statiques en proposant une nowvelle fonctionnalité concernant limportation de package : import statique (static import), Ce nouveau concept permet dappliquer les mémes ragles aux membres statiques qu'aux classes et interfaces pour importation classique. Cette nouvelle fonctionnalité est développée dans la JSR 201. Elle s'utilise comme une importation classique en ajoutant le mot clé static. [Link] 36051

Vous aimerez peut-être aussi