0

这是我正在处理的类文件的一个非常简化的版本,我刚刚使用这些类来展示我的问题。

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 的基础知识——如果相关的话)。

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

4

7 回答 7

6

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

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

s无法更改。

我可以想到两个选择。

选项1

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

公共类测试 { 私有字符串 string1 = null; 私有字符串 string2 = null; 私有字符串;

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

选项 2

传入StringBuilder/StringBuffer而不是String.

于 2012-05-02T13:51:56.827 回答
5

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

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

private String getDefaultString() {
    return "hello";
}
于 2012-05-02T13:52:28.480 回答
1

您正在设置“s”的值而不是 string1 或 string2

尝试类似的东西。

private void setString(String s) {
        string1 = "hello";
        string2 = "world";
    }
于 2012-05-02T13:57:22.727 回答
1

通过进行此分配

 s = "hello";

磨损创建一个新对象。它将具有与传递的内存地址不同的内存地址setString(string1);

我们需要更改收到的对象

 private void setString(StringBuilder  s) { ... }

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

由于 Java 的 String 是不可变的,我们不能改变它的内容:只需创建一个新的 String 对象。

正如@adarshr 指出的那样,我们可以使用可变的StringBuilderorStringBuffer来更改它们的内容。但我们不能只在你的代码中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");
}
于 2012-05-02T14:30:00.033 回答
0

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

于 2012-05-02T13:53:45.817 回答
0

你试图初始化和的值是string1什么string2?两个成员变量开始是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();
  }
}
于 2012-05-02T13:59:39.797 回答
-2

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

于 2012-05-02T13:54:25.320 回答