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(); } } 

让我们看看将要执行的内容:

  1. main()创建一个ObjectTest的新实例
  2. ObjectTest类有一个包含ObjectTest的字段instanceObj
  3. 使用新的ObjectTest初始化了ObjectTest
  4. 转到第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; } }