要明白这个问题 首先了解下 java中的内存分配 java中的内存大体分为两种 栈区+堆区 主要存放内容如下
基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配。字符串常量在 DATA 区域分配 ,this 在堆空间分配 。数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小!
注意以上红字部分
在你的这段代码中
Demo7 d=new Demo7(); 这个d的变量地址便存放在栈区 那么你这个程序为什么会内存溢出呢 我运行了你的程序 报的是
java.lang.StackOverflowError
at Demo7.<init>(Demo7.java:2)
at Demo7.<init>(Demo7.java:4)
at Demo7.<init>(Demo7.java:4)
at Demo7.<init>(Demo7.java:4)
at Demo7.<init>(Demo7.java:4)
这么一个异常 StackOverflowError 即栈区内存溢出 说明栈区的内存被你的变量地址值占满了 为什么会出现这种情况呢
看下异常的第二行 在类初始化的时候报的
再了解下java类初始化的流程
(静态变量、静态初始化块)-->(变量、初始化块)-->构造器
再看你的代码 Demo7 d=new Demo7(); 这句话 即是初始化快 而这句话你又使用了new来创建一个类对象 而创建类对象又会继续执行这句话 这样就会产生无限递归调用 即会产生无限多的 d变量
从而导致栈区溢出 |