Java語言中的參數傳遞
做者:陳躍峯
在實際的開發過程當中,方法調用是一種很常見的操做,在方法調用中,關於參數的處理可能不少進行實際開發的程序員都不必定理解的很清楚,下面系統的介紹一下Java語言中參數傳遞的規則,以及和參數傳遞相關的一些問題。
和其它程序設計語言相似,Java語言的參數傳遞也分爲兩種:
一、 按值傳遞(by value)
適用範圍:8種基本數據類型、String對象
特色:在內存中複製一份數據,把複製後的數據傳遞到方法內部
做用:在方法內部改變參數的值,外部數據不會跟着發生改變
二、 按址傳遞(by address)
適用範圍:數組、除String之外的其餘全部類型的對象
特色:將對象的地址傳遞到方法內部
做用:在方法內部修改對象的內容,外部數據也會跟着發生改變
基礎示例代碼:
publicclass Test1{
publicstatic void t1(int n){
n = 10;
}
publicstatic void t2(String s){
s = "123";
}
publicstatic void t3(int[] array){
array[0] = 2;
}
publicstatic void main(String[] args){
int m = 5;
t1(m);
System.out.println(m);
String s1 = "abc";
t2(s1);
System.out.println(s1);
int[] arr = {1,2,3,4};
t3(arr);
System.out.println(arr[0]);
}
}
按照上面的參數傳遞規則,該代碼的輸出結果應該是:5 abc 2。由於int類型是按值傳遞,因此把參數m傳遞到方法t1時,至關於又複製了一份m的值,在方法t1內部修改的是複製後的值,因此m的值不變,s1的輸出和m相似。而arr是數組,屬於按址傳遞,也就是把arr的地址傳遞到了方法t3內部,在方法t3內部修改數組中的值時,原來的內容也發生改變。
以上特性是Java語言中的規定,在語法上沒法指定參數傳遞是按值傳遞仍是按址傳遞,可是能夠經過下面的變換實現:
一、 對於按值傳遞的參數,若是須要在方法調用之後修改參數的值,能夠利用返回值來實現。
二、 對於按值傳遞的參數,若是須要在方法內部修改時原來的參數不改變,則能夠在方法內部從新建立該對象實現。
示例代碼以下:
public class Test2{
publicstatic int t1(int n){
n = 10;
return n;
}
publicstatic String t2(String s){
s = "123";
return s;
}
publicstatic void t3(int[] array){
//建立新的數組並賦值
int[] newArray = new int[array.length];
//數據拷貝
System.arraycopy(array,0,newArray,0,array.length);
newArray[0] = 2;
}
publicstatic void main(String[] args){
int m = 5;
//從新賦值
m = t1(m);
System.out.println(m);
String s1 = "abc";
//從新賦值
s1 = t2(s1);
System.out.println(s1);
int[] arr = {1,2,3,4};
t3(arr);
System.out.println(arr[0]);
}
}
這樣,程序的輸出結果就將是:10 123 1。
在實際的程序開發中,能夠根據須要使用相似的結構來進行實現。
下面再介紹一個參數傳遞的常見應用,利用參數傳遞實現返回值,這樣的功能在IO類設計的read方法中大量使用。示例代碼以下:
public class Test3{
publicstatic void initArray(int[] array){
for(int i = 0;i < array.length;i++){
array[i] = i;
}
}
publicstatic void main(String[] args){
int[] a = new int[10];
initArray(a);
for(int i = 0;i < a.length;i++){
System.out.println(a[i]);
}
}
}
在該示例代碼中,在initArray方法內部修改了數組的值之後,外部數組a的值也會發生改變,間接實現了返回值的效果。固然,在該示例代碼中,由於只返回一個參數,因此做用體現的不明顯,若是須要返回多個參數時,使用按址傳遞是一種不錯的主意。
因時間倉促,疏漏之處不免,請你們積極補充和指正。