黑马程序员技术交流社区

标题: 请教:关于面向对象的问题; [打印本页]

作者: 黑龙江—刘鹏    时间: 2012-7-11 21:14
标题: 请教:关于面向对象的问题;
本帖最后由 黑龙江—刘鹏 于 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);
}
}
大家运行一下 为什么会这样啊 求解
并且如何修改成正常
作者: 黑马振鹏    时间: 2012-7-11 21:25
public static void main(int y)
{ int x= 2;
  y = y +2  ;
  System.out.println(y);
  main(x);
  System.out.println(x);
}
自己调用自己?死循环
作者: 陆强强    时间: 2012-7-11 21:27
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:29
本帖最后由 曹恒业 于 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);
}


作者: 黑龙江—刘鹏    时间: 2012-7-11 21:35
哦哦 我是新手哈 谢谢啦
作者: 陈淑飞    时间: 2012-7-11 21:41
这个程序有意思,运行是大家可能会有疑问,怎么会打印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 太快了,不可能让你看到的。

最后 , 这样的递归调用,最终肯定会死掉了。
作者: 黑龙江—刘鹏    时间: 2012-7-11 21:43
陈淑飞 发表于 2012-7-11 21:41
这个程序有意思,运行是大家可能会有疑问,怎么会打印4了。 一遍的4。
即使我手快去 按 Ctrl + C  看到的打 ...

哈哈 好详细啊 谢谢
作者: 叶久瑞    时间: 2012-7-11 21:54
一个类中只能有一个main主函数啊!兄弟
main主函数是程序的入口,程序执行的时候会查找到第一个main,然后开始执行。
public static void main(String[] args)

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

哈 反正现在很晕的  
好好 屡屡头绪
作者: 李志群    时间: 2012-7-11 22:07
能把机器弄死机了呵呵 ·····
作者: 高原    时间: 2012-7-11 23:03
叶久瑞 发表于 2012-7-11 21:54
一个类中只能有一个main主函数啊!兄弟
main主函数是程序的入口,程序执行的时候会查找到第一个main,然后 ...

哥们,你说的不对哦,main 不是个关键字,只是它能被JVM识别。其它函数也可以用 main 做函数名的,只要参数不同就行,这属于函数的重载。JVM只识别参数为String[] 的那个main函数。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2