静态关键字在这里做什么?

时间:2019-01-25 11:07:49

标签: java static

我是Java的初学者。我在尝试在类本身中创建类实例的地方使用此代码。

https://i.stack.imgur.com/1IHFB.png

这给了我堆栈溢出错误。 然后,在类中创建引用变量“ static”,现在它可以正常工作。

enter image description here

我的问题是static关键字在这里做什么?我知道静态变量是只加载一次的类变量。但是,构造函数调用还应该进入对自身的递归调用吗?我无法从静态关键字的知识中获得任何答案。

2 个答案:

答案 0 :(得分:3)

您有类似的内容(无法从屏幕截图中复制/粘贴!)

 class A {
     private A a = new A();
 }

因此,要在调用A时创建new A()的实例,必须再次调用this.a来设置new A()的值。无限递归(直到堆栈空间用完)。

将字段a设为静态时,在构造A的实例时不再对其进行初始化,而在加载类本身时仅对其进行初始化。

答案 1 :(得分:2)

当类被初始化并且具有自己类型的成员时,该成员本身将使用内部相同的成员进行初始化,并且该成员内部的该成员将被初始化...您在此处看到无限递归吗?这就是为什么您会得到堆栈溢出错误的原因。

静态关键字使该成员不属于课程。它是在全局上下文中初始化一次的(例如,您不需要D1的实例来访问它。而是键入D1.obj)。因此递归不会在这里发生。