局部变量虽然被释放掉了,但局部变量的值已经写入寄存器中了,sum就从这个寄存器取值。如果学过汇编的话就比较容易理解了

解决方案 »

  1.   

    方法栈 知道么。 方法A 调用另外一个方法B,那就会形成方法栈 栈A. B   。 在B返回的时候 就把b的返回值也返回回来了。只是返回来一个拷贝。不一定非要是那个变量本身
      

  2.   

    一个大神的答案(稍作整理):
    对于四字节的返回值,一般编译器把它放入eax寄存器里,而大于4字节的返回值,一般是放在会在栈中返回地址前的位置。可以肯定的是,应该不是在堆里。
    系统先分配一个临时空间,用来存放函数返回的值,然后在将这个临时变量赋值给接收返回值的变量,再把临时空间释放。
    所谓的临时区域,就是寄存器。只要不是用汇编,一般在高级语言中,我们不需要关心返回值放哪儿了,编译器为会根据你的使用方法选个好地方的。但一般,不是放在eax寄存器中(可能就是楼上说的临时区域),就是在栈中返回地址前的位置。
      

  3.   

    楼主问的问题,其实和开发关系不是很大,这是虚拟机执行引擎的问题,你多了解一点虚拟机指令就行了。
    a b c 三个变量会在add方法完成以后和add方法一起被回收掉,这是肯定的。
    在方法结尾 return c 在虚拟机指令中有return指令,将这个变量的值压入上一个方法的操作数栈中,上一个方法会接受到C这个变量的值,但是c变量本身会被回收掉。关于6楼的问题,虚拟机指令一般分为两种,一种是处理小值的指令,这种指令一般是直接指令,例如1+1这种,就会是sum_1 1+2这种就会变成 sum_2这种 如果这个值大 1+300 就会是 sum指令 当然指令的运用也可能根据变量的动态性来区别运用。