java傳值與傳引用學習

首先說明一下什麼是傳值傳引用:

傳引用:簡單的說,引用其實就像是一個對象的名字或者別名 (alias),一個對象在內存中會請求一塊空間來保存數據,根據對象的大小,它可能需要佔用的空間大小也不等。訪問對象的時候,我們不會直接是訪問對象在內存中的數據,而是通過引用去訪問。引用也是一種數據類型,需要一定的內存空間來保存。但是它們的值是相同的,都指示同一個對象在內存的中位置,我們可以把它想象爲類似 C 語言中指針的東西,它指示了對象在內存中的地址——只不過我們不能夠觀察到這個地址究竟是什麼。

傳值:Java是傳值還是傳引用,問題主要出在對象的傳遞上,因爲 Java 中簡單類型沒有引用。

通過以上說明可以總結出:

1、引用是一種數據類型,保存了對象在內存中的地址,這種類型即不是我們平時所說的簡單數據類型也不是類實例(對象);

2、不同的引用可能指向同一個對象,換句話說,一個對象可以有多個引用,即該對象數據類型的變量;

3、改變一個引用的值,其他引用的值也會改變;

4、在java中只有簡單的數據類型,在傳遞的時候是傳遞的值;


通過以上學習解決了最近遇到的數據更新後,MyAdapter刷新問題。

剛開始我是這麼做的:

在Activity中new了一個複雜的數據類型:List<HashMap<String,Object>> data;

一個setData方法:

 public void setData(List<HashMap<String, Object>> data) {
  MangeTroubleActivity.this.data.clear();
  for(HashMap<String, Object> map:data){
   this.data.add(map)	;
  }
 }


MyAdapter也new了一個複雜的數據類型:

List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();


寫了set方法:

 public void setData(List<HashMap<String, Object>> list) {
    this.list = list;
 }


在Activity中使用MyAdapter的對象調用setData(data);      /*這裏使用的就是傳引用*/

之後在MyAdapter中修改了list後,使用list.clear();清除數據,後使用setData(list)方法放入Activity、MyAdapter改變後的數據,notifyDataSetChanged()更新界面;

這時候發現數據爲空。到底哪裏出了問題呢?

經過測試發現當在list改變後Activity中setData(0的時候傳遞的值爲空了,這時候想應該是 MangeTroubleActivity.this.data.clear(); 的時候把傳過來的數據都清空了,所以設了斷點DeBug一下。果然如此。。。。

那爲什麼會造成清除Activity中data對象,MyAdapter中的list也會改變呢?然後就想到是不是兩個對象引用的是同一個值。

對MyAdapter中set方法做了如下修改

 public void setData(List<HashMap<String, Object>> list) {
  this.list.addAll(list);
//	this.list = list;
 }


測試。。。結果數據更新成功,也不會被清除了。這其中的原因就是:通過addAll()方法實例化list對象,java中複雜數據類型傳遞的時候是傳引用,改變一個對象的值,另一個也會跟這變;


在這推薦一個網址

http://blog.csdn.net/houpuhope/article/details/7449377作者對java中什麼情況下傳值,什麼情況下傳引用講的很詳細。

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