精华内容
下载资源
问答
  • 2021-12-29 09:13:11

    区别:浅拷贝是对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝;而深拷贝是对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。

    https://blog.csdn.net/riemann_/article/details/87217229

    更多相关内容
  • 本文将会深入的探讨一下在拷贝对象中会出现的浅拷贝和深拷贝的情况。 拷贝接口 java中所有的对象都是继承自java.lang.Object。Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native ...
  • 今天小编就为大家分享一篇关于Java Clone深拷贝浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 浅拷贝被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象。换言之,浅拷贝 不复制引用对象。1 class Experience {2 private String skill;3 public void setSkill(String skill){4...

    浅拷贝

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

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    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 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    输出的结果:

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

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

    我是小明的副本,我精通Java,C++

    我是小明的副本,我精通Java,C++

    10

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

    深拷贝

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

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    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 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    输出的结果:

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

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

    我是小明的副本,我精通Java,C++

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

    10

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

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

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

    展开全文
  • 主要介绍了Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,需要的朋友可以参考下
  • java深拷贝和浅拷贝

    2022-04-25 17:30:59
    1.浅拷贝:对象中某一个引用类型的赋值,引用对象的值回随着修改而修改 2.深拷贝:引用对象重新开启新的空间,不会随着改变而改变;可以通过实现Cloneable接口。

    1.浅拷贝:对象中某一个引用类型的赋值,引用对象的值回随着修改而修改

    2.深拷贝:引用对象重新开启新的空间,不会随着改变而改变;可以通过实现Cloneable接口。

     
    

    展开全文
  • Java深拷贝和浅拷贝

    2019-11-12 16:38:14
    实则浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。

    Java深拷贝和浅拷贝

    浅拷贝:
    ①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。
    ②对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。

    具体模型如图所示:可以看到基本数据类型的成员变量,对其值创建了新的拷贝。而引用数据类型的成员变量的实例仍然是只有一份,两个对象的该成员变量都指向同一个实例。
    在这里插入图片描述
    浅拷贝的实现方式主要有两种:

    一、通过拷贝构造方法实现浅拷贝:

    拷贝构造方法指的是该类的构造方法参数为该类的对象。使用拷贝构造方法可以很好地完成浅拷贝,直接通过一个现有的对象创建出与该对象属性相同的新的对象。

    二、通过重写clone()方法进行浅拷贝:

    Object类是类结构的根类,其中有一个方法为protected Object clone() throws CloneNotSupportedException,这个方法就是进行的浅拷贝。有了这个浅拷贝模板,我们可以通过调用clone()方法来实现对象的浅拷贝。

    深拷贝
    对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝

    简单地说,深拷贝对引用数据类型的成员变量的对象图中所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。

    深拷贝模型如图所示:可以看到所有的成员变量都进行了复制。
    在这里插入图片描述
    深拷贝的实现方法主要有两种:

    一、通过重写clone方法来实现深拷贝

    与通过重写clone方法实现浅拷贝的基本思路一样,只需要为对象图的每一层的每一个对象都实现Cloneable接口并重写clone方法,最后在最顶层的类的重写的clone方法中调用所有的clone方法即可实现深拷贝。简单的说就是:每一层的每个对象都进行浅拷贝=深拷贝。

    二、通过对象序列化实现深拷贝

    虽然层次调用clone方法可以实现深拷贝,但是显然代码量实在太大。特别对于属性数量比较多、层次比较深的类而言,每个类都要重写clone方法太过繁琐。

    将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。

    总结

    实则浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。

    展开全文
  • java深拷贝浅拷贝 实现对象拷贝的类,需要实现 Cloneable 接口,并覆写 clone() 方法。 浅拷贝就是创建出一个对象后,将原类的成员变量的地址赋以新的对象的成员变量,像Object对象的clone方法就是浅拷贝 深...
  • 1. 实现 Cloneable 接口 浅拷贝 2. Apache的两个版本:(反射机制)  org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig) org.apache.commons.beanutils.BeanUtil...
  • JAVA深拷贝浅拷贝①对于Java拷贝的理解②浅拷贝一、图解二、代码举例三、适用情况③深拷贝一、图解二、代码举例三、适用情况 ①对于Java拷贝的理解   在JAVA语言中,我们常常会需要用到拷贝操作,当我们需要用到...
  • Java深拷贝浅拷贝

    2022-04-13 23:59:06
    由此可见,cnewC他们的地址是相同的,那他们引用了同一个对象。他们都指向了对象Children(“111”,18)。这叫引用拷贝。 2)对象拷贝 创建一个对象本身的副本。 代码如下: 输出结果如下: ...
  • Java深入理解深拷贝和浅拷贝区别

    万次阅读 多人点赞 2019-02-13 23:31:47
    一、拷贝的引入 (1)、引用拷贝 创建一个指向对象的引用变量的拷贝。 Teacher teacher = new Teacher("Taylor",26); Teacher otherteacher = teacher; System.out.println(teacher); System.out.println...
  • 主要介绍了java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java 浅拷贝和深拷贝

    2021-09-06 16:30:27
    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另...Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。 先介绍一点铺垫知识:Java中的数据类型分为基本数据类型.
  • java深拷贝浅拷贝

    2021-04-14 10:06:12
    文章目录什么是浅拷贝和深拷贝Java 中的 clone()Object 上的 clone() 方法浅拷贝举例深拷贝 什么是浅拷贝和深拷贝 首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。 在 ...
  • 浅拷贝 浅拷贝定义定义 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面所引用的对象。”里面所引用...
  • 在说深拷贝和浅拷贝之前先了解Java中的Cloneable接口 该接口与java.util.RandomAccess接口一样,仅起标识作用。实现此接口并重写clone()方法,即可实现类的拷贝功能。不管是深拷贝(非必须)还是浅拷贝都依赖于此...
  • 首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...
  • 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝深拷贝) 【变量-对象-引用】 在Python中一切都是对象,比如说:3, 3.14, ‘Hello’, [1,2,3,4],{‘a’:1}…… 甚至连type其本身都是对象,type对象 Python...
  • Java浅拷贝深拷贝详细解析
  • JAVA深拷贝和浅拷贝的实现

    千次阅读 2019-05-27 19:53:00
    Java深拷贝和浅拷贝的理解 Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。 Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时...
  • 1.深拷贝和浅拷贝的理解 1.1 浅拷贝 顾名思义,浅,即拷贝得比较浅,拷贝一个对象时除了对象下的8大基本数据类型和String类型外,其他自定义对象构成的属性都是指向source对象的自定义对象构成的属性的地址。所以,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,991
精华内容 14,396
关键字:

java深拷贝和浅拷贝

java 订阅