最近在看 Martin Fowler 重構一書,在一章中看到 JS 參數傳遞是按值傳遞,聯想到 Java。下面咱們聊聊 Java 參數傳遞是值傳遞仍是引用傳遞?bash
還記得初學 Java 的時候,同窗就問我這個問題,我很自信的就回答固然是按值傳遞。而後用代碼舉了例子。spa
輸出結果:code
oldAge is 100
change age is 10
複製代碼
雖然同窗認爲個人例子沒有問題,可是卻不信服這個結論,舉了另外一個對象的例子,表示 Java 參數傳遞是引用傳遞。cdn
程序輸出結果:對象
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
private static void foo(Dog foo)
在 foo
方法中聲明名字爲 foo 參數,在沒有被調用以前,最初被賦值爲null。變量
當調用 foo
方法以後,傳入dog
變量,而後會將 dog
實際指向對象的堆地址賦值給了 foo
,將foo
引用指向了實際參數對象。
而後在 foo
方法中,改變了對象 name 屬性。
因爲 foo
跟 dog
都引用同一個 Dog
對象,因此輸出 name 屬性都爲 fill。
下面再將舉一個例子。
這個例子輸出結果爲:
dog in method name is fill
main method dog name is max
複製代碼
在這個例子中,在方法中建立一個新對象,而後 foo 將指向這個新對象。這裏僅僅改變 foo 的引用。因此這就致使這個例子與第二個例子輸出不同。
Java 參數傳遞是值傳遞。