← (précédent) C.0 La P.O.O : programmation orientée objet
C.2 Les constructeurs
Accueil S O M M A I R E

C.1 La Contruction d'une classe :
(la notion d'objet)

Une classe qui servira à créer des points dans l' espace affine dimension 2. 

1.  public class Points2
2.  {
3.      public double abs;
4.      public double ord;
5.      public static int varStat;
6.      
7.      public void initialiser(double x, double y)
8.      {
9.        abs = x; ord = y;
10.     }
11.       
12.     public void afficherCoord()
13.     {
14.       System.out.println("Le point se situe en position : " + abs + " et " + ord );
15.     }
16.
17.       public void deplacerPoint(double dx, double dy)
18.       {
19.           abs += dx; ord += dy;
20.       }
21.       
22.    public static double calculDistance(Points2 M, Points2 N)
23.    {
24.      double distance;
25.      distance = Math.sqrt( (N.abs - M.abs) * (N.abs - M.abs) + (N.ord - M.ord) * (N.ord - M.ord) );
26.      return distance;
27.    }
28. 
29.    public double calculDistance(Points2 P)
30.    {
31.      double distance;
32.      distance = Math.sqrt((this.abs - P.abs)*{this.abs - P.abs)+(this.ord - P.ord)*(this.ord - P.ord));
33.      return distance;
34.    }
35. }

Rappel : Le nom d' une classe commence toujours par une lettre majuscule. C'est une convention, pas une obligation.
Vous devez enregistrez cette classe sous Points2.java.

Remarquez : il n y a pas de méthode main() dans cette classe. Normal ! Ce n' est pas un programme. Mais simplement une classe qui servira à créer des objets. Attention ! Une classe qui ne possède pas de méthode main() ne sert pas forcément à fabriquer des Objets. Exemple : la classe Math. Mais une classe qui sert à fabriquer des objets est forcément dépourvue de méthode main()

Compilez cette classe et aucun message d' erreur ne sera renvoyé. Normal ! Pas d' erreur dans sa conception. Si vous executez cette classe, un message d' erreur sera affiché :
Exception in thread "main"java.lang.NoSuchMethodError: main
Ce qui signifie en gros qu' une erreur s' est produite : pas de méthode main(). En effet, On n' execute pas de classe ne contenant pas de méthode main(). Normal, pas de méthode main(), pas de programme.

Maintenant, analysons dans la classe Points2. Vous y voyez en lignes 3, 4 et 5 des déclarations de variables. Puis en ligne 7, 12, 17, 22 et 29, des déclarations de méthodes.

Dans la vie courante, un objet possède des caractéristiques et des fonctions. Une voiture est caractérisée par des roues, un volant, un moteur, des sièges, etc... Et elle possède les fonction : rouler, démarrer, tourner, clicnoter, etc...

En P.O.O, c 'est pareil. Sauf qu' à la place de caractéristiques, on dit champs et à la place de fonctions, on dit méthodes. Un champ est une variable déclarée en dehors de toute méthode. Ici, abs, ord et varStat sont donc les champs de la classe Points2.
Comment déclarer un champ ? Avec les mots suivants : 1. public ou private ou protected 2. static ou non 3. type : ici, c double 4. le nom de la variable, autrement dit, le nom du champ.

Dans l' espace dimension 2, les points sont caractérisés par une abscisse et une ordonnée. D' où les champs abs et ord.
Quant à varStat, je l' ai créé pour introduire une notion de java. Cette variable ne caractérise en aucun cas un Point.

Pour ce qui est des méthodes, je vous expliquerais chacune d' elle dans les programmes ci-dessous. Je peux simplement vous dire que le nombre de méthodes que vous mettrez dans les classes que vous allez concevoir n' est pas fixe. Tout dépendra du programme qu' on vous demandera de créer. De même, le nombre de champs dépendra aussi du programme. Il n' est pas fixe. Ce sera à vous de voir.

Maintenant, voyons les exemples de programme qui utilisent cette classe Points2.
EXEMPLE P1 : 

1.    public class TesterPoints2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            A.initialiser();
8.            A.afficherCoord();
9.        }
10.   }
Avant toute chose, vous devez savoir que lorsque vous utilisez un objet dans un programme, vous devez enregistrez la classe qui a servi à fabriquer cet objet dans le même répertoire que le programme. Ici, le progrmme, c' est la classe TesterPoints2 qui doit donc se trouver dans le même répertoire que la classe Points2.

Compilez puis exécutez ce programme, il sera affiché : Le point se situe en position : 2.0 et 7.0

Explications :
Ligne 6 : on fabrique l' objet A à partir de la classe Points2. En P.O.O, on dit qu' on instancie (du verbe instancier) l' objet A à partir de la classe Points2. On dit aussi que A est ine instance de la classe Points2. On dit aussi que A est une variable de type Points2.

Syntaxe générale d' instanciation d' un objet : nomDeLaClasse nomDEL'Objet = new nomDeLaClasse(paramètres éventuels);
L' opérateur new sert à instancier des objets. Vous êtes étonnés de voir des parenthèses suivant le nom d' une classe ? Explications au chapitre suivant : les constructeurs.

Ligne 7 : La méthode initialiser() est appliquée à l' objet A. Regardez la classe Points2 en ligne 7. Vous voyez que la méthode initialiser() est déclarée sans le mot clé static Cela veut dire que pour l' utiliser dans une classe différente de Points2, il faut d' abord créer (instancier) un objet. Puis appliquer la méthode à l' objet en écrivant : nomDeL'Objet, suivi d' un point, suivi du nom de la méthode, suivi des parenthèses avec les paramètres éventuels. Ce qui est le cas en ligne 7 de la classe TesterPoints2. Cette méthode requiert 2 arguments de type double. Puis les valeurs de ces arguments sont respectivements affectées aux champs abs et ord. En écrivant donc M.initialiser(2, 7), je mets la valeur 2 dans abs et la valeur 7 dans ord.

ligne 8 : J' applique la méthode afficherCoord() à l' objet M. Regardez les lignes 12 à 15 de la classe Points2. Cette méthode ne requiert aucun argument. Elle se contente d' afficher (grâce à System.out.println() ) la phrase : Le point se situe en position abs et ord abs et ord étant bien entendu les valeurs des variables abs et ord. Puisque j' ai initialisé le point M avec 2 et 7, ça veut dire que abs et ord ont respectivement les valeurs 2 et 7. C' est pourquoi il est affiché après exécution du programme : Le point se situe en position : 2.0 et 7.0 . 2.0 et 7.0 parce que la méthode initialiser() requiert des types double. 2 et 7 étant des int, il y a eu conversion implicite de int en double.
J' espère que je me suis fait comprendre. Si ce n' est pas le cas, relisez ce n' est pas compliqué.
EXEMPLE P2 : La classe ne s' appelle plus TesterPoints2 mais Tester2Points2

1.    public class Tester2Points2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            Points2 B = new Points2();
8.            A.initialiser(2, 7);
9.            B.initialiser(1, 1);
10.           A.afficherCoord();
11.           B.afficherCoord();
9.        }
10.   }
compilez puis exécutez ce programme, il sera affiché : A est position : 2.0 et 7.0
B est position : 1.0 et 1.0


Explications : Lignes 6 et 7, j' ai respectivement instancié 2 objets : A et B. Ligne 8, j' ai initialisé les coordonnées de M à 2 et 7. Ligne 9 : j' ai initialisé les coordonées de N à 1 et 1. d' où les affichages correspondants.
La question que vous pouvez vous posez est de savoir pourquoi ces coordonnées sont différentes. Après tout, lorsqu' on affecte une nouvelle valeur à une variable, l' ancienne disparaît. On initialise abs et ord avec A.initialise(2, 7). Puis on initialise abs et ord avec B.initialise(1, 1). On devrait logiquement avoir à l' affichage :
A est position : 1.0 et 1.0
B est position : 1.0 et 1.0


L' explication est toute simple. Les variables abs et ord existent en double exemplaire. Pourquoi ? ...
Lorsqu' on déclare un champ(variable déclarée en dehors de toute méthode) sans le mot clé static, lorsqu' on instancie un objet, le compilateur crée un champ associé à cet objet. Si on instancie 10 objets, il y aura autant de champs que d' objets. La variable abs existe donc ici en double exemplaire. abs associé à l' objet A et abs associé à l' objet B. Il en est de même pour le champ ord. En faisant A.initialise(2, 7), on affecte 2 à abs de A et 7 à ord de A. En faisant B.initialise(1, 1), on affecte 1 à abs de B et 1 à ord de B. Et ça, on le doit à l' absence du mot clé static. On dit que abs et ord sont des champs non statiques. Voyez l' exemple 3 et vous comprendrez encore mieux.
EXEMPLE P3 : La classe s' appelle maintenant Tester3Points2

1.    public class Tester3Points2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            Points2 B = new Points2();
8.            A.initialiser(2, 7);
9.            B.initialiser(1, 1);
10.           System.out.println("A est en position : " + A.abs + " et " + A.ord);
11.           System.out.println("B est en position : " + B.abs + " et " + B.ord);
9.        }
10.   }
Compilez puis exécutez ce programme, il sera affiché la même chose qu' à l' exemple 2.

Explications : Ici, on n' utilise pas la méthode afficherCoord(). Mais plutôt la fonction System.out.println() pour afficher les coordonnées de A et de B. Ce qui nous permet de voir comment appeler les variables abs de A, ord de A, abs de B et ord de B.

Lorsqu' on veut utiliser un champ dans une classe autre que celle dans laquelle elle est définie, 2 cas se présentent :
1. le champ est déclaré static : dans ce cas, on écrit nom de la classe, suivi d' un point, suivi du nom du champ.
2. le champ est déclaré sans le mot clé static, dans ce cas, on instancie d' abord un objet, puis on écrit, nom de l' objet, suivi d' un point, suivi du nom du champ. Ce qui est le cas dans l' exemple 3. Ceci pour vous faire comprendre que le champ non statique étant en plusieurs exemplaires dans la mémoire, on est bien obligé de spécifier le nom de l' objet pour au moins faire comprendre de quel champ on est entrain de parler.

Par contre, le champ déclaré avec le mot static sera toujours en un seul exemplaire. Quelque soit le nombre d'objets instanciés.
EXEMPLE P4 : La classe s' appelle maintenant Tester4Points2

1.    public class Tester4Points2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            Points2 B = new Points2();
8.            A.varStat = 50;
9.            
10.           System.out.println("varStat de A = " + A.varStat);
11.           System.out.println("varStat de B = " + B.varStat);
12.           B.varStat = 30;
13.           System.out.println("varStat de A = " + A.varStat);
14.           System.out.println("varStat de B = " + B.varStat);
15.         
16.          System.out.println("varStat de Points2 = " + Points2.varStat);
16.       }
17.   }
Compilez puis exécutez, il sera affiché : varStat de A = 50
varStat de B = 50
varStat de A = 30
varStat de B = 30
varStat de Points2 = 30


Expliquons : lignes 6 et 7 : On crée 2 objets A et B. Puis on affecte à la variable varStat de A, la valeur 50 (ligne 8). Lignes 10, on affiche la valeur de varStat associé à A, on trouve 50. Ligne 11, on fait la même chose pour B. on trouve encore 50. Ce qui prouve bel et bien que cette variable se trouve en un seul exemplaire dans la mémoire. On modifie la valeur varStat de B en ligne 12. Puis on affiche les valeurs de varStat de A (ligne 13) et de B (ligne 14). On trouve la même valeur modifiée : 30. Ce qui prouve encore que la variable varStat se trouve en un seul exemplaire dans la mémoire.
Ligne 16, on affiche la valeur de la variable varStat de la classe Points2 : Points2.varStat : on trouve encore 30. C' est une autre façon d' invoquer la variable varStat. Et c' est la façon la plus adéquate de l' utiliser. Pourquoi ? ... Lorsqu' on déclare un champ avec le mot clé static, pour l' utiliser hors de la classe dans laquelle elle a été définie, on écrit : nom de la classe, suivi d' un point, suivi du nom du champ. Ce champ existe pour toute la classe. Et pas seulemnt pour chaque objet (plusieurs exemplaire). On interprète ce fait en disant qu' un champ statique (déclaré avec le mot clé static) est un champ de classe. Alors qu' un champ non statique est appelé un champ d' instance.

champ statique = variable statique = variable de classe = champ de classe

champ non statique = variable nom statique = variable d' instance = champ d' instance

De classe : parce qu' il y a appartenance à toute la classe. D' instance : parce qu' il y a appartenance à un objet. Objet = instance.
EXEMPLE P5 : La classe s' appelle maintenant Tester5Points2

1.    public class Tester5Points2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            Points2 B = new Points2();
8.            A.initialiser(2, 7);
9.            A.afficherCoord();
10.           A.deplacerPoint(1, 6);
11.           A.afficherCoord();
12.           B.initialiser(-2, 3);
13.           double longueur = Points2.calculDistance(A, B);
14.           System.out.println("distance entre A et B = " + longueur);
15.      }
16.   }
Compilez puis exécutez ce programme, il sera affiché :
Le point se situe en position : 2.0 et 7.0
Le point se situe en position : 3.0 et 13.0
distance entre A et B = 11.180339887498949


Explications :
Lignes 6 et 7 : instanciation des objets A et B. Ligne 8 : initialisation des coordonnées de A à 2 et 7. Ligne 9 : on applique la méthode afficheCoord() à l' objet A. D' où la première ligne d' affichage. Ce sont bel et bien les coordoonées de A. Ligne 10 : on applique la méthode deplacerPoint() à l' objet A. Si vous regardez la classe Points2 en ligne 17, vous verrez que cette méthode requiert 2 arguments de type double. Leurs valeurs sont respectivement l' incrémentation de abs et ord. Rappel : abs += dx; veut dire abs = abs + dx. Autrement dit, la nouvelle valeur de abs est égale à l' ancienne valeur de abs + dx. Dans l' exemple 5, dx = 1 et dy = 6. Les nouvelles coordonnées de A sont donc : 3 et 13. D' où l' affichage de la deuxième ligne, conséquence de l' instruction en ligne 11 de la classe Tester5Points2.

En ligne 12 : initialisation des coordonnées de B à -2 et 7.Puis en ligne 13, on utilise la méthode calculDistance() déclarée en ligne 22 de la classe Points2. Regardez bien cette méthode. Elle est déclarée avec le mot clé static. Cela veut dire que lorsqu' on l' utilise hors de la classe dans laquelle elle est définie, on écrit nom de la classe, suivi d' un point, suivi du nom de la méthode. Cette méthode est de type double. Elle renvoie donc une valeur de type double. D' où le return comme dernière instruction dans sa définition. Rappelons que la définition d' une méthode, c' est l' ensemble des instructions de cette méthode.

Rappelons aussi que lorsqu' une méthode retourne(renvoie) une valeur, on l' utilise en mettant cette valeur dans une variable de même type ou de type convertible. C' est pourquoi en ligne 13 de la classe Tester5Points2, j' ai mis cette valeur dans la variable double.

La méthode calculDistance() requiert 2 arguments de type Points2. En effet, Points2 M signifie que M est une variable de type Points2 (Voir explications de l' exemple 1). Si vous regardez attentivement la définition de la méthode calculDistance() déclarée en ligne 22 de la classe Points2, vous y verrez la formule qui permet de calculer la distance entre 2 Points de l' espace dimension 2. Racine carrée de la somme de la différence des abscisses et de la différence des ordonnées.Je vous rappelle que Math.sqrt() est la fonction mathématique qui permet de calculer la racine carrée d' un nombre réel. En fait, c' est la méthode statique sqrt() de la classe Math.
Pour la ligne 13 de la classe Tester5Points2, je mets donc la valeur de cette distance dans la variable longueur. Puis en ligne 14, j' affiche cette longueur. D' où l' affichage de la dernière ligne. Ouf!
Si vous n' avez pas compris, recommencez la lecture. ça ira.

Quelque chose que vous avez forcément remarqué et que je n' ai pas encore expliqué, c' est la déclaration de deux méthodes de même nom. En l' occurence, la méthode calculDistance() déclarée en ligne 22 et en ligne 29 de la classe Points2.
Sachez que cela n' a rien d' anormal. Java permet au programmeur de déclarer et donc de définir deux méthodes avec le même nom. On applelle cela la surdéfinition des méthodes. C' est spécifique de JAVA. On dit encore la surcharge des méthodes. Mais attention, cela se fait sous conditions.
Les méthodes surdéfinies ne doivent pas avoir la même signature. La signature d' une méthode c' est son nom, le nombre de ses arguments, et le type de ses arguments. En fait, c' est un peu plus corsé que ça. Nous verrons les choses beaucoup plus en détail dans le chapitre consacré à l' héritage et le polymorphisme.
Et on voit ici que les deux méthodes n' ont pas la même signature. nombre d' arguments = 2 en ligne 22 et 1 en ligne 29. Pas la peine de regarder le type des arguments qui est forcément différents puisque le nombre l' est déjà.

Si deux méthodes surchargées ont la même signature, un message d' erreur est affiché à la compilation. Parce que Java choisit la méthode selon le nom et le nombre et ype des arguments. Si c' est la même chose, le choix devient impossible.

Je vous avais prévenu au début de ce site. La P.O.O n' est pas compliqué, en tout cas pas aussi difficile qu' on le dit. Le problème, c' est plutôt le nombre d' informations à digérer. Vous commencez à vous en rendre compte.
EXEMPLE P6 : La classe s' appelle maintenant Tester6Points2

1.    public class Tester6Points2
2.    {
3.        
4.        public static void main(String [] args)
5.        {
6.            Points2 A = new Points2();
7.            Points2 B = new Points2();
8.            A.initialiser(2, 7);
9.            B.initialiser(3, 13);
10.           A.afficherCoord();
11.           B.afficheCoord();
12.           
13.           double longueur = A.calculDistance(B);
14.           System.out.println("distance entre A et B = " + longueur);
15.      }
16.   }

compilez puis exécutez. Il sera affiché :

Le point se situe en position : 2.0 et 7.0
Le point se situe en position : 3.0 et 13.0
distance entre A et B = 11.180339887498949


Lignes 6 et 7 : instanciation de deux objets A et B de type Points2. Lignes 8 et 9 : initialisation des coordonnées de A et de B. Lignes 11 et 12 on affiche ces coordonnées. D' où l' affichage des deux premières lignes.
Maintenant, voyons l' utilisation de la deuxième méthode calculCoord().
La 2ème méthode calculDistance() est déclarée sans le mot clé static. Ce qui veut dire qu' il faut d' abord instancier un objet puis lui appliquer la méthode. De plus, cette méthode requiert un argument de type Points2. En ligne 13, j' utilise donc la méthode en mettant netre ses parenthèses l' objet B qui est de type Points2. Et j' applique cette méthode à l' objet A appartenant à la classe dans laquelle la méthode est définie.
Maintenant, regardons la définition de la méthode(libnes 31, 32 et 33 de la classe Points2). Un nouveau mot clé Java apparaît sous vos yeux : this . Que signifie-t-il ? ... ça dépend de l' endroit où il se trouve. Ici, il se trouve dans la définition d' une méthode. ça veut dire qu' il représente le nom de l' objet sur lequel on applique la méthode. Ici, on a appliqué la méthode à l' objet A. Donc, il fait référence à A. Lorsque vous comparez la 2ème méthode calculDistance() à la première (voir la classe Points2), une seule chose : N est remplacé par this. Dans la première méthode, on connait les deux objets sur lesquels on applique la méthode. Tandis que dans la deuxième, on ne connait pas l' autre point dont on veut calculer la distance jusqu' au point passé en argument (entre parenthèses). Alors on écrit this.abs Ce qui veut dire, l' abscisse (abs) de cet objet sur lequel la méthode est appliqué. Pigé ? this est un mot anglais qui veut dire : ce, cet, cette.
Comme preuve, la distance est la même que dans l' exemple précédent. Puisque ce sont les mêmes coordonnées.

Encore une fois, si vous n' avez pas compris, relisez, au besoin, re-re-re lisez. Vous finirez par comprendre. Ce n' est pas si compliqué.
un peu de cours !

Le mot clé this fait référence à l' objet courant. L' objet courant est celui auquel on applique la méthode. Ce qui veut dire qu' en utilisant les méthodes initialiser(), afficherCoord() et deplacerPoint(), on devrait aussi utiliser ce mot. En effet, si dans les 3 méthodes, vous remplacez abs et ord, respectivement par this.abs et this.ord, à la compilation aucun message d' erreur. Et à l' exécution, pareil. Pas de message d' erreur. Et à l' affichage, le même résultat. Pourquoi la présence et l' absence de this aboutissent au même résultat ? ... Tout simplement parce que dans ces trois méthodes (les 3 premières), il n y a aucune ambiguité. En effet, l' utilisation de ces 3 méthodes met en jeu un seul objet. Donc, abs et ord sont les champs forcément associés à l' objet en cours. La 4ème méthode ( ligne 22 de la classe Points2) est statique. On applique pas la méthode sur un objet. Mais on utilise les objets en tant que arguments. Dans la 5ème méthode (ligne 29 de Points2), la méthode est non statique et elle met en jeu 2 objets dont l' un est l' argument et l' autre est cet objet sur lequel la méthode est appliquée. Donc, l' utilisation de this est necéssaire. Cela dit, pas indispensable. Car en enlevant le mot this devant abs et ord dans la définition de la méthode claculDistance() déclarée en ligne 29 de la classe Points2, on ne change rien. Car ce abs et ce ord sont ceux de l' objet sur lequel on applique la méthode.

Il esxiste un cas où l' utilisation de this est indispensable. C' est le cas par exemple où le nom d' un argument est le même que celui d' un champ,
Exemple: si on avait déclaré la méthode initialiser() avec les argument double abs et double ord. public void initialiser(double abs, double ord)....
On aurait pas pu écrire dans sa définition : abs = abs; ord = ord;. A la compilation, il y aurait eu message d' erreur. Pour corriger le problème, la définition de la méthode initialiser() serait plutôt : this.abs = abs; this.ord = ord;
Traduction : le champs abs de cet objet = valeur de l' argument abs. Même topo pour ord.
Une classe qui sert à fabriquer des cercles dans l' espace dimension 2

1.    public class Cercle
2.    {
3.        private double centreX;
4.        private double centreY;
5.        private double rayon;
6.           
7.        public void initialiser(double x, double y, double r)
8.        {
9.            centreX = x; centreY = y; rayon = r;
10.       }
11.       
12.    public void afficherCoord()
13.    {
14.      System.out.println("Cercle de centre : " + centreX + " et " + centreY + " et de rayon " + rayon);
15.    }
16.        
17.       public void deplacer(double dx, double dy)
18.       {
19.           centreX += dx; centreY += dy;
20.       }
21.       
22.       public void agrandir(double dr)
23.       {
24.           rayon += dr;
25.       }
26.       
27.       public double perimetre()
28.       {
29.           return (2 * Math.PI * rayon);
30.       }
31.      
32.       public double surface()
33.       {
34.           return (rayon * rayon * Math.PI);
35.       }
36.   }

Cette classe servira à créer des objets Cercle. Un cercle est caractérisé par son centre et son rayon. Les coordonnées du centre sont ici : centreX et centreY. Ces champs sont déclarés private. Vous comprendrez les explications à travers les exemples.
Les méthodes sont ici : initialiser(). 3 arguments pour initialiser l' abscisse et l ' ordonnée du centre, et aussi le rayon.
La méthode afficherCoord() pour afficher les 3 coordonnées du cercle.
La méthode deplacer(). Le déplacement d' un cercle, c' est tout simplement le déplacement du centre de ce cercle.
La méthode agrandir() : On agrandi un cercle en agrandissant son rayon tout simplement.
Les méthodes perimetre() et surface(). Sans commentaire. VOus l' avez compris.
EXEMPLE C1 : 

1.    public class TesterCercle
2.    {
3.        public static void main(String [] args)
4.        {
5.            Cercle A = new Cercle().
6.            A.initialiser(1, 3, 5);
7.            A.afficherCoord();
8.        }
9.    }
Compilez puis exécutez ce programme, il sera affiché : Cercle de centre 1.0 et 3.0 et de rayon 5.0

Pas de mystère ici. ligne 5 : instanciation de l' objet A de type Cercle. ligne 6 : initialisation des champs de l' objet A. Puis affichage des coordonnées de A.
EXEMPLE C2 : 

1. public class TesterCercle
2. {
3.   public static void main(String [] args)
4.   {
5.     Cercle A = new Cercle();
6.     A.initialiser(1, 3, 5);
7.     System.out.println("Coordonnées cercle A : " + A.centreX + ", " + A.centreY + " et " + A.rayon);
8.     }
9. }
Compilez ce programme et il sera affiché 3 messages d' erreur.
1. centreX has private accès in class Cercle
System.out.println("Les coordonnées du cercle A sont : " + A.centreX + ", " + A.centreY + " et " + A.rayon);


Les deux autres erreurs sont axactement la même chose. A ceci près qu' il faut changer centrX en centreY pour l' erreur 2 et changer centreX en rayon pour l' erreur 3.

Explications : Les 3 champs centreX, centreY et rayon sont déclarées en mode private Ce qui veut dire qu' on n'y a pas accès en dehors de la classe dans laquelle ils ont été déclarés.
Mais alors, pourquoi a-t-on pu afficher ces mêmes coordonées dans l' exemple C1 ?...
Parce que dans l' exemple C1, on a utilisé la méthode afficherCoord() pour afficher ces coordonnées. Ainsi, lorsqu' un champ es déclaré private dans un classe, cela veut dire que seules les méthodes de cette classe peuvent manipuler ces champs. Ce qui n' était pas le cas avbec la classe Points2 où les champs étainets déclarées public
un peu de cours !

Déclarer les champs en mode private n' est pas une obligation en java. Mais ceci est fortement recommandé. Cela vous éviterait, dans un programme long, de faire n' importe quoi. En l' occurence, de confondre par exemple les champs d' une classe avec ceux d' une autre classe.
Déclarer les champs en mode private se dit en POO, encapsuler les données.
Le champ d' une classe s' appelle aussi la donnée de cette classe.
EXEMPLE C3 : 

1.    public class TesterCercle
2.    {
3.        public static void main(String [] args)
4.        {
5.            Cercle A = new Cercle();
6.            A.initialiser(1, 3, 5);
7.            A.afficherCoord();
8.            A.deplacer(2, 3);
9.            A.afficherCoord();
10.           A.agrandir(5);
11.           A.afficherCoord();
12.           System.out.println("périmètre de A = " + A.perimetre());
13.           System.out.println("surface de A = " + A.surface());
14.       }
15.   }
Compilez puis exécutez. Il sera affiché :
Cercle de centre : 1.0 et 3.0 et de rayon 5.0
Cercle de centre : 3.0 et 6.0 et de rayon 5.0
Cercle de centre : 3.0 et 6.0 et de rayon 10.0
périmètre de A = 62.83185307179586
surface de A = 314.1592653589793


Explications :Ligne 5 : on instancie un nouvel objet A de type Cercle. Ligne 6 : on initialise ses coordonnées avec 1 et 3 comme abscisse et ordonné du centre. Et avec 5 comme le rayon du cercle.. Ligne 7, on affiche les coordonnées du cercle A. Ligne 8 : on déplace le cercle. Ligne 9 : on affiche les nouvelles coordonnées du cercle.. Ligne 10 : on agrandit le cercle. Ligne 11 : on affiche les nouvelles coordonnées du cercle A. Ligne 12 : on affiche le périmètre de A. Ligne 13 : on affiche la surface de A. Pas très compliqué n' est-ce pas ?
La classe Points2 avec des membres tous privés 

1. public class Points2Prives
2. {
3.   private double abs;
4.   private double ord;
5.   private static int varStat;
6.       
7.   private void initialiser(double x, double y)
8.   {
9.     abs = x; ord = y;
10.  }
11.      
12.  private void afficherCoord()
13.  {
14.    System.out.println("Le point se situe en position : " + abs + " et " + ord );
15.  }
16.
17.  private void deplacerPoint(double dx, double dy)
18.  {
19.    abs += dx; ord += dy;
20.  }
21.       
22.  private static double calculDistance(Points2 M, Points2 N)
23.  {
24.    double distance;
25.    distance = Math.sqrt( (N.abs - M.abs) * (N.abs - M.abs) + (N.ord - M.ord) * (N.ord - M.ord) );
26.    return distance;
27.  }
28. 
29.  private double calculDistance(Points2 P)
30.  {
31.    double distance;
32.    distance = Math.sqrt( (this.abs - P.abs) * (this.abs - P.abs) + (this.ord - P.ord) * (this.ord - P.ord) );
33.    return distance;
34.  }
35. }

Ici, c' est à nouveau la classe Points2. Mais cette fois, tous ses membres sont privés. Au fait : les membres d' une classe, ce sont les champs et méthodes de la classe. On distingue des membres publics (public), privés (private) et protégés(protected). On verra protected dans le chapitre consacré à l' héritage et le polymorphisme.

Que peut-on faire avec une classe dont tous les membres sont déclarés avec le mot clé private ???

Rien su tout. On ne peut pas accéder aux champs à partir d' une autre classe. On ne peut pas non plus accéder aux méthodes de cette classe à partir d' une autre classe.

Que fait-on avec ce genre de classe alors ?

Réponse : rien du tout. Tout ce qui est déclaré en private n' est jamais accessible hors de la classe dans laquelle on l' a déclaré.

Lorsque vous aurez compris l' importance du mot clé private à travers divers exemples, ne vous amusez pas à déclarer tout en private.

De même, une classe déclarée en private (par exemple : private class Points2 ) ne sert à rien. En fait, nous verrons dans le chapitre consacré aux classes particulières que les classes internes peuvent être déclarées en private. Plus tard !
La connaissance, c'est bien. La partager, c'est mieux
Conseiller ce site à un(e) ami(e):

Son e-mail est :       
Une suggestion à faire pour ce site ? ... Contact : webmaster@debutantprog.com
← (précédent) C.0 La P.O.O : programmation orientée objet
C.2 Les constructeurs
Accueil S O M M A I R E

C.1 La Contruction d'une classe : la notion d'objet