String作为输出型参数时获取不到值
有时候在一个方法中,我们需要返回多个字符串,而又不想将这些字段包成一个类。此时就需要使用输出型参数。
但是如果将输出型参数的类型声明为String,那么调用该方法后,是获取不到我们想要的值的。
测试代码如下:
public class StringTest { public static void main(String[] args){ StringTest st = new StringTest(); String a = "a"; String b = "b"; st.testReferenceParam(a, b); System.out.println("a="+a + "; b=" + b ); } public void testReferenceParam(String A, String B){ A = "This is A"; B = "This is B"; return; } }
输入为:
a=a; b=b
这是什么原因呢?
这需要从内存原理,以及引用传参方面来解释。
内存原理:一个String指向的对象(此处排除常量字符串)是在堆上存在的,String变量则在栈上存在。当将其作为参数传递给方法时,方法会再声明一个字符串变量,这个变量指向的对象和传进来的参数指向的是同一个对象。如果在方法执行中,该对象里的内容发生了变化,则方法执行过后,该变化保留了下来,此时可以看到原实参指向的对象内容缺失变了。但如果在方法执行过程中,只是将形参指向的对象换了,那么新对象的内容不会更新到实参指向的对象的。上述例子就是后者这种情况。
怎么才能获取到想要的值呢?
不要改变形参指向的对象,而只改变对象的内容。由于String是内容不可变字符串,所以要改用StringBuilder或StringBuffer。
改后代码:
public class StringTest { public static void main(String[] args){ StringTest st = new StringTest(); StringBuilder a = new StringBuilder("a"); StringBuilder b = new StringBuilder("b"); st.testReferenceParam(a, b); System.out.println("a="+a + "; b=" + b ); } public void testReferenceParam(StringBuilder A, StringBuilder B){ A.append(" This is A"); B.append(" This is B"); return; } }
输出:
a=a This is A; b=b This is B
以上纯属个人理解,如有错误,敬请指正。