值傳遞:傳值,把原來的數據直接拷貝一份傳給新的變量
引用傳遞:傳地址,使原來的引用變量指向新的地址中的內容app
奇怪的事情函數
String str = "aaa"; change(str); System.out.println(str);
public void change(String str){ str += "aaa"; }
輸出結果依然是aaa , 而不是aaaaaaui
出現這種狀況是,在主函數中的str與調用函數中定義的str是兩個不一樣的引用,而且他們確實是指向了同一個地址,可是由於String是不可變的,因此在執行語句str+="aaa"的時候實際是建立了一個新的對象,使的調用函數中的引用指向了新的對象,因此主函數中的str不會有任何的影響。
若是調用函數中的變量類型不是String,而是可變的StringBuilder類型,那麼實際狀況分爲兩種,若是是str.append("aaa");那麼主函數中的str是會改變的,若是是str = new StringBuilder("ccc");那麼主函數中的值依然不會受到影響。
主要的緣由是在與賦值操做「=」。若是是複製操做,則標識把調用函數中的str指向一個新的內存空間,那麼與原來的引用失去關聯,原來的很明顯不會受到印象,若是是append操做,只是在原來的內存地址上改變內存中的內容,可是此時無論是主函數中的str仍是調用函數中的str,指向的都是被改變後的內存,很天然的值會受到影響。
**********************************************************************************************************
實際的參數傳遞中會遇到4中狀況:code
基本類型對象
毫無疑問的傳值操做,調用函數與主函數中的變量不存在任何的聯繫內存
int a =10; change(a); System.out.println(a); public void change(int a){ a++; }輸出結果爲10get
不提供改變自身方法的引用類型io
是傳遞的是引用,可是沒法對共同指向的對象進行改變操做,只能建立一個新的對象,調用函數中的引用指向他,不影響主函數中的值class
String a = "aaa"; change(a); System.out.println(a); public void change(String a){ a += "aaa"; }輸出的結果是aaa變量
提供改變自身方法的引用類型,而且使用該方法
StringBuilder a = new StringBuilder("aaa"); change(a); System.out.println(a); public void change(StringBuilder a){ a.appned("aaa"); }輸出結果爲aaaaaa
提供改變自身方法的引用類型,可是不使用該方法,而是使用賦值操做
StringBuilder a = new StringBuilder("aaa"); change(a); System.out.println(a); public void change(StringBuilder a){ a = new StringBuilder("bbb"); }輸出結果爲aaa
參考材料:[知乎:引用傳遞仍是值傳遞][知乎]
[知乎]: https://www.zhihu.com/question/31203609 "引用傳遞與值傳遞"