Java字符串值的功能发生了变化

Yur*_*ura 24 java string function pass-by-reference

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

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

main(){
    String myStr = new String("");
    changeString(myStr);
}
Run Code Online (Sandbox Code Playgroud)

main返回时,该值仍然"""Hello world".这是为什么?

另外,我如何使其工作?假设我希望我的函数changeString将其变为"Hello world"的字符串.

Nul*_*ion 35

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

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

main() {

    String myStr = new String("");
    myStr = changeString();
}
Run Code Online (Sandbox Code Playgroud)

虽然方法名称在这里用词不当.如果您使用原始想法,则需要以下内容:

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

main() {

    ChangeableString myStr = new ChangeableString("");
    changeString(myStr);
}
Run Code Online (Sandbox Code Playgroud)

你的ChangeableString课可能是这样的:

class ChangeableString {
    String str;

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

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

    public String toString() {
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

关于参考文献的快速教训:

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

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

void doSomething(Thing obj) {
    obj.changeMe();
}
Run Code Online (Sandbox Code Playgroud)

如果doNothing(obj)main()(或任何地方)obj调用,将不会在被调用者中进行更改,因为doNothing创建了一个new Thingobj 在方法范围内指定了新引用.

另一方面,在doSomething你正在召唤obj.changeMe(),并且那些取消引用obj- 这是通过价值传递 - 并改变它.

  • @Yura如果没有看到更具代表性的代码示例,很难提供帮助,但从您的说法来看,您的代码需要重构.使用`char []`(或只包含一个`String`的`String []`!)只是一种解决问题而不是纠正它的方法.我理解回归C++惯用语的诱惑,如果这是你习惯的,但它会阻碍你学习新语言的进展. (2认同)

sta*_*lue 7

Java使用 startegy进行调用来评估调用.

也就是说,该值被复制到str,因此如果您指定str的值不会更改原始值.