9 回答
TA贡献2021条经验 获得超8个赞
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
这两句话操作的是同一个引用对象,就是被你修改的那个,如果你想拿出来修改而不改变列表里的元素,需要拷贝一个新的对象出来再做修改。
实现的方式,Test类实现Cloneable接口的clone方法
public class Test implements Cloneable {
//这里是属性以及get/set方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试代码
Test test = tests.get(15).clone;
test.setName("new");
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
TA贡献1852条经验 获得超1个赞
因为变量test指向的内存空间和tests.get(15)指向的内存空间是一致的。你对共同的内存中数据进行修改,所有的引用指向的对象数据都发生了变化。
你想让list中的元素不变,你可以做一个deep copy。
TA贡献1842条经验 获得超12个赞
Test test = tests.get(15);
test.setName("new");//你现在的操作其实就是对tests.get(15)的操作,相当于tests.get(15).setName("new");
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
TA贡献1843条经验 获得超7个赞
Test test = tests.get(15);
test.setName("new");//这里修改了属性,会影响到list里面的对象的
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
TA贡献2080条经验 获得超4个赞
Test test = tests.get(15);
此时的test指向的就是tests.get(15)对象,对test做修改等于对tests.get(15)进行修改。
TA贡献1852条经验 获得超7个赞
你把这句话Test test = tests.get(15);
改成Test test = new Test();
, 你就可以得到你期待的输出了。
添加回答
举报