> 环境:jdk1.8
> 工具:javap
> javap操作命令:javap -v xxx.class
0x003 类型三
代码如下:
public void difference() {
int i = 10;
i = i++;
int j = 10;
j = ++j;
}
使用javap反编译一下得到如下信息:
操作流程:
区别:
通过上图可以看出,i = i++
与j = ++j
区别在于,前者先将局部变量
表中的数据存入操作栈
中,在将局部变量表
中索引为1的数据增加1,然后将栈中数据
存入局部变量表
中索引1的位置,原来数据被覆盖
,也就是先使用,在自增
,只不过自增没有意义了;后者是先将局部变量表
索引为2的值增加1,再将表中数据取出压入栈当中
,最后再次存入局部变量表,后两步操作对值没有什么影响
,也就是先自增,在使用
。
0x004 类型四
代码如下:
public void difference() {
int i = 10;
int j = i++ + ++i;
}
使用javap反编译一下得到如下信息:
操作流程:
描述:
整体流程是,将10存入局部变量表
之后,先取局部变量表
中的值(10)入栈
,在将局部变量表
中的值增加1(11)
【这是i++的操作
】,在将局部变量表
中的值增加1(12)
,取出局部变量表
中的值(12)入栈
,最后进行加和
。