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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-10-3 17:28  /  2393 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红潮 于 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();在堆里还会产生一个匿名对象,这里不存在递归调用,为什么还会栈溢出呢?

评分

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

查看全部评分

3 个回复

倒序浏览
你去掉了static修饰符的话,每次new新对象的时候,都会导致Demo d = new Demo();这条语句的执行,而这条语句的执行又会导致这条语句的执行,而且每次执行这条语句都会产生新的对象,就这样无穷无尽的进行下去,最终就会导致栈溢出了

评分

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

查看全部评分

回复 使用道具 举报
new Demo();之后

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

加静态后 属性就属于整个类 而不是某一个对象了,所以不会在每次初始化的时候都 新建这个属性

评分

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

查看全部评分

回复 使用道具 举报
嗯,赞同3楼的说法,不在赘述了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马