歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java的值傳遞和引用傳遞

我們先說下值傳遞和引用傳遞java官方解釋:

值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。

引用傳遞:(形式參數類型是引用數據類型參數):也稱為傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。

通俗的來說值傳遞其實就是一傳遞一些具體數據,也就是基本類型的數據(1,2,"哈哈"....),引用傳遞是你傳遞的你自己分裝的對象,或者是數據集合,list,array,set。。。

我遇到的整好事對於list數據處理的問題,一言不合就上代碼(測試代碼):

1.下面的代碼是我從我自己寫的一個demo,詳細的表述了值傳遞和引用傳遞:

@Test
    public void ck(){
        bean b = new bean("王","1");
        bean b2 = new bean("王","2");
        List<bean> list = new ArrayList<bean>();
        List<bean> list2 = new ArrayList<bean>();
        list.add(b);
        list.add(b2);
       
        list2.addAll(list);
        list2.get(0).setName("哈哈哈");
       
        for (bean bean : list2) {
            System.out.println(bean.getName()+"ssss"+bean.getAge());
        }
        for (bean bean1 : list) {
            System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());
        }
   
    }

bean類

public class bean {

    private String name ;
    private String age;
   
   
   
   
   
   
    public bean() {
        super();
    }
    public bean(String name, String age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }   
}

按我們正常思路來說,list應該輸出倆個

list:

王ssss1
王ssss2

list2:

哈哈哈ssss1
王ssss2

但是:看我的運行結果

哈哈哈ssss1
王ssss2
哈哈哈jjjjj1
王jjjjj2

 可以看到雖然只是修改了list2中的一個元素,但是list中的元素數據也被修改了,有同學可能就會說了list.addAll的問題,其實不是,重點就是bean這個,list2.addAll(list)

這個方法其實是給list2賦值的bean的內存指針而不是把值拷貝到了list2的內存塊中,也就是我們說的這裡發生了引用傳遞而不是值傳遞,所以修改了list2中元素的值,也就修改

了bean對象元素的值,list輸出元素的值當然會改變,後來我是這樣解決的:

@Test
    public void ck(){
        bean b = new bean("王","1");
        bean b2 = new bean("王","2");
        List<bean> list = new ArrayList<bean>();
        List<bean> list2 = new ArrayList<bean>();
        list.add(b);
        list.add(b2);
       
        for(int i=0;i<list.size();i++){
            bean bn = new bean();
            bn.setAge(list.get(i).getAge());
            bn.setName(list.get(i).getName());
            list2.add(bn);
        }
        list2.get(0).setName("哈哈哈");
       
        for (bean bean : list2) {
            System.out.println(bean.getName()+"ssss"+bean.getAge());
        }
        for (bean bean1 : list) {
            System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());
        }
   
    }

在在list賦值給list2的時候,我把bean對象新new了一個並且遍歷list中的bean屬性值給新new的這個bean對象,這樣傳遞的是基本類型數據也就是copy到新new的bena內存塊中,這樣list2在怎麼修改也不會影響到list中的值,因為他們包涵的bean對象是兩不同指針的對象,這是修改後的輸出結果:

1 list2:
2 哈哈哈ssss1
3 王ssss2
4 list:
5 王jjjjj1
6 王jjjjj2

我的個人理解哈,大家有什麼其他更加簡便的方法和理解留言哈,互相學習

Copyright © Linux教程網 All Rights Reserved