2012-08-12 47 views
4

我想向方法發送字符串並在那裏更改字符串。 該方法應該返回void。 示例:在Java中更改字符串

String s = "Hello"; 
ChangeString(s); 

String res = s; 
//res = "HelloWorld" 
------------------------------------------- 

private void ChageString(String s){ 
s = s + "World"; 
} 

我該如何在Java中執行此操作? 可以在不添加其他課程的情況下完成嗎?

謝謝! PB

+1

見http://stackoverflow.com/questions/11164675/mutable-strings-in-java – fdomig 2012-08-12 18:32:03

+0

如果你確實需要在返回void的方法中做到這一點,那麼就有一個骯髒的破解。 - > http://blogs.atlassian.com/2008/07/magic_trick_in_java但那通常不是要走的路! – zip 2012-08-12 18:40:08

+0

似乎[請在此輸入鏈接的描述] [1] [1]的副本:http://stackoverflow.com/questions/9183703/passing-a-string-to-a-function – Cyber 2012-08-12 18:50:05

回答

8

你的方法不能用的,因爲兩個原因當前工作界面:

  • 字符串是不可改變的。一旦你創建了一個字符串,你不能以後改變那個字符串對象。
  • Java使用按值傳遞,而不是通過引用傳遞。當您在方法中爲s分配新值時,它只會修改本地s,而不是調用代碼中的原始s

要使您的方法正常工作,您需要更改界面。最簡單的變化是返回一個新的字符串:

private String changeString(String s){ 
    return s + "World"; 
} 

然後調用它像這樣:

String s = "Hello"; 
String res = changeString(s); 

看到它聯機工作:ideone

+1

private String changeString(...),返回類型不應該是void。 – kosa 2012-08-12 18:32:23

+0

如何從返回無效的方法返回值? – 2012-08-12 18:32:41

+0

他們是,是的。但有一些討厭的黑客在某些情況下工作,這使他們變得可變:) – dantuch 2012-08-12 18:33:09

0

不,一個Java字符串是不可改變的,不能改變。您可以返回一個新的String並將其分配給相同的變量。

更進一步:字符串被聲明爲final的,所以你不能擴展字符串添加新的行爲而返回void

1

不,不能這樣做。

Java按值傳遞參數。字符串是不可變的,所以你不能改變它的值。你運氣不好。

你可以這樣做:

private String changeString(String original) { 
    return original + " World"; 
} 
0

使用的StringBuffer/StringBuilder的改變的字符串。在java中的字符串是不可變的,這意味着一旦賦值給它們,它們就不能被改變,似乎改變字符串的代碼實際上會產生一個新的對象。 Here's字符串緩衝區上的東西,希望它有幫助。 :)

1

你可以在一個對象包裹你的字符串:

public class StringWrapper { 
    String _str; 
    public StringWrapper(String str) { set(str); } 
    public void set(String str) { _str = str; } 
    public String toString() { return _str; } 
} 

讓你做:

StringWrapper s = new StringWrapper("Hello"); 
ChangeString(s); 

String res = s + ""; 
//res = "HelloWorld" 
private void ChageString(StringWrapper s) { 
    s.set(s + "World"); 
} 
0

使用StringBuffer代替弦,它就會解決您的問題。

public static void main(String[] args) { 
    StringBuffer s = new StringBuffer("Hello"); 
    changeString(s); 
    String res = s.toString(); 
    //res = "HelloWorld" 
} 

private static void changeString(StringBuffer s){ 
    s.append("World"); 
} 

或者,如果你真的需要所以這裏只使用字符串爲解決使用反射:

public static void main(String[] args) { 
    String s = "Hello"; 
    changeString(s); 
    String res = s; 
    //res = "HelloWorld" 
} 

private static void changeString(String s){ 
    char[] result = (s+"World").toCharArray(); 
    try { 
     Field field = s.getClass().getDeclaredField("value"); 
     field.setAccessible(true); 
     field.set(s, result); 

    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | 
      IllegalAccessException e1) { 
     e1.printStackTrace(); 
    } 
}