函數中參數傳值

函數中參數傳值

1、基本數據類型傳值

當函數中傳入的參數為基本數據類型時,函數中對傳入參數的操作不會對函數外的數據產生影響。由於基本數據類型的變數名指向的是具體的數值,在函數內部,相當於將參數進行了拷貝,函數內只對拷貝後的參數進行操作。

  • 基本數據類型
public class ParamsTrans {
    /**
     * 基本數據類型傳值
     * @param a 基本數據類型
     */
    private static void primitiveType(int a){
        a = 1;
    }

    public static void main(String[] args) {
        int primitiveParam = 0;
        ParamsTrans.primitiveType(primitiveParam);
        System.out.println(primitiveParam);
    }
}

// 結果:0

結果分析:基本數據類型primitiveParam初始值為0,在函數中對其值進行修改,輸出值仍為0,說明函數內的操作未生效。

  • 基本數據類型數組
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ParamsTrans {
    /**
     * 基本數據類型數組傳值
     * @param d
     */
    private static void arrayType(int[] d){
        d[0] = 1;
        System.out.println("d hashcode:" + d.hashCode());
    }

    public static void main(String[] args) {
        int[] arrayParam = new int[2];
        arrayType(arrayParam);
        System.out.println(Arrays.toString(arrayParam));
        System.out.println("arrayParam hashcode:" + arrayParam.hashCode());
    }
}


// 結果:
// d hashcode:460141958
// [1, 0]
// arrayParam hashcode:460141958

結果分析:基本數據類型數組與基本數據類型在參數傳值時,具有相同特性。

2、引用數據類型傳值

當函數中傳入的參數為引用數據類型時,函數中對傳入參數的操作會對函數外的數據產生影響。由於引用變數指向對象的記憶體地址,在函數內部,參數只是創建了一個新的變數指向同一個對象,函數中對此對象進行操作,函數外的引用變數也會相應改變。

import java.util.ArrayList;
import java.util.List;

public class ParamsTrans {
    /**
     * 引用數據類型傳值
     * @param b 引用數據類型
     */
    private static void QuoteType(List<Integer> b){
        b.add(1);
        System.out.println("b hashcode:" + b.hashCode());
    }

    public static void main(String[] args) {
        List<Integer> quoteParam = new ArrayList<>();
        ParamsTrans.QuoteType(quoteParam);
        System.out.println(quoteParam.toString());
        System.out.println("quoteParam hashcode:" + quoteParam.hashCode());
    }
}

// 結果:
// b hashcode:32
// [1]
// quoteParam hashcode:32

結果分析:引用數據類型quoteParam初始值為空,在函數中添加元素,輸出值為[1],說明函數內的操作已生效。由變數hash值可以看出,函數內與函數外為同一變數。

3、包裝數據類型傳值

在Java中,有一些對基本數據類型進行包裝的類型,在參數傳值時比較容易混淆,如:String、Integer、Double等。

  • String類型

    public class ParamsTrans {
        /**
         * Sting類型傳值
         * @param c
         */
        private static void StringType(String c){
            c = "b";
            System.out.println("c hashcode:" + c.hashCode());
        }
    
        public static void main(String[] args) {
            String stringParam = "a";
            StringType(stringParam);
            System.out.println(stringParam);
            System.out.println("stringParam hashcode:" + stringParam.hashCode());
        }
    }
    
    // 結果:
    // c hashcode:98
    // a
    // stringParam hashcode:97
    

    結果分析:由程式碼執行結果可以看出,String類型雖然是引用變數,但是在函數中對其進行修改的操作並未生效,且函數內與函數外的變數也並不是同一個變數。這不符合上述引用數據類型的規律,由String類型源碼可知,String中字元串實際是用char[]數組進行存儲的,相當於是char[]的包裝類。因此,在參數傳遞時,是對參數進行了拷貝。

  • Integer類型及包裝類型

    根據上述對String類型的分析,查看Integer類源碼,對Integer類進行賦值實際是對int類型進行操作。綜上所述,在函數參數傳值時,Integer與String具有相同特性。再推廣至包裝類型,所有包裝類型均具有此特性。

Tags: