1. 程式人生 > >java方法引數傳遞方式--按值傳遞、引用傳遞

java方法引數傳遞方式--按值傳遞、引用傳遞

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中的過程可以用下圖來表示:


直接改變了棧幀中的地址,指向另一個物件,所以並沒有改變原來的值。