Java-复制变量';s值,而不是引用它

Java-复制变量';s值,而不是引用它,java,Java,我知道这是一个基本的Java问题,但我从未见过这个问题的完整解决方案。基本上,我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值 这是我的密码: private void someMethod() { String tmpCommand = commandName; commandName = modelItem.getName(); } 这里,tmpCommand的值将更改为modelItem.getName()值,因为它引用了commandName .

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

这是我的密码:

private void someMethod() {

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

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

这里,if
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
仍然具有相同的值:该值是对
StringBuilder
对象的引用。调用
append
根本不会更改该引用。。。它更改引用的对象中的数据。区分变量、引用和对象非常重要

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

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

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

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

哦,真的吗?嗯,我正在读的这本书一定有错误,哈哈。我需要亲自证明这一点。否则,你误解了这本书。这也是一个选择,你知道,更有可能。是的,你是对的。我没有仔细阅读,这就是我后来感到困惑的原因。“我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值。”这就是Java所做的,Java不支持任何其他方法。它不能做你说不想要的(不像C++,如果你真的想,但是不是默认的,它可以做到)因为它引用了命令名。典型的误解,可能来自C/C++等语言。它不引用commnadLine,而是引用commandLine引用的对象。这里的赋值意味着将引用从var命令行复制到var tmpCommand。