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

2024-12-27 14:28:56
推荐回答(3个)
回答1:

对象的内存分配是在堆中完成的,而引用对象A的就是a是在栈中分配的内存,当你new A()时,会一直在栈中分配就是a,但每个变量a所指向的对象不相同,最终栈内存不够,报堆栈溢出
异常。将a属性声明为static,这就是所有类都将共享这个对象,并且只在首次new里在分配内存。

回答2:

以你上述代码为例,实例化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();的对象建立

回答3:

阿勇java:
每次new的时候java会新开辟一部分内存来保存对象,上述代码相当于死循环!
如果用static修饰变量,那么变量所占的空间始终是固定的,不会改变!这样就不会出现堆栈溢出的现象了!