本文已收錄GitHub,更有互聯網大廠面試真題,面試攻略,高效學習資料等java
把一個String類型的參數傳入方法,並在方法內改變了引用的值。 而後在方法外使用這個值,發現這個String仍是以前的值,並無改變。git
這裏要向你們介紹一下,你們都知道java在傳參時分爲值 傳遞 和 引用傳遞 。參數爲基本類型時是值傳遞, 參數爲封裝類型時是引用傳遞。例如:github
基本類型參數面試
public class Test { public static void main(String[] args) { int num = 0 ; changeNum(num); System.out.println("num="+num); } private static void changeNum(int num) { num = 1; } }
打印的結果是num=0。ide
封裝類型參數學習
public class Test { public static void main(String[] args) { Product p = new Product(); p.setProName("before"); p.setNum(0); changeProduct(p); System.out.println("p.proName="+p.getProName()); System.out.println("p.num="+p.getNum()); } private static void changeProduct(Product p) { p.setProName("after"); p.setNum(1); } } class Product { private int num; private String proName; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getProName() { return proName; } public void setProName(String proName) { this.proName = proName; } }
運行的結果是:p.proName=after和p.num=1 。this
上面的兩個例子是明顯的值傳遞和引用傳遞。可是若是參數是String類型呢?咱們看一下具體的例子:code
public class Test { public static void main(String[] args) { String str = "ab"; changeString(str); System.out.println("str="+str); } private static void changeString(String str) { str = "cd"; } }
你們猜一下運行結果是什麼呢?按照前面的例子,String應該是一個封裝類型,它應該是引用傳遞,是能夠改變值得, 運行的結果應該是」cd」。咱們實際運行一下看看,對象
str=ab,這如何解釋呢?難道String是基本類型?也說不通呀。blog
這就要從java底層的機制講起了,java的內存模型分爲 堆 和 棧 。
java在方法傳遞參數時,是將變量複製一份,而後傳入方法體去執行。 這句話是很難理解的,也是解釋這個 問題的精髓。咱們先按照這句話解釋一下基本類型的傳遞
咱們再解釋封裝類型的傳遞:
最後咱們再來解釋String在傳遞過程當中的步驟:
這樣咱們理解了java在方法傳參的整個過程。其實仍是上面那句比較重要的話 java在方法傳遞參數時,是將變量複製一份,而後傳入方法體去執行。