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