函数中的Java字符串值更改

新手上路,请多包涵

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

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

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

main 返回时,值仍然是 "" 而不是 "Hello world" 。这是为什么?

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

原文由 Yura 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 495
2 个回答

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

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

If you call doNothing(obj) from main() (or anywhere for that matter), obj won’t be changed in the callee because doNothing creates一个新的 Thing 并将该新引用分配给 obj _在方法的范围内_。

另一方面,在 doSomething 你正在调用 obj.changeMe() ,并且取消引用 obj 它是按值传递的 - 并更改

原文由 NullUserException 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

也就是说,值被复制到 str ,所以如果你分配给 str 不会改变原始值。

原文由 starblue 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题