浅拷贝

被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象。换言之,浅拷贝 不复制引用对象。

 1 class Experience {
2 private String skill;
3 public void setSkill(String skill){
4 this.skill = skill;
5 }
6 public void setExperience(String skill){
7 this.skill = skill;
8 }
9
10 @Override
11 public String toString() {
12 return skill;
13 }
14 }
15
16 public class CloneTest implements Cloneable{
17
18 private int age ;
19 private Experience experience;
20
21 public CloneTest(){
22 this.age = 10;
23 this.experience = new Experience();
24 }
25 public Experience getExperience() {
26 return experience;
27 }
28 public void setExperience(String skill){
29 experience.setExperience(skill);
30 }
31 public void show(){
32 System.out.println(experience.toString());
33 }
34 public int getAge() {
35 return age;
36 }
37 @Override
38 protected Object clone() throws CloneNotSupportedException {
39 return (CloneTest) super.clone();
40 }
41 }
42 //测试类
43 class MianTest{
44
45 public static void main(String[] args) throws CloneNotSupportedException {
46 CloneTest test = new CloneTest();
47 test.setExperience("我是小明,我精通Java,C++的复制粘贴");
48 test.show();
49 CloneTest cloneTest = (CloneTest) test.clone();
50 cloneTest.show();
51 cloneTest.setExperience("我是小明的副本,我精通Java,C++");
52 cloneTest.show();
53 test.show();
54 System.out.println(cloneTest.getAge());
55 }
56 }

输出的结果:

我是小明,我精通Java,C++的复制粘贴
我是小明,我精通Java,C++的复制粘贴
我是小明的副本,我精通Java,C++
我是小明的副本,我精通Java,C++
10

从结果中不难看出,拷贝的副本改变了Experience的skill属性,原类中的skill属性打印出来也是修改后的结果,说明引用 类型的拷贝没有将对象拷贝,引用的指向还是原类中的指向

深拷贝

除了被复制的对象的所有变量都有原来对象的值之外,还把引用对象也指向了被复制的新对象

 1 class Experience implements Cloneable{
2 private String skill;
3 public void setSkill(String skill){
4 this.skill = skill;
5 }
6 public void setExperience(String skill){
7 this.skill = skill;
8 }
9
10 @Override
11 public String toString() {
12 return skill;
13 }
14
15 @Override
16 protected Object clone() throws CloneNotSupportedException {
17 return super.clone();
18 }
19 }
20
21 public class CloneTest implements Cloneable{
22
23 private int age ;
24 private Experience experience;
25
26 public CloneTest(){
27 this.age = 10;
28 this.experience = new Experience();
29 }
30 public Experience getExperience() {
31 return experience;
32 }
33 public void setExperience(String skill){
34 experience.setExperience(skill);
35 }
36 public void show(){
37 System.out.println(experience.toString());
38 }
39 public int getAge() {
40 return age;
41 }
42 @Override
43 protected Object clone() throws CloneNotSupportedException {
44 CloneTest o = (CloneTest) super.clone();
45 o.experience = (Experience) o.getExperience().clone();
46 return o;
47 }
48 }
49 class MianTest{
50
51 public static void main(String[] args) throws CloneNotSupportedException {
52 CloneTest test = new CloneTest();
53 test.setExperience("我是小明,我精通Java,C++的复制粘贴");
54 test.show();
55 CloneTest cloneTest = (CloneTest) test.clone();
56 cloneTest.show();
57 cloneTest.setExperience("我是小明的副本,我精通Java,C++");
58 cloneTest.show();
59 test.show();
60 System.out.println(cloneTest.getAge());
61 }
62 }

输出的结果:

我是小明,我精通Java,C++的复制粘贴
我是小明,我精通Java,C++的复制粘贴
我是小明的副本,我精通Java,C++
我是小明,我精通Java,C++的复制粘贴
10

可以看出和第一次的结果不同了。

o.experience =(Experience) o.getExperience().clone();

加了这句之后效果不同的。说明实现了深拷贝,原引用对象也复制过来了

Java深拷贝和浅拷贝的区别的更多相关文章

  1. Java 深拷贝和浅拷贝 利用序列化实现深拷贝

    Java 深拷贝和浅拷贝 转自:http://www.cnblogs.com/mengdd/archive/2013/02/20/2917971.html 深拷贝(deep clone)与浅拷贝(sh ...

  2. java 深拷贝与浅拷贝机制详解

    概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一 ...

  3. Python 深拷贝和浅拷贝的区别

    python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用  ...

  4. Java问题解读系列之IO相关---Java深拷贝和浅拷贝

    前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...

  5. Python赋值语句与深拷贝、浅拷贝的区别

    参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...

  6. python深拷贝和浅拷贝的区别

    首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...

  7. java深拷贝与浅拷贝

    1.调用Object类的clone方法必须实现Cloneable接口,clone属于浅拷贝. 2.可以通过java的反序列化机制进行深拷贝. 3.可以直接用apache提供的一些包进行深拷贝和浅拷贝, ...

  8. c# 深拷贝与浅拷贝的区别分析及实例

    浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的. 深拷贝是指源对象与拷贝对象互相独 ...

  9. python深拷贝与浅拷贝的区别

    可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象 ...

随机推荐

  1. Java IO(十九)PrintStream 和 PrintWriter

    Java IO(十九)PrintStream 和 PrintWriter 一.介绍 (一).PrintStream PrintStream 是打印输出流,它继承于FilterOutputStream. ...

  2. 【转】动态规划:最长递增子序列Longest Increasing Subsequence

    转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...

  3. Linux下db2V10.5命令行安装超详细图文教程(附下载地址)

    下载地址:https://pan.baidu.com/s/1GtF03x1FMF3IsGdSiBJu-g 提取码:8vfj 失效了发邮件:wells974@163.com 一.db2prereqche ...

  4. CSS 超出行显示...

    一行超出 overflow:hidden; white-space:nowrap; text-overflow:ellipsis; 多行超出 overflow: hidden; text-overfl ...

  5. spring Resource

    在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源资源.ClassPath相关资源.服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源.因此处理这 ...

  6. elasticsearch中保存时间格式

    利用logstash从文档中导入数据到es中,若未事先设定数据格式,有可能存储时间并未保存为date格式而是text格式. 时间若保存为text,则在会以字符串数组格式存储在es中,是乱序,不好查询. ...

  7. Java实现蓝桥杯 历届试题 合根植物

    问题描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列).每个格子里种了一株合根植物. 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成 ...

  8. Java实现 蓝桥杯 算法提高 判断名次

    算法提高 判断名次 时间限制:1.0s 内存限制:256.0MB 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头---_-!)得了第1名的人23 ...

  9. Java实现 蓝桥杯 历届试题 小数第n位

    历届试题 小数第n位 时间限制:1.0s 内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的 ...

  10. Java实现 蓝桥杯VIP 算法提高 计算时间

    算法提高 计算时间 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒.HH,MM,SS均是两位数,如果小于10用0补到 ...