1. 程式人生 > >JAVA引數傳遞方式 (按值傳遞與引用傳遞區別)

JAVA引數傳遞方式 (按值傳遞與引用傳遞區別)

首先要明確的是JAVA中沒有引用傳遞, 全部是按值呼叫

令大家所費解的 當物件引用作為引數時  函式為什麼能修改真實的物件呢?這不是引用傳遞的特徵嗎?

尤其先學習C++再學習JAVA的同學(比如說我自己)會這樣認為,

用白話解釋就是:

引用傳遞指標時, 連函式操作的指標都是原來的指標,比如C++傳入物件時直接用傳入的指標操作

而JAVA的引用傳進函式時 , 會複製一個引用與實參指向同一物件的引用, 操作的不是同一個引用,

如果還不明白區別再換種方式解釋一次:

JAVA只有按值呼叫, 引數是什麼都會複製一份再操作, 就算是物件的引用也會複製一份新的引用,只不過指向的是同一個物件

這種傳參方式叫做按值傳遞,

 傳遞的東西可以是引用(類似C++的指標)

如果是引用傳遞像C++傳入指標不會再複製一份了,直接拿來用

如果再不明白也沒關係,看看下面的例子和解釋分析

舉個例子:

輸出結果:

也就說我們用一個函式修改了 傳入的一個int變數和一個物件內容,

再輸出int變數和物件內容時發現 ,int的沒有改變,而 物件的內容改變了

這說明什麼呢,說明像 int ,double等基本資料型別在引數傳遞時並沒有傳進變數本身,

而是建立了一個新的相同數值的變數, 函式修改這個新變數並沒有影響原來變數的數值,這也是按值傳遞的特點

那為什麼物件a的資料就改變了呢?

因為雖然也是按值傳遞, 複製了一份新的引用但是指向的物件是同一個,修改後會影響原物件

這就是按值傳遞, 即使傳的是引用也不是引用傳遞,

因為引用傳遞是不復制的,直接使用引數,如下圖:

這樣可以理解了嗎,自我覺得足夠明白了, 我如此深厚的畫圖功底都供出來了,再不明白就是在為難我胖虎!

水平有限, 可能有錯誤,敬請指出!