2009-12-22 27 views

回答

9

在Java參數通過值傳遞時,對象參數傳遞給對象的引用,這意味着您可以更改參數的引用,但不會更改您傳遞引用的對象。您有兩種可能性,返回新對象(首選)或將引用傳遞給可以接收新引用(集合,數組等)的容器)例如:

private static String changeStringAndReturn(String s) { 
    return new String("new string"); 
} 
private static void changeStringInArray(String[] s) { 
    if (null != s && 0 < s.length) { 
     s[0] = new String("new string"); 
    } 
} 
+5

在Java中,參數是按值傳遞! – Tarquila 2009-12-22 14:23:10

+2

有趣的是代碼是正確的,但「文檔」是誤導。我想知道他的代碼是否也會發生同樣的情況? – OscarRyz 2009-12-22 14:28:50

+0

@ rsp--你能否改正你的文檔,因爲它是被接受的答案 – TStamper 2009-12-22 15:34:08

5

Java中的引用通過,所以即使您修改函數內的引用,更改也不會反映回調用函數,因爲您在函數內修改的內容只是原始副本參考不是原始參考本身。

但是你可以從你的changeString方法返回新的字符串,而不是試圖修改那裏(函數內部)的引用本身。

4

只有當你做的函數

private static void changeString(String[] s) { 
    s[0] = new String("new string"); 
} 

字符串是不可變的,並且Java沒有一個「指針到一個參考」作爲第一類數據類型的概念。如果你不喜歡上面的內容,你可以創建一個包含單個字符串字段的類。

0

這在Java中不可行,因爲Java中的所有內容都是按值傳遞的。在這種情況下,參數是對象引用,它是傳遞給方法的引用的值,而不是引用本身。

2

A:您不能在Java對象引用中傳遞值。

如果你真的需要,你可以創建一個包裝like this,並使用它,你期望的方式:

private static void changeString(_<String> str) { 
    str.s("new string"); 
} 

public static void main(String[] args) { 
    _<String> s = new _<String>("old string"); 
    changeString(s); 
    System.out.println(s); // prints "new string" 
} 
2

你當然可以從你的changeString方法返回新的字符串,而不是試圖改變它。

或者,您可以創建一個包裝或包含一個字符串的對象,並將其傳入。ChangeString方法將更改您的對象內部的字符串,並且主方法仍將持有對該對象的引用。

否則,你不能這樣做。字符串是不可變的,並且java始終將對象作爲指向特定對象的值傳遞。改變你指向的位置,並且不再引用同一個對象。

1

字符串在Java中是不可變的,參數是按值傳遞的,因此您不能更改它們(在C#中不等同於ref)。您可以傳入StringBuilder並輕鬆更改其內容。

0

它的醜陋,但你可以將字符串更改爲全局靜態:

private static String s; 

    private static void changeString(String t) { 
     if(s.equals(t)) 
      s = new String("new string"); 
    } 

    public static void main(String[] args) { 
     s = new String("old string"); 
     changeString(s); 
     System.out.println(s); // expect "new string" 
    } 
相關問題