java中函式是值傳遞還是引用傳遞?

2021-07-26 18:00:20 字數 1821 閱讀 9551

先看乙個例子

public

class

test1

static

void changenum(int

a) }

結果:changenum a=100

main a=10

說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。

再看乙個例子

public

class

p @override

public

string tostring()

}public

class

test

static

void

changeobj(p p)

}

這個例子中的執行結果會是什麼呢?

在這個例子中傳入的是乙個物件型別的資料。

我們先來猜想一下:如果傳入的是乙個物件的引用,在函式中改變了這個引用所指向的物件,那麼外部的引用"p"應該是指向了新建立的p("pp")的物件才對

所以猜想的結果是:

before change p:p

change p:pp

after change p:pp

那讓我們來實際執行一下看看結果,實際的結果是:

before change p:p

change p:pp

after change p:p

想猜想的不一樣!!!

這就讓我們很疑惑了,為什麼函式沒有改變引用所指向物件呢?

其實是這樣的,首先要理解「=」賦值操作的意義,

對於基本型別來說「=」賦值操作是直接改變記憶體位址上的值,

而對引用型別來說「=」賦值其實是改變引用變數所指向的記憶體位址。

賦值操作後

引用的賦值並沒有對原來的物件造成影響,"hello"物件仍然是存在的,只是str又指向了新的"world"物件

理解了賦值操作後,現在來說下函式的引數傳遞

函式的引數實際上就是函式內部的乙個區域性變數,從外部傳值給這個引數實際上就是乙個賦值的過程。

來看看第乙個例子,傳乙個定義乙個int型別名稱為a的形式引數,其實完全可以把名稱改為b

然後把外部變數a的值傳遞給函式的變數,就是賦值。基本型別的賦值就是把外部a變數的10賦值給函式變數a,所以這其實是兩個變數,兩者之間沒有任何關係,

所以對函式內部變數的改變也不會對外部的變數造成影響。

再來說下引用型別的傳遞,其實是乙個道理。

在傳遞的時候是把乙個物件的記憶體位址賦值給函式內部的引用型別的區域性變數

如上圖所示,兩個變數是指向同乙個物件的。

在第二個例子中,我們在函式內部新建立了乙個物件,並重新賦值給內部變數p,其實是改變了內部變數的引用所指向的物件,如下圖所示

所以對外部的p變數是沒有影響的。

總結:函式引數傳遞其實是乙個賦值的過程,基本型別傳遞的是數值,引用型別傳遞的引用物件的記憶體位址。

另外一點要特別注意,函式的引數其實是函式內部的區域性變數。不要跟外部變數混淆

java中函式是值傳遞還是引用傳遞?

先看乙個例子 public class test1 static void changenum int a 結果 changenum a 100 main a 10 說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。再看...

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

廢話不多說,上 很簡單,圖一中呼叫靜態方法intvalues int t 毫無疑問是傳遞值,因為如果是引用傳遞,那麼二者列印的值是一致的。很明顯,a 之後,t的值沒有發生改變。圖二也是一樣,清晰明了,把方法引數的值賦值給a,然後改變a的值,二者值列印均一致,那是因為t代表的是乙個堆記憶體的位址,基本...

Java是值傳遞還是引用傳遞

基本型別 如上圖所示,基本型別傳遞時,執行緒在棧上分配形式引數並拷貝實際引數的值。create with intellij idea author wangzhenpeng date 2018 4 8 time 上午9 48 e mail wangzhenpeng0924 163.com descr...