1.问题
Java 中运行以下代码 :
public static int test() {
int i = 0;
i = i++;
return i;
}
返回结果为:0
2.JVM执行的代码
直接在Windows命令窗口中使用 javap -c XXX 查看JVM执行的代码:
public static int test();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iinc 0, 1
6: istore_0
7: iload_0
8: ireturn
JVM调用执行该方法时,对应栈帧(Stack Frame) 在虚拟机中入栈;栈帧中包含:局部变量表、操作数栈、动态链接、方法返回地址等信息。
局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,i就放在局部变量表中;而操作数栈是一个后入先出的栈,用于方法的计算。
3.现在来看看JVM的字节码指令
- 0: iconst_0 --> 将int类型的0入栈,即放到操作数栈的栈顶
- 1: istore_0 --> 将操作数栈顶元素 0 弹出,存入局部变量表的0号索引位上(这是个静态方法,第0位不用存放当前对象的引用)
- 2: iload_0 --> 将局部变量表的0号索引位的