2013-12-03 67 views
0

我有這段代碼的Java程序的靜態方法中:Java的內存管理的神祕

import org.w3c.dom.Document; 
... 
Document tempdoc1=tempdoc; 
//tempdoc1=xmlModifier.setMacro(tempdoc, liquidity, "liquidity"); // this slightly modifies the document 
tempdoc1=null; 
if (tempdoc1==null){ 
tempdoc1=tempdoc; 
} 
...do something with tempdoc1 

什麼我不明白的是:如果我拿出評論「//」我從後面的代碼執行中獲得不同的結果,而從我的基本理解來看,它應該完全相同,因爲在任何情況下,變量tempdoc1都將在下面的行中重新定義!有人知道爲什麼嗎?

編輯:我看不出類xmlModifier的靜態方法setMacro如何修改tempdoc引用的對象。例如,該代碼

public static void main(String[] args) { 
    String test="test"; 
    String test2=dosomething(test);  
    System.out.println(test); 

} 

public static String dosomething(String str){ 
    str="mod"; 
    return str; 
} 

只是打印「測試」,即方法dosomething不會修改測試引用的對象。有沒有情況下,情況並非如此?

+1

你是什麼意思,當你說「我得到不同的結果」?你期望什麼結果?你會得到什麼結果? – neutrino

+0

這意味着在twu情況下xml文檔tempdoc1是不同的(setMacro方法實際上修改了樹的一部分) – splinter123

回答

1

那麼想必聲明:

xmlModifier.setMacro(tempdoc, liquidity, "liquidity"); 

xmlModifier,或tempdoc,或liquidity一定的效果 - 因此與註釋掉,看不到這種效果。

我的猜測是該方法修改tempdoc,然後返回它,你期望它返回一個副本。 Java中的對象不以這種方式工作。實際上,它根本不會修改tempdoc - 它會修改tempdoc的值所引用的對象。如果該方法返回對同一個對象的引用,那不會創建一個新對象 - 它只是意味着你有兩個引用到一個對象,如兩張紙,每個都有相同的房屋地址。

+0

感謝您的答案,我在原文中回覆。 – splinter123