Clone

对象拷贝用于在内存中复制对象,无需构造器便可创建对象。

需要注意的是

1.clone方法提供的只是简单的值拷贝和地址拷贝,若类中包含HashMap等类型时,需要手工编写拷贝过程

2.如果父类没有提供正确的clone方法,子类拷贝也将不正确

3.Object的clone方法没有同步

所以不建议覆盖clone方法,也不建议使用clone方法。

一个简单的例子:

------------------------------

 1 package demos;
 2
 3 import java.util.Date;
 4
 5 public class CloneTest implements Cloneable {
 6     private int id;
 7     private String name;
 8     private Date birday;
 9
10     public CloneTest() {
11     }
12
13     public CloneTest(int id, String name, Date birday) {
14         this.id = id;
15         this.name = name;
16         this.birday = birday;
17     }
18
19     @Override
20     public String toString() {
21         return "[" + id + "-" + name + "-" + birday + "]";
22     }
23
24     // 重写clone方法可以对克隆过程做更多处理,返回类型可以为CloneTest(父类为Object)
25     //
26     @Override
27     public CloneTest clone() {
28         CloneTest c = null;
29         try {
30             c = (CloneTest) super.clone();
31             //引用对象需要独立拷贝
32             c.birday = (Date) birday.clone();
33         } catch (CloneNotSupportedException e) {
34             e.printStackTrace();
35         }
36
37         return c;
38     }
39
40     public static void main(String[] args) throws CloneNotSupportedException {
41         CloneTest a = new CloneTest(11, "Jack", new Date());
42         CloneTest b = (CloneTest) a.clone();
43         System.out.println(a);
44         System.out.println(b);
45     }
46
47 }

------------------------------

输出:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }

[11-Jack-Fri Nov 04 23:58:33 CST 2016]

[11-Jack-Fri Nov 04 23:58:33 CST 2016]

时间: 2024-08-01 00:10:44

Clone的相关文章

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

git clone失败

git clone失败,提示输入的密码错误,执行以下两步 1. 重新生成ssh 在命令行执行命令:ssh-keygen -t rsa -C "[email protected]" 邮箱要输入自己的地址 2. 把生成的 ~/.ssh/id_rsa.pub 公共密钥添加到git网站上 记住要全部复制!

java中的clone()

什么是"clone"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在 Java语言中,用简单的赋值语句是不能满足这种需求的.要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段. Java的所有类都默认继承java.lang.Object类,在java.lan

Java clone()深拷贝、浅拷贝

Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protected native Object clone() throws CloneNotSupportedException; 如果对象implement Cloneable接口的话,需要覆盖clone方法(因为Object类的clone方法是protected,需要覆盖为public) public Obj

Oracle 学习之 11g Clone 安装

如果你需要安装的数据库服务器比较多,使用图形化方式安装数据库软件的速度还是很慢,而且也比较麻烦.Oracle 11g 提供了Clone安装的方法. 步骤如下: 使用正常方法在服务器A上安装好Oracle. 将A机器上的$ORACLE_HOME打包,db_home1.zip . 将B机器的环境准备好,如建立用户.建立用户.修改内核参数,修改环境变量等等. 将zip包copy到B服务器,解压到任意目录. 执行Clone命令 A机器上打包 [[email protected] oracle]# zip

深度clone

1.之前在javascript的设计模式里面看到过,但是没有仔细去分析 2.下面的是一个例子(一种深度clone的写法): if (Obj instanceof Array) { buf = []; //创建一个空的数组 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; www.2cto.com }else if (Obj instanceof Object){ buf = {}; //创建一个空对象

java Object对象的clone方法

参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎么看过,刚好要用,就看看了. 源码解释: /** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class of the object. The

【Lintcode】137.Clone Graph

题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. How we serialize an undirected graph: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each

133. Clone Graph

题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's undirected graph serialization: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each n

git clone远程branch和tag

接着上一个笔记讲,我们想从remote repository上获取某个branch的某个tag.这句可以理解为,以angular,我们想获得angular的angular1的v.0.1.1的版本. 1.查看远程分支git branch -r //显示内容为origin/Androidorigin/mesa-esorigin/mesa-es-dri 如git checkout origin/Android 是不会clone远程的内容(也是错误做法) ------------------------