JAVA之对象的克隆
1.为什么要克隆?
①方便,克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”使用clone方式很方便;
②速度快,clone方法最终将调用JVM中的原生方法完成复制也就是调用底层的c++代码,所以一般使用clone方法复制对象要比新建一个对象然后逐一进行元素复制效率要高。
public class text {
public static void main(String[] args) {
Cat cat =new Cat("x",5);
try {
Cat newcat=(Cat) cat.clone();//实现clone
System.out.println(cat.toString());//输出原来的
System.out.println(newcat);//输出克隆出来的
}catch (CloneNotSupportedException e) {//要捕抓异常并抛出
e.printStackTrace();
}
}
}
2.进行克隆的条件
对象需要具备克隆功能:
(1)实现Cloneable接口,(标记接口)
(2)重写Object类中的clone方法
3.如何实现clone
① 实现Cloneable接口并重写Object类中的clone()方法;
② 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。对象序列化后写入流中,再从流中读取,生成新的对象,新对象和原对象之间也是完全互不影响的。
protected Object clone() throws CloneNotSupportedException {//重写clone方法
return super.clone();
}
4.注意
1, clone()不会调用构造方法;new会调用构造方法。
2, new对象时根据类型确定分配内存空间的大小, clone是根据原对象分配内存
3.如果为一个不实现cloneable的类调用clone的话,那么就会抛出一个CloneNotSupportedException异常。相对于实现cloneable接口的类来说,如果为使用默认方法Object.clone的类的实例调用clone的话,就必须采取以下动作之一:
1.在clone的调用周围包装一个try代码块并捕捉到CloneNotSupportedException异常。
2.将异常CloneNotSupportedException添加到调用clone的方法的throws子句中,抛出这个异常。
以下为
try {
Cat newcat=(Cat) cat.clone();
System.out.println(cat.toString());
System.out.println(newcat);
}catch (CloneNotSupportedException e) {
e.printStackTrace();
版权声明:本文为qq_52732846原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。