clone 深拷贝 浅拷贝
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 深拷贝 浅拷贝的更多相关文章
- ICloneable接口 Clone 深拷贝 浅拷贝
需要字段本身也实现了深拷贝Clone.应用场景不多,意义不大. 1. 隐含式地要求其子类和引用类也要实现ICloneable接口,如果引用层次比较深类似一个网状或树形接口,增加复杂性. 2. 考虑给s ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...
- 深拷贝(deep clone)与浅拷贝(shallow clone)
深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- java中深拷贝浅拷贝简析
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- JS Object Deep Copy & 深拷贝 & 浅拷贝
JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- JavaScript之深拷贝&浅拷贝
深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...
- 【opencv】imread 赋值 深拷贝浅拷贝
import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...
随机推荐
- PHP的那些坑
1.urlencode urlencode编码的对象必须是utf-8编码.如果是其它格式的编码就会出现乱码. 2.array_merge 一般来说,array_merge就是把两个或两个以上的数组组合 ...
- jQuery滚动条回到顶部或指定位置
jQuery滚动条回到顶部或指定位置 在很多网站,为了增强用户体验,我们会看到回到顶部的按钮,不用手动拖拽滚动条就能回到顶部,非常方便.下面就介绍用jquery实现的滚动到顶部的代码 $(functi ...
- 使用ASP.Net WebAPI构建REST服务(五)——客户端
WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时候我们如果想在自己的程序中使用WebAPI时,此时就要实现自己的客户端了.我之前介绍过在.Net 4.5中 ...
- Oracle、Mysql、Sql Server语句的区别
1.空值的处理——判断是否为空,为空时取一个值,不为空时取另一个值 1).Sql Server 中 ISNULL(check_expression,replacement_value) 解释:如果ch ...
- Service相关--读书笔记
2013-12-30 18:16:11 1. Service和Activty都是从Context里面派生出来的,因此都可以直接调用getResource(),getContentResolver()等 ...
- 算法导论-钢条切割 C# 递归实现
下班前看到有位兄弟写 钢条切割问题,尝试实现C#版, 还没有实现最优版,分享一下. int[] parr; private void button1_Click(object sender, Even ...
- 【STL】-迭代器的用法
初始化: list<char>::iterator pos; 算法: 1. 遍历 for(pos = col1.begin(); pos != col1.end(); ++pos){... ...
- 兼容 IE,firfox 的时间日期出现 NaN
//当前日期加上天数后的新日期.function AddDays(days) { var d = new Date(); var year = d.getFullYear(); var day = ...
- Cisco IOS Debug Command Reference I through L
debug iapp through debug ip ftp debug iapp : to begin debugging of IAPP operations(in privileged EXE ...
- IOS文件管理-NSFileMangager-NSdata
Ios下的文件管理, Ios下不像windows 文件系统那样可以访问任何的文件目录,如C盘.D盘什么的.在Ios中每个应用程序只能访问当前程序的目录,也即sandbox(沙盒模型). iOS为每个应 ...