在java中初始化类时,请展示以下内容

Pus*_*raj 0 java

class Size{
Size(){

}
//public  final Size SMALL = new Size();//infinite loop
  final Size as = new Size();//infinite loop
//static Size aw = new Size();//No infinte loop

}


class b{

static public void main(String ftr[]){

    Size z = new Size();

  }
}
Run Code Online (Sandbox Code Playgroud)

当静态大小aw等于new Size(); 上述程序运行时出错.当程序运行时,请参阅下面的方案:

  public  final Size SMALL = new Size();// infinite loop is happening 
  final Size as = new Size();  
Run Code Online (Sandbox Code Playgroud)

一个无限循环正在发生,程序正在给予

  Exception in thread "main" java.lang.StackOverflowError
  at Size.<init>(Interesting.java:6)  
  at Size.<init>(Interesting.java:6) 
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释,或者指出我可以找到背后原因的地方.

ami*_*mit 6

final Size as = new Size();
Run Code Online (Sandbox Code Playgroud)

as是一个实例变量,所以每个实例Size都有它.Size调用的构造函数as = new Size(),从而创建一个新的实例Size,反过来它也将启动构造函数并调用as = new Size()....导致无限的递归构造函数调用.

这里的要点是要注意,因为它as是一个实例变量,所以每次创建一个对象时 - 它都在构造函数中初始化.

您可能想as通过声明它来创建一个类变量static.这将导致初始化as仅发生一次并阻止无限构造函数调用.