iload_1: 的意思是 从局部变量加载int(load int from local variable) ,就是从局部变量表中 拿值,之后放到栈里面,如下图所示:
iinc 1 by 1: 执行 a++ 操作,将局部变量表中 数值为88的进行+1 操作,所以就是 89了,
istore_1: 执行 a = a++ 操作,原先已经执行了 a++ 操作,这个时候将 a++ 中 a 赋值给 int a ,所以会将栈中的数据赋值到 局部变量表中,所以这个时候局部变量表中的数据就是88了
所以我们最后的结果就是88 a = ++a;
字节码指令:
0 bipush 88 2 istore_1 3 iinc 1 by 1 6 iload_1 7 istore_1 8 getstatic #2 <java/lang/System.out> 11 iload_1 12 invokevirtual #3 <java/io/PrintStream.println> 15 returnbipush 88和istore_1: 这句话其实完成了 int a = 88,先将88压栈,然后在出栈赋值到局部变量表中
iinc 1 by 1: 进行++a 操作,所以这个时候局部变量表中的数据就变成了89
iload_1: 这个时候将局部变量表中的数值压到栈中,
istore_1: 这个时候做 a = ++a 操作,将 a的值赋值给 int a,因为在栈中的数据本身就是89,所以最后打印出来的结果就是89
补充:
当我们设置 int a = 250 的时候,下面的值会变成 sipush,是因为 250已经超过127,他已经超过byte 所能代表的最大结果,所以看到的二进制就是sipush,s 代表 short
到这里,你学废了吗?其实有时候我们学东西,知道怎么用,但是具体里面的细节,就需要我们仔细的去琢磨,有时候会很枯燥,当我们了解其原理之后,会有豁然开朗的感觉吗?小农会有,你们呢?
我是牧小农,怕什么真理无穷,进一步有进一步的欢喜,大家加油!