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 ...
随机推荐
- thinkjs——空对象判断
使用thinkjs来做后台的项目开发时,总免不了进行一些数据的唯一性校验,比如说:有这么一个页面,需要对钢厂的名称做一个校验,于是自己在后台做条件搜索时,一不小心用到了两种方法: 一个是find(), ...
- lucene索引文件格式
转自:http://blog.csdn.net/whuqin 本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含 ...
- boost 源码编译 的 Makefile.am写法备份
include $(top_srcdir)/common.mk bin_PROGRAMS= lib_LIBRARIES= lib_LTLIBRARIES= lib_LTLIBRARIES+=libSt ...
- java之socket
socket系java中网络编程的内容. 1客户端: package com.wtd.socket; import java.io.BufferedReader; import java.io.IOE ...
- FloatingActionButton增强版,一个按钮跳出多个按钮--第三方开源--FloatingActionButton
FloatingActionButton项目在github上的主页:https://github.com/futuresimple/android-floating-action-button F ...
- CSS最常用和实用的技巧
1.重置浏览器的字体大小重置浏览器的默认值 ,然后重设浏览器的字体大小你可以使用雅虎的用户界面重置的CSS方案 ,如果你不想下载9MB的文件,代码如下: body,div,dl,dt,dd,ul,ol ...
- [开发笔记]-sqlite数据库在使用时遇到的奇葩问题记录
有时候做些简单的项目一般都会选择sqlite数据库,优点有很多,这里就不详细说了. 在此主要记录一些平时在使用时遇到的问题及解决方法.希望能对大家有所帮助. --------------------- ...
- WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)
一.文件压缩 当应用程序保存和加载数据,它可以使用压缩. 1.使用 Windows.Storage.Compression.Compressor 压缩,获得一个Compressor stream. v ...
- K2十年:专注BPM
<聚·谋·变——K2中国用户大会> 导演:K2中国 主演:K2用户 时长:420分钟 票价:免费 上映日期:2015年7月17日 查看完整视频请关注K2官方微信账号
- JSON.parse()和eval()区别
JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...