黑马程序员技术交流社区

标题: 关于程序出入栈的问题 [打印本页]

作者: 龚建锋    时间: 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)

tu1.jpg

作者: 杨锦    时间: 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)

图解.png

作者: 梁志仲    时间: 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