2010-09-09 76 views
-1

嗨有人可以請解釋我爲什麼是這段代碼片段給我StackOverflowError 我真的很感激,如果你可以解釋發生什麼事情時instanceObj初始化和調用ObjectTest構造函數和java.lang.Object構造函數。在我看來,ObjectTest的構造函數循環一遍又一遍,但我不知道確切的原因?因此,任何建議...當本地和實例對象創建時出現的StackOverflowError


public class ObjectTest { 

    public ObjectTest() { 

    } 


    ObjectTest instanceObj = new ObjectTest(); 


    public static void main(String[] args) { 

    ObjectTest localObj = new ObjectTest(); 
    } 
} 
+0

@all對你的幫助我讀您的所有信息並得到了一些知識,解決我的問題謝謝。 – ddfnfal 2010-09-12 07:36:31

回答

3

讓我們看看究竟會被執行:

  1. main()創建的ObjectTest
  2. 的新實例ObjectTest類有一個字段instanceObj將與初始化包含ObjectTest
  3. instanceObj新的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模式。


關於同一主題:

3

ObjectTest實例是指另一個ObjectTest —命名instanceObj。當它的「父」實例被創建時,這個實例被構造…並因此導致另一個,另一個無限地構建。

這裏是等價代碼,可更清晰地指出了缺點:

public class ObjectTest { 

    ObjectTest instanceObj; 

    public ObjectTest() { 
    instanceObj = new ObjectTest(); /* Recursively call the constructor. */ 
    } 

} 
6

調用構造函數來創建對象的新實例。它有一個對另一個實例的引用,它使用另一個ObjectType的新實例進行初始化,然後進行相同的操作。這是一個無限次的調用,直到你得到這個錯誤。

這將工作。

public class ObjectTest { 

    public ObjectTest() { 

    } 


    public static void main(String[] args) { 

    ObjectTest localObj = new ObjectTest(); 
    } 
} 
1

因爲您正在遞歸創建自己。

您需要注入您的實例,或讓其他類管理該屬性。

public class ObjectTest { 

public ObjectTest() { 
    instanceObj = null; 
} 
public ObjectTest(ObjectTest myObjectTest) { 
    instanceObj = myObjectTest; 
} 
} 
+0

Java規範的哪一部分解釋了這一點? – chrisrhyno2003 2015-10-21 01:55:41