当前位置: 代码迷 >> J2SE >> 关于this引用有关问题
  详细解决方案

关于this引用有关问题

热度:47   发布时间:2016-04-23 19:57:10.0
关于this引用问题。
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里面内容。
感觉有点奇怪,一直没搞明白。
------解决思路----------------------
我是这样认为的
第一次循环完以后的情况如下

第二次循环修改完rData的内容后,this的内容也随之修改了
------解决思路----------------------
就是第一次循环完成后,rData指向的是this中key值为1001所对应的对象
当你修改rData所指向的对象时,修改的也就是this中key值为1001所对应的对象
------解决思路----------------------
把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={}}}

------解决思路----------------------
54行执行的时候,相当于this.put(arrayObj, nData);   
55行相当于rData = this.get(arrayObj);

之后循环在多次,对rData的操作,都是对this.get对应的value,或者value的get的value(不断往里类推)的操作 ,再怎么操作,都是在this这个map里的操作了,有点像深度队列。
  相关解决方案