我是java初学者。我正在尝试这段代码,我在类本身中创建了类的实例。它给了我堆栈溢出错误。然后,我在类中将引用变量设为“静态”,现在它工作正常。我的问题是静态关键字在这里做什么?我知道静态变量是只加载一次的类变量。但是,构造函数调用是否也应该进入对自身的递归调用?我无法从我对静态关键字的了解中得到任何答案。
2 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
你有类似的东西(不能复制/粘贴屏幕截图!)
class A { private A a = new A(); }
A
因此,要在调用时创建一个实例,必须通过再次调用new A()
来设置值。无限递归(直到你用完堆栈空间)。this.a
new A()
当您将该字段a
设置为静态时,它不再在A
构造实例时初始化,而是在加载类本身时仅初始化一次。
偶然的你
TA贡献1841条经验 获得超3个赞
当类被初始化并且它有一个自己类型的成员时,成员本身被初始化为内部相同的成员,并且成员内部的这个成员被初始化......你看到这里的无限递归了吗?这就是您收到堆栈溢出错误的原因。
static关键字使该成员不是类的一部分。它在全局上下文中初始化一次(例如,您不需要 D1 的实例来访问它。您键入 D1.obj 代替)。所以递归不会在这里发生。
添加回答
举报
0/150
提交
取消