Comment fonctionne la liaison dynamique (choix de la méthode à l'exécution) ?
objet.m() exécute la méthode de la classe principale de objet, déterminée à l'exécution et non à la compilationComprendre et anticiper quel code est exécuté lors d'un appel de méthode sur un objet dont le type statique diffère du type réel.
Comprendre et anticiper quel code est exécuté lors d'un appel de méthode sur un objet dont le type statique diffère du type réel.
La liaison dynamique (ou late binding) : lorsqu'une méthode est appelée, Java détermine à l'exécution quelle version exécuter selon la classe principale de l'objet (celle du constructeur), pas selon le type de la variable.
new) qui détermine le code exécuté, pas le type statique de la variable.Vehicule v = new Voiture(...) après que Voiture a redéfini affiche(). Que retourne v.affiche() ?
Variable de type Vehicule pointant vers un objet de classe principale Voiture.
class Vehicule {
String immatriculation;
void affiche() { System.out.println("Vehicule : " + immatriculation); }
}
class Voiture extends Vehicule {
int nombrePlaces;
@Override void affiche() {
System.out.println("Voiture : " + immatriculation + ", " + nombrePlaces + " places");
}
}
Vehicule v = new Voiture(); // type statique = Vehicule, classe principale = Voiture
Appel de v.affiche() : c'est la méthode de Voiture qui s'exécute.
v.immatriculation = "AB-123";
((Voiture)v).nombrePlaces = 5;
v.affiche(); // affiche : Voiture : AB-123, 5 places
// (et non : Vehicule : AB-123)
new) qui détermine le code exécuté, pas le type statique de la variable.La règle : la classe principale est Voiture (le new), donc c'est Voiture.affiche() qui est appelé.
// Résumé :
// Type de la variable : Vehicule
// Classe principale de l'objet : Voiture (car new Voiture())
// Méthode exécutée : Voiture.affiche() ← liaison dynamique
v.affiche() exécute Voiture.affiche() car la classe principale de l'objet est Voiture.
Un tableau Animal[] tab contient un Chien et un Chat. Appeler cri() sur chaque élément : quel code s'exécute ?
Montrer que la liaison dynamique s'applique même quand la variable est déclarée avec le type de la super-classe dans un argument de fonction.
Crée ton compte gratuit pour accéder à la fiche et aux exercices