Concepts des langages objet
Classes internes
Programmations Orientées Objet - JAVA
Chap 3 : concepts P.O.O
Pr. Laila AMIR
Licence SIR
(Systèmes informatiques Répartis)
Année universitaire 2021/2022
Laila AMIR Programmations Orientées Objet 1 / 42
Concepts des langages objet
Classes internes
Plan
1 Concepts des langages objet
La classe, le constructeur, l’objet, le finaliseur
Les packages
Les modificateurs d’accès
Les variables de classe : mot clé static
2 Classes internes
Classe interne statique, et non statique
La variable this
Laila AMIR Programmations Orientées Objet 2 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Plan
1 Concepts des langages objet
La classe, le constructeur, l’objet, le finaliseur
Les packages
Les modificateurs d’accès
Les variables de classe : mot clé static
2 Classes internes
Classe interne statique, et non statique
La variable this
Laila AMIR Programmations Orientées Objet 3 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
La classe
Une classe modélise la structure statique (données membres) et le
comportement dynamique (méthodes) des objets associés à cette
classe.
Une classe est la description d’un objet. Chaque objet est créé à
partir d’une classe (avec l’opérateur new).
Les classes sont déclarées à l’aide du mot-cle class, suivi du nom de
la classe déclarée, suivi du corps de la classe entre accolades.
Laila AMIR Programmations Orientées Objet 4 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Déclaration
Par convention, un nom de classe commence par une majuscule.
public class Vehicule {
// corps de la classe
}
Le fichier contenant cette déclaration doit avoir pour extension .java et
nom [Link].
Remarque :
Un fichier peut contenir plusieurs déclarations de classes, mais il ne peut
contenir qu’une seule classe dite publique (dont le mot-clef class est
précédé de public, comme dans l’exemple ci-dessus). Le fichier doit
obligatoirement porter le même nom que cette classe publique.
Laila AMIR Programmations Orientées Objet 5 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemple
public class Vehicule {
int age ;
float poids ;
boolean moteur ;
float getWeight()
{
return(poids) ;
}
}
Trois ”variables membre” : age, poids et moteur
Une ”méthode membre” : getWeight() => poids d’un véhicule
Laila AMIR Programmations Orientées Objet 6 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Le constructeur
Chaque classe doit définir une ou plusieurs méthodes particulières
appelées des constructeurs.
Un constructeur est une méthode invoquée lors de la création d’un
objet. Cette méthode, qui peut être vide, effectue les opérations
nécessaires à l’initialisation d’un objet.
Chaque constructeur doit avoir le même nom que la classe où il est
défini et n’a aucune valeur de retour.
La définition de cette fonction membre spéciale n’est pas obligatoire
(si vous ne souhaitez pas initialiser les données membres par exemple)
dans la mesure où un constructeur par défaut est défini par le
compilateur Java si la classe n’en possède pas.
Laila AMIR Programmations Orientées Objet 7 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Le constructeur
Exemple: constructeur sans paramètres
public class Vehicule {
int age ;
float poids ;
boolean moteur ;
Vehicule() {
age = 0 ;
poids = 0.0F ;
moteur = false ;
}
float getWeight() { return(poids) ; }
}
Laila AMIR Programmations Orientées Objet 8 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Le constructeur
On peut surcharger le constructeur, autrement, définir un ou plusieurs
constructeurs.
Exemple: constructeur avec paramètres
public class Vehicule {
int age ;
float poids ;
boolean moteur ;
Vehicule(int a,float p,boolean m) {
age = a ;
poids = p ;
moteur = m ;
}
}
Laila AMIR Programmations Orientées Objet 9 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
L’objet
L’opérateur new permet d’instancier une classe en utilisant l’un des
constructeurs de la classe.
Il fait appel à la machine virtuelle pour obtenir l’espace mémoire
nécessaire à la représentation de l’objet puis appelle le constructeur
pour initialiser l’objet dans l’emplacement obtenu. Il renvoie une
valeur qui référence l’objet instancié.
Si l’opérateur new n’obtient pas l’allocation mémoire nécessaire, il
lève l’exception OutOfMemoryError.
Laila AMIR Programmations Orientées Objet 10 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemple de création d’un objet
Exemple :
Création d’un objet V1 de type Vehicule avec le constructeur par
défaut :
Vehicule V1 = new Vehicule() ;
Création d’un objet V2 avec le constructeur avec paramètres :
Vehicule V2 = new Vehicule(2,1.5F,true);
Laila AMIR Programmations Orientées Objet 11 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Remarque sur les objets de type String
Un objet String est automatiquement créé lors de l’utilisation
d’une constante chaı̂ne de caractères.
String chaine1 = ”bonjour”;
String chaine2 = ”bonjour”;
chaine1 et chaine2 représentent la même instance de la chaine.
Pour obtenir une seconde instance de la chaine, il faut explicitement
demander sa création en utilisant l’opérateur new.
String chaine1 = ”bonjour”;
String chaine2 = new String(”bonjour”);
Laila AMIR Programmations Orientées Objet 12 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
La durée de vie d’un objet
Les objets ne sont pas des éléments statiques et leur durée de vie ne
correspond pas forcément à la durée d’exécution du programme.
La durée de vie d’un objet passe par trois étapes :
la déclaration de l’objet et l’instanciation grâce à l’opérateur new;
l’utilisation de l’objet en appelant ses méthodes;
la suppression de l’objet : elle est automatique en Java grâce à la
machine virtuelle. La restitution de la mémoire inutilisée est prise en
charge par le récupérateur de mémoire (garbage collector). Il
n’existe pas d’instruction delete comme en C++.
Laila AMIR Programmations Orientées Objet 13 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
La création d’objets identiques
MaClasse m1 = new MaClasse();
MaClasse m2 = m1;
m1 et m2 contiennent la même référence et pointent donc tous les deux
sur le même objet.
Pour créer une copie d’un objet, il faut utiliser la méthode clone() : cette
méthode permet de créer un deuxième objet indépendant mais identique à
l’original. Cette méthode est héritée de la classe Object qui est la classe
mère de toutes les classes en Java.
MaClasse m1 = new MaClasse();
MaClasse m2 = [Link]();
m1 et m2 ne contiennent plus la même référence et pointent donc sur des
objets différents.
Laila AMIR Programmations Orientées Objet 14 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les finaliseurs
Le ramasse-miettes (garbage-collector) se charge de récupérer
automatiquement l’espace mémoire utilisé par les objets (dès que
ces derniers ne sont plus référencés). Le programmeur n’a pas à
se soucier de cet aspect.
Cependant, si l’objet contient d’autres types de ressources
(fichiers ouverts, connexions réseau, transactions dans une base de
données, etc) il peut être nécessaire d’écrire du code de finalisation
qui devra s’exécuter avant que l’objet disparaisse.
Laila AMIR Programmations Orientées Objet 15 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les finaliseurs
Un finaliseur est une méthode d’instance héritée de la classe Object
dont le nom est finalize()
qui ne possède aucun paramètre
qui ne retourne aucune valeur (void)
La méthode finalize() (si elle a été définie) sera invoquée
automatiquement par le Garbage collector avant la destruction de
l’objet.
Laila AMIR Programmations Orientées Objet 16 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les packages
Un package regroupe un ensemble de classes sous un même espace de
”nomage”.
Les noms des packages suivent le schéma : [Link]
L’instruction package au début d’un fichier indique à quel package
appartient ses classes
En dehors du package, les noms des classes de ce package sont :
[Link]
Laila AMIR Programmations Orientées Objet 17 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les packages
Le fichier à inclure dans une extension(package) doit contenir le mot-clé
package suivi du nom de l’extension. Ce nom peut être composé de
plusieurs mots séparé par un point ( . ).
Exemple :
Pour inclure la classe Toto dans l’extension ’Packages.sousPack1’, il faut
écrire au début du fichier [Link] :
package Packages.sousPack1;
La structure des répertoires doit suivre le nom de l’extension, c’est-à-dire
que le fichier [Link] doit se situer dans un sous-répertoire
Packages/sousPack1/[Link].
Laila AMIR Programmations Orientées Objet 18 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les packages
Lorsqu’ensuite on désire utiliser la classe Toto, il faudra au préalable
écrire :
import [Link];
ou lorsqu’ on désire importer toutes les classes de l’extension
Packages.sousPack1
import Packages.sousPack1.*;
ou utiliser directement une référence au package :
[Link] toto = new [Link]();
Laila AMIR Programmations Orientées Objet 19 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les packages
Un grand nombre de classes (forment l’API), fournies par Java SE,
implémentent des données et traitements génériques utilisables par un
grand nombre d’applications. Une documentation en ligne pour l’API java
est disponible à l’URL : [Link]
Toutes ces classes sont organisées en packages dédiés à un thème
précis. Parmi les packages les plus utilisés, on peut citer :
Package Description
[Link] Classes graphiques et de gestion d’interfaces
[Link] Gestion des entrées/sorties
[Link] Classes de base (importé par défaut)
[Link] Classes utilitaires
[Link] Autres classes graphiques
Pour accéder à une classe d’un package donné, il faut préalablement
importer cette classe ou son package.
Laila AMIR Programmations Orientées Objet 20 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemple
Par exemple, la classe Date appartenant au package [Link] qui
implémente un ensemble de méthodes de traitement sur une date peut
être importée de deux manières :
une seule classe du package est importée : import [Link] ;
toutes les classes du package sont importées (même les classes non
utilisées) : import [Link].* ;
Le programme suivant utilise cette classe pour afficher la date actuelle :
import [Link] ;
public class DateMain {
public static void main(String[] args) {
Date today = new Date();
[Link](”Nous sommes le ” + [Link]());
}
}
Laila AMIR Programmations Orientées Objet 21 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les modificateurs d’accès
Dans les exemples précédents, le mot-clé public apparaı̂t parfois au début
d’une déclaration de classe ou de méthode sans qu’il ait été expliqué
jusqu’ici. Ce mot-clé autorise n’importe quel objet à utiliser la classe
ou la méthode déclarée comme publique.
La portée de cette autorisation dépend de l’élément à laquelle elle
s’applique :
Elément Autorisations
Variable Lecture et écriture
Méthode Appel de la méthode
Classe Instanciation d’objets de cette classe
et accès aux variables et méthodes de classe
Laila AMIR Programmations Orientées Objet 22 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les modificateurs d’accès
En Java, la déclaration d’un élément (classe/méthode/attribut ou
variable) peut être précédée par un modificateur d’accès qui indique si les
autres classes de l’application pourront accéder ou non à cet élément. Ces
modificateurs sont :
public : toutes les classes peuvent accéder à l’élément
protected : seules les classes dérivées (cf. héritage) et les classes du
même package peuvent accéder à l’élément
private : l’élément est seulement accessible depuis l’intérieur de la
classe où il est défini.
(par défaut) : sans modificateur d’accès, seules les classes du même
package peuvent accéder à l’élément.
Exception
Les classes ne peuvent pas être private, non plus protected.
Laila AMIR Programmations Orientées Objet 23 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les modificateurs d’accès
public protected défaut private
Dans la même classe Oui Oui Oui Oui
Dans une classe du Oui Oui Oui Non
même package
Dans une sous-classe d’un Oui Oui Non Non
autre package
Dans une classe quelconque Oui Non Non Non
d’un autre package
Laila AMIR Programmations Orientées Objet 24 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemples : modificateur d’accès private
Laila AMIR Programmations Orientées Objet 25 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemples : modificateur d’accès private
L’utilisation du modificateur private est la meilleure façon d’encapsuler
un objet en cachant son implémentation au monde extérieur.
On ne peut pas accéder au membre (attribut ou méthode) private en
dehors de sa classe.
Laila AMIR Programmations Orientées Objet 26 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Assesseurs et mutateurs
Assesseurs et mutateurs
Pour accéder au contenu ou modifier le contenu d’une variable private en
dehors de sa classe, il faut prévoir des interfaces (méthodes) publiques :
un assesseur ( getter) et un mutateur ( setter) pour chaque variable
private. Sans ces interfaces publiques, il n’ya aucune manière d’accéder à
une variable private en dehors de sa classe.
getNomVariable() : un getter est une méthode publique qui renvoie la
valeur d’une variable private.
setNomVariable(parametre) : un setter est une méthode publique qui
permet de modifier la valeur d’une variable private.
Laila AMIR Programmations Orientées Objet 27 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Assesseurs et mutateurs
Laila AMIR Programmations Orientées Objet 28 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Méthode private
Parfois, une méthode peut fournir une fonctionnalité qui n’est
utile qu’à l’intérieur de sa classe, mais pas en dehors. Alors pour
éviter qu’elle soit utilisée en dehors de sa classe, on la déclare private
Déclarer un constructeur private signifie que seule la classe dans
laquelle le constructeur est déclaré peut instancier un objet de
cette classe. Toute autre classe ne pourra pas le faire.
Laila AMIR Programmations Orientées Objet 29 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemples : modificateur d’accès default
Le modificateur d’accès default est celui qui est appliqué lors que ne
nous déclarons pas explicitement un des trois autres modificateurs
d’accès : public ou private ou protected.
Dans ce cas, une classe, une méthode ou un attribut est accessible
uniquement aux autres classes du même paquetage (package).
Laila AMIR Programmations Orientées Objet 30 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemples : modificateur d’accès protected
Un modificateur d’accès protected permet aux membres (attributs ou
méthodes) d’une classe d’être accessibles dans la classe, dans les
classes dérivées et dans les classes du même paquetage.
Mêmes si les classes dérivées sont dans un paquetage différent de
celui de leur classe mère, ont accès aux membres protected de celle-ci.
Laila AMIR Programmations Orientées Objet 31 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Exemples : modificateur d’accès public
Le modificateur public est le plus permissif des modificateurs
d’accès.
Un attribut, une méthode ou une classe public est accessible dans
tous les paquetages de votre programme et partout ailleurs.
Laila AMIR Programmations Orientées Objet 32 / 42
La classe, le constructeur, l’objet, le finaliseur
Concepts des langages objet Les packages
Classes internes Les modificateurs d’accès
Les variables de classe : mot clé static
Les variables de classe : mot clé static
Une variable ou une fonction membre déclarée static dans une classe est
commune à toute les instances de cette classe. Une telle variable ou
méthode yyy de la classe Xxxx pourra être utilisée en faisant directement
référence à [Link].
class Vehicule {
static float taxation ;
static float Taxation() {
return(taxation) ;
}
}
[Link] = 100.0F ;
[Link]([Link]()) ;
Laila AMIR Programmations Orientées Objet 33 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Plan
1 Concepts des langages objet
La classe, le constructeur, l’objet, le finaliseur
Les packages
Les modificateurs d’accès
Les variables de classe : mot clé static
2 Classes internes
Classe interne statique, et non statique
La variable this
Laila AMIR Programmations Orientées Objet 34 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Classe interne
Définition
Une classe interne est déclarée à l’intérieur d’une autre classe. Elle peut
donc accéder aux membres de la classe externe.
Laila AMIR Programmations Orientées Objet 35 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Classe interne statique
Une classe interne statique ne peut accéder qu’aux membres statiques
de sa classe externe.
Exemple :
public class ClasseExterne {
La compilation du fichier ClasseEx- private int compteur = 0;
[Link] produit 2 fichiers compilés: private static String nom = ”exter”;
static class ClasseInterne {
private int index = 0;
[Link] contient la
public ClasseInterne(){
classe ClasseExterne uniquement [Link](”Création
d’un objet ”+nom);
ClasseExterne$[Link] // ici on ne peut pas acceder
contient la classe ClasseInterne au compteur
}
}
Laila AMIR Programmations Orientées Objet 36 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Classe interne non statique
Une classe interne non statique peut accéder aux membres
statiques de la classe ainsi qu’aux membres de l’objet qui l’a
créée.
Exemple :
Une telle classe interne
(Classe non statique globale)
peut-être déclarée de manière
globale dans l’objet; elle sera public class ClasseExterne {
accessible par l’ensemble des private int compteur = 0;
class ClasseInterne {
méthodes de l’objet. Elle peut
private int index = 0;
aussi être déclarée de manière public ClasseInterne() {
locale à une méthode de l’objet. compteur++;
Elle sera alors accessible depuis }
cette seule méthode. }
}
Laila AMIR Programmations Orientées Objet 37 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Classe interne non statique
Depuis la classe interne,
dans le cas où plusieurs
variables ou méthodes public class ClasseExterne {
portent le même nom private int compteur = 10;
dans la classe interne et class ClasseInterne {
la classe externe, le poin- private int compteur = 0;
teur this seul désigne public void count() {
l’instance de la classe in- [Link]++; // 1
[Link]- -; // 9
terne, tandis que le poin-
}
teur this précédé du }
nom de la classe externe }
désigne l’instance de la
classe externe.
Laila AMIR Programmations Orientées Objet 38 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
Le mot-clé this désigne, dans une classe, l’instance courante de la
classe elle-même. Il sert à référencer dans une méthode l’instance de
l’objet en cours d’utilisation. Il est utilisé à différentes situations
décrites dans les sections suivantes :
Désambiguiser
S’auto-désigner comme référence
Désigner l’instance de la classe qui encadre
Laila AMIR Programmations Orientées Objet 39 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
this : désambiguiser
Il peut être utilisé pour rendre le code explicite et non ambigu. Par
exemple, si dans une méthode, on a un paramètre ayant le même nom
qu’un attribut de la classe dont la méthode fait partie, on peut désigner
explicitement l’attribut grâce à this :
public class Calculateur {
protected int valeur;
public void calcule(int valeur) {
[Link] = [Link] + valeur;
}
}
Dans cet exemple, on additionne le paramètre valeur à l’attribut valeur et
on stocke le résultat dans l’attribut valeur. L’attribut a été désigné
explicitement par le mot-clé this.
Laila AMIR Programmations Orientées Objet 40 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
this : s’auto-désigner comme référence
Le mot-clé this peut être utilisé pour passer une référence à l’instance
elle-même comme paramètre d’une méthode.
Par exemple : s’enregistrer comme écouteur d’évènement :
[Link](this);
Laila AMIR Programmations Orientées Objet 41 / 42
Concepts des langages objet Classe interne statique, et non statique
Classes internes La variable this
this : désigner l’instance de la classe qui encadre
Dans le cas où une classe interne utilise l’instance de la classe externe, le
mot-clé this préfixé du nom de la classe externe permet de désigner
l’instance de la classe externe. S’il n’est pas préfixé, il désigne l’instance
de la classe interne.
public class Livre {
String titre = ”Le livre”;
class Chapitre {
String titre = ”Chapitre 1”;
public String toString(){
return [Link] // ”Le livre”
+ ”/” +
[Link] ; // ”Chapitre 1”
// ou [Link] ; // ”Chapitre 1”
} // -> ”Le livre/Chapitre 1”
}
}
Laila AMIR Programmations Orientées Objet 42 / 42