Java-复制变量';s值,而不是引用它
我知道这是一个基本的Java问题,但我从未见过这个问题的完整解决方案。基本上,我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值 这是我的密码:Java-复制变量';s值,而不是引用它,java,Java,我知道这是一个基本的Java问题,但我从未见过这个问题的完整解决方案。基本上,我想将另一个变量的值复制到另一个变量中,然后让新创建的变量保留该值 这是我的密码: private void someMethod() { String tmpCommand = commandName; commandName = modelItem.getName(); } 这里,tmpCommand的值将更改为modelItem.getName()值,因为它引用了commandName .
private void someMethod() {
String tmpCommand = commandName;
commandName = modelItem.getName();
}
这里,tmpCommand
的值将更改为modelItem.getName()
值,因为它引用了commandName
. 但是,如果我希望tmpCommand
在commandName
值更改时不更改值,该怎么办?我是否必须创建一个新对象tmpCommand
这里,iftmpCommand
的值将更改为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。