我们已经知道,当我们在Java中调用方法时,参数和局部变量将被存储在堆栈中。'this'引用是否存储在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()
调用堆栈:不存储在何处的method
this
参考我想知道
| |
+-------------+
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
但?它是否也存储在堆栈中,如下所示:
| |
+-------------+
| this |
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
或者它存储在内存中的其他区域?还是在运行时由JVM计算?
最后,我还很好奇堆栈中参数/变量obj.test()
的顺序是否具有特定的顺序,就像C调用约定一样,还是取决于VM的实现?
更新:
我知道this
是一个关键字,而不是一个正常的引用变量,但我的这个例子主要关注的,是如何JVM知道哪里对象堆奠定了?或者换句话说,JVM如何知道运行时成员方法的当前对象是什么,以便他们可以访问这些实例变量?
如果我记错,'this'是(隐式地)作为第一个参数的方法及其 – weidi 2012-04-20 05:47:09
值得注意的是,在本机代码和CPU的线程堆栈和在字节码为虚拟所描述的内容中发生的传递机器可以完全不同。例如如果'test()'方法被内联,则不会有方法调用,也不会有'this'值或参数被添加到堆栈中。 – 2012-04-20 07:57:33