对象的克隆是指复制出一个与原对象的实体内容完全一样的另一个对象,两个对象有着不同的引用,不同的实体空间,但是实体的内容完全一样,通过java提供的clone方法来实现克隆,clone方法是基类Object的一个protected方法,任何类都会继承该方法,这个方法必须被重写,否则达不到克隆的效果,clone方法多数是在类外使用的,此时要重写成public的,重写clone方法必须实现Cloneable接口,该接口没有任何要实现的方法,它的作用就是通知JVM可以安全地在实现了此接口的类的实例上使用clone方法,不实现此接口会抛出CloneNotSupportedException异常
public class Student implements Cloneable {
public int a;
public Student() {}
public Object clone() {
Student s = null;
try {
s = (Student) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return s;
}
}
Student s1 = new Student();
Student s2 = (Student) s1.clone();
该复制为浅复制,只能复制对象里的非引用类型的成员,对于引用类型的成员复制的仍然为引用,若想实现深复制,必须首先重写对象里引用类型成员的clone方法,然后在该类的clone方法中,对于其中引用类型变量的复制,明确调用其clone方法复制,java自带的引用类型的成员的clone方法应该都被实现了,我们可以直接用。
public class Student implements Cloneable {
//Student内的引用类型成员
public Address addr;
public int a;
public Student() {
addr = new Address();
}
public Object clone() {
Student s = null;
try {
//先复制一个Student,之后对其中的引用成员addr使用clone复制
s = (Student) super.clone();
s.addr = (Address) this.addr.clone();
} cathc(CloneNotSupportedException e) {
e.printStackTrace();
}
return s;
}
}