函數中參數傳值 1、基本數據類型傳值 當函數中傳入的參數為基本數據類型時,函數中對傳入參數的操作不會對函數外的數據產生影響。由於基本數據類型的變數名指向的是具體的數值,在函數內部,相當於將參數進行了拷貝,函數內只對拷貝後的參數進行操作。 基本數據類型 public class ParamsTrans ...
函數中參數傳值
1、基本數據類型傳值
當函數中傳入的參數為基本數據類型時,函數中對傳入參數的操作不會對函數外的數據產生影響。由於基本數據類型的變數名指向的是具體的數值,在函數內部,相當於將參數進行了拷貝,函數內只對拷貝後的參數進行操作。
- 基本數據類型
public class ParamsTrans {
/**
* 基本數據類型傳值
* @param a 基本數據類型
*/
private static void primitiveType(int a){
a = 1;
}
public static void main(String[] args) {
int primitiveParam = 0;
ParamsTrans.primitiveType(primitiveParam);
System.out.println(primitiveParam);
}
}
// 結果:0
結果分析:基本數據類型primitiveParam初始值為0,在函數中對其值進行修改,輸出值仍為0,說明函數內的操作未生效。
- 基本數據類型數組
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ParamsTrans {
/**
* 基本數據類型數組傳值
* @param d
*/
private static void arrayType(int[] d){
d[0] = 1;
System.out.println("d hashcode:" + d.hashCode());
}
public static void main(String[] args) {
int[] arrayParam = new int[2];
arrayType(arrayParam);
System.out.println(Arrays.toString(arrayParam));
System.out.println("arrayParam hashcode:" + arrayParam.hashCode());
}
}
// 結果:
// d hashcode:460141958
// [1, 0]
// arrayParam hashcode:460141958
結果分析:基本數據類型數組與基本數據類型在參數傳值時,具有相同特性。
2、引用數據類型傳值
當函數中傳入的參數為引用數據類型時,函數中對傳入參數的操作會對函數外的數據產生影響。由於引用變數指向對象的記憶體地址,在函數內部,參數只是創建了一個新的變數指向同一個對象,函數中對此對象進行操作,函數外的引用變數也會相應改變。
import java.util.ArrayList;
import java.util.List;
public class ParamsTrans {
/**
* 引用數據類型傳值
* @param b 引用數據類型
*/
private static void QuoteType(List<Integer> b){
b.add(1);
System.out.println("b hashcode:" + b.hashCode());
}
public static void main(String[] args) {
List<Integer> quoteParam = new ArrayList<>();
ParamsTrans.QuoteType(quoteParam);
System.out.println(quoteParam.toString());
System.out.println("quoteParam hashcode:" + quoteParam.hashCode());
}
}
// 結果:
// b hashcode:32
// [1]
// quoteParam hashcode:32
結果分析:引用數據類型quoteParam初始值為空,在函數中添加元素,輸出值為[1],說明函數內的操作已生效。由變數hash值可以看出,函數內與函數外為同一變數。
3、包裝數據類型傳值
在Java中,有一些對基本數據類型進行包裝的類型,在參數傳值時比較容易混淆,如:String、Integer、Double等。
-
String類型
public class ParamsTrans { /** * Sting類型傳值 * @param c */ private static void StringType(String c){ c = "b"; System.out.println("c hashcode:" + c.hashCode()); } public static void main(String[] args) { String stringParam = "a"; StringType(stringParam); System.out.println(stringParam); System.out.println("stringParam hashcode:" + stringParam.hashCode()); } } // 結果: // c hashcode:98 // a // stringParam hashcode:97
結果分析:由代碼執行結果可以看出,String類型雖然是引用變數,但是在函數中對其進行修改的操作並未生效,且函數內與函數外的變數也並不是同一個變數。這不符合上述引用數據類型的規律,由String類型源碼可知,String中字元串實際是用char[]數組進行存儲的,相當於是char[]的包裝類。因此,在參數傳遞時,是對參數進行了拷貝。
-
Integer類型及包裝類型
根據上述對String類型的分析,查看Integer類源碼,對Integer類進行賦值實際是對int類型進行操作。綜上所述,在函數參數傳值時,Integer與String具有相同特性。再推廣至包裝類型,所有包裝類型均具有此特性。