java方法引數傳遞方式--按值傳遞、引用傳遞
阿新 • • 發佈:2019-01-08
java的方法引數傳遞方式有兩種,按值傳遞和引用傳遞
1.按值傳遞
引數型別是int,long等基本資料型別(八大基本資料型別),引數傳遞的過程採用值拷貝的方式
程式碼片段1:
public class Test {
public static void main(String[] args) {
int a = 5;
fun(a);
System.out.println(a);// 輸出結果為5
}
private static void fun(int a) {
a += 1;
}
}
2.引用傳遞
引數型別為引用型別,引數傳遞的過程採用拷貝引用的方式
程式碼片段2:
public class Test { public static void main(String[] args) { A a = new A(5); fun(a); System.out.println(a.a);// 輸出結果為6 } private static void fun(A a) { a.a += 1; } static class A { public int a; public A(int a) { this.a = a; } } }
結論:按值傳遞,不會改變原來的值,引用傳遞,會改變引用物件的值
再看下面這種情況:
程式碼片段3:
public class Test {
public static void main(String[] args) {
Integer a = 5;
fun(a);
System.out.println(a);// 輸出結果為5
}
private static void fun(Integer a) {
a += 1;
}
}
這裡明明是引用傳遞,為什麼沒有改變物件的值呢?
這裡其實使用了基本資料型別封裝類的自動裝箱功能。Integer a = 5,編譯後實際為Integer a = Integer.valueOf(5),檢視Integer的原始碼,並沒有改變原物件的值,只是將其引用指向了另一個物件。
程式碼片段3中的過程可以用下圖來表示:
直接改變了棧幀中的地址,指向另一個物件,所以並沒有改變原來的值。