2010-03-21 10 views

Répondre

5

Fondamentalement, toute méthode qui n'est pas déclarée final peut être remplacée dans n'importe quelle classe héritante. Une stratégie de résolution de table virtuelle est la façon dont Java envoie de manière dynamique les appels de méthodes à la définition de méthode du type d'exécution de l'objet. Par exemple, si vous avez un objet s déclaré comme étant de type Shape mais instancié comme new Circle() (par exemple Shape s = new Circle()) et que vous appelez s.draw() ... si Cercle remplace draw, vous voulez que la version de Circle de la méthode draw soit invoquée et non la version Shape de cette méthode. Cette information ne peut être trouvée qu'à l'exécution (si un objet Shape est passé, il peut être passé depuis un JAR que le compilateur ne voit jamais, donc le compilateur n'a aucun moyen de déterminer quelle sous-classe spécifique de Shape a été instanciée), et il appartient donc à la VM d'envoyer l'invocation de la méthode à la bonne définition de la méthode (dans ce cas, la version de draw fournie par Circle). Avec la plupart des implémentations d'une table virtuelle, chaque classe a une table où chaque entrée est une fonction membre et son adresse correspondante. Ainsi, la table virtuelle pour Cercle et Forme aurait une entrée dans la table pour "dessiner", mais la table virtuelle pour Cercle et Forme a chacun l'entrée pour dessiner pointent vers leurs définitions respectives de cette fonction. Ensuite, chaque instance de la classe pointe vers la table virtuelle de sa classe donnée. Ainsi, lorsque vous faites new Circle(), il contient une entrée pointant vers la table virtuelle de Circle. Lorsqu'une méthode qui n'est pas déclarée final est invoquée, les implémentations de méthode appropriées sont appelées en recherchant le décalage approprié dans la table virtuelle de l'objet.