String作為輸出型參數時獲取不到值
阿新 • • 發佈:2017-06-11
聲明 調用 情況 過程 執行 變化 錯誤 更新 取不到值
有時候在一個方法中,我們需要返回多個字符串,而又不想將這些字段包成一個類。此時就需要使用輸出型參數。
但是如果將輸出型參數的類型聲明為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作為輸出型參數時獲取不到值