android - 关于Java基础问题。
阿神
阿神 2017-04-18 09:59:46
[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中的元素进行过修改,我缺少了哪个知识点导致我无法理解这个问题?

阿神
阿神

闭关修行中......

全部回复(9)
PHPz
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());
PHPz

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

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

怪我咯
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());
大家讲道理
Test test = tests.get(15);
test.setName("new");

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

ringa_lee
Test test = tests.get(15);
test.setName("new");//这里修改了属性,会影响到list里面的对象的
Log.e("Test", test.toString());
Log.e("Test", tests.get(15).toString());
阿神
Test test = tests.get(15);
此时的test指向的就是tests.get(15)对象,对test做修改等于对tests.get(15)进行修改。
ringa_lee

两个对象的地址是一样的,即两个对象是相同的,所以修改其中一个,另一个也会变得。

ringa_lee

你把这句话Test test = tests.get(15);改成Test test = new Test();, 你就可以得到你期待的输出了。 我同意@中传王正一 的解释,就不重复了。

大家讲道理

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号