繁体   English   中英

Java内存管理之谜

[英]Java memory management mystery

我将这段代码包含在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;
}

只需打印“ test”,即方法dosomething不会修改test引用的对象。 在某些情况下不是吗?

大概是这样的声明:

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

xmlModifiertempdocliquidity有一些影响-因此注释掉后,您看不到这种影响。

我的猜测是该方法会修改tempdoc ,然后返回它,并且您期望它返回一个副本。 Java中的对象无法那样工作。 事实上,它不会修改tempdoc在所有-它会修改的值对象tempdoc指。 如果该方法返回对同一个对象的引用,则不会创建新对象-只是意味着您对一个对象有两个引用,例如两张纸上都带有相同的内部地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM