本文介紹了為什么沒有更新該對象的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我編寫了這段代碼,我想知道為什么引用的對象的值沒有更改
Java中的所有調用都是按值調用的。但當調用引用同一對象時,為什么不更新該對象
class Main {
public static void main(String[] args) {
Integer n = 3;
triple(n);
System.out.println("Hello world! " + n);
}
public static void triple(Integer x)
{
x *= 8;
System.out.println("Hello world! " + x);
}
}
實際產量
Hello world! 24
Hello world! 3
但我認為輸出應該是
Hello world! 24
Hello world! 24
是否因為Integer類的取消裝箱和自動裝箱而創建了與‘x’同名的新對象,因為Integer是本地可用的不可變對象,并且不指向傳遞的參數/對象-n。
推薦答案
將Integer n
傳遞給triple
方法時,實際上是在傳遞Integer
對象n
的引用的值。
因此,在triple
方法中,另一個局部變量x
在被調用時指向this引用值。在方法內部,當它將此Integer對象的值乘以8
時,它將創建Integer
的另一個新實例,因為Integer
是不可變的,局部變量x
將指向該實例。
因此您不會在print語句中看到這個新值,因為n
仍然指向Integer的舊實例,該實例仍然是3
。
如果您使用StringBuilder
嘗試此操作,您將獲得預期的結果:
public static void main(String[] args) {
StringBuilder n = new StringBuilder("foo");
triple(n);
System.out.println("Hello world! " + n);
}
public static void triple(StringBuilder s) {
s.append("bar");
System.out.println("Hello world! " + s);
}
此處的輸出將為:
Hello world! foobar
Hello world! foobar
這是因為StringBuilder
是可變的,如果triple
通過追加數據來修改數據,則原始指針n
和新指針s
將指向對象引用的相同值。
這篇關于為什么沒有更新該對象的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,