我是Java的初学者。我在尝试在类本身中创建类实例的地方使用此代码。
这给了我堆栈溢出错误。 然后,在类中创建引用变量“ static”,现在它可以正常工作。
我的问题是static关键字在这里做什么?我知道静态变量是只加载一次的类变量。但是,构造函数调用还应该进入对自身的递归调用吗?我无法从静态关键字的知识中获得任何答案。
答案 0 :(得分:3)
您有类似的内容(无法从屏幕截图中复制/粘贴!)
class A {
private A a = new A();
}
因此,要在调用A
时创建new A()
的实例,必须再次调用this.a
来设置new A()
的值。无限递归(直到堆栈空间用完)。
将字段a
设为静态时,在构造A
的实例时不再对其进行初始化,而在加载类本身时仅对其进行初始化。
答案 1 :(得分:2)
当类被初始化并且具有自己类型的成员时,该成员本身将使用内部相同的成员进行初始化,并且该成员内部的该成员将被初始化...您在此处看到无限递归吗?这就是为什么您会得到堆栈溢出错误的原因。
静态关键字使该成员不属于课程。它是在全局上下文中初始化一次的(例如,您不需要D1的实例来访问它。而是键入D1.obj)。因此递归不会在这里发生。