关于this引用问题。

cqhweb 2015-03-19 03:58:11
import java.util.ArrayList;
import java.util.LinkedHashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
*
* 报表数据存储用 yxy 20091020
*
*/
public class ReportData extends LinkedHashMap {
private static final Log logger = LogFactory.getLog(ReportData.class);

public static void main1(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");

String key = "1";
String value = "2";

ReportData rData = new ReportData();
rData.put(arrayList, key, value);

}

public static void main(String[] args) {
ArrayList path = new ArrayList();
ReportData rData = new ReportData();
// 添加笔数
path.clear();
path.add("1001");
path.add("1");
path.add("0");
path.add("1");
rData.put(path, "COUNT", "888");
}

public void put(ArrayList arrayList, Object key, Object value) {

ReportData rData = this;

for (int i = 0; i < arrayList.size(); i++) {

Object arrayObj = arrayList.get(i);
boolean flag = rData.containsKey(arrayObj);
if (flag) {
rData = (ReportData) rData.get(arrayObj);
} else {
ReportData nData = new ReportData();
rData.put(arrayObj, nData);
rData = nData;
}
}
rData.put(key, value);
}

}




44行:ReportData rData = this; // rData 指向this,即当前对象

第一次循环
54行:rData.put(arrayObj, nData); // 该句执行完后 this里面是{1001={}}
55行:rData = nData; // 该句执行完后 rData里面是{}

第二次循环
54行:rData.put(arrayObj, nData); // 该句执行完后 this里面是{1001={1={}}} 问题:rData里面 是空,赋完值后还影响this里面内容。
55行:rData = nData; // 该句执行完后 rData里面是{}

那么问题来了。
当第一次循环后rData是null(也就是说第一次循环后rData不再指向this,与this脱离关系了)。
为什么第二次循环到54行赋值完后,还会影响this里面内容。
感觉有点奇怪,一直没搞明白。
...全文
159 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqhweb 2015-03-19
  • 打赏
  • 举报
回复
oh_Maxy 回答的不错,这个就是深度相当与二叉树。主要是来存数据的。 chenjing0320 也解释的很好。
oh_Maxy 2015-03-19
  • 打赏
  • 举报
回复
54行执行的时候,相当于this.put(arrayObj, nData); 55行相当于rData = this.get(arrayObj); 之后循环在多次,对rData的操作,都是对this.get对应的value,或者value的get的value(不断往里类推)的操作 ,再怎么操作,都是在this这个map里的操作了,有点像深度队列。
chenjing0320 2015-03-19
  • 打赏
  • 举报
回复
把this叫做对象A,,第一次循环产生的rData叫做对象B,第二次循环产生的rData叫做对象C。 第一次循环后 B是空的, 所以B是{} A有B的引用,所以A是{1001=B},即{1001={}} 第二次循环后 C是空的, 所以C是{} B有C的引用,所以B是{1=C},即{1={}} 虽然rData不再指向A,但this指向A,A对象仍然存在 A仍然有B的引用,A是{1001=B},但是B变成了{1={}},因此A也就是this是{1001={1={}}}
sow2018 2015-03-19
  • 打赏
  • 举报
回复
就是第一次循环完成后,rData指向的是this中key值为1001所对应的对象 当你修改rData所指向的对象时,修改的也就是this中key值为1001所对应的对象
sow2018 2015-03-19
  • 打赏
  • 举报
回复
我是这样认为的
第一次循环完以后的情况如下

第二次循环修改完rData的内容后,this的内容也随之修改了

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧