即便工做過一階段的人也不必定可以理解Java是值傳遞仍是引用傳遞。若不信,那麼來看看下面這道題。數組
請先寫出你的答案,而後對比下輸出結果。函數
public class Test { private String str = new String("碼上實戰"); private char[] chars = {'星', '期', '一'}; private int num = 2019; private void change(String cStr, char[] cChars, int cNum) { cStr = "歡迎關注->碼上實戰"; //第一步 cChars[2] = '二'; //第二步 cNum = 2020; //第三步 } public static void main(String[] args) { Test test = new Test(); test.change(test.str, test.chars, test.num); System.out.println("str=" + test.str); System.out.println("chars=" + test.chars[0] + "," + test.chars[1] + "," + test.chars[2]); System.out.println("num=" + test.num); } }
str=碼上實戰 chars=星,期,二 num=2019
首先,明確的告訴你們,Java只有值傳遞,沒有引用傳遞!不管理解不理解,先記住這點。spa
方法調用時,實參的數值被複制到另外一個變量,而後傳遞複製的副本。code
方法調用時,實際參數的地址直接傳遞到方法中。對象
- | 值傳遞 | 引用傳遞 |
---|---|---|
區別 | 建立副本 | 不建立副本 |
改變 | 函數中沒法改變實際參數 | 函數中能夠改變原始實際參數 |
這下你看清了吧,值傳遞和引用傳遞的真正區別是:傳遞時,實際參數是否複製了副本! 不要去管參數是基本類型仍是引用類型。token
由於 實參和形參指向的是同一個數組對象,方法中改變的不是參數自己,而是改變了它所指向的對象。rem
由題可知,不管是String仍是int,即便在方法中都進行改變,但實參都沒有改變,因此和參數什麼類型沒有關係。get
若是你有什麼問題,歡迎留言交流。it