【发布时间】:2012-05-01 17:09:06
【问题描述】:
我们已经知道,当我们在 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如何在运行时知道成员方法的当前对象是什么,以便他们可以访问那些实例变量?
【问题讨论】:
-
如果我没记错的话,
this被(隐式)作为第一个参数传递给方法 -
值得注意的是,本机代码和 CPU 线程堆栈中发生的内容与虚拟机字节码中描述的内容可能完全不同。例如如果
test()方法是内联的,则没有方法调用,也没有this值或参数添加到堆栈中。
标签: java this callstack calling-convention