簡體   English   中英

'this'引用是否存儲在Java中的調用堆棧中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM