当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,这就是说,改变一个变量所引用的对象将会对另一个变量产生影响。

如果创建一个对象的新的 copy,他的最初状态与 original 一样,但以后将可以各自改变各自的状态,那就需要使用 clone 方法。

但是 clone 默认的是浅拷贝。

clone 方法是 Object 类的一个 protected 方法,也就是说,在用户编写的代码中不能直接调用它。

clone 方法只对各个域进行对应的拷贝。如果对象中的所有数据域都属于数值或基本类型,这样拷贝域没有任何问题。但是,如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象,因此原始对象与克隆对象共享这部分信息。

如果原始对象与浅克隆对象共享的子对象是不可变的,将不会产生任何问题。然而,更常见的是子对象可变,因此必须重新定义 clone 方法,以便实现克隆子对象的深拷贝。

如果需要做拷贝,必须实现 Cloneable 接口,Cloneable 是一个标记接口,表明类设计者知道要进行克隆处理。如果一个对象需要克隆,而没有实现 Cloneable 接口,就会产生一个已检验异常。

实现深拷贝,必须克隆所有可变的实例域。

所有的数组类型均包含了一个 clone 方法,这个方法被设为 public,而不是 protected。

 package org.wzh.clone;

 import java.util.Arrays;
import java.util.Date; public class CloneDemo1 { public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student("Timo", 11002910, new Date());
System.out.println(student + " " + student.getDate().hashCode());
Student student2 = student.clone();
student2.setDate(new Date());
System.out.println(student2 + " " + student2.getDate().hashCode());
System.out.println(student + " " + student.getDate().hashCode()); int[] array = {1, 2, 3, 4};
int[] array2 = array.clone();
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
} } class Student implements Cloneable { private String name;
private int no;
private Date date; public Student(String name, int no, Date date) {
super();
this.name = name;
this.no = no;
this.date = date;
} @Override
protected Student clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Student student = (Student) super.clone();
//错开时间
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
student.date = (Date) date.clone();
return student;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getNo() {
return no;
} public void setNo(int no) {
this.no = no;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} }

JavaSE--对象克隆的更多相关文章

  1. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  2. C#对象克隆介绍

    浅拷贝和深拷贝 有两种对象克隆的方法:浅拷贝和深拷贝.浅拷贝只是复制引用,而不会复制引用的对象.深拷贝会复制引用的对象. 因此,原始对象中的引用和浅拷贝对象中的同一个引用都指向同一个对象.而深拷贝的对 ...

  3. Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...

  4. js对象克隆, 深复制.

    亲测有效: //对象克隆 function clone(obj) { // Handle the 3 simple types, and null or undefined if (null == o ...

  5. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...

  6. Java对象克隆详解

    原文:http://www.cnblogs.com/Qian123/p/5710533.html 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = appl ...

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

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

  8. java 浅拷贝和深拷贝 对象克隆clone

    分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...

  9. js对象克隆

    大家都知道,js的对象是引用类型,如果直接var obj2 = obj,obj2和obj是共享同一个对象实体的,这往往不是我们想要的结果. 官方并没有给出通用的对象克隆方法: 我们给出以下几种写法: ...

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

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

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-share

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. Dynamic Route Matching Vue路由(1)

    Dynamic Route Matching 动态的 路由 匹配 Very often we will need to map routes with the given pattern to the ...

  3. 新版本vue-cli3.x 无法热更新问题【转载】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_38644883/articl ...

  4. taro编译的时候报 exports.pRimraf = util_1.promisify(rimraf); 错误

    C:\Users\1\AppData\Roaming\npm\node_modules\@tarojs\cli\dist\h5\helper.js:8 exports.pRimraf = util_1 ...

  5. 1 ~ express ~ 初始化。安装第三方模块express。中间件

    一,初始化 二,安装第三方模块express 三,安装中间件 1,bodyParser : 解析 post 请求数据 2,cookies : 读写 cookie 3,swig :模板解析引擎 4,mo ...

  6. 关于 python 中 虚拟环 virtualen境的操作

    python3.X安装和pip安装方法 pip install -i https://pypi.douban.com/simple XXX 1.安装virtualenv pip install vir ...

  7. Dynamics CRM - 解决无法使用 Ribbon Workbench 2016 定制 Sub-Grid View Button 的问题(SubGrid MainTab 消失之谜)

    发现问题: 在 Dynamics CRM 开发中,会经常使用 Ribbon Workbench 工具来定制 Button 或者对已有 Button 进行自定义功能开发,比如隐藏 SubGrid 的 A ...

  8. hash表系列(转)

    http://www.cnblogs.com/mumuxinfei/p/4441826.html 前言: 我以前在百度的mentor, 在面试时特喜欢考察哈希表. 那时的我满是疑惑和不解, 觉得这东西 ...

  9. ucosiii 学习笔记

    OSTaskCreate 的参数中有一个 void *p_ext,这个参数用来传递额外的信息,可以用来传递数组,结构体等等. AppTaskStart --> CPU_Init --> C ...

  10. DevOps元数据管理

    元数据是自动化运维的基础,对元数据的管理和查询贯穿整个运维的生命周期.我们从一个元数据的使用场景开始: 双十一抢购火热进行中,某电商后端实例的日志中出现了502错误码,运维平台监测到该异常并发送告警给 ...