13

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は、実行時にメンバーメソッドの現在のオブジェクトをどのように認識して、それらのインスタンス変数にアクセスできるようにするのでしょうか。

4

2 に答える 2

9

stackmachine モデルを中心に構築されたほとんどの言語は、説明したとおりに機能します。これには、Java、.NET、および C++ が含まれます。

このように考えてみてください: インスタンス メソッドのコードは、クラスのすべてのインスタンスで共有される可能性が最も高く、その共通部分 (メソッド実装のコード、コンピューターへのすべてのメモリのみを覚えておいてください)とにかく、すべてのインスタンスで同じです。

したがって、インスタンス メソッドと静的 (Java および .NET で言えば) メソッドとの違いは、各メソッド シグネチャに追加される暗黙の this パラメーターです。暗黙の this パラメータは、メソッドが操作するインスタンスを示します。メソッドへのパラメーターの受け渡しはスタック上で発生する可能性が最も高いため、このパラメーターはスタックに格納されます。( Javaについてはhttp://zeroturnaround.com/articles/java-bytecode-fundamentals-using-objects-and-calling-methods/#objectsを参照してください。.NET でもほぼ同じです)。this パラメーターは、メソッドを呼び出す前に最初のパラメーターとしてスタックにプッシュされ、その後に他のすべてのパラメーターがプッシュされます。

ここで、仮想マシンのモデルについて説明します。JIT されたマシン コードが実際に this パラメータをスタックまたはレジスタで (またはその他の方法で) 渡すかどうかは、完全に実装固有であり、VM に対して透過的です。

サンプル コードで注意すべきもう 1 つの点は、変数名 'y' を 2 回使用したことです。したがって、このメソッドでは、明示的に 'this' で修飾する場合を除き、ローカル変数 'y' がインスタンス変数を隠します。

于 2012-04-20T06:05:32.273 に答える
2

あなたの質問は次のとおりです: -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.
于 2012-04-20T06:15:33.907 に答える