今天復習Java基礎,發現有一個概念好像有點模糊了,就是值傳遞,Think in Java中說Java只有值傳遞。
上網看了好多的博客分析,各有各的說法,有的說只有值傳遞,有的說有值傳遞和引用傳遞,爭論的焦點就是對象的傳遞。
系統的說一下:Java中有2種參數傳遞,一種是基本類型參數,一種是引用類型參數。
基本類型參數的傳遞方式基本沒有什么爭論,即:Java應用程序中在傳遞基本類型參數時會copy一份值,因為基本類型的值是存在棧中的,也就是當你在方法中改變參數的值是不會影響調用者的值的。
引用類型參數的傳遞方式有爭論:我認為是引用傳遞,但是從嚴格意義上來講,引用也是棧中的值,引用指向的堆中的對象就是值。不管怎么樣,引用類型的參數傳遞就是引用傳遞,但是那個引用指向的堆中對象還是調用者的對象,所以也可以理解為值傳遞。
引用一下一位同學的話:
“其實按值還是按引用的區別在于‘是否在傳遞的時候進行對象的內存拷貝’,java中基本類型是由于在JVM中存儲區域不同于普通對象所以傳遞前會拷貝,傳遞的是拷貝后的值,但是對象在傳遞的時候不拷貝,直接傳“引用值”,指向同一片對象堆內存區域。”
在編寫Java應用程序時,需要注意傳遞基本類型參數時不能在方法中賦值,因為這可能得不到你想要的結果。
ps:注意string類和包裝類的final屬性。雖然是引用類型,但是每當改變它們的時候都會創建新的對象。所以和基本類型的結果是一樣的。
歡迎指正。