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下去啊?谢谢! 展开
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下去啊?谢谢! 展开
3个回答
展开全部
以你上述代码为例,实例化A的对象时
父类初始化及构造器调用(省略)
执行成员A a = new A();
重复上述过程,栈溢出。
但是,如果成员A a变成static,实例化A对象时
父类初始化及构造器调用(省略)
静态成员初始化 static A a = new A();
2.1 重复1, 由于static域只要初始化1次,已完成
2.2 执行A的构造器,完成static A a的初始化
执行A的构造方法,完成 A a = new A();的对象建立
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
阿勇java:
每次new的时候java会新开辟一部分内存来保存对象,上述代码相当于死循环!
如果用static修饰变量,那么变量所占的空间始终是固定的,不会改变!这样就不会出现堆栈溢出的现象了!
每次new的时候java会新开辟一部分内存来保存对象,上述代码相当于死循环!
如果用static修饰变量,那么变量所占的空间始终是固定的,不会改变!这样就不会出现堆栈溢出的现象了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询