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.
 
Rédaction JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages