浅拷贝

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

 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. 题解 P6509 【[CRCI2007-2008] JEDNAKOST】

    洛谷题目传送门!! 洛谷博客!! 这道题感觉是一个很另类的DP  至少我的做法是这样的. 重要前置思想:把A存成字符串!!! (应该也没人会想着存成int和long long 吧) 首先,我们定义状态 ...

  2. 泛微 e-cology OA 前台SQL注入漏洞

    0x00概述 该漏洞是由于OA系统的WorkflowCenterTreeData接口在收到用户输入的时候未进行安全过滤,oracle数据库传入恶意SQL语句,导致SQL漏洞. 0x01影响范围 使用o ...

  3. Spring Cloud 系列之 Apollo 配置中心(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Apollo 配置中心(一) Spring Cloud 系列之 Apollo 配置中心(二) 本篇文章讲解 Apol ...

  4. (Java实现) 车站

    题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...

  5. Java实现 LeetCode 492 构造矩形

    492. 构造矩形 作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 你设 ...

  6. Java实现 LeetCode 486 预测赢家

    486. 预测赢家 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,--.每次一个玩家只能拿取一个分数,分数被拿取之后不再可 ...

  7. Java实现 LeetCode 485 最大连续1的个数

    485. 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数 ...

  8. Java实现 蓝桥杯VIP 算法训练 统计字符次数

    算法训练 统计字符次数 时间限制:1.0s 内存限制:512.0MB 输入一个字符串(长度在100以内),统计其中数字字符出现的次数. 样例输入 Ab100cd200 样例输出 6 import ja ...

  9. Java实现第八届蓝桥杯分巧克力

    分巧克力 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...

  10. 温故知新-多线程-深入刨析synchronized

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 synchroniz ...