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語言相似。 spa

做者:中軟卓越大連ETC
指針

相關文章
相關標籤/搜索