android - 关于Java基础问题。
本文介绍了android - 关于Java基础问题。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
以下是我的测试代码
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name = " + name;
}
}
List<Test> tests = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Test test = new Test();
test.setName("Test" + i);
tests.add(test);
}
Test test = tests.get(15);
test.setName("new");
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
这是实际的输出:
Test: name = new
Test: name = new
我感觉期待的输出应该是这样的:
Test: name = new
Test: name = Test15
这个差异是为什么啊?我并没有对list中的元素进行过修改,我缺少了哪个知识点导致我无法理解这个问题?
解决方案
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());
这篇关于android - 关于Java基础问题。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文