在通常的說法中,方法參數的傳遞分為兩種,值傳遞和引用傳遞,值傳遞是指將實際參數復制一份傳遞到方法中,
在方法中的改動將不會影響到實際參數本身,而引用傳遞則是指傳遞的是實際參數本身,在方法中的改動將會影響到實
際參數本身。但是,在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參數傳遞方式只有值傳遞一種方式而已,傳遞的參數一直都是原始參數的副本。