Java提供了一个projected修饰的clone()方法,该方法用来实现对象的“自我克隆”,即得到当前对象的一个副本,并且两个对象之间完全隔离。需要注意的是,由于该方法使用projected修饰,因此该方法只能被子类重写或者调用。
自定义类实现克隆的步骤如下:
1、首先自定义类需要实现Cloneable接口,该接口只是一个标记性接口(接口中没有定义任何方法),表明实现该接口的类可以实现“自身复制”;
2、自定义类实现自己的clone方法;
3、实现clone方法时通过super.clone();调用Object类的clone方法得到当前对象的副本,并放回该副本。
我们看以下的例子:
class Address{
String detail;
public Address(String detail){
this.detail = detail;
}
}
class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("杭州");
}
public User clone() throws CloneNotSupportedException{
return (User)super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User(28);
User user1 = user.clone();
System.out.println(user == user1);
System.out.println(user.address == user1.address);
}
}
输出结果是:
false
true
可以看出,克隆出来的对象只是原有对象的副本,因此在判断原有对象和克隆出来的对象是否相等时,返回false。虽然Object对象的clone方法虽然简单易用,但它正是一种浅克隆,即它克隆该对象的所有成员变量值,不会对引用类型的成员变量值所引用的对象进行克隆,因此比较两个对象的address时的返回值为true。
如果需要对对象进行深克隆,那么需要我们自己进行递归克隆,以保证所有引用成员变量所引用的对象都被复制。
《Java疯狂讲义》学习笔记。