【死磕JVM】一道面试题引发的“栈帧”!!! (4)

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 return

bipush 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

0 sipush 250

总结

到这里,你学废了吗?其实有时候我们学东西,知道怎么用,但是具体里面的细节,就需要我们仔细的去琢磨,有时候会很枯燥,当我们了解其原理之后,会有豁然开朗的感觉吗?小农会有,你们呢?

我是牧小农,怕什么真理无穷,进一步有进一步的欢喜,大家加油!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszyx.html