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

爲何說按值傳遞

廣義的說引用也是java

對象類型傳遞

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

該副本(listCopy)指向同一個對象,經過副本(listCopy)能夠改變對象的內容。spa

代碼驗證

/**
 * @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");
    }
}

基本類型傳遞

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

代碼驗證

/**
 * @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類型傳遞時雖然是對象類型,但不能經過引用改變對象的值,切記!class

值不能改變的緣由

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

三者的共通性

傳進去的所有是自身的拷貝。date

相關文章
相關標籤/搜索