为了账号安全,请及时绑定邮箱和手机立即绑定

关于Java基础问题。

关于Java基础问题。

慕容森 2019-03-13 18:19:16
以下是我的测试代码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 = newTest: name = new我感觉期待的输出应该是这样的:Test: name = newTest: name = Test15这个差异是为什么啊?我并没有对list中的元素进行过修改,我缺少了哪个知识点导致我无法理解这个问题?
查看完整描述

9 回答

?
宝慕林4294392

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());


查看完整回答
反对 回复 2019-04-24
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

因为变量test指向的内存空间和tests.get(15)指向的内存空间是一致的。你对共同的内存中数据进行修改,所有的引用指向的对象数据都发生了变化。

你想让list中的元素不变,你可以做一个deep copy。


查看完整回答
反对 回复 2019-04-24
?
红颜莎娜

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());


查看完整回答
反对 回复 2019-04-24
?
浮云间

TA贡献1829条经验 获得超4个赞

Test test = tests.get(15);

test.setName("new");

这里不是被你自己改了吗?


查看完整回答
反对 回复 2019-04-24
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

Test test = tests.get(15);

test.setName("new");//这里修改了属性,会影响到list里面的对象的

Log.e("Test", test.toString());

Log.e("Test", tests.get(15).toString());


查看完整回答
反对 回复 2019-04-24
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

Test test = tests.get(15);

此时的test指向的就是tests.get(15)对象,对test做修改等于对tests.get(15)进行修改。


查看完整回答
反对 回复 2019-04-24
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你把这句话Test test = tests.get(15);改成Test test = new Test();, 你就可以得到你期待的输出了。 

查看完整回答
反对 回复 2019-04-24
?
aluckdog

TA贡献1847条经验 获得超7个赞

其实就是传递的一个引用,你改变了他,他们都是指向一个对象,肯定就是输出这样啊


查看完整回答
反对 回复 2019-04-24
  • 9 回答
  • 0 关注
  • 501 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信