JAVA值傳遞or引用傳遞

經常會有學員討論JAVA語言究竟是值傳遞還是引用傳遞的問題。這裏我想對這個問題闡述一下我個人的觀點。很多關於JAVA參數傳遞方式的論述都會去對比參照C/C++或C#,故而我也會對C/C++或C#的參數傳遞方式做一個簡單的描述。在C/C++或是C#語言中有明確的引用傳遞方式以區別值傳遞方式。在C/C++語言中利用指針實現引用傳遞,即定義函數時將形參的數據類型定義成指針類型。調用函數時,取變量地址或是指針變量作爲實參傳遞。實際上傳遞的是地址(指針)的拷貝,實參和形參指向都是同一個地址,所以可以認爲在函數中對參數的修改是可以被“帶回”的。而值傳遞時,參數傳遞的是值得拷貝,在函數中無論如何修改這個“副本”,都無法影響原來的值。舉一個簡單的例子一個值就相當於一個電視機,而指針就相當於這個電視機的遙控器。引用傳遞時相當於複製了一個新遙控器,用新遙控器修換臺,電視是會被“改變”的。值傳遞則相當於複製了一個新電視機,你對新電視機的調整是不會影響到原來的電視機的。

JAVA語言的數據類型分爲基本類型和引用類型。基本類型數據只包含值部分。引用類型數據包含引用和值兩個部分,其中引用類似於C語言的指針(JAVA出於安全的考慮刪去了指針的概念)但是我們不能像使用C語言一樣操作它。我通過引用可以操作其指向的值,而且是我們也不能撇開引用找到值部分,因爲我們無法得到值在內存中的真實地址。當調用方法時,如果參數是基本數據類型的數據,則傳遞的是值本身的拷貝;如果參數是引用類型的數據,則傳遞的是引用的拷貝。所以JAVA是值傳遞還是引用傳遞是由所傳參數的數據類型決定的,或者說這根本就是個僞命題。對於基本數據類型參數想要實現引用傳遞的效果,可以將基本數據類型的參數類型改爲其相應的包裝類型,因爲包裝類型是屬於引用類型的。從JDK1.5開始JAVA語言可以實現基本數據類型和包裝類型之間的自動轉化,簡化代碼的複雜度。

至於C#語言,可以在定義方法時,在參數類型前通過一個修飾符強制參數傳遞的方式是值傳遞或是引用傳遞,否則和JAVA語言類似。

作者:中軟卓越大連ETC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章