浅拷贝

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

 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. Docker 笔记一相关命令

    Centos 7 : Service network restart 重启网络 Ip addr 查看ip地址 Uname -r 查看内核版本 Yum install docker 安装docker 命 ...

  2. word dde payload

    payload: ctrl+F9 {DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe" } Since this techni ...

  3. 资源在windows编程中的应用----菜单

    资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...

  4. 使用docker方式构建prometheus监控的学习

    一.背景:近期学习部署prometheus监控系统,经研究发现prometheus提供docker运行模式.根据我的经验,能够使用docker模式构建系统一定多快好省. 二.环境: 1.centos7 ...

  5. Rocket - tilelink - HintHandler

    https://mp.weixin.qq.com/s/MHW_aBSL72YNee9bVWWeaw   简单介绍HintHandler的实现.   ​​   1. 基本功能   实现Hint请求的处理 ...

  6. (Java实现) 活动选择

    活动选择的类似问题都可以这么写 import java.util.ArrayList; public class huodongxuanze { /** * //算法导论中活动选择问题动态规划求解 * ...

  7. Java实现 LeetCode 407 接雨水 II(二)

    407. 接雨水 II 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高 ...

  8. Java实现 洛谷 Car的旅行路线

    输入输出样例 输入样例#1: 1 3 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出样例#1: 47.5 import java.util. ...

  9. Java实现 LeetCode 169 多数元素

    169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输 ...

  10. Java实现 蓝桥杯VIP 算法提高 欧拉函数

    算法提高 欧拉函数 时间限制:1.0s 内存限制:512.0MB 说明 2016.4.5 已更新试题,请重新提交自己的程序. 问题描述 给定一个大于1,不超过2000000的正整数n,输出欧拉函数,p ...