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 :


programmation orientée objet en JAVA
 
 
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 :


programmation orientée objet en JAVA

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 :


programmation orientée objet en JAVA


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 :



 







programmation orientée objet en JAVA



Pour l’instant  tous est bien. nous  allons  créer une seconde classe s’appelle Personne















programmation orientée objet en JAVA


!!! 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


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


programmation orientée objet en JAVA

 

 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 :

programmation orientée objet en JAVA



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:


programmation orientée objet en JAVA
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 :



programmation orientée objet en JAVA


==> 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 :


programmation orientée objet en JAVA

programmation orientée objet en JAVA

 

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


programmation orientée objet en JAVA


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 :


programmation orientée objet en JAVA

!!! 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  !!!




programmation orientée objet en JAVA

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 :


programmation orientée objet en JAVA

 



programmation orientée objet en JAVA



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:


programmation orientée objet en JAVA

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).


programmation orientée objet en JAVA

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.


programmation orientée objet en JAVA




programmation orientée objet en JAVA



Exercice d’application
Ajouter dans la classe Ville  une méthode pour comparer deux  objets  par rapport  à leur nombre d'habitants.











programmation orientée objet en JAVA

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.


programmation orientée objet en JAVA





poo en java


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 est un mécanisme consistant à protéger les données et les méthodes  d'un objet à l'extérieur, c'est-à-dire en empêchant l'accès aux données par un autre moyen que  via les  accesseurs  et  mutateurs  que nous  avons  défini. C'est  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 objetpermet 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 :

poo en java

 
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 !

poo en java




poo en java

 

 ! ! ! 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 !.

poo en java
 

 



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.

poo en java
 

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é.

poo en java

 

==> 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. 

poo en java
 
 
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:

poo en java

 


poo en java



 

7) Le  polymorphisme



 

        Je suis en train d'écrire la suite    !!!