|
|
|
|
TUTORIEL JAVA |
|
|
|
La liaison dynamique |
Déconstruction d'un phénomène propre à la programmation orientée Objet, partie intégrante de la notion d'héritage et de celle de polymorphisme.
(11/07/2005) |
|
Mécanisme essentiel de la
programmation Objet, l'héritage autorise la création de nouvelles
classes basées sur des classes existantes. Une nouvelle classe
(sous-classe) hérite donc de l'ensemble des caractéristiques
de sa classe parente (ou superclasse), méthodes comme champs.
Il est ensuite possible d'ajouter ses propres méthodes et champs à la sous-classe, mais également, et c'est le point qui nous
intéresse ici, d'adapter les méthodes et champs existants aux
nouveaux besoins de la sous-classe.
Cela implique que la sous-classe reprenne à son compte les méthodes
de sa superclasse : elle peut donc proposer au développeur les
mêmes méthodes publiques (même nom), mais les fonctionnalités
peuvent en être largement revues, et ne plus rien avoir de commun avec
leur original - ou si peu.
Les implications
sont vastes, surtout du point de vue de l'appel de méthode.
En effet, il est possible en Java de faire référence à un objet
d'un type donné à partir d'une variable d'un type correspondant
à une superclasse du type de l'objet :
class Voiture { ... }
classe Twingo extends Voiture { ... }
Voiture v;
v = new Voiture(); // aucun problème.
v = new Twingo(); // aucun problème également, Twingo étant
une sous-classe de Voiture.
Twingo titine = new Twingo();
Voiture[] parcFamilial = new Voiture[7];
parcFamilial[0] = titine; // toujours aucun problème.
Explication
Au sein d'une hiérarchie d'héritage, l'appel de méthodes Objet
provoque l'utilisation du mécanisme de liaison dynamique (ou
liaison tardive). Cela signifie que la méthode à appeler est
déterminée au lancement du programme, et non lors de sa compilation.
Cette liaison dynamique autorise Java à réaliser un polymorphisme
complet : le comportement d'un objet dépend de son type réel,
plutôt que du type de la variable faisant référence à cet objet.
En clair : Java utilise le typage dynamique d'un objet pour
déterminer la méthode à appeler, au moment de l'exécution.
La puissance de ce mécanisme se retrouve dans la certitude qu'il
donne aux développeurs de toujours appelés la bonne méthode.
La puissance de ce mécanisme se retrouve dans la certitude qu'il
donne aux développeurs de toujours appelés la bonne méthode.
Supposons la méthode demarrer()
de la Twingo() présente une
spécificité que n'ont pas les autres Voiture()...
Voiture gudule = new Voiture();
Twingo titine = new Twingo();
gudule.demarrer();
titine.demarrer();
La liaison dynamique représente l'assurance que la machine virtuelle
déclenchera bien la méthode correspondant au type de l'objet
déclaré.
Déroulement
Un appel de méthode provoque une série d'évènements au sein
du compilateur :
- Si la méthode est private, static ou final (ou un constructeur),
il sait laquelle appeler. Sinon, il lance la liaison dynamique...
- À partir du type de l'objet et du nom de la méthode, il repère
dans l'ensemble des classes le groupe de méthodes répondant
à ces caractéristiques.
- Il précise le groupe de méthodes en ne gardant que celles
susceptibles d'accepter le type de paramètres fourni dans l'appel
de méthode. S'il n'y en a qu'une, il appelle celle-ci. Sinon,
il provoque une erreur.
Fonctionnement interne
Lors de la compilation d'un code source, le compilateur transforme
ce source en "bytes codes", et alloue des adresses mémoire aux
variables qui y ont été déclarées : telle variable occupera
ainsi quatre octets de mémoire, tandis qu'un autre en occupera
plus... Ce mécanisme, appelle "liaison précoce" (early binding)
s'applique également à toutes les méthodes déclarées comme final.
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Il en est tout autrement dès qu'il s'agit des types de données
construits à partie de classes utilisateurs. Pour celles-ci,
le compilateur ne réserve pas un espace mémoire pour chaque
variable, car il n'est pas en mesure de déterminer si une variable
contiendra une valeur d'un type déclaré, ou d'une sous-classe
de ce type. La charge est donc attribuée à la machine virtuelle
(JVM), qui allouera l'espace mémoire idoine en fonction des
besoins avérés. |
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|