8

メソッドに文字列を送信し、そこで文字列を変更したいと思います。メソッドはvoidを返す必要があります。例:

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

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

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

Javaでそれを行うにはどうすればよいですか?別のクラスを追加せずに実行できますか?

ありがとう!PB

4

6 に答える 6

14

次の2つの理由により、メソッドは現在のインターフェースで機能しません。

  • 文字列は不変です。文字列を作成すると、後でその文字列オブジェクトを変更することはできません。
  • Javaは、参照渡しではなく、値渡しを使用します。メソッドで新しい値を割り当てると、呼び出し元のコードの元の値ではなくs、ローカルの値のみが変更されます。ss

メソッドを機能させるには、インターフェースを変更する必要があります。最も簡単な変更は、新しい文字列を返すことです。

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

次に、次のように呼び出します。

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

オンラインで動作することを確認してください:ideone

于 2012-08-12T18:31:31.810 に答える
2

Stringの代わりに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();
    }
}
于 2014-03-20T16:53:54.020 に答える
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");
}
于 2012-08-12T18:44:49.847 に答える
1

いいえ、帰国中はできませんvoid

Javaはパラメータを値で渡します。文字列は不変であるため、その値を変更することはできません。あなたは運が悪い。

あなたはこれを行うことができます:

private String changeString(String original) {
    return original + " World";
}
于 2012-08-12T18:32:24.207 に答える
0

いいえ、Java文字列は不変であり、変更できません。新しい文字列を返し、それを同じ変数に割り当てることができます。

さらに:Stringはfinalとして宣言されているため、Stringを拡張して新しい動作を追加することはできません

于 2012-08-12T18:31:54.043 に答える
0

StringBuffer / StringBuilderを使用して、文字列を変更します。Javaの文字列は不変です。つまり、値が割り当てられると変更できなくなり、文字列を変更しているように見えるコードが実際に新しいオブジェクトを作成します。これが文字列バッファに関するものです。お役に立てば幸いです。:)

于 2012-08-12T18:34:08.870 に答える