为什么这个具有相同类的实例变量的类会导致StackOverflowError,而类似的类与相同类型的静态变量不相同?

时间:2016-12-22 13:41:19

标签: java

我的问题与另一个问题有关:How does creating a instance of class inside of the class itself works?

我按如下方式创建了两个类:

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关键字在这里有什么区别?

2 个答案:

答案 0 :(得分:6)

无论何时创建新的类实例,第一个代码段都会创建Test类的新实例。因此无限递归和堆栈溢出。

require('flickity-imagesloaded')

第二个片段,因为此处变量是静态的,所以在初始化类时会创建类的实例。创建类的新实例时,没有无限递归。

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...

答案 1 :(得分:2)

当类加载器首次加载Test类时,静态字段仅初始化一次。