Мы уже знали, что при вызове метода в Java параметры и локальные переменные будут храниться в стеке.
Например, следующий код:
public class Test
{
int x = 10;
int y = 20;
void test(int y)
{
int z = y;
this.x = y; // How JVM knows where is our current object?
}
public static void main(String [] args)
{
Test obj = new Test();
obj.test(3);
}
}
Создаст стек вызовов, подобный следующему, когда мы вызывалиobj.test()
:
| |
+-------------+
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
Но мне интересно, где ссылка this
хранится в method
? Он также хранится в стеке, как показано ниже :
| |
+-------------+
| this |
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
, или хранится в другой области памяти? Или это вычисляется JVM во время выполнения?
Наконец, мне также любопытно, имеет ли порядок параметров/переменных obj.test()
в стеке определенный порядок, точно так же, как C имеет соглашение о вызовах, или это зависит от реализации VM?
Обновление:
Я знаю, что this
— это ключевое слово, а не обычная ссылочная переменная, но меня больше всего беспокоит этот пример: как JVM узнает, где находится объект в куче?
Или, другими словами, как JVM может узнать, что является текущим объектом метода-члена во время выполнения, чтобы получить доступ к этой переменной экземпляра?