在Java中參數的傳遞主要有兩種:值傳遞和參數傳遞; 下麵是對兩種傳遞方式在記憶體上的分析: 一:值傳遞 解釋:實參傳遞給形參的是值 形參和實參在記憶體上是兩個獨立的變數 對形參做任何修改不會影響實參 代碼示例如下: 結果:20 為什麼?看下麵分析: 通俗的講法就是:形參只是實參創建的一個副本,副本改變 ...
在Java中參數的傳遞主要有兩種:值傳遞和參數傳遞;
下麵是對兩種傳遞方式在記憶體上的分析:
一:值傳遞
解釋:實參傳遞給形參的是值 形參和實參在記憶體上是兩個獨立的變數 對形參做任何修改不會影響實參
代碼示例如下:
package arrayDemo; public class Demo1 { public static void main(String[] args) { int b =20; change(b);// 實參 實際上的參數 System.out.println(b); } public static void change(int a){//形參 形式上的參數 a=100; } }
結果:20
為什麼?看下麵分析:
通俗的講法就是:形參只是實參創建的一個副本,副本改變了,原本當然不可能跟著改變;
再通俗的講法就是:
小明去餐廳吃飯,看見別人點的紅燒肉挺好吃,九把服務員叫過來,說我要一份紅燒肉,服務員從後廚拿來一份紅燒肉,小明吃完了,但是他吃的紅燒肉跟旁邊那個人吃的是一份嗎?當然不是。
再來解釋引用傳遞
二:引用傳遞
實參傳遞給形參的是參數對於 堆記憶體上的引用地址 實參和 形參在記憶體上指向 了同一塊區域 對形參的修改會影響實參
package arrayDemo; public class Demo1 { public static void main(String[] args) { int [] a={1,2,3}; System.out.println(a[0]); change(a); System.out.println(a[0]); } public static void change(int[] a ){ a[0]=100; } }
結果:1 100
為什麼?
由於引用傳遞,傳遞的是地址,方法改變的都是同一個地址中的值,
原來a[0]指向0x13地址,值是1,
後來在a[0] 指向的也是0x13地址,將值變成了100
所以,再查詢a[0]的值的時候,值自然變成了100
通俗點的講法就是:
小明回到家,他妻子說:冰箱二層有一隻雞,你去做了;
小明做好了,叫妻子過來吃飯。
這個時候,他妻子現在看見的雞和她買回來的一樣嗎?
當然不一樣,都做熟了;
什麼意思呢?
雞就是數據
冰箱二層就是存儲數據的地址
把雞做熟了就是相當於把值改變了
地方還是那個地方,就是雞變了。