写一段代码
public static int func(){
int i = 10;
try{
return i;
}finally {
i = 100;
}
}
在main方法中打印方法func()的返回值,来查看返回值

结果为10,并不是被修改之后的100。
使用javap反编译这个类来获取虚拟机指令,javap -c class文件
先了解几个简单的jvm指令:
bipush # ------加载一个常量x到操作数栈
istore_# -------将操作数栈顶的数据存储到局部变量表的#号槽位
iload_# -------将局部变量表#号槽位的数据加载到操作数栈
ireturn --------返回操作数栈顶的值
分析返回值为10的原因。分析反编译结果如下:

做个图解:

可以看到其实底层是将i复制了一份,然后将原来的数据改变,返回复制的i。
本文通过一个Java代码示例解析了方法返回值在内存中的处理方式,详细介绍了为何在finally块中修改局部变量不会影响返回值。通过反编译结果分析,揭示了Java虚拟机在方法调用过程中的细节,帮助理解程序执行的底层机制。
1098

被折叠的 条评论
为什么被折叠?



