1、代码
public class Test {
private long index = 0;
public long nextIndex() {
return index++;
}
}
2、分析
我们来看nextIndex()
方法,如果某方法调用该方法,那么返回值是0
,而index最终会变成1
,这个大家肯定都不会怀疑,按照我之前的理解,就是++放在后面就先赋值后++,但是这只是表面的理解,其中内部细节真的是这样吗?
我们来看nextIndex()
方法的字节码指令,如下所示:
让我们一起来解读字节码吧,其中aload_0
代表将局部变量表中下标为0
的this
(当前对象)压入操作数栈中,dup
代表将this
复制一份压入操作数栈中,getfield #2 <io/renren/Test.index>
代表使用操作数栈中的this
取得成员变量index
的值并压入操作数栈中,dup2_x1
代表将操作数栈栈顶元素index
复制一份,然后往下移动3个槽位(dup
后面的2
是因为index
是long
类型,需要占据2
个槽位,后面x1
代表需要将复制值向下移动,向下移动的位置等于2+1
,也就是3
,其中2
是dup
后面的2
,然后1
是x1
后面的1
),移动之后操作数栈最底层就是占据2
个槽位的index
,它的值是0
,上面是当前对象this
,在网上是占据2
个槽位的index
,它的值也是0
,然后lconst_1
代表将long类型
的1
压入操作数栈,当然也是占据2
个槽位,ladd
代表将操作数栈最顶层为0
的index
值和1
弹出栈然后相加,之后将和压入操作数栈,这个值就是占据两个槽位的1
,putfield #2 <io/renren/Test.index>
的作用是将操作数栈顶部的1
和this
弹出,然后赋值给该对象的成员变量index
,此时操作数栈中只剩下数值为0
的index
值,lreturn
代表将long类型
的0
返回,然后压入到调用该方法的操作数栈中,所以返回的就是0
,而成员变量index
的值是1