首先,我们来看一下clone()方法要干什么
克隆:将现有的对象复制一份,产生一份与原来对象一样的对象,但注意克隆出来的对象存的内存地址和 被克隆的对象不一样。
要想知道这道面试题答案,我们首先来看下如何使用这个clone 方法,Object对象有一个clone()方法,里面有这么一句
protected Object clone() throws CloneNotSupportedException {
if (!(this instanceof Cloneable)) {
throw new CloneNotSupportedException("Class doesn't implement Cloneable");
}
return internalClone((Cloneable) this);
}
会判断当前对象是否是一个Cloneable 的实现类,那么我们使用clone()方法,就得实现这个接口,
则有如下代码
public class MyClone {
public static void main(String[] args) {
Person p = null;
Person p2 = null;
try {
p = new Person();
p2 = (Person) p.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(p);
System.out.println(p2);
}
}
//实现Cloneable接口,重写clone()方法
class Person implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
重写clone()方法的时候 需要先克隆父类,所以 一般来说,通常都有的一行代码是
super.clone()
还有我们在使用clone的时候,会有浅克隆和深度克隆之分,一定要注意,浅克隆克隆出的对象,该对象里的引用类型的变量存储的还是原对象的值,如果有时候修改可能会修改到原对象引用的对象