java本地和实例对象创建时的StackOverflowError

时间:2010-09-09 19:20:12

标签: java object stack-overflow instance local

您可以请任何人解释一下,为什么这段代码片段会给我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();
   }
}

4 个答案:

答案 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)

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

  1. main()创建ObjectTest
  2. 的新实例
  3. ObjectTest类的字段instanceObj将包含ObjectTest
  4. instanceObj初始化为新的ObjectTest
  5. 转到第2步

  6. 我想你想要更像这样的东西:

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