Java方法究竟是值傳遞還是引用傳遞?打賞

一直以來,Java地址引用概念的影響,認為Java傳參分為值傳遞和引用傳遞,最近因為追究JavaScript的傳遞方式,遂翻出Java相關資料看了一下,發現原來這么久一直理解錯了。Java中只有按值傳遞,沒有按引用傳遞!

這里同樣涉及到堆與棧的概念,至于區別,這里就不再贅述了,和JavaScript的說法類似,可以參考前面的《JavaScript函數究竟是值傳遞還是引用傳遞?》。

對于這個問題,網上說法各異,《Core Java》的作者,以及JAVA的創造者James Gosling都認為當一個對象或引用類型變量被當作參數傳遞時,也是值傳遞,這個值就是對象的引用,因此JAVA中只有值傳遞,沒有引用傳遞。還有一種說法是引用可以看作是對象的別名,當對象被當作參數傳遞時,傳遞的是對象的引用,因此是引用傳遞。當然,也有《Thinking in Java》作者Bruce Eckel站在了中立的立場上。

個人在之前一直認為是第二種,而最近因為參考相關資料弄清了JavaScript究竟是值傳遞還是引用傳遞,最后發現Java在一定程度上和JavaScript的某些概念還是相同的,遂認為應該同樣認為是第一種。

關于傳參,大概有值傳遞、引用傳遞和指針傳遞這幾個概念,網上有人大概解釋如下:

值傳遞:傳遞實參的一個復本給形參,在被調函數內對形參的修改不會影響到原來的實參

引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。

指針傳遞:本質還值傳遞,把指針的值復制一份傳遞給形參,都指向實參指針指向的值,當對形參指向的內容操作時,就相當于對實參本身進行的操作。

在 Java 應用程序中永遠不會傳遞對象,而只傳遞對象引用。因此是按引用傳遞對象。但重要的是要區分參數是如何傳遞的。 Java 應用程序按引用傳遞對象這一事實并不意味著 Java 應用程序按引用傳遞參數。參數可以是對象引用,而 Java 應用程序是按值傳遞對象引用的。

Java 應用程序中的變量可以為以下兩種類型之一:引用類型或基本類型。當作為參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的;沒有一種按引用傳遞。

按 值傳遞意味著當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。因此,如果函數修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味 著當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。因此,如果函數修改了該參數,調用代碼中的原始值也隨之改變。

當傳遞給函數的參數不是引用時,傳遞的都是該值的一個副本(按值傳遞)。區別在于引用。在 C++ 中當傳遞給函數的參數是引用時,您傳遞的就是這個引用,或者內存地址(按引用傳遞)。在 Java 應用程序中,當對象引用是傳遞給方法的一個參數時,您傳遞的是該引用的一個副本(按值傳遞),而不是引用本身。

綜上所述,Java中所謂的引用傳遞,其實和C++中的指針傳遞是類似的,而指針傳遞的本質是值傳遞,所以可以說java中沒有引用傳遞。

Java方法究竟是值傳遞還是引用傳遞?
文章《Java方法究竟是值傳遞還是引用傳遞?》二維碼
  • 微信打賞
  • 支付寶打賞

已有5條評論

  1. 飛利浦呼吸機

    路過

    2016-08-17 11:10 回復
  2. 類風濕醫院

    頂!此回復雖僅有一字,卻深刻地表達了本人的深深情感,可謂言簡意賅,一字千金,扣人心弦!再加上以感嘆號收尾,點睛之筆,妙筆生花,意境深遠!頂雖然不難寫,難得是s樓主喝到完全找不到開機鍵在哪里時,但依然來發文的精神。

    2016-07-25 16:45 回復
  3. 大洋馬

    菜鳥怎么快速提高

    2016-06-17 16:44 回復
  4. 搬瓦工

    純技術流,寫的不錯哦

    2016-03-27 00:10 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖