Stack Overflow java

Asl*_*wer 3 java static

作为类变量的对象会导致堆栈溢出

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对象变量时才说第一次.它会再次实际调用该类,这也应该导致无限循环.在某个地方我错了.有人可以突出我错在哪里.

MD *_*med 6

不,声明它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其自己的构造函数中创建该类的实例,该构造函数又创建另一个,然后另一个,......然后它继续,导致堆栈溢出.