Java基础--对象克隆
对象拷贝用于在内存中复制对象,无需构造器便可创建对象。
需要注意的是
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基础--对象克隆的更多相关文章
- 《java基础——对象的拷贝》
java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...
- Java基础--对象的克隆
文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...
- java 复制对象 (克隆接口 与 序列化)
关于java对象复制我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的是应用传递也就是地址传递,而很多时候对于对象传递我们也 ...
- 【java】对象克隆protected Object clone() throws CloneNotSupportedException
package 对象克隆; class A implements Cloneable{//要具备clone()功能必须要实现Cloneable接口,此接口里无方法,只起标识作用. private St ...
- java基础-对象的初始化
一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...
- 一天一个Java基础——对象和类
1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...
- Java基础-对象与类
面向对象程序设计概述 面向对象的程序设计(简称OOP)时当今主流的程序设计范型,已经取代了"结构化"过程化程序设计开发技术,Java是完全面向对象的. 类 类设计构造对象的模板或蓝 ...
- Java基础——对象容器(顺序、集合、Hash)
扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...
- Java基础-对象的内存分配与初始化(一定要明白的干货)
首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...
随机推荐
- C/C++ 字符串操作函数 思维导图梳理
这些常用的字符串操作函数都是包在string.h头文件中. 分享此图,方便大家记忆 <(^-^)> 选中图片点击右键,在新标签页中打开图片会更清晰
- 为多个文件夹下的C源代码编写Makefile文件
上一篇文章写了如何为在同一个文件夹下的C源代码,本篇文章为多个文件夹下的C源代码编写Makefile文件. 建立两个文件夹,分别为abs与src.其最终目录结构如下: 1 $ ls * 2 jun.c ...
- 【转载】有向图强连通分量的Tarjan算法
转载地址:https://www.byvoid.com/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly conn ...
- NLP学习常用的网页链接
[2016.7.5] 这是以前学习的时候整理的,放到博客里面,以后再有的话会更新~ 1.一个国外的学者维护的博客,介绍NLP [链接](http://nlpers.blogspot.jp/) 2.北京 ...
- JDK各个版本的新特性jdk1.5-jdk8[转]
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...
- PHP开发框架
利用PHP开发框架可以帮助你编写干净和可重用的代码.PHP开发框架遵循MVC设计模式,以确保能够明确区分逻辑和演示文稿.但是有关PHP框架的争论也不少,这是因为有的人喜欢性能,有的人喜欢文档,而有的人 ...
- ThinkPHP模版时间显示
<!-- 如果有日期输出,即$data.time不为空且不为0,则格式化时间戳,否则默认当前时间戳,并格式化成日期格式 --> {$data.time|default=time()|dat ...
- QT 创建对话框 Dialog 实例
1. 2. dialog.h 头文件 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> QT_BEGIN_NAMESPACE cla ...
- Spring初学之Spel初配
Spel又时候可以方便我们为bean的属性赋值,如下配置文件就是常用的一些使用: <?xml version="1.0" encoding="UTF-8" ...
- DataWarehouse- 从面试定位自己的水平
1.讲一下什么是维度表和事实表.用户资料表算是什么类型表. 2. 维度建模属于第几范式,让你对维度建模改进,有什么思路吗. 3. 了解数据血缘分析吗,让你实现的话有什么技术方案,感觉难点在哪. 4. ...