Chaque classe Java est associé à une méthode virtuelle de la table qui contient des "liens" vers le pseudo-code de chaque méthode d'une classe. Cette table est héritée de la super-classe d'une classe particulière et étendus en ce qui concerne les nouvelles méthodes d'une sous-classe. E. g.,
class BaseClass {
public void method1() { }
public void method2() { }
public void method3() { }
}
class NextClass extends BaseClass {
public void method2() { } // overridden from BaseClass
public void method4() { }
}
résultats dans les tableaux
BaseClass
1. BaseClass/method1()
2. BaseClass/method2()
3. BaseClass/method3()
NextClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. NextClass/method4()
Remarque, comment la méthode virtuelle de la table d' NextClass
conserve l'ordre des entrées de la table de BaseClass
et juste remplace le "lien" de method2()
qui il remplace.
Une implémentation de la JVM peut ainsi optimiser un appel à l' invokevirtual
en se souvenant que BaseClass/method3()
sera toujours la troisième entrée dans la table de méthode virtuelle de n'importe quel objet cette méthode ne jamais être invoqué.
Avec invokeinterface
cette optimisation n'est pas possible. E. g.,
interface MyInterface {
void ifaceMethod();
}
class AnotherClass extends NextClass implements MyInterface {
public void method4() { } // overridden from NextClass
public void ifaceMethod() { }
}
class MyClass implements MyInterface {
public void method5() { }
public void ifaceMethod() { }
}
Cette hiérarchie de classe les résultats de la méthode virtuelle tables
AnotherClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. AnotherClass/method4()
5. MyInterface/ifaceMethod()
MyClass
1. Maclasse/method5()
2. MyInterface/ifaceMethod()
Comme vous pouvez le voir, AnotherClass
contient l'interface de la méthode dans sa cinquième entrée et MyClass
il contient en sa deuxième entrée. Pour réellement trouver la bonne entrée dans la table de méthode virtuelle, un appel à une méthode invokeinterface
auront toujours à la recherche de la table complète sans une chance pour le style de l'optimisation de la invokevirtual
n'.
Il existe d'autres différences comme le fait, que invokeinterface
peut être utilisé avec des références à des objets qui ne sont pas réellement implémenter l'interface. Par conséquent, invokeinterface
devra vérifier lors de l'exécution si une méthode existe dans la table, et éventuellement de lever une exception. Si vous voulez plonger plus profondément dans le sujet, je vous suggère, par exemple, "la mise en Œuvre Efficace des Interfaces Java: Invokeinterface Considérés comme Inoffensifs".