Java克隆对象

来源:互联网 发布:win7安装linux操作系统 编辑:程序博客网 时间:2024/06/05 20:52


一。 使用Cloneable接口

  1. 实现Cloneable接口的类都具备被拷贝的能力,拷贝在内存中进行,比new生成对象性能明显提升;
  2. clone方法是Object类的protected方法,也就是在用户编写的代码中不能直接调用。为此必须重写定义clone方法,并声明为public,
  3. Cloneable接口的出现与接口正常使用没有关系,是一个空接口,它只是一个标记表示一个对象需要克隆,如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个(checked exception)
  4. Clone()方法存在与Object对象中,但是其不会将对象的全部属性都拷贝,而是有选择的拷贝
    1. 基本类型:
    1. 对象:如果变量是一个实例对象,只拷贝地址引用;
    2. String字符串:拷贝地址引用,但是修改时,会从字符串池中重新生成新的字符串,原来的保持不变;
  1. 对于Clone实现对象的拷贝:需要新建大量的对象,工程量大可以使用序列化来实现对象的拷贝

 

//Person.javapublic class Person implements Cloneable {private String name;public String getName() {return name;}public void setName(String aName) {name = aName;}public Person clone() {Person person = null;try {person = (Person) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return person;}public Person() {}}

public class CloneTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubPerson a = new Person();a.setName("yang");Person b = a.clone();b.setName("Qiang");System.out.println("A name :" + a.getName());}}


二、使用序列化来实现对象的拷贝

  1. 在内存中通过字节流的拷贝是比较容易的,把木对象写入到一个字节流中,再从字节流中毒出来,这样可以创建一个新的对象,且新对象与木对象不存在引用共享的问题,实现的对象的深拷贝


 

public class CloneUtils {      @SuppressWarnings("unchecked")      public static <T extends Serializable> T clone(T obj){          T cloneObj = null;          try {              //写入字节流              ByteArrayOutputStream out = new ByteArrayOutputStream();              ObjectOutputStream obs = new ObjectOutputStream(out);              obs.writeObject(obj);              obs.close();                            //分配内存,写入原始对象,生成新对象              ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());              ObjectInputStream ois = new ObjectInputStream(ios);              //返回生成的新对象              cloneObj = (T) ois.readObject();              ois.close();          } catch (Exception e) {              e.printStackTrace();          }          return cloneObj;      }  }  

  1. 使用该工具类的对象必须实现Searializable接口,否则无法克隆,
  2. 例子:

publicclass Email implements Serializable{ } publicclass Client{publicstatic void main(){Emailemail = new Email();Emailcopy = CloneUtils.clone(email);}}


 

 

0 0
原创粉丝点击