今天復(fù)習(xí)Java基礎(chǔ),發(fā)現(xiàn)有一個(gè)概念好像有點(diǎn)模糊了,就是值傳遞,Think in Java中說Java只有值傳遞。
上網(wǎng)看了好多的博客分析,各有各的說法,有的說只有值傳遞,有的說有值傳遞和引用傳遞,爭(zhēng)論的焦點(diǎn)就是對(duì)象的傳遞。
系統(tǒng)的說一下:Java中有2種參數(shù)傳遞,一種是基本類型參數(shù),一種是引用類型參數(shù)。
基本類型參數(shù)的傳遞方式基本沒有什么爭(zhēng)論,即:Java應(yīng)用程序中在傳遞基本類型參數(shù)時(shí)會(huì)copy一份值,因?yàn)榛绢愋偷闹凳谴嬖跅V械?,也就是?dāng)你在方法中改變參數(shù)的值是不會(huì)影響調(diào)用者的值的。
引用類型參數(shù)的傳遞方式有爭(zhēng)論:我認(rèn)為是引用傳遞,但是從嚴(yán)格意義上來講,引用也是棧中的值,引用指向的堆中的對(duì)象就是值。不管怎么樣,引用類型的參數(shù)傳遞就是引用傳遞,但是那個(gè)引用指向的堆中對(duì)象還是調(diào)用者的對(duì)象,所以也可以理解為值傳遞。
引用一下一位同學(xué)的話:
“其實(shí)按值還是按引用的區(qū)別在于‘是否在傳遞的時(shí)候進(jìn)行對(duì)象的內(nèi)存拷貝’,java中基本類型是由于在JVM中存儲(chǔ)區(qū)域不同于普通對(duì)象所以傳遞前會(huì)拷貝,傳遞的是拷貝后的值,但是對(duì)象在傳遞的時(shí)候不拷貝,直接傳“引用值”,指向同一片對(duì)象堆內(nèi)存區(qū)域。”
在編寫Java應(yīng)用程序時(shí),需要注意傳遞基本類型參數(shù)時(shí)不能在方法中賦值,因?yàn)檫@可能得不到你想要的結(jié)果。
ps:注意string類和包裝類的final屬性。雖然是引用類型,但是每當(dāng)改變它們的時(shí)候都會(huì)創(chuàng)建新的對(duì)象。所以和基本類型的結(jié)果是一樣的。
歡迎指正。