1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性

2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set很多属性很麻烦

3. 实现:实现Cloneable接口(标识接口,里面没有方法的定义)标识该类对象可以克隆

重写Object中的clone()方法,该方法可以合法的(实现上面接口)对该类实例(对象)按字段进行复制。

在重写的clone()方法中 return super.clone(); (调用父类(Object)的clone方法,其实子类什么都没做)用父类的clone放复制当前对象的属性 返回复制的对象

4. 深拷贝,浅拷贝:对象属性有 基本类型 int String(不是基本但是final)等,引用变量(其他类的对象),因为基本基本类型变量的拷贝是值拷贝,引用变量的拷贝是拷贝的地址,所以克隆出来的对象的引用变量是同一个变量,在一个对象修改时,另一个对象也被修改,所以有了深拷贝。实现深拷贝需要把引用变量的对象的类也实现Cloneable接口,从写clone()方法,return super.clone();

5. 深拷贝好像用在java框架hibernate 上

/*
浅拷贝 s修改teacher s1的teacher也修改了
*/
package weiguoyuan.chainunicom.cn; class Teacher1 {
private String name;
public Teacher1(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
} class Student1 implements Cloneable{
private String name;
private Teacher1 teacher;
public Student1(String name,Teacher1 teacher) {
this.name = name;
this.teacher = teacher;
}
public Teacher1 getTeacher() {
return teacher;
}
public String toString() {
return name+" "+teacher.toString();
}
public Object clone() throws CloneNotSupportedException{
return super.clone(); }
} public class TestClone { public static void main(String[] args) throws CloneNotSupportedException {
Teacher1 t = new Teacher1("jianghongweiSB");
Student1 s = new Student1("weiguoyuanNB",t);
Student1 s1 = (Student1)s.clone();
System.out.println(s);
System.out.println(s1); s.getTeacher().setName("jianghongwei");
System.out.println(s);
System.out.println(s1);
}
}
/**
* 深拷贝实现
*/
package weiguoyuan.chainunicom.cn; class Teacher1 implements Cloneable{
private String name;
public Teacher1(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
} class Student1 implements Cloneable{
private String name;
private Teacher1 teacher;
public Student1(String name,Teacher1 teacher) {
this.name = name;
this.teacher = teacher;
}
public Teacher1 getTeacher() {
return teacher;
}
public String toString() {
return name+" "+teacher.toString();
}
public Object clone() throws CloneNotSupportedException{
Student1 student = (Student1)super.clone();
student.teacher = (Teacher1)this.teacher.clone();
return student;
}
} public class TestClone { public static void main(String[] args) throws CloneNotSupportedException {
Teacher1 t = new Teacher1("jianghongweiSB");
Student1 s = new Student1("weiguoyuanNB",t);
Student1 s1 = (Student1)s.clone();
System.out.println(s);
System.out.println(s1); s.getTeacher().setName("jianghongwei");
System.out.println(s);
System.out.println(s1);
}
}

clone 深拷贝 浅拷贝的更多相关文章

  1. ICloneable接口 Clone 深拷贝 浅拷贝

    需要字段本身也实现了深拷贝Clone.应用场景不多,意义不大. 1. 隐含式地要求其子类和引用类也要实现ICloneable接口,如果引用层次比较深类似一个网状或树形接口,增加复杂性. 2. 考虑给s ...

  2. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...

  3. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  4. c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参

    c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...

  5. java中深拷贝浅拷贝简析

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

  6. JS Object Deep Copy & 深拷贝 & 浅拷贝

    JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  7. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  8. JavaScript之深拷贝&浅拷贝

    深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...

  9. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

随机推荐

  1. 碰到sshd连接不上linux时的解决办法

    1,首先更改ssh配置,可以是ssh端口连接不上服务器 cd /etc/ssh/sshd_config vi !$ Port 52113 //ssh默认的连接端口, 改为别人不知道的端口 Permit ...

  2. SQL查询表占用空间大小

    SQL查询表占用空间大小. create table tmp (name varchar(50),rows int,reserved varchar(50),data varchar(50),inde ...

  3. django.test.client 使用随记

    import os,sys,django; sys.path.append("\\path\\to\\mysite")#ATTETION!,Err: "unable to ...

  4. IPTables系列:如何配置Ubuntu 14.04中的IPTables防火墙

    IPTables基本命令 在向大家介绍复杂防火墙规则之前,还是先上一些简单的料,让大家对IPTables最为基本的命令有一些简单了解. 首先要说明的是IPTables命令必需以root权限运行,这意味 ...

  5. strstr strchr strrchr

    通过函数的定义来区分: 1.strstr: 返回子串出现的第一次位置 char *strstr(const char *haystack, const char *needle) 可见,strstr函 ...

  6. 启动 nginx 失败 "fastcgi_pass" directive is duplicate

    [emerg] 4953#0: "fastcgi_pass" directive is duplicate in /etc/nginx/sites-enabled/default: ...

  7. [vijos P1034] 家族

    寒假给自己定的第一个目标就是把并查集,Tarjan之类搞会.翻了翻笔记,发现并查集是2012年的6月30日学的…早就忘光了…今天敲题目的时候也吃了不少的亏呢… 家族这一题就是并查集的标准题,第一次提交 ...

  8. Android 自动朗读(TTS)

    在Android应用中,有时候需要朗读一些文本内容,今天介绍一下Android系统自带的朗读TextToSpeech(TTS).自动朗读支持可以对指定文本内容进行朗读,还可以把文本对应的音频录制成音频 ...

  9. C语言实例代码

    绘制余弦曲线和直线 #include #include int main() { double y; int x,m,n,yy; for(yy=0;yy<=20;yy++) {y=0.1*yy; ...

  10. 用C#感受MongoDB MapReduce之魅力 转

    MapReduce这个名词随着hadoop的用户的增多,越来越被人关注.MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它.M ...