我們已經知道,當我們在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