局部变量虽然被释放掉了,但局部变量的值已经写入寄存器中了,sum就从这个寄存器取值。如果学过汇编的话就比较容易理解了
解决方案 »
- 如何将二维数组数据导入JTable里?
- treeviewer的拖放操作
- java 怎么设置一个按钮无边框
- 在windows 下的cmd 中用 java -version命令查看版本出现“java.exe遇到问题,需要关闭……”
- 问几个关于java基础的但是拿不准的问题,能回答的都有分~!
- java中如何停止一个启动后的线程?
- 这个程序怎么了?各位帮帮忙,作业急!
- java socket 文件传输 有点问题
- 求websphere4.0升级到4.03升级包的下载地址!以及如何升级!!
- JDK1.3中无法处理中文?
- request.getInputStream()未读取到数据
- Java中如何让图片沿Y轴旋转?
对于四字节的返回值,一般编译器把它放入eax寄存器里,而大于4字节的返回值,一般是放在会在栈中返回地址前的位置。可以肯定的是,应该不是在堆里。
系统先分配一个临时空间,用来存放函数返回的值,然后在将这个临时变量赋值给接收返回值的变量,再把临时空间释放。
所谓的临时区域,就是寄存器。只要不是用汇编,一般在高级语言中,我们不需要关心返回值放哪儿了,编译器为会根据你的使用方法选个好地方的。但一般,不是放在eax寄存器中(可能就是楼上说的临时区域),就是在栈中返回地址前的位置。
a b c 三个变量会在add方法完成以后和add方法一起被回收掉,这是肯定的。
在方法结尾 return c 在虚拟机指令中有return指令,将这个变量的值压入上一个方法的操作数栈中,上一个方法会接受到C这个变量的值,但是c变量本身会被回收掉。关于6楼的问题,虚拟机指令一般分为两种,一种是处理小值的指令,这种指令一般是直接指令,例如1+1这种,就会是sum_1 1+2这种就会变成 sum_2这种 如果这个值大 1+300 就会是 sum指令 当然指令的运用也可能根据变量的动态性来区别运用。