我可以更改传递给我的方法的String对象的值吗?

mer*_*esi 25 java string parameters immutability pass-by-reference

我发现以下问题是Java"pass-by-reference"还是"pass-by-value"?.

我几乎阅读了所有内容,但是如果我想要这个foo(-)方法,我还不知道该怎么做才能改变我String价值?(也许或不参考,对我来说无关紧要).

void foo(String errorText){ 
    errorText="bla bla";
}

int main(){ 
    String error="initial"; 
    foo(error); 
    System.out.println(error);
}
Run Code Online (Sandbox Code Playgroud)

我想bla bla在控制台上看到.可能吗?

Jac*_*nds 38

您无法errorTextfoo当前声明的方法中更改in 的值.即使您传递字符串的引用errorTextfoo,Java的Strings为不可变的-你不能改变它们.

但是,您可以使用StringBuffer(或StringBuilder).可以在您的foo方法中编辑这些类.

public class Test {
    public static void foo(StringBuilder errorText){ 
        errorText.delete(0, errorText.length());
        errorText.append("bla bla");
    }

    public static void main(String[] args) { 
        StringBuilder error=new StringBuilder("initial");
        foo(error); 
        System.out.println(error);
    }
}
Run Code Online (Sandbox Code Playgroud)

其他解决方案是使用包装类(创建一个类来保存String引用,并更改引用foo),或者只返回字符串.


Eri*_*son 7

使用方法的返回值或创建包装类.

让它返回值:

String foo(String errorText){ 
    return "bla bla";
}

int main(){ 
    String error="initial"; 
    error = foo(error); 
    System.out.println(error);
}
Run Code Online (Sandbox Code Playgroud)

将值包装在对象中:

class StringWrapper {
    private String string;
    public StringWrapper(String s) {
        this.string = s;
    }
    public String getString() {
        return this.string;
    }
    public void setString(String s) {
        this.string = s;
    }
}

void foo(StringWrapper errorText){ 
    errorText.setString("bla bla");
}

int main(){ 
    StringWrapper error=new StringWrapper("initial"); 
    foo(error); 
    System.out.println(error.getString());
}
Run Code Online (Sandbox Code Playgroud)