2014-12-25 32 views
-3
public static void main(String[] args){ 
    String str1 = "Hello"; 
    System.out.println(str1); 
    tell(str1); 
    System.out.println(str1); 
} 

public static void tell(String str2){ 
    str2 = "Hi"; 
} 

output: Hello 
     Hello 

這個例子適合字符串不可變嗎?我認爲引用str2可能會改變str1字符串值,導致它們都引用相同的地址。如果String類是可變的,則輸出可能是Hello Hi,並且由於不可變的特性,最終結果是Hello Hello。這個例子適合在java中不可變的字符串嗎?

這個例子是否正確?

http://www.explain-java.com/is-string-mutable-in-java-why-wrapper-classes-immutable-in-java/

此網頁具有相同的例子我。我真的錯了嗎?

如果我說得對,我會投票給我,讓更多的人知道String不變的真相。

+0

你需要做的'STR1 =告訴(STR1);'並改變從'void'到'String'回報,因爲Java是通過按值因此,當您在'tell'方法中重新分配時,重新分配不會退出方法本身的關閉。 – Rogue

回答

2

這不是一個不可變性的例子,而是對象引用是通過值而不是通過引用傳遞的。因此分配給參數不會改變傳遞給它的變量的值。

雖然tell()清楚地分配給"Hi"其中str2是它的參數,它不內main()改變str1值。

2

字符串不可變意味着你不能alter該字符串;它沒有提到用新字符串替換String變量的內容。

您的輸出與Strings的可變性(或不可以)無關,因爲您從不嘗試更改字符串。你嘗試改變函數內的一個參數,但因爲Java按值傳遞所有內容,而str2實際上是tell內的"Hi",所以該分配對str1(如你所見)沒有影響。

1

Java通過所有值,而不是通過引用。事實上,該參考文件的副本已通過。由於字符串是不可變的,因此您的分配會創建一個新的String對象,該對象現在指向該引用的副本。原始參考仍然指向「你好」。 檢查這個article以更好地理解爲什麼以及哪些是好處

1

字符串不可變的例子嗎?

案例1: 在這種情況下,字符串「java2s」是不可變的。

class Main { 
    public static void main(String args[]) { 
     String s = "java2s"; 
     s.replace('a', 'Z').trim().concat("Aa"); 
     s.substring(0, 2); 
     System.out.println(s); 
    } 
} 

輸出:java2s

情況2: 在這種情況下字符串 「java2s」 是不可變的,但是新的字符串分配給 's' 的參考變量。

public class Main { 
    public static void main(String args[]) { 
    String s = "java2s".replace('a', 'Z').trim().concat("Aa"); 
    s.substring(0, 2); 
    System.out.println(s); 
    } 
} 

輸出:jZvZ2sAa

相關問題