Java 1: Fondamentaux de la POO
▪ Encapsulation : private, public
▪ Getters / Setters
▪ La méthode toString()
▪ mot clé @Override (la syntaxe de la
signature)
▪ Comparaison d’objets
▪ Les attributs et méthodes statiques
Coordination : Cherifa BEN KHELIL
[Link]-khelil@[Link]
Une partie de cette présentation est tirée du cours
Support préparé par : Asma Gabis [Link]@[Link]
Java de l’EPFL
Programmation Orientée Objet
Introduction
• L’objectif principal de la notion d’objet est d’offrir des outils qui permettent d’organiser des
programmes de façon plus efficace.
• Les objets permettent de mettre en œuvre dans les programmes les notions :
✓ d’encapsulation
✓ d’abstraction
✓ d’héritage
✓ de polymorphisme
A. Gabis INGE-1-NEW – 2025/2026
01
L’encapsulation
L’encapsulation
Définition
• Le principe d’encapsulation consiste à regrouper dans le même objet informatique les
données et traitements qui lui sont spécifiques :
✓ Les données inclues dans un objet seront appelées les attributs de cet objet ;
✓ Les traitements/fonctions défini(e)s dans un objet seront appelées les méthodes de cet
objet.
Objet
=
Attributs
+
Méthodes
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Notion d’abstraction
• Pour être véritablement intéressant, un objet doit permettre un certain degré d’abstraction.
• Le processus d’abstraction consiste à identifier pour un ensemble d’éléments :
✓ des caractéristiques communes à tous les éléments
✓ des mécanismes communs à tous les éléments
➔ Description générique de l’ensemble considéré : se focaliser sur l’essentiel, cacher les détails.
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Notion d’abstraction
Exemple : Rectangles
• La notion d’« objet rectangle » n’est intéressante que si l’on peut lui associer des propriétés
et/ou mécanismes généraux
➔ Propriétés et mécanismes valables pour l’ensemble des rectangles et non pas pour un
rectangle particulier.
• Les notions de largeur et hauteur sont des propriétés générales des rectangles (attributs),
• Le mécanisme permettant de calculer la surface d’un rectangle (surface = largeur × hauteur)
est commun à tous les rectangles (méthodes)
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Notion d’abstraction
Illustration : Considérons les 3 rectangles suivants
Spécifique
Hauteur: 30 Hauteur: 12 Hauteur: 30
Largeur 12 Largeur 30 Largeur 30
Surface : 360 Surface : 360 Surface : 900
Hauteur Générique
Largeur
Surface
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Abstraction et encapsulation
• Un intérêt de l’encapsulation est que cela permet d’abstraire :
• En plus du regroupement des données et des traitements relatifs à une entité, l’encapsulation
permet en effet de définir deux niveaux de perception :
✓ Un niveau externe : partie « visible » (par les programmeurs-utilisateurs) de l’objet : Ie
prototype des méthodes et attributs accessibles hors de l’objet
✓ Un niveau interne : (détails d’) implémentation de l’objet, méthodes et attributs accessibles
uniquement depuis l’intérieur de l’objet (ou l’intérieur d’objets similaires)
➔ Corps de l’objet
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Abstraction et encapsulation
Encapsulation
Regroupement de tout ce qui caractérise l’objet:
données (attributs) et traitements (méthodes)
Isolement et dissimulation des détails
d’implémentation
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Comment encapsuler ?
• En cachant (ou non) l’existence de certains éléments de l’objet à d’autres objets.
➔ Jouer sur la visibilité des membres de la classe
4 niveaux de visibilité :
• Public : Aucune restriction d'accès. Accessible à partir d'un objet ou de n'importe quelle classe fille
• Privé : Ne peut être accédé qu'à partir de la classe qui le définit
• Protected : Accessible uniquement à partir de la classe qui la définit, ainsi que de toute classe
enfant
• Par défaut : Accessible uniquement à partir du package actuel
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
Comment décider de la visibilité ?
Dans la plus part des cas , mettre :
• Privé
✓ Tous les attributs de la classe systématiquement
✓ Les méthodes de la classe non utilisées par l’application utilisateur
• Public
✓ Les méthodes de la classe utilisées par l’application utilisateur
• Protected
✓ Pour les attributs et méthodes d’une classe mère dans le cas d’un héritage qui ne sont pas
utilisés par l’utilisateur mais uniquement par les classes filles.
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
L’accès public
public class Point
{
Mettre le mot-clé « public » avant l’attribut
// Liste des attributs
public double x;
public double y;
et/ou la méthode concerné : // Constructeur par défaut
public Point()
{}
public typeAtt nomAtt ;
// Constructeur d'initialisation à deux paramètres
public Point(int x, int y)
{
public typeSortie nomMethode(liste paramètres ) this.x = x;
this.y = y;
}
}
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
L’accès privé
public class Point
{
Mettre le mot-clé « private » avant l’attribut // Liste des attributs
private double x;
et/ou la méthode concerné: private double y;
}
private typeAtt nomAtt ;
public class Main
{
public static void main(String[] args)
private typeSortie nomMethode(liste paramètres ) {
Point p = new Point();
}
}
A. Gabis INGE-1-NEW – 2025/2026
L’encapsulation
L’accès privé
public class Point
{
// Liste des attributs
private double x;
private double y;
}
Comment faire pour modifier / afficher le contenu d’un attribut ?
A. Gabis INGE-1-NEW – 2025/2026
02
Getters/ Setters
«Accesseurs» /«Mutateurs »
Accesseurs / Mutateurs
Pour la lecture d’un attribut : accesseur/ getter
• Accesseur (« méthode get() » ou « getters »)
• Consultation d’une variable (accès en lecture)
• Retourne la valeur de l’attribut auquel il est associé
Syntaxe :
public typeDeRetour getNomAttrib()
{
return nomAttrib;
}
Exemple :
Public double getHauteur()
{
return hauteur;
}
A. Gabis INGE-1-NEW – 2025/2026
Accesseurs / Mutateurs
Pour la lecture d’un attribut : accesseur/ getter
Exemple :
class Rectangle
{
private double largeur;
private double hauteur;
// constructeur class RectangleMain
Rectangle(double h, double l) {
{hauteur = h; public static void main(String[] args)
largeur = l; } {
// getters Rectangle rect1 = new Rectangle(3.0,4.0);
public double getHauteur() {return hauteur;} [Link]([Link]());
public double getLargeur(){ return largeur;}
//...
// méthode surface }
}
public double surface () {
return hauteur* largeur;
}
}
A. Gabis INGE-1-NEW – 2025/2026
Accesseurs / Mutateurs
Pour l’écriture d’un attribut : mutateur / setter
• Modificateur « méthodes set() » ou « setters »
✓ Modification
✓ Affectation de l’argument à une variable d’instance précise
Syntaxe :
public void setNomAttrib(typeParam paramètre ){
nomAttrib = paramètre ;
}
Exemples :
public void setLongueur(double lo) { public void setLongueur(double longueur) {
longueur = lo; [Link] = longueur;
} }
A. Gabis INGE-1-NEW – 2025/2026
Accesseurs / Mutateurs
Pour l’écriture d’un attribut : mutateur / setter
Exemple :
class Rectangle {
private double largeur;
private double hauteur;
// constructeur
Rectangle(double h, double l)
{hauteur = h;
class RectangleMain
largeur = l; } {
// getters public static void main(String[] args)
public double getHauteur() {return hauteur;} {
public double getLargeur(){ return largeur;} Rectangle rect = new Rectangle(3.0,4.0);
//setters
public void setHauteur(double h)
[Link](8.0);
{ hauteur = h;} [Link](7.0);
public void setLargeur(double la) [Link]([Link]());
{ largeur = la;}
}
// méthode surface
}
public double surface () {
return hauteur* largeur;
}
} >>>8.0
A. Gabis INGE-1-NEW – 2025/2026
03
Affichage d’un objet
Affichage d’un objet
Besoin
Soit la portion du code suivant:
Rectangle r = new Rectangle(3,4);
[Link](r);
>>>>> Rectangle@23fc625e
Que fait-on si on souhaite faire afficher le contenu d’un objet ?
A. Gabis INGE-1-NEW – 2025/2026
Affichage d’un objet
Méthode toString()
• Java prévoit une méthode qui retourne une représentation de l’instance sous forme de String
• La méthode toString() est définie dans la classe Object ; en conséquence toutes les classes
Java en hérite
@Override
public String toString()
{
// Corps de la méthode
return …
}
• Par défaut, la méthode toString() affiche la référence de l’objet
• Pour la personnaliser et lui permettre de retourner une chaîne de caractères décrivant les
informations d’un objet, on procède à sa redéfinition.
• L’annotation @Override doit être mise au-dessus de toute méthode redéfinie (plus de détails
plus tard ☺ )
A. Gabis INGE-1-NEW – 2025/2026
Affichage d’un objet
Méthode toString()
class Rectangle {
private double largeur;
private double hauteur;
// constructeur class RectangleMain
Rectangle(double h, double l) {
{ hauteur = h; public static void main(String[] args) {
largeur = l;
} Rectangle rect = new Rectangle(4.5,9.0);
@Override [Link](rect);
public String toString(){
return "Rectangle " + hauteur + " x " + }
largeur; }
}
}
>>> Rectangle 4.5 x 9.0
A. Gabis INGE-1-NEW – 2025/2026
Affichage d’un objet
@Override
• L'annotation @Override indique au compilateur qu'une méthode donnée est la
redéfinition d’une autre méthode de la superclasse.
• En plus de rappeler au programmeur qu'il s'agit de la redéfinition d'une autre
méthode, la présence de l'annotation @Override va forcer le compilateur à vérifier
que la méthode a été redéfinie correctement.
A. Gabis INGE-1-NEW – 2025/2026
Affichage d’un objet
@Override
• L'annotation @Override indique au compilateur qu'une méthode donnée est la
redéfinition d’une autre méthode de la superclasse.
public class Singe {
public void mangerBananes(int nb) { ... } ... }
class Babouin extends Singe {
@Override
public void mangerBananes(int nb) { ... } // redéfinition ...
• En plus de rappeler au programmeur qu'il s'agit de la redéfinition d'une autre
méthode, la présence de l'annotation @Override va forcer le compilateur à vérifier
que la méthode a été redéfinie correctement.
A. Gabis INGE-1-NEW – 2025/2026
Affichage d’un objet
@Override
• Dans l'exemple suivant le programmeur a fait une erreur dans le nom de la méthode (oublie
de la lettre "s"), erreur qui sera détectée par le compilateur qui ne trouvera pas la méthode
correspondante dans la superclasse.
public class Singe {
public void mangerBananes(int nb) { ... } ... }
class Babouin extends Singe {
@Override
public void mangerBanane(int nb) { ... } // n'est pas une redéfinition
...
}
A. Gabis INGE-1-NEW – 2025/2026
04
Comparaison d’objets
Comparaison d’objets
Besoin
Considérons le programme Java ci-dessous:
public class RectangleMain
{
public static void main(String[] args)
{
Rectangle r1 = new Rectangle(5.0,9.0);
Rectangle r2 = new Rectangle(5.0,9.0);
if (r1 == r2) L’opérateur == appliqué à
{ deux objets, compare les
[Link]("Rectangles identiques "); références de ces objets.
}
else
{
[Link]("False");
}
} >>> False
}
A. Gabis INGE-1-NEW – 2025/2026
Comparaison d’objets
equals()
• Tout comme pour l’affichage d’un objet, Java prévoit une méthode qui retourne un booléen
indiquant si deux objets sont égaux ou pas.
• La méthode equals() est définie dans la classe Object ; en conséquence toutes les classes
Java en hérite
• Pour utiliser la méthode equals(), il est nécessaire de la redéfinir en indiquant les attributs qui
doivent être égaux pour ainsi dire que deux objets sont égaux ➔ utilisation de l’annotation
@Override
Syntaxe :
public boolean equals(Object o)
{
// Corps de la méthode À l’appel
return …
Object [Link](Object autreObjet)
}
A. Gabis INGE-1-NEW – 2025/2026
Comparaison d’objets
equals()
Exemple :
public class Main { public class StrMain {
public static void main(String[] args) { public static void main(String[] args) {
String myStr1 = "Hello"; String str1="Rouge";
String myStr2 = "Hello"; String str2="Rou";
String myStr3 = "Another String"; String str3= str2+"ge";
if ([Link](str3)){
[Link]([Link](myStr2)); [Link]("chaines identiques");
}
[Link]([Link](myStr3)); }
} }
}
>>> true
>>> chaines identiques
>>> false
A. Gabis INGE-1-NEW – 2025/2026
Comparaison d’objets
equals()
Exemple :
class Rectangle {
private double largeur;
private double hauteur;
// constructeur class RectangleMain{
Rectangle(double h, double l) public static void main(String[] args) {
{ hauteur = h; Rectangle r1 = new Rectangle(5.0,9.0);
largeur = l;} Rectangle r2 = new Rectangle(5.0,9.0);
if ([Link](r2)){
@Override [Link]("2- equals = TRUE");
public boolean equals(Object obj) { }
Rectangle autreRectangle = (Rectangle) obj; else{
if (autreRectangle == null) { [Link]("2- Not equals");
return false; }
} }
else { }
return (hauteur == [Link])
&& (largeur == [Link]);
}}
}
>>> 2- equals = TRUE
A. Gabis INGE-1-NEW – 2025/2026
05
Attributs et méthodes
statiques
Attributs et Méthodes Statiques
Attribut Statique
• Un attribut statique est une variable qui appartient à la classe plutôt qu’à une instance
spécifique.
Syntaxe :
Class NomClasse
{ À l’appel
public static typeAttribut nomAttributStat; [Link]
….
}
Exemple :
public class Point {
public static int nombreDePoints; À l’appel [Link] = 10;
}
A. Gabis INGE-1-NEW – 2025/2026
Attributs et Méthodes Statiques
Méthode Statique
• Une méthode statique est une méthode qui appartient à la classe et non à une instance.
Syntaxe :
Class NomClasse
{
À l’appel
static typeRetourMethode nomMethode (liste param) { …. }
[Link](…);
Exemple :
public class Point {
public static void afficherNombreDePoints() {
À l’appel
[Link]("Nombre de points : " + [Link]();
nombreDePoints);
}
}
A. Gabis INGE-1-NEW – 2025/2026
Attributs et Méthodes Statiques
Exemple:
public class Point {
private static int nombreDePoints = 0;
public class Main {
private int x, y;
public static void main (String [] args){
Point p1 = new Point(1, 2);
public Point(int x, int y) {
Point p2 = new Point(3, 4);
this.x = x;
[Link]("Nombre de points
this.y = y;
créés : " + [Link]());
nombreDePoints++;
}
}
}
public static int getNombreDePoints() {
return nombreDePoints;
}
} >>> Nombre de points créés : 2
A. Gabis INGE-1-NEW – 2025/2026
Recommandations pour des Applications Vertes
en POO
A. Gabis INGE-1-NEW – 2025/2026
Activité
1. Créez une classe Personne avec les attributs nom et age.
2. Implémentez un constructeur par défaut.
3. Implémentez un constructeur paramétré en utilisant le mot-clé this pour initialiser les
attributs.
4. Fournissez des méthodes accesseurs et mutateurs pour nom et age.
5. Redéfinissez la méthode toString pour pouvoir afficher tous les attributs de la classe
Personne.
6. Créez une classe TestPersonne contenant la méthode main pour tester la fonctionnalité.
7. Chaque instance de Personne doit avoir un identifiant unique qui s'incrémente
automatiquement à chaque nouvel objet créé. Comment pouvons-nous y parvenir ?
Testez votre solution dans la classe TestPersonne.
A. Gabis INGE-1-NEW – 2025/2026