[英]Java - copying a variable's value instead of referencing it
我知道這是一個基本的Java問題,但我從未見過完整的解決方案。 基本上,我想將另一個變量的值復制到另一個變量中,然后讓新創建的變量保留該值。
這是我的代碼:
private void someMethod() {
String tmpCommand = commandName;
commandName = modelItem.getName();
}
在這里, tmpCommand
的值將更改為modelItem.getName()
值,因為它引用了commandName
。 但是,如果我希望tmpCommand
在commandName
值更改時不更改值怎么辦? 我必須創建一個新的對象tmpCommand
嗎?
在這里,如果
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
引用同一對象。 也就是說,字符串是不可變的,因此無論如何您都無法更改這些對象的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.