1. 程式人生 > >java方法引數傳遞方式只有----值傳遞!

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引數傳遞方式只有值傳遞一種方式而已,傳遞的引數一直都是原始引數的副