前言:
歡迎訪問(wèn)凱哥個(gè)人網(wǎng)站:www.kaigejava.com?
歡迎關(guān)注凱哥公眾號(hào):凱哥Java
本文是java基礎(chǔ)語(yǔ)法最后一篇佑淀。從下節(jié)課開始谎砾,我們將進(jìn)入-【從零學(xué)Java】的第二階段-->面向?qū)ο?/p>
本節(jié)內(nèi)容:
1:java中的值傳遞及圖解
2:地址值傳遞及圖解
3:第一階段(基礎(chǔ)語(yǔ)法)總結(jié)和第二階段預(yù)告
本文出處:《凱哥陪你學(xué)系列之java基礎(chǔ)篇.Java基本語(yǔ)法篇》中第36篇基礎(chǔ)語(yǔ)法完結(jié)篇- java中值傳遞和地址值傳遞And圖解
聲明:本文系凱哥Java(www.kaigejava.com)原創(chuàng)(微信id:kaigejava)。轉(zhuǎn)載請(qǐng)注明出處
一:java中的值傳遞
如下圖:
問(wèn)題:
①、②忘晤、③中分別輸出的是什么远舅?
我們嘗試著看代碼來(lái)進(jìn)行分析:
在①中我們知道 輸出的 a=10;b=20
然后調(diào)用了change()這個(gè)方法图柏。
所以應(yīng)該先輸出③。
我們來(lái)分析 在change()方法中裁着,參數(shù)a=10 ,參數(shù) b=20
所以 a=b,運(yùn)算之后矿酵,a的值就為20了全肮。
而 b = a+b。其實(shí)這個(gè)時(shí)候a=20了 所以b=20+20(b是不變的)
運(yùn)算之后b=40了
所以 ③輸出的應(yīng)該是 a = 20 b=40
然后程序回到main函數(shù)中哪自,接著往下走,就該輸出②了胧华。
那么請(qǐng)問(wèn)②處輸出多少?是 a=10 b=20 還是 a=20 b=40悲没?
我們先運(yùn)行下,看下輸出結(jié)果:
接下來(lái)我們圖解
圖解說(shuō)明:
1:先壓棧。程序先運(yùn)行main方法,根據(jù)棧的特點(diǎn)褂痰,main方法被壓倒棧底。
在main方法中驶冒,int a =10 ; int b = 20; 所以①出輸出的就是 a=10 b =20
2:接著change()方法進(jìn)棧崇猫,然后經(jīng)過(guò)運(yùn)行完成之后,在change方法中 int a = 20 ;int b = 40了。所以在③處輸出的a =20 b=4o
3:當(dāng)棧內(nèi)運(yùn)行完成之后,就開始彈棧了溢谤。所以-阀参,change方法先被彈棧所刀。(可以理解為子彈已經(jīng)出槍膛了)
4:接著main方法勉痴,所以②處輸出的就是 main 方法中的a 和 b的值了蒸矛。從圖中我們可以看出劣像,a = 10;b=20.所以在②處輸出的是 10和20
二:地址值傳遞及圖解
如下圖:
思考:
①處應(yīng)該輸出的是2
②處(在changeArr方法里面的)輸出的是多少?
③處輸出的是多少坏挠?
分析:
因?yàn)?arr[i]%2==0 這句代碼意思就是:arr中第i個(gè)元素如果模 2 == 0
才會(huì)執(zhí)行arr[i]*=2這句代碼的意思就是:arr[i]= arr[i]*2;
至于 模運(yùn)算(%)是什么和arr[i]*=2是什么庇楞,可以回顧下之前文章蛋褥。
所以②處輸出的是4.
那么③應(yīng)該是什么?
請(qǐng)看運(yùn)行結(jié)果:
內(nèi)存圖解聂使;
圖解說(shuō)明:
1:同樣main函數(shù)先被壓棧 到棧底
2:在堆區(qū)創(chuàng)建了arr數(shù)組并初始化了分別為1,2,3,4,5 所以在①輸出arr第二個(gè)元素就是2
3:接著changeArr方法進(jìn)棧
4:同樣 將數(shù)組 arr的地址指想了changeArr方法壁拉,
5:經(jīng)過(guò)changeArr方法運(yùn)算之后,數(shù)組第二個(gè)元素就變成4 柏靶,第四個(gè)元素變成8弃理。所以在②打印出的是4
6:程序運(yùn)行完成changeArr被彈棧(子彈出膛)。也就是引用arr數(shù)組的地址值被切斷了辆苔。如圖中被劃斷的
7:接著運(yùn)行main方法,此時(shí)main方法中arr的地址值依然指向的是 0x0011這個(gè)遥倦。我們從堆區(qū)中可以看到,在堆區(qū)中的arr={1豪硅,4,3,8,5}
所以在③打印出arr中第二個(gè)元素就是4
三:總結(jié)
通過(guò)本節(jié)學(xué)習(xí)痴昧,我們需要掌握
1:Java中值傳遞和址傳遞的區(qū)別
值傳遞瘤载,值是多少,就是多少统刮。
址傳遞瑞佩,有可能會(huì)變化的首启。如果其他方法引用這個(gè)地址值之后,進(jìn)行處理膀估,那么就會(huì)影響最終結(jié)果即纲。
下節(jié)預(yù)告:
下節(jié)開始我們將做個(gè)小項(xiàng)目:簡(jiǎn)單的《學(xué)生管理系統(tǒng)》礁遵,通過(guò)這個(gè)小項(xiàng)目,可以把之前學(xué)過(guò)的串聯(lián)起來(lái)薛窥,一起回顧java基礎(chǔ)語(yǔ)法拱镐。歡迎學(xué)習(xí)下一篇:《從零學(xué)java筆錄-第37篇基礎(chǔ)語(yǔ)法完結(jié)小項(xiàng)目練習(xí)-學(xué)生管理系統(tǒng) 基礎(chǔ)版》