java方法返回值存放在内存什么地方

u010021183 2014-09-22 04:30:57
public class FunctionDemo4 {
public static void main(String[] args) {
int sum = add(3,5);
print(sum);

}

static int add(int a,int b){
int c = 0;
c = a + b;
return c;
}

static void print(int result){
System.out.println(result);
}
}

麻烦高手帮菜鸟解决下问题,根据内存图,add方法里面a,b,c三个参数都将被压入栈内存中,a,b,c三个参数都是局部变量,那么根据变量的生命周期,add执行完后,应该就把a,b,c这三个变量释放掉了,那么int sum = add(3,5);中的sum是如何取到add的返回值的呢,因为返回值c是局部变量,在方法执行完后,即被释放掉了,sum要是取值得话,从哪里取值,add方法又把返回值存放在内存中哪里了呢?
...全文
1047 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhicong.zh 2018-06-09
  • 打赏
  • 举报
回复
板砖拍错了()说返回寄存器中的值的那哥们,说的可能是对的,我暂时相信是值得拷贝。 理由: 1.在返回时,寄存器中不一定保存了返回变量的值或者对象地址
树成 2014-10-16
  • 打赏
  • 举报
回复
楼主问的问题,其实和开发关系不是很大,这是虚拟机执行引擎的问题,你多了解一点虚拟机指令就行了。 a b c 三个变量会在add方法完成以后和add方法一起被回收掉,这是肯定的。 在方法结尾 return c 在虚拟机指令中有return指令,将这个变量的值压入上一个方法的操作数栈中,上一个方法会接受到C这个变量的值,但是c变量本身会被回收掉。 关于6楼的问题,虚拟机指令一般分为两种,一种是处理小值的指令,这种指令一般是直接指令,例如1+1这种,就会是sum_1 1+2这种就会变成 sum_2这种 如果这个值大 1+300 就会是 sum指令 当然指令的运用也可能根据变量的动态性来区别运用。
scott_129 2014-09-24
  • 打赏
  • 举报
回复
楼上正解, 其实我也是来学习的。
一大三千 2014-09-24
  • 打赏
  • 举报
回复
一个大神的答案(稍作整理): 对于四字节的返回值,一般编译器把它放入eax寄存器里,而大于4字节的返回值,一般是放在会在栈中返回地址前的位置。可以肯定的是,应该不是在堆里。 系统先分配一个临时空间,用来存放函数返回的值,然后在将这个临时变量赋值给接收返回值的变量,再把临时空间释放。 所谓的临时区域,就是寄存器。只要不是用汇编,一般在高级语言中,我们不需要关心返回值放哪儿了,编译器为会根据你的使用方法选个好地方的。但一般,不是放在eax寄存器中(可能就是楼上说的临时区域),就是在栈中返回地址前的位置。
qq_21181013 2014-09-23
  • 打赏
  • 举报
回复 1
来学习的,这里真的是卧虎藏龙之地啊
w_l_o_v_e_c 2014-09-23
  • 打赏
  • 举报
回复
内存的栈中啊
码上行动_Light 2014-09-23
  • 打赏
  • 举报
回复
同样是来学习的。
windsunmoon 2014-09-22
  • 打赏
  • 举报
回复
方法栈 知道么。 方法A 调用另外一个方法B, 那就会形成方法栈 栈A. B 。 在B返回的时候 就把b的返回值也返回回来了。只是返回来一个拷贝。不一定非要是那个变量本身
skyWalker_ONLY 2014-09-22
  • 打赏
  • 举报
回复
局部变量虽然被释放掉了,但局部变量的值已经写入寄存器中了,sum就从这个寄存器取值。如果学过汇编的话就比较容易理解了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧