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对象.也就是 ...
随机推荐
- linux 无密码登录
环境:Linux 脚本:Python 功能:批量IP,远程执行命令.拷贝文件 运行:./ssh_scp.py iplist.txt 脚本内容: #!/usr/bin/env python# -*- c ...
- showModalDialog改进版,包括Chrome下的特殊处理
父页面: if(window.ActiveXObject){ //IE $("#choose_entp").click(function(){ ...
- Codeforces Round #273 (Div. 2) A , B , C 水,数学,贪心
A. Initial Bet time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- JAVA中代码前加@有什么作用
严格说@符号并未在java 语言中作为操作符使用.而是在其他附属技术中使用比如1.javadoc 文档关键字/*** @author* @version* @since* @see*/用于自动生成 ...
- Python词云的中文问题
image= Image.open('F:/__identity/course/建模/九寨沟地震/四川地图.jpg') fig = plt.figure(figsize=(20, 16)) graph ...
- shell获取ip地址
Mac: $ ifconfig en0|awk -F"[ ]+" '/inet/{print $2}' fe80::a211:9bff:fe15:%en0 192.168.0.10 ...
- 详解 Android 通信
详解 Android 通信 :http://www.androidchina.net/5028.html
- 10-THREE.JS perspective透视摄像机和orthographic正交摄像机区别
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- Eclipse插件开发_学习_01_Maven+Tycho 构建RCP程序
二.参考资料 1.用Tycho来构建你的RCP程序(一) —— Plugin
- fastadmin学习文档
https://doc.fastadmin.net/docs/index.html 介绍 FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架. 主要特性 基于Auth ...