java对象中成员变量是自己的对象堆栈溢出的问题

例子:classA{privateinti;privateAa=newA();publicA(){}publicstaticvoidmain(String[]args){... 例子:
class A{
private int i;

private A a = new A();

public A() {

}

public static void main(String[]args) {
A a = new A();

}

}
如上述代码,执行的时候会产生堆栈溢出.但是如果把A中的变量a换成static的变量则不会出现这个问题,java类库中java.lang.Boolean中就是这样做的!请问new A()时内存分配情况,还有a = new A(),他里面的成员变量是不是一直new下去啊?谢谢!
展开
 我来答
tytwddd
2013-08-08 · TA获得超过110个赞
知道小有建树答主
回答量:146
采纳率:0%
帮助的人:136万
展开全部
对象的内存分配是在堆中完成的,而引用对象A的就是a是在栈中分配的内存,当你new A()时,会一直在栈中分配就是a,但每个变量a所指向的对象不相同,最终栈内存不够,报堆栈溢出
异常。将a属性声明为static,这就是所有类都将共享这个对象,并且只在首次new里在分配内存。
rayregister
2013-08-08 · TA获得超过339个赞
知道小有建树答主
回答量:100
采纳率:100%
帮助的人:66万
展开全部

以你上述代码为例,实例化A的对象时

  1. 父类初始化及构造器调用(省略)

  2. 执行成员A a = new A();

  3. 重复上述过程,栈溢出。

 

但是,如果成员A a变成static,实例化A对象时

  1. 父类初始化及构造器调用(省略)

  2. 静态成员初始化 static A a = new A();

    2.1 重复1, 由于static域只要初始化1次,已完成

    2.2 执行A的构造器,完成static A a的初始化

  3. 执行A的构造方法,完成 A a = new A();的对象建立

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
简讯快递
2013-08-08 · TA获得超过1202个赞
知道小有建树答主
回答量:1926
采纳率:33%
帮助的人:512万
展开全部
阿勇java:
每次new的时候java会新开辟一部分内存来保存对象,上述代码相当于死循环!
如果用static修饰变量,那么变量所占的空间始终是固定的,不会改变!这样就不会出现堆栈溢出的现象了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式