android - 关于Java基础问题。

查看:138
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆