我知道这是一个基本的Java问题,但我从未见过这个问题的完整解决方案。基本上,我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值。
这是我的代码:
private void someMethod() {
String tmpCommand = commandName;
commandName = modelItem.getName();
}
此处,tmpCommand
的值将更改为modelItem.getName()
值,因为它引用commandName
。但是,如果我希望在tmpCommand
值更改时commandName
不更改值,该怎么办?我是否必须创建一个新对象tmpCommand
?
答案 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
此处,test
和original
仍然具有相同的值:该值是{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
相同的对象。也就是说,字符串是不可变的,所以无论如何你都无法改变这些对象的内容。