浅拷贝(Object类中的clone()方法)是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝。

深拷贝(或叫深克隆) 则是对对象及该对象关联的对象内容,都会进行一份拷贝。

实体类:

package com.lin.test;

import java.io.Serializable;

/**
* @athor tianlin
*
* 2015年6月28日 下午1:56:18
*
**/
public class Dog implements Serializable{ private static final long serialVersionUID = 1L; private String dogName; public String getDogName() {
return dogName;
} public void setDogName(String dogName) {
this.dogName = dogName;
} } package com.lin.test; import java.io.Serializable; /**
* @athor tianlin
*
* 2015年6月28日 下午1:43:24
*
**/
public class User implements Serializable{ private static final long serialVersionUID = 1L; private String username; private Dog dog; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
} }

克隆执行类:

package com.lin.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; /**
* @athor tianlin
*
* 2015年6月28日 下午1:44:08
*
**/
public class ObjCloner { @SuppressWarnings("unchecked")
public static <T>T cloneObj(T obj){ T retVal = null; try{ // 将对象写入流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj); // 从流中读出对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais); retVal = (T)ois.readObject(); }catch(Exception e){
e.printStackTrace();
} return retVal;
} }

测试类:

package com.lin.test;
/**
* @athor tianlin
*
* 2015年6月28日 下午1:42:47
*
**/
public class CloneTest { public static void main(String[] args) { User user = new User();
user.setUsername("张三"); Dog dog = new Dog();
dog.setDogName("小狗1"); user.setDog(dog); User user2 = ObjCloner.cloneObj(user); System.out.println("user username : "+user.getUsername());
System.out.println("user dogname : " + user.getDog().getDogName());
System.out.println("user2 username : "+user2.getUsername());
System.out.println("user2 dogname : " + user2.getDog().getDogName()); System.out.println(" -------------------------------------"); user2.setUsername("李四");
user2.getDog().setDogName("小狗2");; System.out.println("user username : "+user.getUsername());
System.out.println("user dogname : " + user.getDog().getDogName());
System.out.println("user2 username : "+user2.getUsername());
System.out.println("user2 dogname : " + user2.getDog().getDogName());
} }

运行结果:

user username : 张三
user dogname : 小狗1
user2 username : 张三
user2 dogname : 小狗1
-------------------------------------
user username : 张三
user dogname : 小狗1
user2 username : 李四
user2 dogname : 小狗2 摘自:http://www.cnblogs.com/Jtianlin/p/4605477.html

java中的拷贝(二)深克隆的更多相关文章

  1. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  2. java中封装类(二)

    java中的数字类型包括 Byte,Short,Integer,Long,Float,Double.其中前四个是整数,后两个是浮点数. 在说java中数字类型之前先来看看它们统一的基类Number. ...

  3. Java中对象拷贝的两种方式

    引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...

  4. JAVA中的NIO(二)

    一.内存文件映射 内存文件映射允许我们创建和修改那些因为太大而不能放入内存中的文件.有了内存文件映射,我们就可以假定整个文件都在内存中,而且可以完全把文件当作数组来访问. package com.dy ...

  5. java中的IO二

    java中流分为节点流和处理流,IO一中的案例都是节点流 一.处理流的使用实例 二.装饰者模式 以上BufferReader的用法就是装饰者模式 Decorator就是动态地给对象增添行为 如果要实现 ...

  6. java中的拷贝(一)

    摘自:http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: int apples = 5; int pea ...

  7. java中的拷贝文件FileChannel

    以前用Java拷贝文件,只知道写byte数组循环拷贝,今天知道了可以用FileChannel进行拷贝,上代码: 下边是传统的byte数组拷贝方法 </pre><pre name=&q ...

  8. JAVA中反射机制二

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射二 利用反射创建对象 1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函 ...

  9. Java中的时间二三事

    实习过程中对于时间的处理有很多,有的还涉及到从数据库取出时间,所以做一些总结,想到那先写到哪,慢慢补充.    首先最常见的是java.util中的Date类,这个类封装了当前的日期和时间,它实际是计 ...

随机推荐

  1. maven3创建多模块web项目

    实现步骤 创建项目目录 进入“工作空间”目录,创建名为treasure的文件夹,切换至控制台,进入该文件夹. 配置模块 生成各个模块  maven-archetype-quickstart 默认的Ar ...

  2. 包含Blob字段的表无法Export/Import

    最近一直用MySQL-Front的导出导出工具完成数据库的备份,确实比较方便快捷. 后来增加了一张表,其中有blob字段,上传几个文件后,发现导出不好用了,进度条长期处于停滞状态. 想想也是,要把bl ...

  3. oracle语句随笔

    oracle语句随笔 dmp数据的导入. ; --创建用户 GRANT CONNECT,RESOURCE,DBA TO memsspc; --赋值权限 --cmd 中导入命令 IMP memsspc@ ...

  4. linux chmod命令(转)

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  5. Linux脚本执行过程重定向

    Linux脚本执行过程重定向 一.bash调试脚本,并将执行过程重定向到指定文件 bash –x  shell.sh 2>&1 | tee shell.log

  6. linux重置mysql密码

    1.使用重置脚本 wget http://soft.vpser.net/lnmp/ext/reset_mysql_root_password.sh;sh reset_mysql_root_passwo ...

  7. disable jboss JMXInvokerServlet .

    jboss 默认有几个控制台,都是可能存在漏洞被黑客利用,除了web console .jmx console. 还有JMXInvokerServlet,访问路径是ip/invoker/JMXInvo ...

  8. 学习RFS,所有文章的参考

    所有文章的主要参考: CSDN博客:http://blog.csdn.net/tulituqi 微博:@齐涛-道长

  9. 又来了,SDE非直连

    现在sde都推荐直连了,没想到还是遇到了非直连. 用10.1默认是直连,但还支持非直连. 安装半天始终无法启动.系统差点崩了. 原来是sde用户密码过期锁定了,好烦. C:\Program Files ...

  10. Vue.2.0.5-深入响应式原理

    大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue 最显著的一个功能是响应系统 -- 模型只是普通对象,修改它则更新视图.这会让状态管理变得非常简单且直观,不过理解它的原理以避免一些常见的陷阱也 ...