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]
sist5/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] 2815/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] sist5/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]
4515/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] sist5/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]
9515/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] 71815/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] 3515/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] 9515/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] 101515/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] 1515/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] 121515/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]
199515/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]
141515/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] 261515/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]
271515/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]
281515/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]
201515/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]
300515/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]
31515/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]
321515/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]
331515/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]
341515/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