如下代码片段为什么i的结果为1呢?
public class Test1 {
public static void main(String[] args) {
int i = 1;
i = i++;
System.out.println("i = " + i);
}
}
使用javac将java文件执行为class文件,查看class文件如下:
注意:这里使用的查看字节码的工具jclasslib
来查看的字节码文件,使用普通记事本无法查看字节码文件
可以看到字节码查看后最常见的为:iconst和istore、iload命令,我们可以查看jvm规范可知这些命令的意思
使用jclasslib可以点击命令,即可直接跳转jvm规范。
举例说明iconst命令如下,iconst_常量,就是将常量推动到操作数堆栈上
除了操作数堆栈,还会涉及局部变量表,用来存放java中的局部变量,是一个数组形式的结构,例如istore命令会操作操作数栈和局部变量表的数据转换。
而局部变量表的索引我们可以通过jclasslib文件查看对应索引表示的变量,如下图,可看到索引0的变量为main方法的入参args,而索引为1的位置对应代码变量的i
那么按照以上所学来解析字节码文件:
因此,通过分析字节码指令发现,i++先把1取出来放入临时的操作数栈中,接下来对i进行加1,i变成2,最后再将之前保存在操作数栈中的1放入i,最后i就变成了1
试着分析下面++i的字节码文件