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
的实例。