Java 为什么具有相同类的实例变量的此类会导致StackOverflowerError,而具有相同类型的静态变量的类似类不会导致StackOverflower?
我的问题与另一个问题有关: 我创建了两个类,如下所示:Java 为什么具有相同类的实例变量的此类会导致StackOverflowerError,而具有相同类型的静态变量的类似类不会导致StackOverflower?,java,Java,我的问题与另一个问题有关: 我创建了两个类,如下所示: class Test { Test buggy = new Test(); public static void main (String[] args) { Test test = new Test(); System.out.println("Done"); } } 还有一个: class Test { static Test buggy = new Test(); public static vo
class Test {
Test buggy = new Test();
public static void main (String[] args) {
Test test = new Test();
System.out.println("Done");
}
}
还有一个:
class Test {
static Test buggy = new Test();
public static void main (String[] args) {
Test test = new Test();
System.out.println("Done");
}
}
我不明白为什么第一个代码(没有静态变量)会出现堆栈溢出错误,但当我将实例变量声明为静态(第二种情况)时,没有出现错误。这里的
static
关键字有什么区别?只要创建了类的新实例,第一个代码片段就会创建测试类的新实例。因此出现了无限递归和堆栈溢出
Test test = new Test(); // creates an instance of Test which triggers
// initialization of all the instance variables,
// so Test buggy = new Test(); creates a second
// instance of your class, and initializes its
// instance variables, and so on...
第二个代码段,因为这里的变量是静态的,所以在初始化类时创建类的实例。创建类的新实例时,没有无限递归
Test test = new Test(); // this time buggy is not an instance variable, so it
// has already been initialized once, and wouldn't be
// initialized again
静态字段仅在类加载器首次加载测试类时初始化一次 在第一段代码中,您创建了一个测试实例,并在其中创建了另一个实例。这将创建一个无限循环。检查初始化
测试时第一次发生的情况。初始化单个测试时会发生什么情况?它有一个变量buggy
,它被初始化,属于Test
类型。这个Test
还有一个类型为Test
的变量buggy
,它也需要初始化。你猜怎么着?现在有另一个变量buggy
需要初始化。这会一直发生,直到您的堆栈溢出了Test
的实例。