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中公用

时间: 2024-10-08 10:28:51

Java中克隆(Clone)一个对象的相关文章

JAVA中的clone方法剖析

原文出自:http://blog.csdn.net/shootyou/article/details/3945221 java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的?     1. Clone&Copy     假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通常我们会有这样的赋值Employee cindyelf=tobby,这个时候只

Java中对Clone的理解

面试中经常遇到Clone的相关知识,今天总算是把Clone理解的比较透彻了!Java中Clone的概念大家应该都很熟悉了,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的?     1. Clone和Copy     假设现在有一个User对象,User u1=new User(“U1001”,“Jason”,25),通常我们会有这样的赋值User u2=u1,这个时候只是简单了copy了一下reference,u2和u1都指向内存中同一个ob

简单聊聊java中如何判定一个对象可回收

背景 说到java的特性,其中一个最重要的特性便是java通过new在堆中分配给对象的内存,不需要程序员主动去释放,而是由java虚拟机自动的回收.这也是java和C++的主要区别之一:那么虚拟机是如何实现自动回收的呢?它的基本回收算法又是什么呢?  这篇随笔先不介绍这些~ ~,熟话说 饭要一口一口地吃,路要一步一步地走嘛,这篇随笔主要讲解的是回收的前提:如何判断一个对象可以回收. 对java中如何判断一个对象可以回收的一般性认识 在没有学习<深入理解java虚拟机>之前,对于java中判断一

Java中如何序列化一个对象(转)

转自:http://blog.csdn.net/chx10051413/article/details/40784667 http://www.cnblogs.com/baoendemao/p/3804797.html Java 中如何序列化一个对象 我们都知道java 中无法保存一个对象到文本文件中,但是当我们有这种需求的时候,我们可以通过java 的序列化功能把当前对象的一些属性以二进制的形式保存到文件中.当我们需要这个对象的时,只需要从二进制文件中还原为保存前的对象即可.从这里我们可以得到

详解Java中的clone方法

转载自:http://blog.csdn.net/zhangjg_blog/article/details/18369201 Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是

详解Java中的clone方法:原型模式

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之

Java中的clone()----深复制,浅复制

这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用

转:Java中的Clone()方法详解

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 使用new操作符创建一个对象 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之后,再

Java中的clone方法详解

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存