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

需要注意的是

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

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

3.Object的clone方法没有同步。

一个简单的例子:

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

public class CloneTest implements Cloneable, Serializable {
private int id;
private String name;
private Date birday;
private List<String> list = new ArrayList<String>();
private transient String pwd = "pwd"; public CloneTest() {
Q.p("constructor.");
} public CloneTest(int id, String name, Date birday) {
this();
this.id = id;
this.name = name;
this.birday = birday;
} public void initList() {
this.list.add("1");
this.list.add("2");
this.list.add("3");
} public void clrList() {
this.list.clear();
} public static void main(String[] args) throws CloneNotSupportedException {
CloneTest a = new CloneTest(11, "Jack", new Date());
a.initList();
CloneTest b = a.clone();
CloneTest c = a.deepClone();
a.clrList();
System.out.println(a);
System.out.println(b);
System.out.println(c);
} @Override
public String toString() {
return "[" + id + "-" + name + "-" + birday + "-" + pwd + "-" + list.toString() + "]";
} // 重写clone方法可以对克隆过程做更多处理,返回类型可以为CloneTest(父类为Object)
@Override
public CloneTest clone() {
CloneTest c = null;
try {
c = (CloneTest) super.clone();
//引用对象需要独立拷贝
c.birday = (Date) birday.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} return c;
} //利用序列化对象进行深度复制,克隆基本对象和引用对象(除了transient)
public CloneTest deepClone() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(this);
ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
CloneTest o = (CloneTest) is.readObject();
return o;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
} }

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

输出:

constructor.
[11-Jack-Sun Nov 19 21:14:33 CST 2017-pwd-[]]
[11-Jack-Sun Nov 19 21:14:33 CST 2017-pwd-[]]
[11-Jack-Sun Nov 19 21:14:33 CST 2017-null-[1, 2, 3]]

Java基础--对象克隆的更多相关文章

  1. 《java基础——对象的拷贝》

    java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...

  2. Java基础--对象的克隆

    文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...

  3. java 复制对象 (克隆接口 与 序列化)

    关于java对象复制我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的是应用传递也就是地址传递,而很多时候对于对象传递我们也 ...

  4. 【java】对象克隆protected Object clone() throws CloneNotSupportedException

    package 对象克隆; class A implements Cloneable{//要具备clone()功能必须要实现Cloneable接口,此接口里无方法,只起标识作用. private St ...

  5. java基础-对象的初始化

    一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...

  6. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  7. Java基础-对象与类

    面向对象程序设计概述 面向对象的程序设计(简称OOP)时当今主流的程序设计范型,已经取代了"结构化"过程化程序设计开发技术,Java是完全面向对象的. 类 类设计构造对象的模板或蓝 ...

  8. Java基础——对象容器(顺序、集合、Hash)

    扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...

  9. Java基础-对象的内存分配与初始化(一定要明白的干货)

    首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...

随机推荐

  1. C# 利用TTS实现文本转语音

    TSS(Text To Speech),语音朗读文本的技术,在Windows下台下,微软给我们提供了一套API接口(Speech API).金山词霸的朗读功能就是用的这个接口. WindowsXP自带 ...

  2. MongoDB快速入门(四)- 插入文档

    插入文档 将数据插入到MongoDB集合,需要使用MongoDB 的 insert() 方法. 语法 insert()命令的基本语法如下: >db.COLLECTION_NAME.insert( ...

  3. CodeWars上的JavaScript技巧积累

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice The sli ...

  4. 【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)

    题目传送门:bzoj2118 洛谷P2371 这道题看了题解后才会的..果然是国家集训队的神仙题,思维独特. 首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每 ...

  5. Codeforces Round #395 (Div. 2) C

    题意 : 给出一颗树 每个点都有一个颜色 选一个点作为根节点 使它的子树各自纯色 我想到了缩点后check直径 当<=3的时候可能有解 12必定有解 3的时候需要check直径中点的组成点里是否 ...

  6. Flume的Avro Sink和Avro Source研究之二 : Avro Sink

    啊,AvroSink要复杂好多:< 好吧,先确定主要问题: AvroSink为啥这么多代码?有必要吗?它都有哪些逻辑需要实现? 你看,avro-rpc-quickstart里是这么建client ...

  7. HDU4819 Mosaic

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. MATLAB选出一个数组里n个元素的所有组合

    用nchoosek(A,n) 如: nchoosek([1,5,3,2,4,0],3) nchoosek([1,5,3,2],2)ans =     1     5     1     3     1 ...

  9. 安装rackspace private cloud --2 overview

    Target hosts 包含以下 network bridges: LXC internal lxcbr0: 必须的,自动生成,containers的外网连接,不连接到host上任何物理/逻辑接口, ...

  10. review36

    对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时,目标对象就会自动调用接口中的run()方法,因此,对于使用同一目标对象的线程,目标对象的成员变量自然就是 ...