2013-12-03 31 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