我想知道调用方法时返回值在内存中是如何实现的。
譬如int method(){int b;...return b;}这个方法中返回了int类型的值。但我们知道作为局部变量的b在方法调用完后它所占用的内存应该是被释放了,那么这时int a=method();这个赋值过程在内存中是怎么实现的?
还有当返回的不是基本数据类型而是一个对象时,这个赋值过程在内存中又是怎么实现的?譬如有类A,A a=method();这个a应该仅仅是一个对象引用,这时它指向的内存是返回的对象占有的内存,可是这个返回的对象在方法调用完后又被释放内存,似乎这个a占有的内存就不是合法的了,它所指向的内存还会被系统分配出去吗?
这些我不明白,希望有能人指点一下。

解决方案 »

  1.   

    从jvm上层看的话,jvm是基于栈的机器。返回值放到栈顶,调用者取栈顶的数据就是返回值了。
    简单例子:public class Test {  
        public static int getI(){
    return 5;
        }
        public static Test getTest(){
            return new Test();
        }
        public static void main(String[] args) {  
            int result = getI();
            System.out.println();
            Test t = getTest();    
        }  
    }  
    Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: returnpublic static int getI();
      Code:
       0: iconst_5
       1: ireturnpublic static Test getTest();
      Code:
       0: new #2; //class Test
       3: dup
       4: invokespecial #3; //Method "<init>":()V
       7: areturnpublic static void main(java.lang.String[]);
      Code:
       0: invokestatic #4; //Method getI:()I  调用方法后,返回值位于栈顶
       3: istore_1        将栈顶数据保存到局部变量result
       4: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
       7: invokevirtual #6; //Method java/io/PrintStream.println:()V
       10: invokestatic #7; //Method getTest:()LTest;  调用方法后,返回值(引用)位于栈顶
       13: astore_2       将栈顶的引用保存到局部变量t
       14: return}在语言级别看,对象在堆中,不存在退出方法对象就不存在的行为。可以跟C++中的栈对象对比一下。
      

  2.   

    看楼上老大的解释 学习ing
      

  3.   

    1楼说对象在堆中,可是java不是会垃圾自动回收吗?这个在方法中创建的内存块难道不会在方法调用完后被回收?这时t所存的引用还有什么意义?
      

  4.   

    jvm中每个方法都是在栈中操作的,向栈中压入参数,执行后返回值在栈顶