2015-10-26 72 views
2
Test d1= new Test(); 

public static void main(String[] args) { 
    Test d1 = new Test(); 
    System.out.println(d1); 
} 

同樣的對象被創建,但在不同的位置發生了什麼。第一個是在一個類內,但在一個方法之外,第二個在同一個類的一個方法之內..可能.. ??代碼compliles細但在運行時存在一些例外,如:atTest<init><Test.java:3>是完全相同的對象創建可能在Java中的不同位置?

+0

它不是同一個對象。 – Eran

+0

'd!= d1'因此它們是不同的物體。 –

+0

是的,你最終會在'stackoverflow錯誤' –

回答

1

是,上面的代碼是有效的,2個不同的對象在 存儲器

class Test{ 
    Test d = new Test(); // instance object 

    public static void main(String[] args) { 
    Test d1 = new Test(); // local to this method 
    System.out.println(d1); 
    } 
} 

另外創建由@所建議的sᴜʀᴇsʜᴀᴛᴛᴀ,由於在頂層創建對象而產生java.lang.StackOverflowError

+0

有效,但會產生'stackoverflow錯誤' –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀyup correct –

3

如果同一對象是創造,但在不同的地點?

2個對象創建。也許,如果你願意,你不能創建N個這樣的對象。

第一個在類內,但在方法外,第二個在同一個類的方法內。可能嗎?

是。

最頂層的人是Test類的實例成員,您在該方法內創建的一個對該方法而言是本地的。

代碼compliles不錯,但在運行時沒有像一些例外:在測試

也就是說計算器錯誤。您正在嘗試在頂級Test類中創建Test對象,因此構造函數繼續在遞歸中調用並因此導致錯誤。

Exception in thread "main" java.lang.StackOverflowError 
    at Test.<init>(Test.java:2) 
2

您正在遞歸創建Test的新實例,直到內存不足。

所以讓我們來看看它一步一步:

main方法

您有:

Test d1 = new Test(); 

這將創建一個新的實例Test,因此這對Test初始化,您可以創建一個新的變量:

Test d = new Test(); 

如此創建新對象,但是與之前創建新i相同的Test nstance一遍,這又創造了Test一個新實例:

Test d = new Test(); 

,直到耗盡內存,這將無限期地發生。

相關問題