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

  

 

  以上纯属个人理解,如有错误,敬请指正。

posted on 2017-06-11 14:29  傻瓜乐园  阅读(987)  评论(0编辑  收藏  举报

导航