作为类变量的对象会导致堆栈溢出
public class stack {
stack obj = new stack(); // its obvious that during class loading obj will call class to
// load and infinite loop will occur.
}
Run Code Online (Sandbox Code Playgroud)
让我们说我static在课堂上使用obj
public class stack {
static stack obj = new stack(); // it will not cause infinite loop and program will //execute successfully
}
Run Code Online (Sandbox Code Playgroud)
当JVM第一次捕获类时,静态变量被分配到内存中(据我所知).仅在JVM开始将内存分配给上述static对象变量时才说第一次.它会再次实际调用该类,这也应该导致无限循环.在某个地方我错了.有人可以突出我错在哪里.
不,声明它static不会导致无限循环.这就是原因.
静态变量在类加载时间内初始化.因此,当您的类第一次加载时,编译器将为静态变量创建一个实例,就是这样.这不会导致您的班级第二次加载.由于您的课程未再次加载,因此不会重复此过程.
如果你将它声明为非静态属性,那么这是一个完全不同的故事.考虑一下 -
public class stack {
stack obj = new stack();
........
}
Run Code Online (Sandbox Code Playgroud)
该声明相当于 -
public class stack {
stack obj;
public stack() {
obj = new stack(); // implicitly moved here by the compiler
}
........
}
Run Code Online (Sandbox Code Playgroud)
从最后一个例子可以看出,为什么这里存在无限递归.您正在stack其自己的构造函数中创建该类的实例,该构造函数又创建另一个,然后另一个,......然后它继续,导致堆栈溢出.