我想知道调用方法时返回值在内存中是如何实现的。
譬如int method(){int b;...return b;}这个方法中返回了int类型的值。但我们知道作为局部变量的b在方法调用完后它所占用的内存应该是被释放了,那么这时int a=method();这个赋值过程在内存中是怎么实现的?
还有当返回的不是基本数据类型而是一个对象时,这个赋值过程在内存中又是怎么实现的?譬如有类A,A a=method();这个a应该仅仅是一个对象引用,这时它指向的内存是返回的对象占有的内存,可是这个返回的对象在方法调用完后又被释放内存,似乎这个a占有的内存就不是合法的了,它所指向的内存还会被系统分配出去吗?
这些我不明白,希望有能人指点一下。
譬如int method(){int b;...return b;}这个方法中返回了int类型的值。但我们知道作为局部变量的b在方法调用完后它所占用的内存应该是被释放了,那么这时int a=method();这个赋值过程在内存中是怎么实现的?
还有当返回的不是基本数据类型而是一个对象时,这个赋值过程在内存中又是怎么实现的?譬如有类A,A a=method();这个a应该仅仅是一个对象引用,这时它指向的内存是返回的对象占有的内存,可是这个返回的对象在方法调用完后又被释放内存,似乎这个a占有的内存就不是合法的了,它所指向的内存还会被系统分配出去吗?
这些我不明白,希望有能人指点一下。
解决方案 »
- java自带的类的方法都可以直接使用么?
- 关于 java jdbc-odbc 连接 sqlserver2005 的问题
- sdk配置问题(新手小试)
- 求这种正则表达式如何来写
- 反复执行程序的方式
- java中的面向对象是怎么体现的?新手刚学java,怎么感觉和C语言处理方法很相似啊?
- 求高手点拨一个IM系统Java工程的测试连接的方案.
- (高分啊……)Jbuilder7好还是JBuilder8好,那里有JBuilder的快速入门宝典!
- 请问java.lang.reflect这个包(反射)的主要用途?java.lang.reflect.Method这个类是干什么用的?
- weblogic究竟有什么特别的优点
- 求五子棋的算法,顺便解释一下“禁手”!看了还是不太清楚
- java中引用的包或方法是哪里的呢
简单例子: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++中的栈对象对比一下。