2013-03-26 33 views
-2

爲什麼在同一類的實例中創建非靜態實例時發生堆棧溢出錯誤?爲什麼在實例中創建非靜態實例時發生堆棧溢出錯誤?

public class ObjectTest { 
    ObjectTest instanceObj = new ObjectTest("Outside"); 

    public ObjectTest(String s) { 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 
} 

但問題得到由如下修改解決:

static ObjectTest instanceObj = new ObjectTest("Outside"); 

據瞭解,像循環依賴關係發生在第一種情況下,同時賦予新的對象來instanceObj參考

誰能澄清整個事情??爲什麼靜態引用循環依賴不會發生?

+0

謝謝大家...雖然我意識到靜態/非靜態的概念..但是現在我明白了......我有點困惑......再次感謝! – 2013-03-26 18:49:31

+0

完成Sotirios! – 2013-03-26 18:53:44

回答

6

instanceObj是非靜態的,對於ObjectTest構造函數創建另一個ObjectTest它創建另一個ObjectTest,等等循環往復。當它是靜態的時,整個ObjectTest類只有一個instanceObj創建...它畢竟是靜態的,它是。 :)當instanceObj是靜態的並且它的ObjectTest被創建時,它已經擁有靜態的instanceObj,它本身就是。這確實需要一些習慣,它可能有助於在紙上做到這一點,並確保你清楚static關鍵字的含義。

2

因爲它在對象內部創建對象,並在對象內部再次創建對象。這就像兩個鏡子在彼此前面時的無限鏡像。

關於靜態對象,它不是類的實例。靜態對象在類級別創建。

我們在設計SingleTon類時使用同一類的靜態對象。

1

因爲你暴露的代碼幾乎是一樣的:當你修改字段靜態字段

public class ObjectTest { 
    ObjectTest instanceObj; 

    public ObjectTest(String s) { 
     instanceObj = new ObjectTest("Outside"); // creating another object executing this constructor again 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 

} 

你做這樣的事情:

public class ObjectTest { 
    static ObjectTest instanceObj; 

    static { 
     instanceObj = new ObjectTest("Outside"); 
    }  

    public ObjectTest(String s) { 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 

} 

執行構造函數只有一次。

相關問題