摘要方法的參數有形式參數和實際參數兩種形式。根據參數數據類型的不同,當實際參數向形式參數傳遞值時,有著不同的傳遞方式。對于初學者而言,由于不能深入理解參數傳遞在內存中是如何分配的,容易導致參數傳遞錯誤。本文從實例出發,講述參數傳遞的兩種方式,為開發者提供借鑒。
關鍵詞形式參數 實際參數 值傳遞 引用傳遞
中圖分類號:TP312文獻標識碼:A
Parameter Values Transfer and Pass by Reference Comparison in Jave
PENG Jian, TANG Ying
(Jiangxi Financial and Economics Vocational School, Jiujiang, Jiangxi 332000)
AbstractParameter of method have two forms of formal parameters and actual parameters. According to different types of parameters data, when the actual parameters transfer value to formal parameters, it has different transfer mode. For beginners, they unable to deeply understand how parameters transfer allocate in memory, it is easy to cause the parameters transfer errors. This paper, starting from examples to talk about the two passing ways of parameter passing.
Key wordsformal parameters; actual parameters; value transfer; pass by reference
0 引言
在Java語言中,成員方法可以有多個不同數據類型的參數,也可以一個參數都沒有。對于參數我們需要區分形式參數和實際參數的概念。形式參數是指定義成員方法時,括號里面的參數名字。實際參數是指在程序代碼中調用成員方法時,傳遞給方法的參數。而對于參數值傳遞和引用傳遞的區分是令初學者頭疼不已的一個問題。
1 基本數據類型形式參數的值傳遞
Java語言中基本類型包括:int,double等。當形式參數為基本類型時,程序采用單向值傳遞的形式,即將實際參數的值復制一份給形式參數,形式參數值的變化不影響原來的實際參數。示例如下:
public class First{
static int test(int x,int y){
System.out.println(\"運算前形參:x=\"+x+\" y=\"+y);
x=x*2;//改變形參x的值
y=y-1;//改變形參y的值
System.out.println(\"運算后形參:x=\"+x+\" y=\"+y);
return x+y;
}
public static void main(String[] args){
int a=4,b=5,c;
System.out.println(\"運算前實參:a=\"+a+\" b=\"+b);
c=test(a,b);
System.out.println(\"運算后實參:a=\"+a+\" b=\"+b);
}
}
運行結果如下:
運算前實參:a=4 b=5;運算前形參:x=4 y=5
運算后形參:x=8 y=4;運算后實參:a=4 b=5
從結果可以看出,兩個實際參數在運算前后都沒有發生變化,而形式參數的值則發生了改變,說明基本類型參數是單向值傳遞。
2 引用類型形式參數的引用傳遞
程序中經常需要把一個對象作為實際參數進行傳遞,這和基本類型數據的值傳遞情況是不同的,因為此時傳遞的是對象的引用(地址)。當實參對象的引用(地址)被復制給形參時,對形參對象內容進行改變也就是對實參對象內容進行改變。例如:
class Second{int v=0;}
public class Third{
static void test(Second x,int y){
x.v=1;//改變形式參數對象x的成員變量值
y=5;//改變形式參數基本類型(int)變量y的值
}
public static void main(String[] args){
Second a=new Second();
int b=4;
System.out.println(\"運算前實參:a.v=\"+ a.v + \" b=\"+b);
test(a,b);
System.out.println(\"運算后實參:a.v=\"+ a.v + \" b=\"+b);
}
}
運行結果如下:
運算前實參:a.v=0 b=4;運算后實參:a.v=1 b=4
從結果可以看出,當把對象作為方法的參數時,由于它傳遞的是對象的引用(地址),因此形式參數對象內容的改變會影響到實際參數,而基本類型沒有影響。
3 數組參數傳遞比較
數組屬于引用類型,它既可用來存放基本類型數據,又可以用來存放引用類型數據。從本質上說把數組作為參數傳遞,與引用類型參數傳遞是一致的。例如:
public class Four{
public static void test(int[] x,Second[] y){
for(int i=0;i<3;i++)
{x[i]++;y[i].v++;}
}
public static void main(String[] args){
int[] a={1,2,3};
Second[] b={new Second(),new Second(),new Second()};
System.out.print(\"基本類型數組傳遞前元素的值:\");
for(int i=0;i<3;i++)
System.out.print(a[i]+\" \");
System.out.println();
System.out.print(\"引用類型數組傳遞前元素對象屬性v的值:\");
for(int i=0;i<3;i++)
System.out.print(b[i].v+\" \");
System.out.println();
test(a,b);
System.out.printl(\"基本類型數組傳遞后元素的值:\");
for(int i=0;i<3;i++)
System.out.print(a[i]+\" \");
System.out.println();
System.out.print(\"引用類型數組傳遞后元素對象屬性v的值:\");
for(int i=0;i<3;i++)
System.out.print(b[i].v+\" \");
System.out.println();
}
}
運行結果如下:
基本類型數組傳遞前元素的值:1 2 3。
引用類型數組傳遞前元素對象屬性v的值:0 0 0。
基本類型數組傳遞后元素的值:2 3 4。
引用類型數組傳遞后元素對象屬性v的值:1 1 1。
從結果我們可以看出,用數組作為參數傳遞可以改變實際參數的值。說明數組實現的是引用傳遞。
4 總結
通過比較可以看出:基本類型形參采用的是值傳遞,即復制實參數據,形參的改變不影響實參;而引用類型形參采用的是引用傳遞,即復制實參的引用地址,形參的改變實質上就是改變實參。開發者只有深入理解參數傳遞的本質,才能在程序開發中運用自如,提高代碼質量。
參考文獻
[1]張白一,崔尚森.面向對象程序設計——Java.西安電子科技大學出版社,2006.
[2]王克宏.Java技術及其應用.高等教育出版社,1999.