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. 项目管理办公室 PMO

    项目管理办公室是组织中指导,协调,支持项目管理工作的一个常设职能部门,也就是管理项目管理的常设职能部门. 它负责指定和贯彻标准化的项目管理方法论(包括工作流程与规章制度等),协调所辖的各项目对资源,工 ...

  2. sp转dp dp转px

    (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, mTextSize, context.getResources().getDis ...

  3. 使用Matrix控制图片和组件的变化

    如下程序开发了一个自定义View,该自定义View可以检测到用户的键盘事件,当用户单击手机的方向键时,该自定义View会用Matrix对绘制的图形进行旋转.倾斜变换. import android.c ...

  4. discuz判断用户登录

        在include/common.inc.php 文件.程序开始先判断是否有cookie存到了sid值,然后解密cookie['auth']这个用户登录状态加密字符串,如果解密出来有uid值表示 ...

  5. [vijos P1112] 小胖的奇偶

    第一次看到这题怎么也不会想到是并查集题目…星期五第一次看到这题,到今天做出来,实在是废了好多功夫.看了很多人的解题都有same和diff数组,我也写了,后来发现不对啊两个数组的话find函数怎么写呢? ...

  6. CCNA 4.14 TP Correction

    All people seem to need data processing ( Application presentation session transport network data li ...

  7. Word2013可以写博客

    步骤如下http://www.cnblogs.com/guyichang/p/4629211.html

  8. dataTable/dataSet转换成Json格式

    using System.Text;using System.Collections.Generic; 1)dataTable转Json(表格有名称:dt.TableName) public stat ...

  9. idea常用快捷键大全(转)

    IntelliJ Idea 常用快捷键列表   文章来自:http://lavasoft.blog.51cto.com/62575/97730/   Alt+回车 导入包,自动修正Ctrl+N   查 ...

  10. 欢迎参加MVP主讲的Windows 10开发线上课程

    博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...