您可以请任何人解释一下,为什么这段代码片段会给我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();
}
}
答案 0 :(得分:6)
您可以调用构造函数来创建对象的新实例。它引用了另一个实例,您使用另一个新的ObjectType实例进行初始化,而ObjectType又实现相同的功能。在你收到错误之前,它是无限次的呼叫。
这样可行。
public class ObjectTest {
public ObjectTest() {
}
public static void main(String[] args) {
ObjectTest localObj = new ObjectTest();
}
}
答案 1 :(得分:3)
每个ObjectTest
个实例都引用另一个 ObjectTest
- 名为instanceObj
。这个实例是在创建“父”实例时构造的......从而导致构建另一个实例,而另一个实例无限制地构建。
以下是可以更清楚地指出缺陷的等效代码:
public class ObjectTest {
ObjectTest instanceObj;
public ObjectTest() {
instanceObj = new ObjectTest(); /* Recursively call the constructor. */
}
}
答案 2 :(得分:3)
让我们看看将要执行的内容:
main()
创建ObjectTest
ObjectTest
类的字段instanceObj
将包含ObjectTest
instanceObj
初始化为新的ObjectTest
我想你想要更像这样的东西:
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模式。
关于同一主题:
答案 3 :(得分:1)
因为你是递归创造自己的。
您需要注入您的实例,或让其他类管理该属性。
public class ObjectTest {
public ObjectTest() {
instanceObj = null;
}
public ObjectTest(ObjectTest myObjectTest) {
instanceObj = myObjectTest;
}
}