Мы уже знали, что при вызове метода в Java параметры и локальные переменные будут сохранены в стеке.Эта ссылка хранится в стеке вызовов в 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?
Update:
Я знаю this
это ключевое слово вместо нормальной контрольной переменной, но моя главная забота об этом примере, как JVM знает, где же объект заложен в куче?
Или, другими словами, как JVM знает, что представляет собой текущий объект метода-члена во время выполнения, чтобы они могли получить доступ к этой переменной экземпляра?
, если я правильно помню, 'this' есть (неявно) передается в качестве первого параметра метода – weidi
Ее стоит отметить, что происходит в родном коде и стек процессоров потоков и что описано в байткод для виртуальной машина может быть совершенно другой. например если метод 'test()' inline, в стеке нет вызова метода, значения 'this' или аргументов, добавленных в стек. –