1. 程式人生 > >String作為輸出型參數時獲取不到值

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

  

  以上純屬個人理解,如有錯誤,敬請指正。

String作為輸出型參數時獲取不到值