函数中的 Java 字符串值更改

2022-09-01 12:55:12

我有一个非常尴尬的问题...

void changeString(String str){
    str = "Hello world":
}

main(){
    String myStr = new String("");
    changeString(myStr);
}

返回时,值是静止的,而不是 。为什么?main"""Hello world"

另外,我如何使它工作?假设我希望我的函数将它得到的字符串更改为“Hello world”。changeString


答案 1

每个人都解释了为什么它不起作用,但没有人解释如何使它工作。最简单的选择是使用:

String changeString() {
    return "Hello world";
}

main() {

    String myStr = new String("");
    myStr = changeString();
}

尽管方法名称在这里用词不当。如果你要使用你最初的想法,你需要这样的东西:

void changeString(ChangeableString str) {
    str.changeTo("Hello world");
}

main() {

    ChangeableString myStr = new ChangeableString("");
    changeString(myStr);
}

您的类可能如下所示:ChangeableString

class ChangeableString {
    String str;
    
    public ChangeableString(String str) {
        this.str = str;
    }

    public void changeTo(String newStr) {
        str = newStr;
    }

    public String toString() {
        return str;
    }
}

关于参考文献的快速课程:

在Java方法中,所有内容都是按值传递的。这包括引用。这可以通过以下两种不同的方法来说明:

void doNothing(Thing obj) {
    obj = new Something();
}

void doSomething(Thing obj) {
    obj.changeMe();
}

如果从调用(或从任何位置调用),则不会在被调用方中更改,因为会创建一个新的引用,并在方法的作用域中将该新引用分配给该引用。doNothing(obj)main()objdoNothingThingobj

另一方面,在你调用中,并且取消引用 - 这是通过值传递的 - 并更改它。doSomethingobj.changeMe()obj


答案 2

Java 使用按值 startegy 调用来评估调用。

也就是说,该值将复制到 ,因此,如果赋值到 该值,则不会更改原始值。strstr