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的一个普遍做法。这些方法并不是答案的一部分。我理解-我只是指出,一般的方法应该是使对象尽可能不可变,除非你必须使它们可变,而不是相反。