Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java字符串变量未设置_Java_String_Null - Fatal编程技术网

java字符串变量未设置

java字符串变量未设置,java,string,null,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);

这是我正在处理的类文件的一个简化版本,我刚刚用这些类来说明我的问题

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


非常感谢您提供的任何帮助/指导。

因为字符串是不可变的,所以您在方法内部所做的任何更改都将是该方法的局部更改

private void setString(String s) {
   s = "hello";
}
这是无法改变的

我可以想出两个选择

选择1

将s设为实例变量字段并更改方法

公开课考试{ 私有字符串string1=null; 私有字符串string2=null; 私有字符串

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

传入StringBuilder/StringBuffer而不是String。

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

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

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

如果您误解了java参数传递,请尝试public void setString1String s{string1=s;}

ur应用程序正在参数s中分配hello word。但是变量s是一种参数类型,因此s的反射将在setString方法块中…而不是在其他任何地方…使用实例变量或静态变量查看ur分配的反射。

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

试试类似的东西

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

您试图将string1和string2的值初始化为什么?这两个成员变量开始时为null

如果我将测试类视为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();
  }
}

通过进行此项分配

 s = "hello";
我们正在创建一个新对象。该对象的内存地址将与使用SetString字符串1传递的内存地址不同

我们需要更改在接收到的对象

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

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

正如@adarshr所指出的,我们可以使用可变的StringBuilder或StringBuffer来更改其内容。但我们不能在代码中仅用StringBuilder替换String。我们必须确保:

StringBuilder在传递给setString之前已初始化。 StringBuilder不会在setString中再次创建,我们使用的是传递的同一个。 因此,在代码中替换此选项应该可以:

private StringBuilder string1 = new StringBuilder();
private StringBuilder string2 = new StringBuilder();

private void setString(StringBuilder  s) {
    s.append("hello");
}

这只解释了故事的一部分;另一部分是s是对字符串对象的引用,可以修改。@OliCharlesworth s是对字符串对象引用的副本。因此,即使您通过重新赋值来修改引用,原始字符串也不会被更改,因为在第一个pl中字符串不是不可变的acePlease使用正确的英语,而不是ur和y。哦,是的,将方法更改为public。@Lion这是OP对问题的演示。不必是灌木丛,但在更大的类文件中,需要类似的内容。@Andrew Strange,编译对我来说很好。他的要求中没有任何内容表明需要设置器。你为什么要添加这样的内容我?我只是想说明POJO的一个普遍做法。这些方法并不是答案的一部分。我理解-我只是指出,一般的方法应该是使对象尽可能不可变,除非你必须使它们可变,而不是相反。