引用傳遞和值傳遞

2021-09-19 10:14:55 字數 1359 閱讀 3614

1.主方法中的值傳遞

首先我們先看以下**

public static void main(string args)
執行結果為

在這裡我們發現進行int型別的傳遞時,b的值進行了改變,a的值並沒有一起發生變化,即可以說傳遞之後a和b就沒有關係了。事實上我們去嘗試其他基本型別(char、byte、int、float、double、long、short、boolean)的傳遞的時候,會發現它們之間傳遞的只是值而已,彼此各自發生變化都不會改變另乙個的值。

2.函式呼叫過程中的值傳遞

我們平時會經常將乙個物件作為引數傳入函式,在函式內部對該引數進行修改,如下:

我們想要改變a的值

public static void change(int a,int b)	

public static void main(string args)

結果為:

結果並沒有按照我們預想的進行a=a+b,改變a的值。原因是函式中的形式引數相當於是對a進行了一次拷貝,即只是將a的值傳遞給了形參,那麼之後的就好理解了:無論我們對形參進行什麼操作,a依舊是a,形式引數的變化不會對a造成任何影響。

**範例:

public static void change(int a)

public static void main(string args)

執行結果為:

這就是引用傳遞,我們將a的首位址傳入方法,想象這時有乙個叫做a的房間,我們有了它的門牌號,然後跟裝修師傅說需要房間進行裝修,那麼師傅就會找到這個房間並進行相應的操作,即接下來在方法內部對形式引數的改變會影響到原來傳入的值。

細心的同學會發現在方法中有乙個注釋a=new int[2],如果我們將這個注釋給解開,會出現什麼結果呢?

結果如下:

這不就像我們前面說的值傳遞了麼?事實上它們還是有一點區別的。之所以會出現這樣的結果,用下面的圖來進行解釋吧。

開始的時候,我們傳入了陣列a的首位址,形式引數b(為了便於說明,事實上我們定義的是叫做a的形式引數)在堆中尋找並定位到a的位置,後來,我們在方法中建立了乙個新的一維陣列,並將它的首位址賦給了b,這個時候b就不再指向陣列a的首位址了,那麼方法中接下來做什麼也不會影響到a了。

最後,我們在進行傳遞過程中需要注意我們是否需要對之前的值進行改變,如果不需要,那就可以採用值傳遞;需要的話,那就採用引用傳遞。

值傳遞和引用傳遞

幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...

值傳遞和引用傳遞

1.什麼是值傳遞和引用傳遞 值傳遞 方法呼叫時,實際引數的值copy乙份傳遞給形式引數,此時,有兩個相等的數值分別儲存於不同的記憶體位址上,因此,後面的方法中都是對形參位址上的數值進行修改。引用傳遞 方法呼叫時,實際引數的值 也就是位址 copy乙份傳遞給形式引數,此時,形參和實參的引用都指向同一儲...

值傳遞和引用傳遞

定義 通過建立乙個實際引數的副本,再傳遞給方法的形式引數,在main自身並不會被使用。這個在我們第一次使用編寫交換數的方法時,基本都會遇見,當我呼叫a,b兩個變數時,通過交換方法交換他們的位置,但是沒用,這就是值傳遞,乙個坑 public class switchnum switchnum a,b ...