![](/img/trans.png)
[英]Where does class, object, reference variable get stored in Java. In heap or in stack? Where is heap or stack located?
[英]Is 'this' reference stored on call stack in 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的實現?
更新 :
我知道this
是一個關鍵字,而不是一個普通的引用變量,但我對這個例子的主要關注點是JVM如何知道對象在堆中的位置?
或者換句話說,JVM如何在運行時知道成員方法的當前對象是什么,因此他們可以訪問這些實例變量?
圍繞stackmachine模型構建的大多數語言都會像您描述的那樣工作。 這包括Java,.NET和C ++。
以這種方式思考:實例方法的代碼很可能在類的所有實例之間共享,如果那個公共部分(用於實現方法的代碼)復制除了每個實例的數據之外的任何東西都沒有多大意義。無論如何,記住它對計算機的所有內存都是相同的。
因此,將實例方法與靜態(在Java和.NET中說)方法區別開來的是一個隱含的this參數,它被添加到每個方法簽名中。 隱含的this參數表示該方法應該操作的實例。 因為傳遞給方法的參數很可能發生在堆棧上,所以這個參數將存儲在堆棧中。 (請參閱http://zeroturnaround.com/articles/java-bytecode-fundamentals-using-objects-and-calling-methods/#objects for Java,它在.NET中的表現非常相似)。 在調用方法之前,將此參數作為第一個參數壓入堆棧,然后是所有其他參數。
現在,它描述了虛擬機的模型。 如果JITed機器代碼真的通過堆棧或寄存器(或以任何其他方式)傳遞此參數,則完全是特定於實現的並且對VM是透明的。
在示例代碼中要注意的另一件事是你使用變量名'y'兩次,因此在方法中,局部變量'y'將影響實例變量,除非你明確地用'this'限定它。
您的問題是: - JVM如何知道運行時成員方法的當前對象是什么,因此他們可以訪問這些實例變量。
What i know is , when u call a method with its object then implicitly
your object reference is passed to your method. like....
obj.test(obj,3);
And at run time this object is cached in this keyword.. that means this is local
for that method and must be get m/m in stack.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.