La notion de POO
1) Introduction
POO c’est quoi ????
La programmation orientée objet (POO), ou programmation par objet, est un concept de programmation plus puissant et pratique. En effet, avec ce type de programmation, vous pourrez créer, utiliser, recréer divers objets à travers d’une classe.
Un objet représente un concept, une idée ou toute entité du monde physique, comme une voiture, une personne ou encore une page d'un livre. Il possède une structure interne et un comportement, et il sait interagir avec ses pairs. Il s'agit donc de représenter ces objets et leurs relations. L’interaction entre les objets via leurs relations permet de concevoir et réaliser les fonctionnalités (méthodes) attendues. Alors le POO est permet de transcrire les éléments du réel sous forme virtuelle.
Exemple :
Qu'est-ce-qu' une classe ?
Une « classe » est un modèle de données définissant la structure commune à tous les objets qui seront créés à partir d'elle. Autrement dit, nous pouvons percevoir une classe comme un moule grâce auquel nous allons créer autant d'objets de même type et de même structure qu'on le désire.
Par exemple, pour modéliser n'importe quelle voiture, nous pourrions écrire une classe Voiture dans laquelle nous définissons les attributs (couleur, matricule, marque, ...) et méthodes (démarrer, accélérer, freiner,...) communs à tout voitures.
Qu'est-ce qu'un objet ?
Un « objet » est une représentation d'une chose matérielle ou immatérielle du réel à laquelle on associe des propriétés et des actions.
Par exemple : une voiture, une personne, un animal, ou bien un compte bancaire peuvent être vus comme des objets.
==> Attributs
Les « attributs » (aussi appelés « données membres ») sont les caractéristiques
==> Méthodes
Les «méthodes» sont les actions applicables à un objet.
Un objet personne, par exemple, dispose des actions suivantes : manger, dormir, boire, marcher, courir ....
Exemple :
Qu'est-ce-qu' une instance ?
Une instance est une représentation particulière d'une classe.
Lorsque l'on crée un objet, on réalise ce que l'on appelle une « instance de la classe ». C'est à dire que du moule, on en extrait un nouvel objet qui dispose de ses attributs et de ses méthodes. L'objet ainsi créé aura pour type le nom de la classe.
Exemple :
Notre première classe
Dans le premier cours sur la programmation en Java, nous avons déjà travaillé avec quelque classe (comme String, Scanner).
Lorsque vous faisiez ceci : String chaine = new String ("Bonjour") ;
Ici chaine est un objet String. Vous avez utilisé un objet de la classe String : on dit que vous avez créé une instance de la classe String.
Le moment est venu pour vous de créer vos propres classes
!!! Attention Si vous avez bien suivi la première partie de ce cours,
(👉Voir la première partie👈) nous avons déjà une classe mère s’appelle PremierClass contenant la
méthode main. Maintenant nous allons
créer une nouvelle classe
s’appelle ClasseMain. Suiviez les étapes suivantes :
Pour l’instant tous est bien. nous allons créer une seconde classe s’appelle Personne
!!! Le nom de votre classe « Personne » (avec un « P» majuscule, convention de nommage oblige). Cette fois, vous ne devez pas y créer la méthode main.
Ici, notre classe Personne précédée par un mot clé public. Vous devez savoir que lors que nous créons une classe comme ceci, Eclipse nous facilite la tâche en ajoutant automatiquement ce mot clé, qui correspond à la portée de la classe.
Alors ces deux syntaxes public class Personne { } et class Personne { } sont presque équivalents !
En programmation, la portée détermine qui peut faire appel à une classe, une méthode ou une variable. Vous avez déjà rencontré la portée public : cela signifie que tout le monde peut faire appel à l'élément. Ici dans le cas qui nous intéresse il s'agit d'une méthode. Une méthode marquée comme public peut donc être appelée depuis n'importe quel endroit du programme.
Nous allons ici utiliser une autre portée : private. Elle signifie que notre méthode ne pourra être appelée que depuis l'intérieur de la classe dans laquelle elle se trouve ! Les méthodes déclarées private correspondent souvent à des mécanismes internes à une classe que les développeurs souhaitent « cacher » ou simplement ne pas rendre accessibles de l'extérieur de la classe…
L’objectif de ce
chapitre est de construire un objet Personne, il va falloir définir les données qu’on va lui attribuer.
Alors un objet Personne est possède :
* un nom de type String
* un prénom de type String
* un CNI de type int
maintenant, on a une nouvelle variable ( Classe ) (comme int, float, String …) s’appelle Personne, et on peut déclarer une variable ( objet ) de type Personne comme ceci :
P : est un objet d’une classe Personne
Personne : est une variable spéciale s’appelle classe
Pour initialiser l’objet P nous allons devoir utiliser ce qu'on appelle des constructeurs
Un constructeur est une méthode d'instance qui va se charger de créer un objet.
Il existe deux types des constructeurs (constructeur par défaut et Constructeur avec paramètres).
==> constructeur par défaut
un constructeur par défaut, c’est une méthode qui ne prendra aucun paramètre mais permettra tout de même d'instancier un objet, c’est-à-dire initialiser les variables d'instance. Voici votre premier constructeur:
Remarque:
* le constructeur est une méthode qui n'a aucun type de retour
* le (les) constructeur(s) d'une classe doit (doivent) porter le même nom que la classe !
Exemple :
==> constructeur par paramètres
un constructeur par paramètres, c’est une méthode a des paramètres pour initialiser les variables d'instance.
Exemple :
Remarque :
* Pour accéder aux variables d'instance (les données membres) en utilisant le « . » Nom_objet.variable ; ou Nom_objet.méthode () ;
* il vous faudra respecter l'ordre des paramètres passés lors de l'initialisation de votre objet : si non, votre programme ne compilera pas !
Exemple :
On affiche les données de chacune personne P1 et P2
Apres l’exécution de ce programme ci-dessus on obtient le résultat suivant :
Vous constatez que nous pouvons accéder, modifier les variables d’instance directement à travers le nom d’objet suivi par le nom de variable tout simplement. mais C'est très risqué tant que les variables d’instance déclarées public. (en cas d’absence la portée signifie que la variable est déclaré public)
Exemple :
!!! pour résoudre ce problème, où les variables d’un objet seront visibles que dans la classe qui le définit, on ajoute le mot clé private avant chaque variable
Exemple :
Mais dans ce cas-là on ne peut pas faire les instructions suivantes !!!
Pour l’instant tous est bien. nous allons créer une seconde classe s’appelle Personne
!!! Le nom de votre classe « Personne » (avec un « P» majuscule, convention de nommage oblige). Cette fois, vous ne devez pas y créer la méthode main.
Ici, notre classe Personne précédée par un mot clé public. Vous devez savoir que lors que nous créons une classe comme ceci, Eclipse nous facilite la tâche en ajoutant automatiquement ce mot clé, qui correspond à la portée de la classe.
Alors ces deux syntaxes public class Personne { } et class Personne { } sont presque équivalents !
En programmation, la portée détermine qui peut faire appel à une classe, une méthode ou une variable. Vous avez déjà rencontré la portée public : cela signifie que tout le monde peut faire appel à l'élément. Ici dans le cas qui nous intéresse il s'agit d'une méthode. Une méthode marquée comme public peut donc être appelée depuis n'importe quel endroit du programme.
Nous allons ici utiliser une autre portée : private. Elle signifie que notre méthode ne pourra être appelée que depuis l'intérieur de la classe dans laquelle elle se trouve ! Les méthodes déclarées private correspondent souvent à des mécanismes internes à une classe que les développeurs souhaitent « cacher » ou simplement ne pas rendre accessibles de l'extérieur de la classe…
2) Les constructeurs
Alors un objet Personne est possède :
* un nom de type String
* un prénom de type String
* un CNI de type int
maintenant, on a une nouvelle variable ( Classe ) (comme int, float, String …) s’appelle Personne, et on peut déclarer une variable ( objet ) de type Personne comme ceci :
Personne : est une variable spéciale s’appelle classe
Pour initialiser l’objet P nous allons devoir utiliser ce qu'on appelle des constructeurs
Un constructeur est une méthode d'instance qui va se charger de créer un objet.
Il existe deux types des constructeurs (constructeur par défaut et Constructeur avec paramètres).
==> constructeur par défaut
un constructeur par défaut, c’est une méthode qui ne prendra aucun paramètre mais permettra tout de même d'instancier un objet, c’est-à-dire initialiser les variables d'instance. Voici votre premier constructeur:
Remarque:
* le constructeur est une méthode qui n'a aucun type de retour
* le (les) constructeur(s) d'une classe doit (doivent) porter le même nom que la classe !
Exemple :
==> constructeur par paramètres
un constructeur par paramètres, c’est une méthode a des paramètres pour initialiser les variables d'instance.
Exemple :
Remarque :
* Pour accéder aux variables d'instance (les données membres) en utilisant le « . » Nom_objet.variable ; ou Nom_objet.méthode () ;
* il vous faudra respecter l'ordre des paramètres passés lors de l'initialisation de votre objet : si non, votre programme ne compilera pas !
Exemple :
On affiche les données de chacune personne P1 et P2
Apres l’exécution de ce programme ci-dessus on obtient le résultat suivant :
Vous constatez que nous pouvons accéder, modifier les variables d’instance directement à travers le nom d’objet suivi par le nom de variable tout simplement. mais C'est très risqué tant que les variables d’instance déclarées public. (en cas d’absence la portée signifie que la variable est déclaré public)
Exemple :
!!! pour résoudre ce problème, où les variables d’un objet seront visibles que dans la classe qui le définit, on ajoute le mot clé private avant chaque variable
Exemple :
Mais dans ce cas-là on ne peut pas faire les instructions suivantes !!!
Remarques
* La différence entre public et private c'est quand tu as d'autres classes. Un attribut public sera visible dans n'importe quelle classe, alors qu'un attribut private ne se sera visible que dans la classe qui le définit.
* En pratique, il vaut mieux mettre private tout le temps, parce que sinon, n'importe qui pourrait faire n'importe quoi avec tes données, ce qui peut entraîner pas mal d'erreurs
* si tu veux vraiment donner la visibilité public à un attribut, alors il faut lui rajouter le mot clé final (constante), comme ça tu es sûr qu'il ne changera jamais de valeur. Mais tout privé c'est quand même le mieux.
* mais la question qui se pose, comment accéder aux ces variables en cas de mode private, oui bravooo , c’est une bonne question.
* On utilise les méthodes get et set pour accéder aux valeurs des attributs.
3) Accesseurs et mutateurs
Un accesseur est une méthode qui va nous permettre d'accéder aux variables de nos objets en lecture, et un mutateur nous permettra d'en faire de même en écriture ! Grâce aux accesseurs, vous pourrez afficher les variables de vos objets, et grâce aux mutateurs , vous pourrez les modifier.
Exemple :
Problème 1 !!!
Imaginez que le nom d’une variable passée comme un paramètre dans la méthode setNom() est semblable avec le nom d’une variable d’objet. Prenons cet exemple:
Le problème c’est que, le programme considère le mot nom comme la variable d’objet courant et n’est pas une variable locale passée par paramètre, et par conséquence la variable nom ne changera pas (reste elle-même).
Pour résoudre ce problème on utilise le mot clé this qui fait référence à l'objet courant ! Bien que la traduction anglaise exacte soit « ceci », il faut comprendre « moi ». À l'intérieur d'un objet, ce mot clé permet de désigner une de ses variables ou une de ses méthodes.
Exemple :
Maintenant on répète le même exemple précédant en ajoutant seulement le mot clé this.
Problème 2 !!!
On va
prendre une autre classe qui s’appelle Ville.
Alors un
objet Ville est possède :
* un nom de type String
* un nbreHabitants de type int
* un categorie de type char
chaque ville a une catégorie par rapport à son nombre d'habitants.
si
: nbreHabitants <= 10000 c’est-à-dire
catégorie A
si
: 10000 < nbreHabitants <= 100000 c’est-à-dire
catégorie B
si
: nbreHabitants > 100000 c’est-à-dire
catégorie C Nous voulons que la classe Ville gère la façon de déterminer la catégorie elle-même, et non que cette action puisse être opérée de l'extérieur. La méthode qui fera ceci sera donc déclarée private.
Exercice d’application
Ajouter dans la classe Ville une méthode pour comparer deux objets par rapport à leur nombre d'habitants.
4) Les variables de classe
il y a trois grands types de variables dans une classe :1. Les variables d'instance : ce sont elles qui définiront les caractéristiques de notre objet.
2. Les variables de classe : celles-ci sont communes à toutes les instances de votre classe.
3. Les variables locales : ce sont des variables que nous utiliserons pour travailler dans notre objet.
Exemple :
nous allons compter le nombre d'instances de notre classe Ville, Il s'agira d'une variable de type int que nous appellerons nbreInstance, Afin qu'une variable soit une variable de classe, elle doit être précédée du mot clé static.
Remarque :
Remarquer que l'accesseur de notre variable de classe déclarée privée est aussi déclaré static:
ceci est une règle « Toutes les méthodes de classe n'utilisant que des variables de classe doivent être déclarées static. On les appelle des méthodes de classe»
5) Le principe d’encapsulation
L'encapsulation permet de définir des niveaux de visibilité des éléments de la classe. Ces niveaux de visibilité définissent les droits d'accès aux données selon que l'on y accède par une méthode de la classe elle-même, d'une classe héritière, ou bien d'une classe quelconque. Il existe trois niveaux de visibilité:
publique: les fonctions de toutes les classes peuvent accéder aux données ou aux méthodes d'une classe définie avec le niveau de visibilité public. Il s'agit du plus bas niveau de protection des données
protégée: l'accès aux données est réservé aux fonctions des classes héritières, c'est-à-dire par les fonctions membres de la classe ainsi que des classes dérivées (classes fils).
privée: l'accès aux données est limité aux méthodes de la classe elle-même. Il s'agit du niveau de protection des données le plus élevé.
6) L’héritage
L’héritage est la
définition d’une classe par extension des caractéristiques d’une autre classe.
L'héritage, est l'un des
mécanismes les plus puissants de la programmation
orientée objet, permet de reprendre des
membres d'une classe (appelée superclasse ou classe mère) dans
une autre classe
(appelée sous-classe, classe fille ou encore classe
dérivée), qui en hérite.
Syntaxe :
Reprenons l'exemple de la classe Ville. Nous allons créer une nouvelle classe, nommée Capitale, héritée de Ville. C’est à dire les objets Capitale auront tous les attributs et toutes les méthodes associés aux objets Ville !
! ! ! Problème :
!!! Pourquoi ce problème ?????
==> Le problème c’est que
les attributs de la classe mère
(Ville) sont déclarés privates, alors ne se seront visibles que dans la classe Ville. Et pour
résoudre ce problème, il faut Remplacer le mot private par
le mot protected dans la
déclaration de variables ou de
méthodes de la
classe Ville. Donc, une fois les variables et méthodes privées de la classe mère déclarées en protected, notre objet Capitale aura accès à celles-ci !.
classe Ville. Donc, une fois les variables et méthodes privées de la classe mère déclarées en protected, notre objet Capitale aura accès à celles-ci !.
Remarque :
Notons un point
important avant de continuer. Contrairement au C++, Java ne gère pas les héritages multiples : une classe dérivée (aussi appelée classe fille) ne peut hériter que d'une seule classe mère !
Vous n'aurez donc jamais ce genre de classe :
À présent, continuons la construction de notre objet hérité Capitale qui a tous les attributs et toutes les méthodes associés aux objets Ville !, ce qui différenciera nos objets Capitale de nos objets Ville sera la présence d'un nouveau champ : le nom d'un monument . Cela
implique que nous devons créer un constructeur par défaut et un constructeur d'initialisation pour notre objet Capitale.
Remarque !!!! :
Pour éviter d’écrire les
mêmes instructions deux fois (la redondance), on peut faire appel aux variables de la classe mère dans nos constructeurs grâce au mot
clé super. Cela aura pour effet de récupérer les éléments
de l'objet de base, et de les
envoyer à notre objet hérité.
==> On ajoute une nouvelle
méthode dans la classe Ville s’appelle decrisToi() qui permet décrire la ville, afin
d’utiliser le mot clé super.
Alors maintenant dans la
classe Capitale, on peut récupérer la description de la ville via le mot clé super(), ce
qui nous
donne une méthode decrisToi() un peu différente, car nous allons lui ajouter le champ
monument pour notre description:
7) Le polymorphisme |
Je suis en train d'écrire la suite !!!
9 Commentaires
C'est intéressant.vraiment merci a vous 🙏
RépondreSupprimerWouah intéressant ces cours.vraiment merci pour vos différents efforts 🙏
RépondreSupprimerBonjour ce cours est intéressant .J'ai hâte de voir la suite
RépondreSupprimerMerveilleux ce cours... Plein d'inspiration...très bonne saisie.
RépondreSupprimerVous êtes génial. Courage à vous
RépondreSupprimerMerci bcp pour vos efforts
RépondreSupprimerTrès intéressant.
RépondreSupprimerCe commentaire a été supprimé par l'auteur.
RépondreSupprimerCours très explicatif,et bien élaboré ,je dirais bien que grâce à ce cours j'ai vraiment bien compris ce que c'est la programmation orientée objet
RépondreSupprimer