浅拷贝

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

 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. [工具推荐]003.Tortoisegit使用教程(补充)

    前文介绍:       在前文<[工具推荐]003.Tortoisegit使用教程>中详细介绍了如何使用Tortoisegit的使用,但是大家使用后反映一点,就是每次操作都需要输入账号名和 ...

  2. hashMap探析

    本篇文章包括: 数据结构 各个参数 为什么数组的长度是2的整数次方 为什么要将装载因子定义为0.75 为什么链表转红黑树的阈值为8 hash碰撞 put方法 resize方法 jdk7中数组扩容产生环 ...

  3. Java多线程--synchronized的用法

    全面介绍Synchronized:https://blog.csdn.net/luoweifu/article/details/46613015 synchronized class/this/obj ...

  4. python中的数据存储认识

    声明:本人是一个初学者,博客内容基本也是一些基础的东西,如果说的有什么问题欢迎纠正. 前言 许多人初学python之前应该也学习过其他的语言,比如博大精深的c语言,笔者在学习python之前就学习过c ...

  5. Netty学习笔记(二) - ChannelPipeline和ChannelHandler

    ChannelPipeline 和 ChannelHandler 是 Netty 重要的组件之一,通过这篇文章,重点了解这些组件是如何驱动数据流动和处理的. 一.ChannelHandler 在上一篇 ...

  6. 基于S7-PLCSIM Advanced搭建S7通信仿真环境

    写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...

  7. Rocket - tilelink - ErrorEvaluator

    https://mp.weixin.qq.com/s/NkbW465NAmhDsETksd2M0g   介绍ErrorEvaluator的实现.   ​​   1. 基本介绍   ErrorEvalu ...

  8. 最新 iOS 框架整体梳理(一)

    前言 这段话其实是我差不多写完文章之后再回过头来写的,原本在写文章之前想写一下写的初衷的,但当我写完之后感觉初衷没有收获更真切一些.其实到这篇为止总结出来的也就三十多个,有些是比较新的框架,有些是我们 ...

  9. Spring Cloud Ribbon 客户端负载均衡

    Ribbon客户端组件提供一系列完善的配置选项,比如连接超时.重试.重试算法等,内置可插拔.可定制的负载均衡组件.下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权轮询负载均衡 区域感知轮询负载均 ...

  10. Java实现 蓝桥杯 算法训练 相邻数对(暴力)

    试题 算法训练 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 ...