函数中的Java字符串值变化

标签 java string function pass-by-reference

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

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

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

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

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

最佳答案

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

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

关于引用的快速类(class):

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

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

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

如果您从 main()(或任何地方)调用 doNothing(obj),则 obj 不会在被调用者,因为 doNothing 创建了一个新的 Thing 并将该新引用分配给 obj 在方法的范围内

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

关于函数中的Java字符串值变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486393/

相关文章:

java - JPA2.1/Hibernate 5.2 使用 Hibernate Tools 通过 ANT Maven 任务生成 ddl

c++ - 循环并使用数字的索引作为文件名

R 如何使用格式代码/字符串将一列字符串拆分为多列?

javascript - 在 Javascript 中扩展对象

java - Jackson 序列化类文字

java - 将 servlet 请求重定向到另一个 servlet

java - IntelliJ : How to import a folder of . java 文件作为库?

php - 如果仅前一个或下一个字符不包含相同字符,则替换字符串中的字符

python - 使用 csv 列作为函数参数

c++ - 头文件使用其他头文件函数