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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Ticket
  2. {       
  3.         static int ticket = 100;
  4.         Ticket t = new Ticket();
  5.         static void sale()
  6.         {
  7.                 System.out.println("ticket num is :" + ticket--);
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 //当用对象调用sale()时,出现StackOverflowError,栈溢出错误
  12.                 new Ticket().sale();
  13.                 //而当直接使用静态的方式,直接调用sale()时,就不报错,?
  14.                 //sale();
  15.         }
  16. }
复制代码

点评

如果问题未解决,请继续追问,如果问题解决了,请将帖子分类改为已解决,谢谢  发表于 2013-3-29 07:13

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
加个判断结束的...你的没有控制结束语句,if(ticket<=0) return ;就不会一直递归下去了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 夏振博 于 2013-3-28 22:08 编辑

递归最不可缺的是递归的出口 ,就是在什么情况下让它停止递归
正好昨天晚上帮朋友讲递归时写的代码 5*4*3*2*1=?你可以研究下
你这代码我真心没搞明白,Ticket t = new Ticket();干嘛用的,想递归?你代码溢出就是因为这段代码,不断的调用自己到这里就调用,下面的代码一直都没执行
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 System.out.println(Demo.diGui(5));
  4.         }
  5.         private static int diGui(int i){
  6.                 if(i==1)return 1;//这就是出口
  7.                 else return i*diGui(i-1);
  8.         }
  9. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我差点都被你绕过去了
你自己仔细观察下你的代码
第四行, Ticket t = new Ticket();
你在类的内部创建了一个本类对象
所以你在main函数中,new一个对象的时候,jvm会开始加载类进内存,遇到Ticket t = new Ticket();这个语句,又创建一个新的对象。。。。递归的是这个部分
跟你有没有调用sale()方法无关!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
递归一定要有出口,一个重要原则就是递归要向已知方向递归;
回复 使用道具 举报
递归也就是函数自身调用自身的编程手法或者表现形式       
递归注意事项:
        1.限定条件
        2.要注意递归的次数,尽量避免内存溢出.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马