在Java中參數(shù)的傳遞主要有兩種:值傳遞和參數(shù)傳遞;
下面是對兩種傳遞方式在內(nèi)存上的分析:
一:值傳遞
解釋:實(shí)參傳遞給形參的是值 形參和實(shí)參在內(nèi)存上是兩個(gè)獨(dú)立的變量 對形參做任何修改不會(huì)影響實(shí)參
代碼示例如下:
1
2
3
4
5
6
7
8
9
10
11
|
package arrayDemo; public class Demo1 { public static void main(String[] args) { int b = 20 ; change(b); // 實(shí)參 實(shí)際上的參數(shù) System.out.println(b); } public static void change( int a){ //形參 形式上的參數(shù) a= 100 ; } } |
結(jié)果:20
為什么?看下面分析:
通俗的講法就是:形參只是實(shí)參創(chuàng)建的一個(gè)副本,副本改變了,原本當(dāng)然不可能跟著改變;
再通俗的講法就是:
小明去餐廳吃飯,看見別人點(diǎn)的紅燒肉挺好吃,九把服務(wù)員叫過來,說我要一份紅燒肉,服務(wù)員從后廚拿來一份紅燒肉,小明吃完了,但是他吃的紅燒肉跟旁邊那個(gè)人吃的是一份嗎?當(dāng)然不是。
再來解釋引用傳遞
二:引用傳遞
實(shí)參傳遞給形參的是參數(shù)對于 堆內(nèi)存上的引用地址 實(shí)參和 形參在內(nèi)存上指向 了同一塊區(qū)域 對形參的修改會(huì)影響實(shí)參
1
2
3
4
5
6
7
8
9
10
11
12
|
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 ; } } |
結(jié)果:1 100
為什么?
由于引用傳遞,傳遞的是地址,方法改變的都是同一個(gè)地址中的值,
原來a[0]指向0x13地址,值是1,
后來在a[0] 指向的也是0x13地址,將值變成了100
所以,再查詢a[0]的值的時(shí)候,值自然變成了100
通俗點(diǎn)的講法就是:
小明回到家,他妻子說:冰箱二層有一只雞,你去做了;
小明做好了,叫妻子過來吃飯。
這個(gè)時(shí)候,他妻子現(xiàn)在看見的雞和她買回來的一樣嗎?
當(dāng)然不一樣,都做熟了;
什么意思呢?
雞就是數(shù)據(jù)
冰箱二層就是存儲(chǔ)數(shù)據(jù)的地址
把雞做熟了就是相當(dāng)于把值改變了
地方還是那個(gè)地方,就是雞變了。
以上所述是小編給大家介紹的Java中值傳遞和引用傳遞的區(qū)別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
原文鏈接:https://www.cnblogs.com/ncl-960301-success/p/10574701.html