黑马程序员技术交流社区
标题:
关于程序出入栈的问题
[打印本页]
作者:
龚建锋
时间:
2012-7-23 22:16
标题:
关于程序出入栈的问题
class DemoTest {
public static void main(String[] args) {
int num = run();
System.out.println(num);
}
static int run() {
int x= 1;
return x;
}
}
/*疑问:当程序执行时,main()方法入栈,当执行到int num = run();时就调用run()方法,
即run()方法入栈,main()压栈,我们都知道return能够结束方法,在执行到run()方法中的return x;语句时run()
就结束并出栈,main()就弹栈,继续执行并输出num的值1.run()都已经出栈了又是怎样给main()返回的值呢?*/
执行流程如图:
tu1.jpg
(29.49 KB, 下载次数: 72)
下载附件
2012-7-23 22:15 上传
作者:
杨锦
时间:
2012-7-23 23:07
java里面定义一个容器专门用来存储返回值的,所以main函数并不是向run方法直接取的返回值,因为run方法已经出栈了,而是从容器中取回的返回值。
class DemoTest {
public static void main(String[] args) {
int num = run();
System.out.println(num);
}
static int run() {
int x= 1;
return x; //假设这里改成return x++;
}
}
那么输出结果应该还是 1 。出栈之前x确实有做一次自家动作,但是x值已经在自加之前存到java定义的容器当中了,所以这样就能看出来,main函数确实不是从run方法直接获得的返回值
作者:
刘海源
时间:
2012-7-23 23:27
class DemoTest {
public static void main(String[] args) {
int num = run();
System.out.println(num);
}
static int run() {//因为run()方法是静态方法,它在内存的存储位置是静态方法区中,所以值不会消失,随着类的加载而加载
//当主函数调用时就直接从方法区中拿出值,所以num是1
int x= 1;
return x;
}
}
图解.png
(14.66 KB, 下载次数: 70)
下载附件
2012-7-23 23:27 上传
作者:
梁志仲
时间:
2012-7-23 23:37
class DemoTest {
public static void main(String[] args) {
int num = run(); //main方法中的局部变量,被调用时在栈内存中存储,通过run方法对其进行赋值初始化
System.out.println(num);
}
static int run() { //静态方法,随着类的加载而存在于内存中的方法区中
int x= 1; //局部变量,被调用时在栈内存中存储,方法结束后,局部变量将被回收
return x; //因x是局部变量,即使这里x++,再次调用run方法时x会重新被初始化为x=1
}
}
作者:
郭凯敏
时间:
2012-7-24 01:27
run方法是静态的,他的生命周期和类一样。我觉得他压根就没有进栈一说,且一直在方法区中,你掉他,他就给你结果
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2