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

如果创建一个对象的新的 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--对象克隆的更多相关文章
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- C#对象克隆介绍
浅拷贝和深拷贝 有两种对象克隆的方法:浅拷贝和深拷贝.浅拷贝只是复制引用,而不会复制引用的对象.深拷贝会复制引用的对象. 因此,原始对象中的引用和浅拷贝对象中的同一个引用都指向同一个对象.而深拷贝的对 ...
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...
- js对象克隆, 深复制.
亲测有效: //对象克隆 function clone(obj) { // Handle the 3 simple types, and null or undefined if (null == o ...
- (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...
- Java对象克隆详解
原文:http://www.cnblogs.com/Qian123/p/5710533.html 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = appl ...
- 【java】对象克隆protected Object clone() throws CloneNotSupportedException
package 对象克隆; class A implements Cloneable{//要具备clone()功能必须要实现Cloneable接口,此接口里无方法,只起标识作用. private St ...
- java 浅拷贝和深拷贝 对象克隆clone
分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...
- js对象克隆
大家都知道,js的对象是引用类型,如果直接var obj2 = obj,obj2和obj是共享同一个对象实体的,这往往不是我们想要的结果. 官方并没有给出通用的对象克隆方法: 我们给出以下几种写法: ...
- java 复制对象 (克隆接口 与 序列化)
关于java对象复制我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的是应用传递也就是地址传递,而很多时候对于对象传递我们也 ...
随机推荐
- VM安装CentOS7步骤
VM15下载,在360软件管家就可以下载 CentOS7下载地址:http://mirror.bit.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_6 ...
- 编程入门-Eclipse的断点调试
编程入门-Eclipse的断点调试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.双击选中你要调试的代码行数 2>.允许方法透视图 3>.进行代码调试 4& ...
- 前台图片Canvas压缩上传小结
需求来源:之前有个提交审核表单的业务,表单中含有大量附件图片,大约有20多张吧,为了省事,采用的同步上传,一次需要上传很多照片,本来单张图片限制为200KB,这样子总图片大小约为5MB左右,想想也可以 ...
- 关于torch.nn.Conv2d的笔记
先看一下CLASS有哪些参数: torch.nn.Conv2d( in_channels, out_channels, kernel_size, stride=1, padding=0, dilati ...
- Vue组件template模板字符串几种写法
在定义Vue组件时,组件的模板template选项需要的是一个字符串,当其内容较复杂需要换行时,需要简单处理一下,具体有五种方式: 方式一:使用 \ 转义换行符 <!DOCTYPE html&g ...
- 移动端主页内容 part4 axios
ajax 可以动态获取数据内容 vue中发送ajax有很多工具可用 浏览器自带的fetch 现在推荐: axios第三方模块(vue中发送ajax) 特点: 跨平台的数据请求 浏览器中xhr请求 n ...
- 洛谷 P1964 【mc生存】卖东西(多重背包)
题目传送门 解题思路: 题目里有,多重背包. AC代码: #include<iostream> #include<cstdio> #include<map> usi ...
- OGG实验:喂奶间隔数据表通过OGG配置同步
我之前在<使用SQL计算宝宝每次吃奶的时间间隔(数据保障篇)>中提到数据实时同步的方案,其中有一种是数据表通过OGG进行同步,当时没有详细展开测试,只给了之前学习OGG时的配置示例.由于之 ...
- 《C Primer Plus》- 第二章 C语言概述
本笔记写于2020年1月27日. 本系列文章参考的是<C Primer Plus>(第六版),其中里面会有笔者自己的相关补充. 以下示例均运行于macOS Catalina 10.15.2 ...
- da道至简读后感
大道至简,衍化至繁. 往往特别深奥的事却是从特别简洁的发展而成的,就像麦克斯韦仅仅凭一个方程组就统一了电磁学一样,物理学中的算式往往非常简练.开普勒计算天体运行的时候是遵循老师认同的地心说计算的,结果 ...