文档章节

java传值与传引用学习

Bonjourss
 Bonjourss
发布于 2016/05/11 09:19
字数 833
阅读 6
收藏 0
首先说明一下什么是传值传引用:

传引用:简单的说,引用其实就像是一个对象的名字或者别名 (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中什么情况下传值,什么情况下传引用讲的很详细。

本文转载自:http://blog.csdn.net/yan943789510/article/details/43760425

Bonjourss
粉丝 2
博文 37
码字总数 2312
作品 0
虹口
程序员
私信 提问
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
354
0
java中值传递的理解,C++中传值传递、引用传递和指针方式的理解

通过对参考文献中两篇文章的理解消化,自己运行测试分析总结如下: java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { Stri...

Nob
2014/09/20
1K
1
什么是值传递和引用传递?之间的区别

一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递。值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。引用传递一般是对于对象型变...

我叫小糖主
05/07
19
0
Java中的JVM基础:数据类型和堆栈

数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,...

疯狂的兔子
2015/03/26
421
0
Java中的引用和C++中引用的区别

用过java和C++的同学都知道在二者中均有引用的概念。但是这两个概念所代表的并不相同。 首先了解C++ 中引用的含义:“引用”即“别名”。C++中的引用代表的就是实际的存储空间。对其进行操作...

osDaniel
2013/12/02
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:Linux

一、目录 目录 作用 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 /etc /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,...

浮躁的码农
15分钟前
2
0
什么是 happens-before 原则?

Java 中 happens-before 原则,是在 JSR-133 中提出的。 原文摘要: • Each action in a thread happens-before every subsequent action in that thread. • An unlock on a monitor happe......

ConstXiong
27分钟前
4
0
8核AMD Zen加持:微软Surface这回血拼

微软定于10月2日在纽约举办Surface新品发布会,几乎全线消费级产品都将更新,比如15英寸Surface Laptop 3。 最新爆料称,15寸Surface Laptop 3预计一口气推出6款型号,其中顶配为8核AMD处理器...

linuxCool
28分钟前
3
0
BeginnersBook MongoDB 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
29分钟前
4
0
Java NIO:Buffer、Channel 和 Selector

本文将介绍 Java NIO 中三大组件 Buffer、Channel、Selector 的使用。 本来要一起介绍非阻塞 IO 和 JDK7 的异步 IO 的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到...

乱世当空
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部