2017-09-01 51 views
-1

在給定的代碼中,'s'是類String的對象。 當我們將's'傳遞給一個函數時,會創建一個s的副本,它將指向同一個字符串。 但即使如此,該函數所做的更改過法1這樣做,但我們去的時候用的方法也越來越體現在沒有得到反映2.在java中使用字符串

方法1:

class ST{ 
    public static void main (String[] args) { 
     String s="Test"; 
     change(s); 
     System.out.println(s); 
    } 
    static void change(String s) 
    { 
     s=s+"test"; 

    } 
} 

方法2:

class ST{ 
    public static void main (String[] args) { 
     String s="Test"; 
     s=change(s); 
     System.out.println(s); 
    } 
    static String change(String s) 
    { 
     return s+"test"; 

    } 
}  

我的問題是,如果每次創建原始引用的副本時,它也指向同一個字符串,那麼爲什麼方法一會失敗?

+0

我看不出有任何的問題在這裏。 –

+2

方法1正在改變本地作用域變量's'來指向一個字符串的新實例。一旦退出該功能,該新字符串將被丟棄。原始變量's'仍然指向原始字符串'Test'。 一旦超出方法範圍,返回'main'沒有任何改變。方法2將'main'的變量's'設置爲函數調用的結果,從而將's'改爲指向一個新的字符串。 –

+0

這裏的商店refrence和參考文獻中作出的變化應該反映在......只是問。 – user8542418

回答

4

字符串對象是不可變的!你不能改變它們,所以s=s+"test"創建一個全新的字符串。

所以來管理它的唯一途徑就是你的方法號2

+0

感謝您的答案......但是這是否意味着方法2中的's'已經開始指向全新的字符串「Testtest」 – user8542418

+0

不,這意味着您將返回一個NEW字符串對象,與's'不同用's' + test的值 – DamCx

+0

我在說's'在方法2的主要部分's = change(s);' – user8542418