对象的内存分配是在堆中完成的,而引用对象A的就是a是在栈中分配的内存,当你new A()时,会一直在栈中分配就是a,但每个变量a所指向的对象不相同,最终栈内存不够,报堆栈溢出
异常。将a属性声明为static,这就是所有类都将共享这个对象,并且只在首次new里在分配内存。
以你上述代码为例,实例化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修饰变量,那么变量所占的空间始终是固定的,不会改变!这样就不会出现堆栈溢出的现象了!