java方法引數傳遞方式只有----值傳遞!
在通常的說法中,方法引數的傳遞分為兩種,值傳遞和引用傳遞,值傳遞是指將實際引數複製一份傳遞到方法中,
在方法中的改動將不會影響到實際引數本身,而引用傳遞則是指傳遞的是實際引數本身,在方法中的改動將會影響到實
際引數本身。但是,在java中只有值傳遞,沒有引用傳遞!那麼,為什麼當方法引數是基本資料型別時表現是值傳遞,
而當是引用型別時表現的是引用傳遞形式呢?
Java記憶體區域中含有java堆和虛擬機器棧兩個記憶體區域(並不是只是將java記憶體區分為這兩個記憶體區域,此外還有程
序計數器,本地方法棧以及方法區),java堆的目的就是為了存放物件,當一個方法執行時,每個方法都會為自己建立
記憶體棧,用於存放方法內定義的變數等資訊,當方法結束,這個方法的記憶體棧也會被銷燬。
總的來說,java方法執行時存放在棧中而物件本身存在堆中。下面將用兩個例子來敘述當方法引數是基本資料型別
時和引用型別時java的值傳遞過程。
方法引數為基本資料型別時:
可以看出,在main方法中呼叫swap方法傳遞的a,b引數僅僅是a,b副本,並不不是a,b本身,下面將java記憶體空間的
情況,進一步說明java方法引數的值傳遞。
當main方法開始執行時,建立main方法棧,棧中儲存了a,b兩個變數,值分別為9,20。main呼叫swap方法,並傳遞a,
b的副本給swap方法,swap方法建立自己的棧區,裡面有a,b和temp,此時的記憶體區中存在5個臨時變數,在swap中將a,b
進行交換,當swap方法結束後,swap棧區被銷燬,從始至終,main棧區中的a,b未受到影響,直至main方法結束,main棧
區銷燬。所以java傳遞的只是引數的副本而非引數本身。
而當引數是引用型別時:
從上面的例子看出,當引數型別為引用時,原始引數受到了影響,那是否就是進行了引用傳遞呢?答案是否定的,引數
還是進行的值傳遞。
在main方法中有testValueTransfer引用變數,它儲存在main方法棧中,新new的TestValueTransfer物件則儲存在java堆中
,testValueTransfer實際儲存的是物件的地址指向物件。當在main方法中呼叫swap方法時,傳遞的是testValueTransfer引用變
量的副本,此時記憶體區中存在兩個變數指向TestValueTransfer物件,當在swap方法中交換物件中的a,b成員變數時,實際操作
的是物件本身,因此當swap方法結束後,main方法中testValueTransfer指向的物件發生了變化。
總結:java引數傳遞方式只有值傳遞一種方式而已,傳遞的引數一直都是原始引數的副