Articles récents
JAVA : Programmation objet, concepts et pratique
L'objectif de cet article et de traiter de la programmation orientĂ©e objet (POO) le plus simplement possible, mĂȘme si certaines notions sont assez rudes, et en l'illustrant d'exemples simples et concrets.
JAVA est basé sur la POO. D'ailleurs tout programme java est au moins constitué d'une classe. La notion d'objet a été amélioré et on atteint un niveau de complexité comme jamais. En effet de nombreux concepts se sont greffé à la POO tel que l'héritage, le polymorphisme, les métaclasse, les interfaces, les classes abstraites, ... La philosophie objet autour du JAVA a été tellement poussée, que l'on peut dire que tout est objet dans ce langage.
Toutes les fonctionnalités (méthodes) dépendent de la classe racine Object, elle est la "superclass". Le langage JAVA a enrichit progressivement la hiérarchie des classes, et désormais, le nombre de méthodes qui sont offerts par le dernier JDK est époustouflant. Il s'agit probablement du langage de programmation informatique le plus riche qui existe désormais.
1)Notions de classe et d'objet
1.1) Les méthodes et les attributs
La classe agit comme un modÚle pour les objets, elle détermine leurs caractéristiques, on parlera d'attributs. En outre la classe définie les traitements spécifiques à l'objet, on parlera alors de méthodes. Dans le jargon de l'objet, l'instance d'une classe est un objet.Si on exécute la fonction main(), cela affiche sur la console:
Une autre caractéristique d'un objet est son oid (object identifier), c'est le pointeur (adresse mémoire) qui est sur la structure de l'objet en mémoire.
1.2)Constructeur/Destructeur geter/seter
Dans le programmation objet, il existe un certains nombre de méthodes à définir pour gérer au mieux la vie de l'objet:Pour le constructeur:
Donc l'instanciation d'objet sera de la forme :
Pour les getters/setters:
Pour le destructeur:
Sous Eclipse, la génération de ces méthodes peut se faire sur demande par : bouton droit dans la classe, source, Generate...
1.3)Copie entre objets
Shallow copy: La Shallow copy (littéralement copie peu profonde)est une des méthodes de copie entre objet, le principe revient à copier les oid entre eux.Deep copy: La Deep copy (littéralement copie profonde) consiste à recopier les valeurs des attributs entre les objets.
1.4)Objets liés ou embarqués
Il est possible de mettre des objets en relation entre eux, les chapitres suivants en parleront largement. Néanmoins, sans la notion d'héritage, on peut aussi lier des objets ou de les embarquer (encapsulation de classes ou classes internes selon le jargon).Les objets liés:
Les objets embarqués:
2)HĂ©ritage et polymorphisme
2.1)Notions sur l'héritage
Le concept de la modélisation objet/classe est de factoriser le code au maximum. Notamment, un des objectifs est de réutiliser le code à partir de la classe modÚle. On définit des classes hiérarchiques. La classe racine est aussi nommée super-class. Prenons l'exemple d'un cercle et d'un carré, nous définissons alors leurs attributs et méthodes comme le calcul de surface de l'objet.Si on reprend l'exemple, nous pouvons définir une classe forme qui reprend les éléments communs aux classes Cercle et Rectangle. Ensuite, il suffit de les faire hériter à cette super-class, les classes dérivés devront définir les particularités de la classes par des attributs ou méthodes spécifiques.
On notera le mot clé extends qui permet de préciser la classe supérieure. En outre, en JAVA une classe ne peut hériter que d'une seule classe.
2.2)Gestion des accĂšs entre classes
L'hĂ©ritage permet lâaccĂšs Ă des attributs ou des mĂ©thodes. Il possible de restreindre ces accĂšs, quatre niveaux autorisent l'utilisation de tel ou tel mĂ©thode. Il y a :Il n'est pas rare que les attributs de la super-class soient private et que les getters/setters soient public ou protected. On parle alors d'encapsulation, car les accĂšs aux attributs sont limitĂ©s aux mĂ©thodes, ce qui permet des traitements complĂ©mentaires en cas de nĂ©cessitĂ© pour Ă©viter que des valeurs erronĂ©es soient affectĂ©es.
Si un constructeur d'une classe dĂ©rivĂ©e appelle le constructeur de base, cela se fait par la commande super qui doit ĂȘtre appelĂ©e en premier. Attention, la commande ne concerne que le constructeur immĂ©diatement supĂ©rieur. Il est possible d'appeler une mĂ©thode de la classe supĂ©rieure par super.nom_method(val1,val2);
On définit le mot clé static, il s'agit d'un attribut ou d'une méthode commune à la classe qui n'est pas liée à un instance particuliÚre. On peut donc définir une variable ou une méthode.
Dans l'exemple ci-dessus, les variable c1.rayon et c2.rayon sont les mĂȘmes variables. Pour Ă©viter les confusions, on note Cercle.rayon cette variable, cela permet de dire qu'elle est rattachĂ©e Ă la classe et non Ă l'instance.
De la mĂȘme façon, une mĂ©thode static f est notĂ©e Cercle.f() .
Il ne faut pas confondre les mots clés final et static.
Gestion des variables dans un programme JAVA:
JAVA définit plusieurs types de variables :
Il existe deux façon de transmettre une variable:
Les échanges avec les méthodes sont réalisés de deux façons, les variables de types primitifs sont transmis par valeur, les échanges d'objet sont transmis par variable.
2.3)Redéfinition et sur-définition
Il ne faut pas la confondre avec la sur-dĂ©finition qui consiste Ă crĂ©er des mĂ©thodes de mĂȘmes noms mais avec des attributs diffĂ©rents. La re-dĂ©finition consiste Ă redĂ©finir une mĂ©thode qui a Ă©tĂ© hĂ©ritĂ©.Prenons un exemple, imaginons une super-class qui dĂ©finit la mĂ©thode imprime(), qui affiche Hello. Avec la redĂ©finition, il est possible de refaire dans une mĂ©thode imprime() qui affiche Hello world! dans une classe qui hĂ©rite de la super-class. On enrichit la mĂ©thode.
JAVA autorise de sur-définir une méthode qui a été héritée.
Le mot clĂ© final permet de dĂ©finir une variable comme constante. On peut Ă©galement l'appliquer Ă une mĂ©thode ou Ă une classe. Une mĂ©thode qui estampillĂ©e final ne peut pas ĂȘtre redĂ©finie dans les classes dĂ©rivĂ©es. De plus, une classe dite final ne peut pas ĂȘtre dĂ©rivĂ©e.
Un exemple de surdéfinition - surcharge :
Donne Ă lâexĂ©cution:
Un exemple de redéfinition :
Donne Ă lâexĂ©cution:
2.4)Le polymorphisme
Le mot polymorphisme est formĂ© Ă partir du grec ancien πολλοί (polloĂ) qui signifie « plusieurs » et μορφος (morphos) qui signifie « forme ». En POO, le polymorphisme est liĂ© Ă l'hĂ©ritage, il permet de manipuler des objets sans en connaitre le type. Ce mĂ©canisme sera en mesure de retrouver la mĂ©thode relative aux types traitĂ©s.Prenons l'exemple suivant:
Dans l'exemple ci-dessus la notion de polymorphisme est au niveau de l'affichage de la surface. En effet, le compilateur a su en fonction du type d'objet appeler la bonne méthode. Autre point à noter, l'affectation d'un objet Rectangle ou Cercle à un type Forme a été acceptée. On peut donc affecter à un objet, un objet de type ascendant.
Le polymorphisme permet un comportement adapté selon le type d'objet, c'est le compilateur qui traite la ligature de la bonne méthode. Il est donc possible de traiter avec une super-class sans connaitre ou faire connaitre les classes qui sont héritées! Le développeur ne se soucie plus du type de l'objet (du moins pas complÚtement) et peu masquer des sous-classes s'il le souhaite puisqu'avec ce mécanisme, le compilateur sera en mesure de retrouver la bonne méthode.
2.5)La super-class Object
JAVA a définit une super-class appelée Object, elle est la classe racine. Toutes les classes héritent par de cette classe. On pourrait écrire :Il est possible de créer un objet de la classe Object, toutefois pour pour utiliser une méthode, il faudra passer par une conversion adaptée.
La classe Object a quelques méthodes qui sont héritées par les objets dérivés, on peut les redéfinir ou les utiliser directement:
Ensuite et pour que la classe soit complÚte, il faudra définir les getters/setters, une méthode clone, une méthode hashCode et finalize.
2.6)Les classes abstraites
Une classe abstraite ne peut pas ĂȘtre instanciĂ©e, il n'y a pas d'objet lui correspondant. Elle sert simplement de modĂšle aux classes dĂ©rivĂ©es, et donc de dĂ©finir des attributs et mĂ©thodes gĂ©nĂ©riques. A partir du moment oĂč une mĂ©thode est abstraite, la classe est abstraite et doit ĂȘtre dĂ©finie comme tel.En fait une classe abstraite permet de dĂ©finir/imposer des Ă©lĂ©ments dans les classes dĂ©rivĂ©es par l'intermĂ©diaire de l'hĂ©ritage et du polymorphisme. Souvent les mĂ©thodes sont simplement dĂ©finies mais pas dĂ©crites, elles le seront dans les classes infĂ©rieures. Une classe abstraite doit ĂȘtre dĂ©clarĂ©e comme public, puisque son objectif est d'ĂȘtre redĂ©finie.
Dans l'exemple que nous avons pris pour décrire le polymorphisme, la classe Forme est abstraite. La méthode surface est définie mais non décrite, elle est décrite dans les classes dérivées Rectangle et Cercle. Dans ce cas:
Un autre exemple:
2.7)Les interfaces
Une interface est une classe qui ne possÚde que des méthodes abstraites.Les interfaces ont des fonctionnalités complémentaires aux classes abstraites, ce qui justifient leurs existences et le fait qu'on les retrouvent un peu partout.
Une interface ne dĂ©finie que des mĂ©thodes abstraites, et mĂȘme que des entĂȘtes de mĂ©thodes. Une interface peut dĂ©finir des constantes par static final int K=8;
Voici un exemple d'utilisation:
Une classe peut implĂ©menter plusieurs interfaces, c'est un des gros intĂ©rĂȘts des interfaces. Une interface n'est pas liĂ©e Ă un hĂ©ritage, mais il est possible d'appliquer une interface Ă des classe dĂ©rivĂ©es.
2.8)Les classes d'encapsulation
JAVA définit les types dits primitifs (integer, float, ...). JAVA a redéfinit ces types sous formes d'objets, ce sont les wrappers ou classes enveloppes. L'objectif est de disposer de méthodes autour de ces variables qui seront désormais des objets.2.9)Les classes anonymes
Il s'agit d'une classe qui ne possĂšde pas de nom.Les classes anonymes sont Ă Ă©viter, car cela complexifie le code pour un intĂ©rĂȘt faible.