2013-12-08 24 views
1
public static void main(String[] args) 
{ 
    String name = "john"; 
    StringTest obj = new StringTest(name); 
    name = "peter"; 
    System.out.println(obj.name); 
} 

}修改字符串/ Integer對象,並檢查是否會影響其具有的對象作爲參數現在

class StringTest{ 
String name; 
StringTest(String name) 
{ 
    this.name = name; 
} 

}

類對象,因爲字符串名稱已經從再分配「約翰「到」彼得「我希望它打印彼得,但它打印約翰。字符串是不可變的,當它被重新分配時會導致創建一個新對象,或者對此有什麼正確的解釋?

此外,當我用Integer對象嘗試這個,行爲是一樣的!任何人請解釋此行爲的原因

回答

2

Java使用傳遞值,這意味着您通過的值name,而不是參考。
在您創建StringTest實例後更改name的值不會以任何方式影響您的StringTest

+0

雅所以一個字符串名稱的引用副本將被傳遞給該方法..所以一旦我改變了字符串名稱,它應該得到反映在具有引用的對象,對! –

+1

不,當你寫'name =「peter」;'時,你創建一個新的'String'並將'name'指向'String'。這不會影響StringTest實例中的類變量'name',它仍然會指向'「john」'。 – Keppil

+0

好吧知道了..tq。我只是認爲引用將被傳遞而不是實際的字符串 –

0

我覺得這裏拋出你的是,你不必使用「新」關鍵字來創建字符串。代碼讀取更像創建一個基本類型,如int或long,而不是對象創建。這是實際發生的事情。 創建兩個字符串的等效方法是

String name = new String(new char[] {'j','o','h','n'}); 
StringTest obj = new StringTest(name); 
name = new String(new char[] {'p','e','t','e','r'}); 

寫入的方式,我認爲你爲什麼沒有實現在StringTest引用的字符串的副作用是比較清楚的。它與字符串確實是不可變的事實無關。

相關問題