1.Java值傳遞與引用傳遞

1.在平時(shí)寫程序的時(shí)候,偶爾會(huì)遇到這樣的問(wèn)題:調(diào)用一個(gè)方法修改某一個(gè)參數(shù)的值,但是程序的運(yùn)行結(jié)果和預(yù)料的不一樣。而且有時(shí)候靈,有時(shí)候不靈,這就很頭疼。今天來(lái)總結(jié)一下這個(gè)問(wèn)題的原因。
2.首先,舉個(gè)例子來(lái)重現(xiàn)問(wèn)題。


image.png

image.png

image.png

于是,出現(xiàn)了兩個(gè)顯而易見(jiàn)的問(wèn)題。
首先,基本類型和對(duì)象類型在方法調(diào)用的過(guò)程前后,基本類型的原值不會(huì)改變,對(duì)象類型在經(jīng)過(guò)方法調(diào)用后,值發(fā)生了改變。

其次,包裝類型是屬于對(duì)象類型的,但是運(yùn)行結(jié)果和對(duì)象類型截然不同。

那么在調(diào)用recount方法的前后,究竟發(fā)生了什么事呢?
答:在調(diào)用方法的時(shí)候,arg作為形參,將實(shí)參的值拷貝到自己這里。當(dāng)實(shí)參是基本類型的時(shí)候,在方法內(nèi)部修改arg的值,本質(zhì)是修改形參的值,跟實(shí)參沒(méi)有關(guān)系。在方法執(zhí)行完畢后,退出方法棧,arg也就消失了,完全不會(huì)影響實(shí)參的值。當(dāng)實(shí)參是對(duì)象類型的時(shí)候,在方法內(nèi)部修改實(shí)際引用的對(duì)象的值的時(shí)候,外部的實(shí)參所對(duì)應(yīng)的對(duì)象的值也就被改變了。當(dāng)參數(shù)類型是包裝類型(還包括String)時(shí),因?yàn)榘b類型(String)的對(duì)象都是不可修改的,我們?cè)趫?zhí)行這段代碼時(shí):str="abcde";
實(shí)際上是創(chuàng)建了一個(gè)新的對(duì)象,并將形參指向這個(gè)新創(chuàng)建的對(duì)象,當(dāng)方法執(zhí)行完畢后,實(shí)參并沒(méi)有受到影響。

結(jié)論:像包裝類、String類這樣的類,雖然是對(duì)象類型,但是由于他們的對(duì)象是不可以修改值的,所以在作為形參的時(shí)候,產(chǎn)生的效果類似于基本類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容