Мы уже знали, что при вызове метода в 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 может узнать, что является текущим объектом метода-члена во время выполнения, чтобы они могли получить доступ к этой переменной экземпляра?