一段話系列-java函數(方法)中的參數傳遞

爲什麼說按值傳遞

廣義的說引用也是

對象類型傳遞

當一個對象引用(list)作爲一個參數被傳遞到方法中時,參數就是該對象引用(list)一個副本(listCopy);因爲是副本,所以不會影響對象引用(list)的值;

該副本(listCopy)指向同一個對象,通過副本(listCopy)可以改變對象的內容。

代碼驗證

/**
 * @author : bozheng
 * @date : 2018/8/12 14:27
 */
public class TestDemo {

    @Test
    public void test(){
        //list爲對象的引用
        List list = new ArrayList();
        //傳進去的是list引用的副本
        setList1(list);
        //外部引用的指向並未變成null,該引用的副本變爲了null
        System.out.println(list);
        //傳進去的是list引用的副本
        setList2(list);
        //改了對象的值
        System.out.println(list);
    }

    public void setList1(List listCopy){
        //改變的是引用副本的指向
        listCopy = null;
    }

    public void setList2(List listCopy){
        //改變對象的值
        listCopy.add("1");
    }
}

基本類型傳遞

當一個基本類型作爲參數傳遞進方法時,傳遞進去的是基本類型的拷貝。故不會影響外部參數的值。

代碼驗證

/**
 * @author : bozheng
 * @date : 2018/8/12 14:27
 */
public class TestDemo {

    @Test
    public void test(){
        int a = 0;
        //傳遞進去的是a的拷貝
        setList1(a);
        //a的值爲改變
        System.out.println(a);
    }

    public void setList1(int aCopy){
        aCopy = 1;
    }
}

String類型傳遞

特殊性

String是對象類型,不是基本類型,正常來講應符合對象類型傳遞的規則:1.傳遞進去的是引用的副本;2.引用的副本可改變指向對象的值。

但是如果是這樣的話,我也會多此一舉把String單獨列出來了,大家可以運行一下代碼:

/**
 * @author : bozheng
 * @date : 2018/8/12 14:27
 */
public class TestDemo {

    @Test
    public void test(){
        String a = "hello";
        //傳遞進去的是a的拷貝
        setString(a);
        //a的值未改變!
        System.out.println(a);
    }

    public void setString(String aCopy){
        aCopy = "hi";
    }
}

運行代碼後發現,a的值並未改變。故String類型傳遞時雖然是對象類型,但不能通過引用改變對象的值,切記!

值不能改變的原因

通過閱讀String的源碼可得,String中使用一個char數組進行值的存放,該char數組有final關鍵字,所以對象的值不可改變,其它對象的包裝器類型亦是如此。

三者的共通性

傳進去的全部是自身的拷貝。

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