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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 正在输入... 中级黑马   /  2015-3-1 21:53  /  1697 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

构造函数为什么不能递归呢?
在网上也找不到好的解释。
  1. public class DiGuiTest{
  2.        
  3.         public static void main(String[] args) {
  4. //创建person对象;
  5.         Person p = new Person();
  6.        
  7. }
  8. }
复制代码
直接调用会报错,提示创建一个方法
  1. public class Person {
  2.         Person(){
  3.                 int i = 1;
  4.                 System.out.println("递归调用"+i);
  5.                 i++;
  6.                 Person();//此处提示创建一个Person函数, 创建出来是void Person();
  7.         }
  8. }
复制代码
是不是只建一个方法,然后创建对象。 再在对象构造中调用该方法。




评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 ㏒假™面具 于 2015-3-1 22:27 编辑

递归使用时有两个注意事项:1.一定要明确条件,来控制递归的次数,否则会导致内存溢出  2.递归次数太多也会导致内存溢出。你在构造函数中。调用构造函数没有明确条件。
回复 使用道具 举报
首先构造函数是给对象初始化的,而递归是函数自身调用自身由未知到已知,并且需要给定条件来结束递归,否则会死循环直到内存溢出。
其次你将构造函数定义成递归的形式,当创建对象时就会在堆内存中不断的开辟空间,而一个对象只对应一个内存地址,这种情况下就矛盾了,就会出错。
    以上是我个人的分析,不知道对不对!
回复 使用道具 举报
因为构造函数没法设置出口,设置不了出口,内存就会溢出,因此构造方法不能使用递归
回复 使用道具 举报
你看看你写的递归代码,是不是没有出口,这样会一直递归下去的,然后就死机了
回复 使用道具 举报
你可以这样理解
1、构造函数本身不是函数,函数必须有返回值,构造函数没有返回值
2、构造函数的作用是在堆内存中开辟出一段空间,以存放对象各属性的值;
     而普通函数的作用是为执行一段代码并返回结果。
3、我的理解就是,你不要把构造函数当作函数看待,它本身就不是函数,只是像函数;你可以叫它构造体。constructor  和   function,从英语上理解。
回复 使用道具 举报
学习了,各位的解释
回复 使用道具 举报
构造函数只能被new关键字调用。构造函数有返回值吗?没有。每次递归需要返回值吗?需要。
回复 使用道具 举报
写的很好啊
回复 使用道具 举报
进来学习学习
回复 使用道具 举报
Person(){
                int i = 1;
                System.out.println("递归调用"+i);
                i++;
                Person();//此处提示创建一个Person函数, 创建出来是void Person();
        }
此时编译不通过。
Person构造方法中调用的Person();此时Person()方法代表的不是构造方法,而是Person类中的自定义的方法,例如:public void Person(){}.
如果构造方法中向调用例外的构造方法,可以使用this关键字。
public class Person {
        public Person() {
                this(1);
        }
        public Person(int age) {
        }               
}
递归算法是一种直接或者间接地调用自身的算法(除构造方法)。所以这不是递归。


回复 使用道具 举报
你这个递归没写出口吧= =
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马