A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 龚建锋 初级黑马   /  2012-7-23 22:16  /  1841 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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, 下载次数: 68)

tu1.jpg

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
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方法直接获得的返回值

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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, 下载次数: 67)

图解.png

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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
}
}
回复 使用道具 举报
run方法是静态的,他的生命周期和类一样。我觉得他压根就没有进栈一说,且一直在方法区中,你掉他,他就给你结果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马