我们已经知道,当我们在 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 如何在运行时知道成员方法的当前对象是什么,以便他们可以访问那些实例变量?