Как Java виртуалната машина се справя с извикване и връщане на метод

Този месец Under The Hood се фокусира върху извикване на метод и връщане в Java виртуалната машина (JVM). Той описва четирите начина, по които могат да бъдат извикани Java (и нативните) методи, дава пример на код, който илюстрира четирите начина и обхваща съответните байт кодове.

Извикване на метод

Езикът за програмиране Java предоставя два основни вида методи: методи на екземпляр и методи на клас (или статика). Разликата между тези два вида методи е:

  1. Instanceметодите изискват екземпляр, преди да могат да бъдат извикани, докато classметодите не.
  2. Instanceметодите използват динамично (късно) обвързване, докато classметодите използват статично (ранно) обвързване.

Когато Java виртуалната машина извиква метод на клас, тя избира метода, който да се извиква, въз основа на типа на препратката към обекта, който винаги е известен по време на компилация. От друга страна, когато виртуалната машина извиква метод на екземпляр, тя избира метода за извикване въз основа на действителния клас на обекта, който може да е известен само по време на изпълнение.

JVM използва две различни инструкции, показани в следващата таблица, за да извика тези два различни вида методи: invokevirtual за instanceметоди и invokestatic за classметоди.