这是我正在处理的类文件的简化版本,我刚刚使用这些类来显示我的问题。
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的基础 - 如果相关的话)。
非常感谢任何帮助/指导。
答案 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指出的那样,我们可以使用可变的StringBuilder
或StringBuffer
,并更改其内容。但我们不能在您的代码中将String
替换为StringBuilder
。我们必须确保:
StringBuilder
在传递给setString()
之前已初始化。StringBuilder
内部setString()
未再次创建private StringBuilder string1 = new StringBuilder();
private StringBuilder string2 = new StringBuilder();
private void setString(StringBuilder s) {
s.append("hello");
}
(我们使用的是我们传递的相同内容)。因此,在代码中替换它应该有效:
{{1}}
答案 4 :(得分:0)
你误解了java参数传递,试试public void setString1(String s) { string1 = s; }
答案 5 :(得分: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();
}
}
答案 6 :(得分:-2)
你的应用程序在参数s中分配hello字。但是变量s是一个参数类型,即s的反射将在setString()方法块中...而不是其他任何地方...使用实例变量或静态变量,以查看你的任务的反映。