Java 引用傳遞和值傳遞

還是沒能通俗易懂

  • 引用傳遞就是指 將對象的地址值進行傳遞

  • 值傳遞 就是把對象的值進行傳遞


// 我有一個類    ClassA

// new 一個對象 ClassA classa =  new ClassA();

我調用一個方法 fun1
 void fun1(ClassA classa) {   // 這裏面的ClassA 就是做的引用傳遞,他是個形參,那實際參數是什麼呢?? 這裏不對,實參是對象的值

}

void  fun2(int a, String b, Long c) { // 這裏的參數  a ,b ,c 是形參,他代表的是一個具體的值。所以他的傳遞就是值傳遞

} 

// ClassA classa int a, String b, Long c 都是形參

// new ClassA(); 是實參

看下代碼 你就明白了

 public static void main(String args[]) {
        People people = new People();
        System.out.println("people = " + people);
        String a = "string";
        System.out.println("a = " + a);
        int i = 111;
        System.out.println("i = " + i);
        double j = 11.12223;
        System.out.println("j = " + j);
    }
people = People@5fd0d5ae  
// 這裏面的 People@5fd0d5ae 就是 對象 people 在堆中的地址  他在作爲參數的時候,傳的就是這個東西 
// 然後你在方法裏做邏輯的時候,用的就是這個地址對應的值,你去操作他,一旦你對這個值進行了修改,那麼
// 源對象的值,也會被修改,就好比,我告訴你冰箱裏有一瓶水,你喝了三分之一,等我回家的時候,再去看那瓶水就是被你喝過的。是的
// 這個就是引用傳遞  引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象;
a = string
i = 111
j = 11.12223

java中的基本類型,包括string在內 都是值傳遞,他們的改變,不會影響源數據。

值傳遞只會作用在方法內部,不會影響方法外的數據。

 public static void main(String[] args) {
        // 我們把這個param傳到了方法裏,方法對其進行了修改
        String param = "我是參數";
        System.out.println("\nparam = " + param);
        // 執行修改操作,引用傳遞的值將會被改變,值傳遞的值將不受影響
        change(param);
        System.out.println("\n我是方法執行過的參數 param , 我現在的值是 = " + param);
    }

    private static void change(String param) {
        System.out.println("傳入進來的參數的值 param = " + param);
        System.out.println("\n下面我的值將會被改變");
        // 方法執行過程中對值傳遞的變量進行修改,不會影響源數據
        param = "我把值傳遞的內容改了";
        System.out.println("\n我已經把 param 內容修改掉了,修改成了 :" + param);
    }
param = 我是參數
傳入進來的參數的值 param = 我是參數

下面我的值將會被改變

我已經把 param 內容修改掉了,修改成了 :我把值傳遞的內容改了

我是方法執行過的參數 param , 我現在的值是 = 我是參數

引用傳遞

    public static void main(String[] args) {
        StringBuilder a = new StringBuilder("A");
        StringBuilder b = new StringBuilder("B");
        operate(a, b);
        System.out.println("--------------------------");
        System.out.println(a + "." + b);
    }

    static void operate(StringBuilder x, StringBuilder y) {
        x.append(y);
        System.out.println("x = " + x);
        y = x;
        System.out.println("y = " + y);
    }
-------------------------
x = AB
y = AB
--------------------------
AB.B
說明

這個問題的關鍵在於 a,b,x,y 的地址指向;
y = x 與 b = a 是不等價的!!
發生改變的是 y 指向的值變成了和 x 指向的相同, 此時 y = AB(因爲append方法改變的x原有的值)
而此時 b 的指向並沒有發生改變。

劃重點

引用傳遞過程中,只有引用對象的值發生了改變纔會影響源數據。地址的改變不會影響源數據。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章