我期待 hello = "hello" 但它打印出 null。我可以知道是什么原因吗?
@Test
public void testGetABC(){
String hello= null;
assembleABC(hello);
System.out.println(hello); // null
}
public static void assembleABC(String hello){
hello = "hello";
}
已编辑
在 Java 中,参数是按值传递的,而不是按引用传递的,实际上您并没有修改hello
. 这意味着对象本身的内部状态可能会改变,但您在方法调用中使用的引用(变量)不会改变。
也许知道 C#,您可以在其中通过引用发送参数,但这在 Java 中是不可能的:
@Test
public void testGetABC(){
String hello= null;
assembleABC(byRef hello); // NOT really allowed, compilation error
System.out.println(hello);
}
public static void assembleABC(byRef String hello){ // NOT really allowed, compilation error
hello = "hello";
}
你可以做些什么来解决你的问题是改变你的代码是这样的:
@Test
public void testGetABC(){
String hello= null;
hello = assembleABC();
System.out.println(hello); // not null anymore
}
public static String assembleABC(){
return "hello";
}
在java中,函数的值是通过refrence方法按值传递的。因此,如果您更改保持对象的值,则将反映值的更改。但是,如果您更改了参考本身,那么它们将不会有任何影响。在 java 中,String 是不可变的对象。
检查以下示例以获得更多说明:
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
String hello = "hello";
StringBuffer strBuffer = new StringBuffer("hello");
changeMe(hello);
System.out.println(hello);
changeMe(strBuffer);
System.out.println(strBuffer);
changeMe2(strBuffer);
System.out.println(strBuffer);
}
public static void changeMe(String hello){
hello = null;
}
public static void changeMe(StringBuffer strBuffer){
strBuffer.append("appended");
}
public static void changeMe2(StringBuffer strBuffer){
strBuffer = null;
}
}
输出:
你好
你好附加
你好附加
在 Java 中,字符串总是不变的。如果要将引用传递给函数,可以创建自己的(不是最终的)类并将 String 放入其中。
这是一个简单的例子:我已经调用了我自己的类 VariableString :
public class StringTest {
private class VariableString {
private String string;
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public int length() {
return this.string.length();
}
public String toString() {
return string;
}
}
public static void assembleABC(VariableString hello) {
hello.setString("hello");
}
public static void main(String[] args) {
VariableString hello = new StringTest().new VariableString();
assembleABC(hello);
System.out.println(hello); // prints hello
}
}