java本地和实例对象创建时的StackOverflowError
嗨,任何人都可以解释一下,为什么这段代码片段给我StackOverflowError我真的很感激,如果你能解释当instanceObj初始化和调用ObjectTest构造函数和java.lang.Object构造函数时发生了什么。 在我看来ObjectTest构造函数循环一遍又一遍。但我不知道确切的原因? 所以任何建议……
public class ObjectTest { public ObjectTest() { } ObjectTest instanceObj = new ObjectTest(); public static void main(String[] args) { ObjectTest localObj = new ObjectTest(); } }
让我们看看将要执行的内容:
-
main()
创建一个ObjectTest
的新实例 -
ObjectTest
类有一个包含ObjectTest
的字段instanceObj
- 使用新的
ObjectTest
初始化了ObjectTest
- 转到第2步
我想你想要更像这样的东西:
public class ObjectTest { private static ObjectTest instanceObj; private ObjectTest() { } public static ObjectTest getInstance() { if (instanceObj != null) { instanceObj = new ObjectTest(); } return instanceObj; } public static void main(String[] args) { ObjectTest localObj = ObjectTest.getInstance(); } }
或这个 :
public class ObjectTest { private static final ObjectTest instanceObj = new ObjectTest(); private ObjectTest() { } public static ObjectTest getInstance() { return instanceObj; } public static void main(String[] args) { ObjectTest localObj = ObjectTest.getInstance(); } }
这是Singleton模式。
在同一主题上:
- 为什么我得到StackOverflowError
- java类中的循环依赖
您可以调用构造函数来创建对象的新实例。 它引用了另一个实例,您可以使用另一个新的ObjectType实例进行初始化,而ObjectType也会执行相同的操作。 在你收到错误之前,它是无限次的调用。
这会奏效。
public class ObjectTest { public ObjectTest() { } public static void main(String[] args) { ObjectTest localObj = new ObjectTest(); } }
每个ObjectTest
实例引用另一个 ObjectTest
instanceObj
。 这个实例是在创建“父”实例时构造的……因此导致构造另一个,另一个无限制。
以下是可以更清楚地指出缺陷的等效代码:
public class ObjectTest { ObjectTest instanceObj; public ObjectTest() { instanceObj = new ObjectTest(); /* Recursively call the constructor. */ } }
因为你是递归创造自己的。
您需要注入您的实例,或者让其他类管理该属性。
public class ObjectTest { public ObjectTest() { instanceObj = null; } public ObjectTest(ObjectTest myObjectTest) { instanceObj = myObjectTest; } }