Contrairement au Langage C++, dans le langage Java, la programmation est essentiellement Objet. En java rien n'existe sans les Objets. Tout est Objet.
De manière superficielle, le terme "orienté
objet", signifie que l'on organise le logiciel comme une collection
d'objets dissociés comprenant à la fois une structure de données
(attributs) et un comportement (méthodes)
dans une même entité (encapsulation).
Exemple : une voiture peut avoir une certaine couleur et en même temps
possède un comportement qui sera le même pour toutes les autres
voitures, comme accélérer. Ce concept est différent de
la programmation conventionnelle dans laquelle les structures de données
et le comportement ne sont que faiblement associés.
Chaque objet a une identité et peut être distingué des autres. Deux pommes ayant les mêmes couleur, forme et texture demeurent des pommes individuelles; une personne peut manger l'une, puis l'autre. De la même façon, des jumeaux identiques sont deux personnes distinctes, même si elles se ressemblent. Le terme identité signifie que les objets peuvent être distingués grâce à leur existence inhérente et non grâce à la description des propriétés qu'ils peuvent avoir. Nous utiliserons l'expression instance d'objet pour faire référence à une chose précise, et l'expression classe d'objets pour désigner un groupe de choses similaires. En d'autres termes, deux objets sont distincts même si tous leurs attributs (nom, taille et couleur par exemple) ont des valeurs identiques (deux pommes vertes sont deux objets distincts).
La classification signifie que les objets ayant la même structure de donnée (attributs) et le même comportement (méthodes) sont regroupés en une classe. Les objets d'une classe ont donc le même type de comportement et les mêmes attributs. En groupant les objets en classe, on abstrait un problème. Les définitions communes (telles que le nom de la classe et les noms d'attributs) sont stockés une fois par classe plutôt qu'une fois par instance. Les méthodes peuvent être écrites une fois par classe, de telle façon que tous les objets de la classe bénéficient de la réutilisation du code. Par exemple, toutes les ellipses partagent les procédures de dessin, de calcul d'aire ou de test d'intersection avec une ligne.
Une classe est un modèle utilisé pour créer
plusieurs objets présentant des caractéristiques communes.
.
Chaque objet possède ses propres valeurs pour chaque attribut mais partage noms d'attributs et méthodes avec les autres objets de la classe. Par exemple une classe Voiture peut être définie comme ayant un des attributs couleur et comme une des méthodes freiner ; les objets associées à la classe voiture peuvent être : Mercedes rouge, Clio verte, etc.. ces objets ont le même comportement (freiner). On peut acheter un kilo de pommes vertes calibrées, chacune de ces pommes est un objet unique qui correspond à la classe Pomme avec comme attributs (couleur, calibre).
La
relation qui existe entre la classe et les objets est la même que celle
qui existe entre un type de données et des variables de ce type. On dit
que l'objet est une instance (variable) de sa
classe (type).
Rappelons que la notion de variable informatique est totalement identique à la variable mathématique et que la notion de type correspond à l'ensemble de définition. De façon plus concrète, la variable correspond à un emplacement mémoire, et il est nécessaire de connaître son type pour déterminer sa taille.
Un attribut est une valeur de donnée détenue par les objets de la classe. Couleur et Poids sont des attributs des objets relatif à Voiture. Chaque attribut à une valeur pour chaque instance d'objet. Par exemple l'attribut Couleur porte la valeur rouge dans l'objet Mercedes alors que pour l'objet Clio la valeur de l'attribut Couleur est verte. Les instances peuvent avoir des valeurs identiques ou différentes pour un attribut donné. Chaque nom d'attribut est unique à l'intérieur d'une classe. Ainsi, la classe Voiture et la classe Pomme peuvent avoir chacune un attribut Couleur.
Dans une classe, les attributs sont définis par des variables. Les attributs peuvent être considérés comme des variables globales pour chaque objet de cette classe. Comme pour toutes variables, il est nécessaire de connaître le type correspondant et c'est la classe de l'objet qui indique de quel type d'attribut (variable) il s'agit. Chaque objet stocke sa propre valeur pour chacune de ses variables.
Une méthode est une fonction ou une transformation qui peut être appliquée aux objets ou par les objets dans une classe. Accélérer et freiner sont des méthodes de la classe Voiture. Tous les objets d'une même classe partagent les mêmes méthodes. Chaque méthode a un objet cible comme argument implicite (c'est l'objet lui-même this, elle peut donc accéder à chacun des attributs). La même opération peut s'appliquer à de nombreuses classes différentes. On dit qu'elle est polymorphe, c'est à dire qu'elle prend différentes formes dans des classes différentes. Une méthode peut avoir des arguments, en plus de son objet cible.
Les méthodes sont des groupes d'instructions reliées les unes aux autres au sein d'une classe d'objets qui agissent sur eux-mêmes, ainsi que sur d'autres classes et d'autres objets. Elles servent à accomplir des tâches spécifiques, au même titre que les fonctions dans d'autres langages de programmation. Elles peuvent renvoyez une valeur ou modifier l'environnement.
Explications :
En Java, un paquetage est une manière de regrouper des classes apparentées. Les paquetages permettent de ne rendre des groupes de classes disponibles que quand ils sont nécessaires, et ils éliminent les risques de conflits entre des noms de classes communs à des groupes de classes différents. (bien souvent, un paquetage correspond physiquement à un répertoire).
Les bibliothèques de classes Java sont contenues dans un paquetage appelé java. Les classes du paquetage java offrent la garantie d'être disponibles dans toutes les implémentations de Java. Le paquetage java contient des paquetages définissant des sous-ensembles spécifiques des fonctionnalités du langage Java, telles que les fonctions standards, le système de gestion de fichiers, les fonctions multimédia et quantité d'autres choses.
Lorsque, dans un programme, vous faites référence à une classe, le compilateur la recherche dans le paquetage par défaut ( java.lang - fonctions de base du langage ). Pour utiliser une classe appartenant à un autre paquetage, il est nécessaire de fournir l'information correspondante au compilateur. Pour ce faire, vous pouvez :
En citant le nom de la classe
Pour faire référence à une classe au sein d'un package, vous devez lister tous les paquetages contenant la classe, en les faisant suivre du nom de la classe et en séparant les différents éléments à l'aide d'un point (.). Considérons, par exemple, la classe Color. Elle est contenue dans le paquetages awt, lequel est contenu dans le paquetage java. Pour faire référence à la classe Color dans vos programmes, vous pouvez donc utiliser la notation java.awt.Color.
En important une classe
L'instruction import vous permet de citer le nom (complet) d'une ou plusieurs classes, comme par exemple, import java.awt.Color; A partir de là, vous pourrez utiliser la classe Color sans avoir à mentionner le nom de paquetage, comme si elle appartenaient au paquetage par défaut.
En important un paquetage
La démarche précédente s'avère elle aussi fastidieuse dès qu'un certain nombre de classes d'un même paquetage sont concernées. Avec : import java.awt.*; vous pourrez ensuite utiliser toutes les classes du paquetage awt issu du paquetage java en omettant le nom des paquetages correspondant.
Pour en savoir plus sur les paquetages
L'encapsulation est le principe qui permet de regrouper les attributs et méthodes au sein d'une classe. Cette notion est aussi associée au système de protection qui permet de contrôler la visibilité d'une variable ou d'une méthode. En d'autres termes, cela signifie que chaque fois que vous définissez un membre d'une classe (attribut ou méthode), vous devez indiquer les droits d'accès quant à l'utilisation de ce membre.
Dans cette optique, Java propose quatre niveaux de protection : public, private, protected et package. Sachez que les trois premières étiquettes de protection correspondent à des mots clés qui sont utilisés au début de la déclaration d'un attribut ou d'une méthode. Le niveau de protection package est associé à un attribut ou une méthode quand aucun des trois mots clés (public, private ou protected) n'a été indiqué.
Ce mécanisme d'encapsulation permet surtout de protéger l'objet de toute malveillance externe. Pour cela, la plupart du temps, il faut interdire l'accès direct aux attributs et passer par les méthodes qui modifient indirectement (éventuellement) les attributs. Par exemple : si l'on désire changer la couleur d'une voiture, cela ne se fait pas par enchantement, il est nécessaire de passer par tout un processus (décaper, poncer, passer plusieurs couches, etc...), et dans ce cas de figure l'attribut couleur ne doit pas être accessible directement.
Mot clé public | Toutes les attributs ou méthodes d'une classe définies avec le mot clé public sont utilisables par tous les objets. Il s'agit du niveau le plus bas de protection. Ce type de protection est employé pour indiquer que vous pouvez utiliser sans contrainte les attributs et méthodes d'une classe. |
Mot clé private | Tous les membres d'une classe définis avec le mot clé private sont utilisables uniquement par les méthodes de la classe. Cette étiquette de protection constitue le niveau le plus fort de protection. Sachez que les variables appartenant à une classe sont généralement déclarées comme privées. |
Mot clé protected | Tous les membres d'une classe définis avec le mot clé protected sont utilisables uniquement par les méthodes de la classe, par les méthodes des classes dérivées et par les méthodes des classes appartenant au même package. Cette technique de protection est fortement associée à la notion d'héritage (voir ultérieurement). |
Niveau package | Comme indiqué plus haut, le niveau de protection package est employé quand aucune des trois étiquettes précédentes n'a été spécifiée. Les packages (ou paquets) permettent de regrouper des classes Java. Cela signifie dans ce cas que tous les membres d'une classe définis avec ce niveau de protection peuvent être utilisés par les autres classes du même package. |
Dans l'exemple qui suit, nous avons placé des droits d'accès sur chacun des membres des classes. Ensuite dans la méthode principale de la classe Test, nous avons essayé d'utiliser chacun des membres des objets. Il est possible d'utiliser les membres public ou de paquetage, par contre, les membres privés sont interdits. C'est le cas lorsque nous essayons d'accéder au membre privé couleur, il est impératif de passer par la méthode associée, savoir : changerCouleur.
Il semble aller de soi que la couleur d'une voiture soit une caractéristique de chacun des objets Voiture (soit par exemple mercedes un objet Voiture de couleur rouge et clio un objet Voiture de couleur verte), et non une caractéristique de sa classe. Cependant, la différence n'est pas toujours aussi évidente.
Imaginons que vous ayez besoin de créer un logiciel qui permet de tracer des cercles. Pour les besoins de votre application, les cercles auront toujours un rayon de 100 pixels. Si nous créons une classe Cercle, nous pouvons attribuer à la classe Cercle une variable rayon. Il est cependant probable que cette variable aura la valeur 100 pour toutes les instances (objets) de Cercle. Si nous disposons d'une centaine d'objets Cercle, cela représente une grande capacité mémoire.
Il serait donc inutile que chaque instance de Cercle possède cette variable. Il suffit qu'il partage l'usage d'une variable commune à toute la classe. Ce type de variable est dit statique. Le terme correspondant en Java est static.
La variable rayon est aussi appelée variable de classe, il n'empêche
qu'elle fait partie de c1 et de c2
et qu'il est possible d'y accéder par c1.rayon
ou c2.rayon ou même par Cercle.rayon
(variable de classe), mais la valeur sera toujours identique pour tous les objets
de cette classe. Il est bien sûr possible de changer la valeur du rayon,
par exemple par c2, et cela aura une répercussion
sur l'ensemble des objets (la valeur de c1.rayon
sera identique) :
Exemple
d'attributs statiques :
Nous avons utilisé la classe Color qui
fait parti du paquetage java.awt et qui possède
des attributs statiques (constantes - mot réservé
: final) qui correspondent aux couleurs usuelles.
Jusqu'à présent, par soucis de simplicité, nous avions écrit une chaîne de caractères pour exprimer le choix des couleurs. Dorénavant, il faudra utiliser la véritable syntaxe comme cela est préciser dans le tableau ci-dessous.
Nom de constante | Couleur correspondante |
---|---|
Color.black |
noir bleu cyan (bleu clair) gris foncé gris vert gris clair magenta orange rose rouge blanc jaune |
Il arrive, quelquefois, que nous ayons besoin de fonctions normales, comme par exemple les fonctions mathématiques, sin, cos, etc.... Le problème, c'est que Java n'autorise pas cette façon de procéder, il faut passer systématiquement par des classes ; c'est le cas notamment pour les fonctions mathématiques qui se situe dans la classe Math. Quand nous utilisons ces fonctions (méthodes - se situent dans la classe), il n'est pas nécessaire de déclarer un objet pour chaque utilisation, il suffit de l'utiliser au travers de la classe, comme par exemple :
Ce sont des méthodes propres à la classe et non pas aux objets de la classe, et c'est pour cela qu'elles sont appelées méthodes de classe. Elles sont statiques, et le terme utilisé en Java est static. Notez qu'il existe au moins une méthode statique, c'est la fonction principale du programme (main) et qui correspond à la classe principale du fichier. Cette méthode est appelée à partir du système d'exploitation, et donc nous ne pouvons pas créer d'objet. Il est logique alors que cette méthode soit statique. Sa signature complète obligatoire (sauf pour arg) est la suivante :
Bien entendu, une méthode de classe ne pourra en aucun cas agir sur les champs usuels (non statiques) puisque, par nature, elle n'est liée à aucun objet en particulier.
Généralement une classe est déclarée dans un package. Cette notion de package (ou paquet ou bibliothèque) permet de regrouper plusieurs classes afin par exemple de séparer vos classes de celles du JDK. Ces paquets interviennent également au niveau de l'accessibilité des classes. Cela signifie qu'une classe peut accéder à une autre classe dans les deux cas suivants :
A l'inverse, cela signifie qu'un programme Java ne peut pas accéder à une classe d'un autre package si cette classe n'est pas déclarée publique. Rendre une classe publique constitue donc un choix crucial puisque dans ce cas, elle pourra être utilisée en dehors du package où elle est définie. En conjonction avec cette notion de classe publique, Java respecte les principes suivants.
En reprenant tout ce qui vient d'être vu, voici un exemple du fichier Test.java :
Lorsque nous compilons un programme, nous obtenons autant de fichiers compilés (.class) que de classes présentes dans le source. Chaque fichier compilé porte le nom de la classe décrite dans le source.
Lorsque nous effectuerons la compilation, il existera 4 fichiers (Test.java, Test.class, Voiture.class, Pomme.class).