黑马程序员技术交流社区

标题: new 对象栈溢出错误 [打印本页]

作者: 王红潮    时间: 2012-10-3 17:28
标题: new 对象栈溢出错误
本帖最后由 王红潮 于 2012-10-3 20:39 编辑

看到有个栈溢出的帖子,没有想明白,求解
class   Demo
{
      Demo d = new Demo();
      //static Demo d  = new Demo();
       Demo()
      {
          System.out.println("demo run");
       }

       public static void main(String[] args)
       {
          new Demo();
        }

}
如果加了static 不会产生溢出错误,成员变量保存在了方法区中,只有一个变量,如果去掉static修饰,new对象时栈里有个变量d指向了堆里的Demo对象,new Demo();在堆里还会产生一个匿名对象,这里不存在递归调用,为什么还会栈溢出呢?
作者: 王海宇    时间: 2012-10-3 18:24
你去掉了static修饰符的话,每次new新对象的时候,都会导致Demo d = new Demo();这条语句的执行,而这条语句的执行又会导致这条语句的执行,而且每次执行这条语句都会产生新的对象,就这样无穷无尽的进行下去,最终就会导致栈溢出了
作者: 尤洋    时间: 2012-10-3 18:33
new Demo();之后

Demo d = new Demo();这一条作为类 的 成员变量 会在每次的对象实例化里显示初始化的过程中  被执行
执行之后 又会产生新对象,继续初始化,往返循环。所以会内存溢出

加静态后 属性就属于整个类 而不是某一个对象了,所以不会在每次初始化的时候都 新建这个属性
作者: 李建强    时间: 2012-10-3 18:53
嗯,赞同3楼的说法,不在赘述了。




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