2012-08-12 44 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(); 
    } 
}