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

我发现以下问题是Java是“按引用传递”还是“按值传递”?

我几乎阅读了所有内容,但还不知道如果我想要该方法,该怎么办,以更改我的?(也许也可以不参考,这对我来说并不重要)。foo(-)String

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

int main(){ 
    String error="initial"; 
    foo(error); 
    System.out.println(error);
}

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


答案 1

您无法更改 in 的值,因为该方法当前已声明。即使您将字符串的引用传递到 中,Java 也是不可变的 - 您无法更改它们。errorTextfooerrorTextfooString

但是,您可以使用 (或 )。可以在方法中编辑这些类。StringBufferStringBuilderfoo

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);
    }
}

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


答案 2

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

让它返回以下值:

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

int main(){ 
    String error="initial"; 
    error = foo(error); 
    System.out.println(error);
}

将值包装在对象中:

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());
}