java字符串变量未设置

Ari*_*Ari 0 java string null

这是我正在处理的类文件的简化版本,我刚刚使用这些类来显示我的问题.

public class Test {
    private String string1 = null;
    private String string2 = null;

    private void setString(String s) {
        s = "hello";
    }

    private void set() {
        setString(string1);
        setString(string2);
    }

    public void print() {
        System.out.println(string1);
        System.out.println(string2);
    }

    public void initialise() {
        set();
        print();
    }  
}

public class StringTest {
    public static void main(String[] args) {
        Test test = new Test();
        test.initialise();
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,基本上,在此之后,两个字符串变量仍为null.是什么导致这个问题?我怎么能绕过它呢?(仍在学习java的基础知识 - 如果相关的话).

非常感谢任何帮助/指导.

ada*_*shr 6

因为String是不可变的,所以您在方法中所做的任何更改都将是该方法的本地更改.

private void setString(String s) {
   s = "hello";
}
Run Code Online (Sandbox Code Playgroud)

s 无法改变.

我可以想到两个选择.

选项1

创建s一个实例变量(字段)并更改您的方法.

public class Test {private String string1 = null; private String string2 = null; private String s;

private void setString(String s) {
    this.s = "hello";
}
Run Code Online (Sandbox Code Playgroud)

选项2

传入StringBuilder/ StringBuffer代替String.

  • 这只是故事的一部分; 另一部分是`s`是对`String`对象的引用,*可以*被修改. (3认同)

ass*_*ias 5

您的问题是Java是按值传递的,因此您的setString方法不会执行任何操作.要更改值string1,您需要string1 = xxxx;在代码中的某处.例如:

private void set() {
    string1 = getDefaultString();
    string2 = getDefaultString();
}

private String getDefaultString() {
    return "hello";
}
Run Code Online (Sandbox Code Playgroud)