在學(xué)習(xí)Java時(shí),我們不可避免地會(huì)遇到參數(shù)傳遞這個(gè)話題。在Java中,參數(shù)傳遞主要分為引用傳遞和值傳遞兩種。這兩種傳遞方式的本質(zhì)區(qū)別是什么呢?下面我們來詳細(xì)了解一下。
值傳遞,即傳遞的是參數(shù)的副本,被調(diào)用方法可以修改參數(shù)的值,但不會(huì)影響參數(shù)原來的值。看下面這段代碼:
public int add(int x, int y){ x = x + y; return x; } int a = 1, b = 2; int result = add(a, b); System.out.println(result); // 輸出3 System.out.println(a); // 輸出1 System.out.println(b); // 輸出2
在這段代碼中,我們調(diào)用了一個(gè)add()方法,傳入的參數(shù)為a和b,這里的a和b即為int類型的基本數(shù)據(jù)類型。調(diào)用add()方法后,方法執(zhí)行了x = x + y這個(gè)語句,x的值變成了3。但需要注意的是,這個(gè)x并不是a的引用,而是a的副本。因此,調(diào)用add()方法后,a和b的值均未發(fā)生變化。
接下來,我們再看一下引用傳遞。在Java中,傳遞參數(shù)是以引用的方式進(jìn)行傳遞的。所謂引用傳遞,即在傳遞參數(shù)時(shí),傳遞的是參數(shù)的地址。看下面這個(gè)例子:
public void changeStr(StringBuffer str){ str.append("hello"); } StringBuffer s = new StringBuffer("world"); changeStr(s); System.out.println(s); // 輸出worldhello
在這個(gè)例子中,我們定義了一個(gè)方法changeStr(),該方法傳入的參數(shù)是一個(gè)StringBuffer類型的引用str。在changeStr()方法中,我們調(diào)用了StringBuffer對象的append()方法,來向這個(gè)對象中添加字符串hello。需要注意的是,在調(diào)用changeStr()方法時(shí),我們傳入的是變量s的引用,而不是值。因此,調(diào)用changeStr()方法后,變量s中保存的對象也被修改了。
通過上面的例子,我們可以看出,在Java中,參數(shù)傳遞的方式是以引用的方式進(jìn)行傳遞的,但是針對不同的數(shù)據(jù)類型,傳遞方式又有所不同。對于基本數(shù)據(jù)類型,采用的是值傳遞,而對于對象類型,則采用的是引用傳遞。