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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑龙江—刘鹏 初级黑马   /  2012-7-11 21:14  /  2155 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑龙江—刘鹏 于 2012-7-11 21:41 编辑

class Demo
{
public static void main(String[] args)
{
  int x  =0;
  x= x+1;
      
  main(x);
  System.out.println(x);
  
}
public static void main(int y)
{ int x= 2;
  y = y +2  ;
  System.out.println(y);
  main(x);
  System.out.println(x);
}
}
大家运行一下 为什么会这样啊 求解
并且如何修改成正常

10 个回复

倒序浏览
public static void main(int y)
{ int x= 2;
  y = y +2  ;
  System.out.println(y);
  main(x);
  System.out.println(x);
}
自己调用自己?死循环
回复 使用道具 举报
public static void main(int y)
{ int x= 2;
  y = y +2  ;
  System.out.println(y);
  main(x);//这个不要加,不然会无限无限调用main(x),x是int型所以就不停的调用自己
  System.out.println(x);//这句执行不到
}
}
回复 使用道具 举报
本帖最后由 曹恒业 于 2012-7-11 21:36 编辑

class Demo
{
        public static void main(String[] args)
        {
          int x  =0;
          x = x+1;  
          main(x);
          System.out.println(x);  
        }

        public static void main(int y)      //这是一个无限递归的函数,相当于一个死循环。
        {
                int x = 2;
                y = y + 2  ;
                System.out.println(y);
                main(x);
                System.out.println(x);
        }
}

主程序第一次调用main(1)函数,输出3, 然后又进入函数内的main(2),输出4,然后再进入main(2),输出4,然后周而复始。
如果写了一个自己调用自己的函数,即递归函数,则一定要在函数内部加一个递归终止条件,否则无异于循环体中没有终止条件,就会无限运行下去。
比如举一个求和的递归函数为例子说明。
class Demo
{
        public static void main(String[] args)
        {
                System.out.println(sum(100));
        }

public static int sum(int num)   //函数功能:求1到num数字累加的和
{
       if(num==1)            //这就是该求和递归函数的终止判断条件,以后用递归函数切记这一点啊
           return 1;
       return num+sum(num-1);
}

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
哦哦 我是新手哈 谢谢啦
回复 使用道具 举报
这个程序有意思,运行是大家可能会有疑问,怎么会打印4了。 一遍的4。
即使我手快去 按 Ctrl + C  看到的打一个打印的结果依然是4 。
呵呵,于是我改造了下这个程序,方便大家看到程序执行过程:

代码如下:
class Demo
{
public static void main(String[] args) throws Exception
{
  int x  =0;
  x= x+1;
      
  main(x);
  System.out.println(x);
  
}
public static void main(int y) throws Exception
{
Thread.sleep(1000);   //让线程给个待1秒钟 , 这样可以看到第一次打印的结果了吧。
  System.out.println("--1-- y = "+y);

  int x= 2;
  y = y +2  ;
  Thread.sleep(1000);
  System.out.println("--2-- y = "+y + " , x = "+x);


  System.out.println(y);
  main(x);
  Thread.sleep(1000);
  System.out.println("--3-- y = "+y + " , x = "+x);

  System.out.println(x);
}
}

------------------

执行后结果为



从上面我们可以看出
循环的第二次就是4了,第一次的3 太快了,不可能让你看到的。

最后 , 这样的递归调用,最终肯定会死掉了。

评分

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

查看全部评分

回复 使用道具 举报
陈淑飞 发表于 2012-7-11 21:41
这个程序有意思,运行是大家可能会有疑问,怎么会打印4了。 一遍的4。
即使我手快去 按 Ctrl + C  看到的打 ...

哈哈 好详细啊 谢谢
回复 使用道具 举报
一个类中只能有一个main主函数啊!兄弟
main主函数是程序的入口,程序执行的时候会查找到第一个main,然后开始执行。
public static void main(String[] args)

所以你下面定义函数的时候,函数名不能够用main这个关键字,要不然程序会出错的
public static void main(int y)
回复 使用道具 举报
叶久瑞 发表于 2012-7-11 21:54
一个类中只能有一个main主函数啊!兄弟
main主函数是程序的入口,程序执行的时候会查找到第一个main,然后 ...

哈 反正现在很晕的  
好好 屡屡头绪
回复 使用道具 举报
能把机器弄死机了呵呵 ·····
回复 使用道具 举报
叶久瑞 发表于 2012-7-11 21:54
一个类中只能有一个main主函数啊!兄弟
main主函数是程序的入口,程序执行的时候会查找到第一个main,然后 ...

哥们,你说的不对哦,main 不是个关键字,只是它能被JVM识别。其它函数也可以用 main 做函数名的,只要参数不同就行,这属于函数的重载。JVM只识别参数为String[] 的那个main函数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马