Java 參數傳遞是值傳遞仍是引用傳遞?

最近在看 Martin Fowler 重構一書,在一章中看到 JS 參數傳遞是按值傳遞,聯想到 Java。下面咱們聊聊 Java 參數傳遞是值傳遞仍是引用傳遞?bash

還記得初學 Java 的時候,同窗就問我這個問題,我很自信的就回答固然是按值傳遞。而後用代碼舉了例子。spa

passpyvalue.png

輸出結果:code

oldAge is 100
change age is 10

複製代碼

雖然同窗認爲個人例子沒有問題,可是卻不信服這個結論,舉了另外一個對象的例子,表示 Java 參數傳遞是引用傳遞。cdn

carbon65.png

程序輸出結果:對象

dog in method name is fill
main method dog name is fill

複製代碼

的確這個例子改變了Dog對象 name 屬性。當時看到以後,感受打破了本身認知,難道 Java 傳遞真的按照引用的嗎?不過這也不對,基本參數類型只有值,並不存在對象一說,難道 Java 對象(Object)按照用於傳遞,基本參數類型按照值傳遞?blog

不知道有沒有小夥伴初學 Java 時有沒有跟我有同樣困惑?哈哈。it

首先說明一下 Java 參數傳遞是按值傳遞,基本參數類型與對象是同樣的。io

對於這樣的一個對象建立過程 Dog dog=new Dog("max");,實際上等式左邊 dog 變量是隻是一個引用,而等號右邊纔是真正對象,位於 JVM 堆上。class

image.png

private static void foo(Dog foo)foo 方法中聲明名字爲 foo 參數,在沒有被調用以前,最初被賦值爲null。變量

image.png

當調用 foo 方法以後,傳入dog 變量,而後會將 dog實際指向對象的堆地址賦值給了 foo,將foo引用指向了實際參數對象。

image.png

而後在 foo方法中,改變了對象 name 屬性。

image.png

因爲 foodog 都引用同一個 Dog對象,因此輸出 name 屬性都爲 fill。

下面再將舉一個例子。

carbon66.png

這個例子輸出結果爲:

dog in method name is fill
main method dog name is max
複製代碼

在這個例子中,在方法中建立一個新對象,而後 foo 將指向這個新對象。這裏僅僅改變 foo 的引用。因此這就致使這個例子與第二個例子輸出不同。

image.png

總結

Java 參數傳遞是值傳遞。

相關文章
相關標籤/搜索