0

私は最近Javaバイトコードについて学んでいて、ほとんど理解していますが、たとえばローカル変数のカウントがどのようにカウントされるかについて混乱しています。ローカル変数の合計だけだと思っていたのですが、このコードはバイトコードを調べると1つのローカル変数を生成します

public int testFail()
{
    return 1;
}

しかし、ローカル変数が定義されていないため、ローカル変数はゼロにする必要があると思いました。

さらに、このメソッドも 1 つのローカル変数を生成しますが、前の例よりも多くのローカル変数があります。

最後にこの方法

public static int testFail(int a, int b)
{
    return a+b;
}

バイトコードで 2 つのローカル変数を生成します。

public static int testFail(int a)
{
    return a;
}
4

2 に答える 2

1

非静的メソッドは、ローカル変数スロットを使用しますthis。もう 1 つの複雑な点は、longs とdoubles がそれぞれ 2 としてカウントされることです。また、コンパイラと設定によっては、ソース コード内のローカル変数とバイト コード内のローカル変数の間の 1 対 1 のマッピングが表示されない場合があります。たとえば、デバッグ情報が省略されている場合、コンパイラは不要なローカル変数を削除することがあります。

編集:

私が思い出したのは、コンパイラがローカル変数スロットを再利用することもあるということです。たとえば、次のコードがあるとします。

public static void test() {
    for(int i = 0; i < 100; i++) {
        ...
    }
    for(int j = 0; j < 100; j++) {
    }
}

と のスコープが重複しないため、同じスロットを と に使用できますij

于 2013-06-28T15:22:59.980 に答える
0

最初のものにローカル変数がある理由は、それが非静的メソッドであるためです。したがって、暗黙的thisなパラメーターがあります。

于 2013-06-28T14:26:07.150 に答える