傳值還是傳引用

概述

     java應用程序在賦值操作或傳參時,傳值還是傳引用是一個必須考慮的問題。借鑑他人的研究成果,再結合自己的實踐總結,寫下了這篇文章,自己備忘的同時希望也能給他人蔘考,歡迎指出錯誤或不足。

規則

1.在賦值時:

    a 傳值:.8種基本類型(byte short int long char float double boolean)及其包裝類(Byte Short Integer Long Character Float Double Boolean)

    b 傳引用:class type、interface type 、arrary type、null type

2.在傳參時:

 a.java有且只有一種參數傳遞機制——按值傳遞

 b.傳容器時,在方法內無法更改實參(容器的引用),但可以更改容器中的元素值。

源碼:

public class Test {
    int testId;

    /**
     *  賦值測試1
     */
    static void test1(){
        // 基本類型
        int i1 = 1;
        int i2 = i1;
        i2 = 2;
        System.out.println("i1=" + i1 + ";  i2=" + i2);
        //輸出:i1=1;  i2=2
        // 包裝類型
        Integer integer1 = 1;
        Integer integer2 = integer1;
        integer2 = 2;
        System.out.println("integer1=" + integer1 + ";  integer2=" + integer2);
        //輸出:integer1=1;  integer2=2
    }

    /**
     * 賦值測試2
     */
    static void test2(){
        Test t1 = new Test();
        t1.testId = 1;
        Test t2 = t1;
        t2.testId = 2;
        System.out.println("t1.testId=" + t1.testId + ";  t2.testId=" + t2.testId);
        //輸出:t1.testId=2;  t2.testId=2
    }

    /**
     *傳參測試
     */
    static void swap(int[] p){
        // 交換
        int tmp = p[0];
        p[0] = p[1];
        p[1] = tmp;

        // 測試更改實參
        int [] j = {5,6};
        p = j;
    }

    public static void main(String[] args){
        test1();
        test2();

        int[] i = {1,2};
        swap(i);

        System.out.println("i[0]=" + i[0] + ";  i[1]="+i[1]);
        //輸出:i[0]=2;  i[1]=1
    }
}

分析:

1.基本類型是基本類型不是面向對象的,主要出去效率方面的考慮,但是同時也提供基本類型的對象版本,即基本類型的包裝器(wrapper)。採用傳值而不採用傳引用的方式可以理解。

2.對於最後一個輸出,從存儲結構上來看,數組i[2]存儲在兩個區:


  棧區                                                            堆區



從上圖中發現,i、p作爲實參、形參,在保存在棧區中,而數組具體內容保存在堆區。

調用方法時p獲得數組在堆區的索引,此次過程傳值,因此對p進行賦值操作實際上不影響i;然而對於堆區的部分,p、i具有相同的操作權限。





 

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