创建一个对象除了new, 还可以通过调用已有对象的clone()的方式得到
Cloneable只是一个标识接口.
clone()方法的声明是在Object类中.
MyClass implements Cloneable只是表示这个类会提供clone()方法.
外界可以这样得到一个新对象, 而不一定非要new一个对象出来.
MyClass myClass1 = myClass.clone();
调用已有对象的clone()方法得到的新对象和new 一个对象出来的区别:
使用clone()不会调用构造方法, 实现本质是内存中的二进制数据的复制.
浅拷贝和深拷贝的区别
区别在, 对引用类型的成员变量的赋值上.
WordDocument implements Clonable {
int index;
ArrayList<String> mImages;
//浅拷贝
@Override
protected WordDocument clone() {
WordDocument doc = (WordDocument)super.clone();
doc.index = this.index;
doc.mImages = this.mImages;
return doc;
}
//深拷贝
@Override
protected WordDocument clone() {
WordDocument doc = (WordDocument)super.clone();
doc.index = this.index;
doc.mImages = (ArrayList<String>)this.mImages.clone();
return doc;
}
}
使用场景
模块A负责更新用户信息类 - User, 模块B要在一个界面上展示User中的数据. 如果直接把User的对象给模块B使用, 难免模块B调用一些public方法对User的对象进行了数据修改.
这个情况下, 就可以调用User对象.clone(), 把这个拷贝出来的对象给模块B使用, 即使模块B修改了对象中的数据, 也不会影响到原来的对象.
使用这种保护性拷贝的方式, 避免原来的对象被其他模块修改.
-------DONE.------------