這個問題好多文章都講過了,在此本人補充一下,加深理解,有不足之處請指教。
相信做java開發同學們都知道,調用方法傳遞參數時,不論是基本類還是引用類型,
java都是值傳遞,不存在引用傳遞(稱引用傳遞,只是便於理解,不過看到我下面的例子,就要注意了)。
先看這里例子:預期輸出結果是什么?
public class Test4 class Domain |
<br>
實際輸出結果:
調用chenge方法之前:name=test01
調用chenge方法之后:name=test02
調用chenge2方法之前:name=www01
調用chenge2方法之后:name=www01
-------------------------------------------------------------------------------------
分析:
代碼中方法chenge和chenge2都是應用類型作為入參的;
對於調用方法chenge的結果很好理解;對於調用方法chenge2就要好好分析了。
因為:java中調用方法時的入參都是值傳遞(不管是基本類型還是引用類型)
所謂的值傳遞,按照jdk的介紹,本質是變量名的拷貝被傳到方法中,比如 基本類型變量、引用類型變量,在傳遞到方法中時,
都是該變量的一個拷貝。基本類型的值都保存在棧用中(實際棧的值是共享的),調用方法后不會影響原來的值。
(1)針對例子中的chenge方法:chenge(domain); 這里的變量domain會有一個拷貝傳到chenge方法體內,這個拷貝變量同樣與domain指向之前的對象。
方法chenge中的 domain.setName("test02") 語句,實際修改的是拷貝變量指向的對象,由於變量domain與拷貝變量同時指向一個對象,
變相的修改了domain的指向對象。
因此打印結果為:
調用chenge方法之前:name=test01
調用chenge方法之后:name=test02
(2)由(1)的分析,就好理解chenge2方法了。
chenge2方法是將拷貝變量指向了另一個新的對象,不影響原來的對象,
因此打印結果為:
調用chenge2方法之前:name=www01
調用chenge2方法之后:name=www01