Java - 源代码中的本地变量与字节代码之间的双射映射

时间:2014-03-04 10:40:12

标签: java bytecode local-variables

Java方法的源代码中的局部变量与字节码之间是否存在双射映射?

E.g。

源代码:

int x = ...
A a = ....
if (...) {
    B b = ....
}

我可以假设在字节码中会有3个局部变量的空间,其中第一个与x相关,第二个与a相关,第三个与b相关?

字节码中本地变量的排序是否与Java源代码中首次使用的顺序有关?

编辑:我知道对于long和double,Java使用两个局部变量,并且为方法参数保留了局部变量

2 个答案:

答案 0 :(得分:4)

  

Java方法的源代码中的局部变量与字节码之间是否存在双射映射?

通常没有,因为范围之外的变量使用的地址会重用于其他范围内的变量。例如:

for (int j = 0;;) {}
int k  = 0;

k可以重复使用与j相同的位置。

答案 1 :(得分:1)

不,因为编译器可以优化您的代码,因此可以消除变量。简单地想一下像这样的代码:

int a = 1; // only used to initialize b
int b = a;

然后没有必要为a留出空间。或者,为您的例子

int x = 42; // only used to initialize a
A a = new A(x);