Pourquoi invokeSpecial est nécessaire quand invokeVirtual existe

Il existe trois opcodes pour appeler les méthodes Java. Il est clair que invokeStatic est juste pour l’appel de méthode statique.

Autant que je sache, invokespecial est utilisé pour invoquer les méthodes constructeur et privées. Faut-il différencier l’invocation de méthodes privées et publiques au moment de l’exécution? Il pourrait être invoqué avec le même opcode dis invokevirtual? La machine virtuelle Java traite-t-elle la définition de méthode privée et publique? Pour autant que je sache, les mots-clés publics et privés sont nécessaires à la phase de développement pour l’encapsulation?

Des commentaires, merci.

De ce site

La réponse peut être facilement trouvée si l’on lit attentivement les spécifications de la machine virtuelle Java:

La différence entre les instructions invokespecial et invokevirtual est que invokevirtual invoque une méthode basée sur la classe de l’object. L’instruction invokespecial est utilisée pour appeler les méthodes d’initialisation d’instance ainsi que les méthodes et méthodes privées d’une super-classe de la classe en cours.

En d’autres termes, invokespecial est utilisé pour appeler des méthodes sans se soucier de la liaison dynamic, afin d’invoquer la version d’une classe particulière.

http://www.artima.com/underthehood/invocationP.html Le lien ci-dessus donne des exemples précieux qui complètent ma question.

class Superclass { private void interestingMethod() { System.out.println("Superclass's interesting method."); } void exampleMethod() { interestingMethod(); } } class Subclass extends Superclass { void interestingMethod() { System.out.println("Subclass's interesting method."); } public static void main(Ssortingng args[]) { Subclass me = new Subclass(); me.exampleMethod(); } } 

Lorsque vous appelez main () dans la sous-classe telle que définie ci-dessus, elle doit imprimer “la méthode intéressante de Superclass”. Si invokevirtual était utilisé, cela imprimerait “la méthode intéressante de la sous-classe”. Pourquoi? Parce que la machine virtuelle choisirait la relevantMéthode () à appeler en fonction de la classe réelle de l’object, qui est la sous-classe. Il utilisera donc la méthode intéressante () de Subclass. Par contre, avec invokespecial, la machine virtuelle sélectionnera la méthode en fonction du type de la référence, donc la version de specialMethod () de Superclass sera invoquée.