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对象.也就是 ...
随机推荐
- Cocos2d-x项目移植到WP8系列之二:开篇
原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...
- c++ boost库学习一:时间和日期
timer类 #include <boost\timer.hpp> #include "iostream" using namespace std; int _tmai ...
- 互联网高并发之Hystrix实现服务隔离和降级
当大多数人在使用Tomcat时,多个HTTP服务会共享一个线程池,假设其中一个HTTP服务访问的数据库响应非常慢,这将造成服务响应时间延迟增加,大多数线程阻塞等待数据响应返回,导致整个Tomcat线程 ...
- js提示确认删除吗
<script language="javascript"> function delcfm() { if (!confirm("确认要删除?")) ...
- 排序算法(java版)
一直想理解一下基本的排序算法,最近正好在搞java所以就一并了(为了便于理解,这儿都是以从小到大排序为目的) 冒泡排序 也就是比较连续的两个值,如果前面一个值大于后面一个值,则交换. 时间复杂度为O( ...
- 回溯法之k着色问题
package main import ( "fmt" ) type Graphic struct { edges [][]int colors int color []int f ...
- Live disk migration with libvirt blockcopy
nova采用 libvirt blockcopy(python API virDomainBlockRebase)来做live snapshot. Create the base image: $ ...
- 我的java mvc
mint mvc 并不是我原创的.她的基础是廖雪峰老师的webwind mvc. webwind是廖老师模仿spring的一个 rest 风格的 mvc 框架,功能简单,但是mvc的核心功能基本具备了 ...
- java:jsp: ResourceBundle国际化多语言
java提供了一个资源类java.util.ResourceBundle来试下多国语言版本.其实ResourceBundle只是一个抽象的类,她有两个子类:ListResourceBundle,和,P ...
- linux下图形字符的命令
banner sudo apt-get install sysvbanner banner song 若更改字体可以使用banner song printerbanner -w 50 A toilet ...