java字符串变量未设置

时间:2012-05-02 13:50:20

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

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

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

7 个答案:

答案 0 :(得分:6)

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

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

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

选项2

传递StringBuilder / StringBuffer代替String

答案 1 :(得分:5)

您的问题是Java is pass by value,因此您的setString方法不会执行任何操作。要更改string1的值,您需要在代码中的某个位置string1 = xxxx;。例如:

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

private String getDefaultString() {
    return "hello";
}

答案 2 :(得分:1)

您要将“s”的值设置为string1或string2

尝试类似的事情。

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

答案 3 :(得分:1)

通过进行此分配

 s = "hello";

我们正在创建一个新对象。它将具有与通过setString(string1);

传递的内存地址不同的内存地址

我们需要更改

收到的对象
 private void setString(StringBuilder  s) { ... }

而不是创建一个新的。我们需要使用与此方法中传递的完全相同的对象。无法创建新的,因为调用方法不会注意到(Java中的参数永远不会输出参数)。

由于Java的String是 inmutable ,我们无法更改其内容:只需创建一个新的String对象。

正如@adarshr指出的那样,我们可以使用可变的StringBuilderStringBuffer,并更改其内容。但我们不能在您的代码中将String替换为StringBuilder。我们必须确保:

  1. StringBuilder在传递给setString()之前已初始化。
  2. StringBuilder内部setString()未再次创建private StringBuilder string1 = new StringBuilder(); private StringBuilder string2 = new StringBuilder(); private void setString(StringBuilder s) { s.append("hello"); } (我们使用的是我们传递的相同内容)。
  3. 因此,在代码中替换它应该有效:

    {{1}}

答案 4 :(得分:0)

你误解了java参数传递,试试public void setString1(String s) { string1 = s; }

答案 5 :(得分:0)

您要将string1string2的值初始化为什么?两个成员变量的开头是null

如果我将Test类视为POJO(普通的旧Java对象),我会按如下方式添加getter / setter方法:

public class Test {

  private String string1;
  private String string2;

  public String getString1() {
    return this.string1;
  }

  public String getString2() {
    return this.string2;
  }

  public void setString1(String s) {
    this.string1 = s;
  }

  public void setString2(String s) {
    this.string2 = s;
  }

  /*
   * Additional methods
   */
  public void set() {

    setString1("hello");
    setString2("world");
  }

  public void print() {

    System.out.println(this.string1);
    System.out.println(this.string2);
  }

  public void initialize() {

    set();
    print();
  }
}

答案 6 :(得分:-2)

你的应用程序在参数s中分配hello字。但是变量s是一个参数类型,即s的反射将在setString()方法块中...而不是其他任何地方...使用实例变量或静态变量,以查看你的任务的反映。