深入理解Java中方法的參數傳遞機制

首先,你要知道Java中方法的參數傳遞機制只有值傳遞,並不存在引用傳遞的說法,或者說所謂的引用傳遞實則也是值傳遞。
什麼是值傳遞?所謂值傳遞,就是將實際參數的副本(複製品)傳入方法,而參數的本身不會受到任何的影響。
1、基本數據類型的值傳遞

public class Swap {
    public  static void swap(int a ,int b){
        int tmp = a;
        a = b;
        b = tem;
        System.out.println("Swap方法裏," + "a=" + a + ";" +"b=" +b);
    }
    public static void main(String[] args){
        int a = 1;
        int b = 2;
        System.out.println("初始賦值時,"+ "a=" + a + ";" +"b=" +b);
        swap(a,b);
        System.out.println("交換結束後,"+ "a=" + a + ";" +"b=" +b);
    }
}

運行結果:

初始賦值時,a=1;b=2
Swap方法裏,a=2;b=1
交換結束後,a=1;b=2

這裏寫圖片描述

分析:swap()方法裏面a、b的值是2、1,交換方法結束後,a、b的值依然是1、2。這也說明了swap()方法的a、b只是main()方法變量a、b的複製品。當程序執行swap()方法時,系統將main()方法中的a、b變量作爲參數值傳入swap()方法,傳入的只是a、b的副本。

2、引用類型的值傳遞

class DataWrap{
    int a;
    int b;
}
public class ReferenceTransferTest {
    public static void swap(DataWrap dw){
        //下面三行代碼實現dw的 a、b兩個成員變量的值交換
        //定義一個臨時變量來保存dw對象的a成員變量的值
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;
        System.out.println("swap方法裏,a成員變量的值是" + dw.a +";b成員變量的值是 "+ dw.b);
    }

    public static void main(String[] args){
        DataWrap dw = new DataWrap();
        dw.a = 1;
        dw.b = 2;
        System.out.println("初始賦值時,a成員變量的值是" + dw.a + ";b成員變量的值是 " + dw.b);
        swap(dw);
        System.out.println("交換結束後,a成員變量的值是" + dw.a + ";b成員變量的值是 " + dw.b);
    }

}

運行結果:

初始賦值時,a成員變量的值是1;b成員變量的值是 2
swap方法裏,a成員變量的值是2;b成員變量的值是 1
交換結束後,a成員變量的值是2;b成員變量的值是 1

這裏寫圖片描述

這裏寫圖片描述


分析:dw只是一個引用變量,系統複製了dw傳入swap()方法裏,但並未複製DataWrap對象。當程序在swap()方法裏操作dw形參時,由於dw只是一個引用變量,故實際操作的還是堆內存的DataWrap對象。此時不管操作main()方法裏的dw變量,還是操作swap()方法裏的dw參數,其實操作他們所引用指向的DataWrap對象。


總的來說,方法的參數傳遞只有值傳遞,當傳入的是基本數據類型時,傳入的是基本數據類型數據的副本,無論方法裏對數據作什麼操作,都不會影響原來數據(它直接創建了另一個棧區儲存並操作);當傳入的是引用類型時,傳入的是引用變量的副本(注意不是對象),當在方法通過引用變量對它所指向的對象進行操作時,原來的引用變量所指向的對象也就會隨着改變(因爲兩者所指向的就是同一個對象)。

文章參考:《瘋狂Java講義》一書。

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