首页 > 代码库 > Java中克隆(Clone)一个对象

Java中克隆(Clone)一个对象

在开发过程中,可能会遇到我们需要一个和某个对象一样数据,但是不是同一个内存地址的新对象,这个时候就需要用到Clone()了.

不过.注意,Clone()分为浅拷贝和深拷贝.区别在于要拷贝的对象是否有非基本变量.

1.如果一个对象是这样的:

 1 public class CloneMan {
 2     /** 
 3      * @fields id 克隆人id
 4      */ 
 5     private int id;
 6     /** 
 7      * @fields isM 克隆人性别
 8      */ 
 9     private boolean isM;
10     
11     public CloneMan(int id, boolean isM) {
12         this.id = id;
13         this.isM = isM;
14     }
15     
16     public int getId() {
17         return id;
18     }
19     public void setId(int id) {
20         this.id = id;
21     }
22     public boolean isM() {
23         return isM;
24     }
25     public void setM(boolean isM) {
26         this.isM = isM;
27     }
28 }

CloneMan类只有基本变量类型的成员变量,那么Clone一个,只需要实现Cloneable接口,重写Clone()方法即可

 1 public class CloneMan implements Cloneable{
 2     /** 
 3      * @fields id 克隆人id
 4      */ 
 5     private int id;
 6     /** 
 7      * @fields isM 克隆人性别
 8      */ 
 9     private boolean isM;
10     
11     public CloneMan(int id, boolean isM) {
12         this.id = id;
13         this.isM = isM;
14     }
15     
16     public int getId() {
17         return id;
18     }
19     public void setId(int id) {
20         this.id = id;
21     }
22     public boolean isM() {
23         return isM;
24     }
25     public void setM(boolean isM) {
26         this.isM = isM;
27     }
28     
29     public CloneMan clone() {
30         try {
31             return (CloneMan)super.clone();
32         } catch (CloneNotSupportedException e) {
33             e.printStackTrace();
34             return null;
35         }
36     }
37 }

通过clone()方法就可以获取到新的CloneMan对象.

但是,如果需要克隆的类的成员变量包括了非基本类型的,如String,那么这种方法就失效了.因为里面的非基本变量类型也需要重写clone()方法,这种方式我觉得太麻烦了.

通过查找资料,我知道一个通过IO流来clone对象的方法,亲测有效

public static Object deepClone(Object obj) {
        //将对象写入流中
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(obj);
            //将对象从流中读出来
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi = new ObjectInputStream(bi);
            return oi.readObject();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

###注意:这里传入的Object要实现可序列化接口Serializable###

这里得到的是一个Object对象,可以在获取后进行强转获取到想要的类型,我这里处理的是如果有异常返回的是null,所以获取后要进行一次非空判断.

因为这个是一个通用方法,可以卸载IOUtil中公用

 

Java中克隆(Clone)一个对象