Java - 复制变量的值而不是引用它

时间:2014-07-28 14:23:46

标签: java

我知道这是一个基本的Java问题,但我从未见过这个问题的完整解决方案。基本上,我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值。

这是我的代码:

private void someMethod() {

    String tmpCommand = commandName;
    commandName = modelItem.getName();

}

此处,tmpCommand的值将更改为modelItem.getName()值,因为它引用commandName 。但是,如果我希望在tmpCommand值更改时commandName不更改值,该怎么办?我是否必须创建一个新对象tmpCommand

2 个答案:

答案 0 :(得分:12)

  

此处,如果tmpCommand的值会更改为modelItem.getName()值,因为它引用了commandName

不,它不会。 tmpCommand的值分配时commandName的值。

这很容易证明:

String original = "foo";
String test = original;
original = "bar";
System.out.println(test); // Prints foo

请注意,更改original的值与更改original的值所引用的对象内的数据相同。让我们用可变类型做一个不同的例子 - StringBuilder

StringBuilder original = new StringBuilder("foo");
String test = original;
original.append("bar");
System.out.println(test); // Prints foobar

此处,testoriginal仍然具有相同的值:该值是{em>引用到StringBuilder对象。对append的调用根本不会更改该引用...它会更改引用引用的对象中的数据。区分变量,引用和对象 非常重要。

因此,如果你想避免这种情况,你需要创建一个具有相同内容的新对象 - 有些类提供了这样做的方法;别人不这样做。例如,您可以使用:

StringBuilder original = new StringBuilder("foo");
String test = new StringBuilder(original);
original.append("bar");
System.out.println(test); // Prints foo

当提供clone()方法时,也可以使用。但基本上这个想法是有时你想要两个变量来保存对独立对象的引用。

答案 1 :(得分:0)

您的代码将按原样运行,因为一旦commandName被分配modelItem.getName(),它就不再引用与tmpCommand相同的对象。也就是说,字符串是不可变的,所以无论如何你都无法改变这些对象的内容。