java的值傳遞和引用傳遞,java傳遞引用

來源:互聯網
上載者:User

java的值傳遞和引用傳遞,java傳遞引用

昨天博主在對於值傳遞和引用傳遞這裡栽了一個大坑啊,導致一下午時間都浪費在這裡,我們先說下值傳遞和引用傳遞java官方解釋:

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

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

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

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

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

 1 @Test 2     public void ck(){ 3         bean b = new bean("王","1"); 4         bean b2 = new bean("王","2"); 5         List<bean> list = new ArrayList<bean>(); 6         List<bean> list2 = new ArrayList<bean>(); 7         list.add(b); 8         list.add(b2); 9         10         list2.addAll(list);11         list2.get(0).setName("哈哈哈");12         13         for (bean bean : list2) {14             System.out.println(bean.getName()+"ssss"+bean.getAge());15         }16         for (bean bean1 : list) {17             System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());18         }19     20     }

 bean類

 1 public class bean { 2  3     private String name ; 4     private String age; 5      6      7      8      9     10     11     public bean() {12         super();13     }14     public bean(String name, String age) {15         super();16         this.name = name;17         this.age = age;18     }19     public String getName() {20         return name;21     }22     public void setName(String name) {23         this.name = name;24     }25     public String getAge() {26         return age;27     }28     public void setAge(String age) {29         this.age = age;30     }    31 }

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

list:

王ssss1
王ssss2

list2:

哈哈哈ssss1
王ssss2

但是:看我的運行結果

1 哈哈哈ssss12 王ssss23 哈哈哈jjjjj14 王jjjjj2

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

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

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

 1 @Test 2     public void ck(){ 3         bean b = new bean("王","1"); 4         bean b2 = new bean("王","2"); 5         List<bean> list = new ArrayList<bean>(); 6         List<bean> list2 = new ArrayList<bean>(); 7         list.add(b); 8         list.add(b2); 9         10         for(int i=0;i<list.size();i++){11             bean bn = new bean();12             bn.setAge(list.get(i).getAge());13             bn.setName(list.get(i).getName());14             list2.add(bn);15         }16         list2.get(0).setName("哈哈哈");17         18         for (bean bean : list2) {19             System.out.println(bean.getName()+"ssss"+bean.getAge());20         }21         for (bean bean1 : list) {22             System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());23         }24     25     }26     

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

1 list2:2 哈哈哈ssss13 王ssss24 list:5 王jjjjj16 王jjjjj2

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.