如果类中定义一个类型为该类的非静态成员变量,声明时初始化,就会出现栈溢出异常;
然而如果是静态的,为啥就不会出现栈溢出异常了呢?
比如:
public class Test {
//public Test test = new Test(); //出现栈溢出异常
public static Test test = new Test(); //不出现异常
public static void main(String[] args) {
Test test = new Test();
}
}
希望能从内存分配方面给出答案,谢谢。
------解决思路----------------------
直接在类成员后边用=初始化的代码会在构造类实例的时候被调用,每当执行new Test()的时候,中间有一句代码也是new Test(),然后再调用……最后形成没有临界条件的递归就栈溢出了
static成员是脱离于类实例的,在new Test()时不会执行=后边的语句
------解决思路----------------------
静态的成员变量是属于类的,它是跟类的字节码文件即.class文件一起加载的。而Test test = new Test(); ,这个变量是属于对象的,也就是说每次创建对象都会创建一个这样的变量。那么你会发现,如此就成了无限循环。一直往栈里压,无数层,等到内存满了就会报内存溢出了。