首先说明一下什么是传值传引用:




传引用:简单的说,引用其实就像是一个对象的名字或者别名 (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中复杂数据类型传递的时候是传引用,改变一个对象的值,另一个也会跟这变;