在java中初始化类时,请执行以下操作

在java中初始化类时,请执行以下操作,java,Java,静态尺寸aw等于新尺寸()时;运行上述程序时出现错误。 当程序运行时,请参见下面的场景: 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

静态尺寸aw等于新尺寸()时;运行上述程序时出现错误。 当程序运行时,请参见下面的场景:

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();

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

  public  final Size SMALL = new Size();// infinite loop is happening 
  final Size as = new Size();  
线程“main”java.lang.StackOverflower中出现异常 大小。(有趣的。java:6) 大小。(有趣的。java:6) 有人能给我解释一下,或者,告诉我在哪里我能找到背后的原因

  Exception in thread "main" java.lang.StackOverflowError
  at Size.<init>(Interesting.java:6)  
  at Size.<init>(Interesting.java:6) 
因为
是一个实例变量,所以每个
大小的实例都有它。
Size
的构造函数调用
as=new Size()
,从而创建一个
Size
的新实例,该实例反过来也将启动构造函数并调用
as=new Size()
。。。。导致无限递归构造函数调用

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


您可能希望通过声明
static
使
成为类变量。这将导致
as
的初始化只发生一次,并阻止无限构造函数调用。

static=整个应用程序中的一个对象,因此它只创建一次,就是这样。
非静态=每个创建的对象一个实例,要创建多少个对象?你创建了z,然后在z里面创建了一个新的z,这就创建了一个新的z

因为第6行中的
as
是一个实例属性(对象的一部分),所以您可以这样读取它:

要创建此对象,我必须首先创建此大小类型的对象,但要创建此对象,我必须首先创建大小类型的对象,但要创建

因此是有限循环

在ohter方面,当您使用
static
限定符对其进行标记时,您将其设置为类属性(类的一部分,而不是对象的一部分),以便您可以像这样读取它

要定义这个类,我必须创建类型为Size的对象

然后Java说。。。“好的,明白了,到时候我就做。”。将创建类定义,并在加载时创建该类的新实例。不会出现混乱或无限循环

我希望这有帮助

final Size as = new Size();