1. 程式人生 > >Java到底是值傳遞還是引用傳遞?

Java到底是值傳遞還是引用傳遞?

在使用Java函式,常常會有一個疑問,我傳過去的是引數的值還是引數的地址。

下面,說一下Java的引數傳遞:

首先,要說明的是Java的資料型別

在Java中只有三種引用型別:

  • 介面
  • 陣列

除上面幾種型別外的所有型別都是基本型別。

使用基本型別的時候,會把這個放入虛擬機器棧中,而引用型別的變數會先在虛擬機器棧中宣告一個變數,然後把該變數指向在堆中存放地址

在主函式中往宣告函式傳參時,主函式會有一個自己的棧,該棧中存放主函式中宣告的變數值,當呼叫函式時,會有一個新的棧,而該棧中會有一個傳遞引數的副本。

當傳遞的是一個引用型別的變數時,同樣也會建立一個宣告函式棧,在該棧中也會有一個引數的副本,不過該副本和主函式上的變數在棧中指向的地址是相同的。如果在函式修改了該地址的值,主函式中變數的值也會發生變化。

如果在函式中修改了變數指向的地址,同時修改了其中的值,主函式中的變數不會有任何變化,因為主函式變數指向的地址並沒有發生變化,該值也沒發生變化。

所以,總的來說在Java中不存在引用傳遞,只有值傳遞!!!