java传值与传引用学习
来源:互联网 发布:win10 笔记软件 编辑:程序博客网 时间:2024/04/28 07:45
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中什么情况下传值,什么情况下传引用讲的很详细。- java传值与传引用学习
- Java学习(一):引用与传值
- Java 引用和赋值 传值与传引用
- JAVA中的传值与传引用
- java传值与传引用
- Java传值与传引用
- Java传值与传引用
- Java传值与传引用
- java 传值与传引用
- java关于传值与传引用
- Java传值与传引用总结
- Java传值与传引用
- Java传值与传引用
- Java传值与传引用
- Java传值与传引用
- JAVA传值与传引用
- java -- 传值与传引用
- Java的传值与传引用
- js window.print() 打印隐藏内容
- 工作周报031
- StructLayout特性
- android 电容屏(三):驱动调试之驱动程序分析篇
- 测试123
- java传值与传引用学习
- Servlet--Servlet技术
- 30天自制操作系统第二天
- hdu 1285 拓扑排序(简单)
- Myeclipse配置Mybatis_generator生成mapper,model,client
- Android中HttpGet和HttpPost设置超时
- File :: Temp
- 大文件从指定行开始读取
- mysql配置文件介绍