有关对象的克隆克隆的方法
2017-12-28 00:00
375 查看
摘要: 面试
有关对象的克隆,目前有两种方式。
1.实现Cloneable接口并重写Object类中的clone(),方法;
这里的实现方法比较简单,就是用该类中已有的参数变量去构造一个参数相同的新对象。这个克隆出来的对象,各种参数值相同,但是地址值是不同的。但是有一点,这种类多数需要带有所有参数的构造方法使用起来不叫简单。
2.实现Seriable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
首先这个是要有一个工具类,工具类的参数为被克隆对象,返回值为克隆的新对象
我们一般使用第二种,因为基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是都支持序列化,折现个检查是编译器完成的,不是在运行时排除异常,这种方案明显比Object的clone方法好,把问题在编译是暴露,而不是运行时。
有关对象的克隆,目前有两种方式。
1.实现Cloneable接口并重写Object类中的clone(),方法;
这里的实现方法比较简单,就是用该类中已有的参数变量去构造一个参数相同的新对象。这个克隆出来的对象,各种参数值相同,但是地址值是不同的。但是有一点,这种类多数需要带有所有参数的构造方法使用起来不叫简单。
2.实现Seriable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
首先这个是要有一个工具类,工具类的参数为被克隆对象,返回值为克隆的新对象
public class MyUtil { private MyUtil() { throw new AssertionError(); } //这里需要注意泛型的使用 public static <T> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放 } }
我们一般使用第二种,因为基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是都支持序列化,折现个检查是编译器完成的,不是在运行时排除异常,这种方案明显比Object的clone方法好,把问题在编译是暴露,而不是运行时。
相关文章推荐
- static的方法和变量,只与当前类型有关,和当前对象实际new无关
- 有关json复合对象传至前台的拼接方法
- 克隆JS对象的三个实用方法
- JavaScript 中有关时间对象的方法
- JavaScript 中有关数组对象的方法
- JavaScript 中有关数组对象的方法(详解)
- 浅谈JavaScript 中有关时间对象的方法
- 克隆JS对象的三个实用方法
- PHP面向对象(OOP):克隆对象__clone()方法
- 尝试有关对象指针的使用方法,里面有自己加的知识,更深入了解了
- java克隆对象clone()的使用方法和作用
- 深度克隆一个对象的方法
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- php中的类与对象(魔术方法、克隆和重载)
- JavaScript的对象深度克隆方法
- java 深克隆clone对象或容器的另一种方法
- 析构方法、克隆对象
- php -- 魔术方法 之 对象克隆 : __clone()
- js克隆对象、数组的常用方法介绍
- javascript最新深度克隆对象方法