首页
学习
活动
专区
圈层
工具
发布

Java的对象克隆

Object 类提供的 clone() 方法是 “浅拷贝”,并没有克隆对象中引用的其他对象,原对象和克隆的对象仍然会共享一些信息。...深拷贝指的是:在对象中存在其他对象的引用的情况下,会同时克隆对象中引用的其他对象,原对象和克隆的对象互不影响。介绍克隆要了解克隆的具体含义,先来回忆为一个包含对象引用的变量建立副本时会发生什么。...如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题、但是如果对象包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象和克隆的对象仍然会共享一些信息。...可以看到,默认的克隆操作是 “浅拷贝”,并没有克隆对象中引用的其他对象。浅拷贝会有什么影响吗?这要看具体情况。如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享就是安全的。...参考资料《Java核心技术卷一:基础知识》(第10版)第 6 章:接口、lambda 表达式与内部类 6.2.3 对象克隆

77210

Java对象的深克隆与浅克隆(对象复制)

第二次声明表明,原始和克隆的对象应该具有相同的类类型,但它不是强制性的。 第三声明表明,原始和克隆的对象应该是平等的equals()方法使用,但它不是强制性的。...浅克隆 如果原型对象的成员变量是值类型,将复制一份给克隆对象 如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象, 即原型对象和克隆对象的成员变量指向相同的内存地址。...当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型...6 总结 实现对象克隆的两种方式: 实现Cloneable接口并重写Object#clone() 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可实现真正的深克隆 基于序列化和反序列化实现的克隆不仅仅是深度克隆

3.3K52
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java--对象的克隆

    因为Java方法中对象参数的传递是句柄(引用)传递,所以方法中对句柄的改动会影响到原对象。 很少调用一个方法来处理它的参数,在实际编程中也要避免改变参数的情况。...但如果我们需要在一个方法的调用期间修改一个参数,且不打算修改外部实体,就应该在自己方法的内部制作一个那个参数的副本来保护那个参数。 制作对象副本需要使用clone()方法。...这个例子中由于别名问题,原Vector和拷贝的Vector都包含了相同的对象,即两个Vector是完全独立的,但其中容纳的东西相同,这就是”浅拷贝“。”...浅拷贝“只拷贝本对象,该对象内部指向的其他对象,以及”其他对象“又指向的另外的对象都不拷贝。 若要“深拷贝”,必须在覆盖的clone()里采取附加的操作。...注意:因为Java不可能在衍生之后反而缩小方法的访问范围,所以一旦对象变得可以克隆,从它衍生的任何东西都是可以克隆的。

    81670

    Java学习笔记之对象的复制和克隆

    第一次声明保证克隆对象将有单独的内存地址分配。 第二次声明表明,原始和克隆的对象应该具有相同的类类型,但它不是强制性的。...而通过clone方法赋值的对象跟原来的对象时同时独立存在的。 如何实现克隆 先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。...参考文档:Java如何复制对象 浅克隆和深克隆 1、浅克隆 在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址...简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。 ? 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

    70640

    一文了解Java对象的克隆,深浅拷贝(克隆)

    一、什么是对象的克隆? 在Java的Object类中,有一个方法名为clone(),直译过来就是克隆,核心概念就是复制对象并返回一个新的对象。...(1)在要实现克隆的对象类中实现Cloneable接口。 为啥?...重写是为了扩大访问权限,如果不重写,因Object的clone方法的修饰符是protected,除了与Object同包(java.lang)和直接子类能访问,其他类无权访问。...三、测试(浅克隆) 按照前面官方文档提到的,clone通常是一个浅拷贝,如果要做到深拷贝,需要对复制对象中的对象引用进行修改,换句话说就是浅拷贝的效果就是引用例行的属性无法完全复制,被克隆对象和克隆对象中的该引用类型的属性指向同一个引用...浅拷贝的情况下,原被克隆对象发生变化后,克隆对象的基本数据类型和不可变引用数据类型(String)的数据未发生影响,而cp字段为可变的应用类型,可以观察到克隆对象的内容随着被克隆对象的变化发生了同样的变化

    3.6K40

    Java中的深克隆和浅克隆

    我们常见的 Object a = new Object(); Object b; b = a; 这种形式的代码复制的是引用, 即对象在内存中的地址, a和b指向了同一个对象....它的工作原理如下: 在内存中先开辟一块和原始对象相同的空间, 然后复制原始对象的内容....Java中实现浅克隆 java中实现clone要实现 Cloneable 接口, 该接口十分简单, 源码如下: ? 仅仅起到一个标识的作用. 下面是一个实现浅克隆的例子: ?...Java序列化克隆 如果引用类型中海包括引用类型, 要实现多层克隆会很麻烦, 这使用可以使用序列化和反序列化的方式实现对象的深克隆....由于Java序列化的过程中, 写在流中的是对象的一个拷贝, 而原对象仍然在JVM中, 所以可以利用这个原理来实现对对象的深克隆. 上面代码使用序列化实现如下: ?

    1.9K10

    JAVA中的浅克隆和深克隆分析

    无论是在java面试过程中,还是在与各种老鸟交流的过程中,对java对象的深浅拷贝,都是一个绕不开的问题,这个问题看似很容易,却是大多数人用来区分小白的标准问题。现在对该问题进行说明。...1.定义 浅克隆(拷贝):复制一个对象的实例,但是这个对象中包含的其它的对象还是共用的。一般用super.clone()方法,clone的对象就是浅克隆。...深克隆(拷贝):复制一个对象的实例,而且这个对象中包含的其它的对象也要复制一份。...如果使用clone(),那么需要对clone方法进行重写,复制一个对象super.clone(),之后再一一对属性进行复制。这样显得非常冗余,幸好,在java中还可以通过流来实现。...当然,实现深克隆的方法并不局限于流这一种办法,还可以通过json等其他办法实现。

    1K20

    Java对象实现克隆的三种方式

    Java 对象克隆可以使用以下三种方式实现:1. 实现 Cloneable 接口并重写 clone() 方法Java 提供了 Cloneable 接口和 clone() 方法,用于支持对象克隆。...使用序列化和反序列化实现深拷贝使用序列化和反序列化可以实现对象的深拷贝,即克隆对象及其所有属性。实现方法如下:将对象序列化为字节流。将字节流反序列化为新的对象。...Java 序列化库,可以用于实现对象的深拷贝。...使用 Kryo 序列化库实现对象的克隆需要先定义一个 Kryo 对象,然后对需要克隆的对象进行序列化和反序列化。...使用 FST 序列化库实现对象的克隆需要先定义一个 FSTConfiguration 对象,然后对需要克隆的对象进行序列化和反序列化。

    5.7K70

    【深入理解JVM】Java对象创建过程和对象内部结构

    一、对象的创建过程 二、对象的内部结构(内存分配) 1、对象头 hashcode GC分代年龄 线程编号 锁编号 时间戳 引用计数 … 2、实例数据   存储所定义的各种类型字段内容,无论是从父类继承下来...,还是在子类中定义的,都需要记录起来。...3、对齐填充   起着占位符的作用,实例数据起始地址必须是8字节的整数倍,(对像的大小必须是8字节的整数倍)。 三、对象的访问   通过栈上的reference引用数据来访问堆上的实例数据。...1、直接指针   reference引用存储是对象地址,直接指向对象的实例数据,同时一个存储一个指向对象类型数据的指针。...2、句柄   reference引用存储是句柄地址,句柄地址存储两个对象和类型数据两个指针,一个指向对象实例数据,一个指向对象类型数据。

    24540

    java内部类和静态内部类区别_静态内部类对象的创建

    在阅读Java Collection Framwork时,LinkedList中有个静态内部类: private static class Node { E item...为了找到静态内部类和普通内部类的区别,我使用jad工具,自己重写一个类似的Node类,对其进行反编译后发现: 普通内部类版本: private class List$Node { List...,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。...每次生成一个非静态的内部类实例,都会有这样的操作。 恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。...所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    84310

    【JAVA零基础入门系列】Day14 Java对象的克隆

    今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充。   ...在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。...A指向的对象地址赋值给了B,这样B也同样指向这个地址,所以这时候,goodsA和goodsB操作的是同一个对象。   ...所以,如果只是简单的赋值的话,之后对于goodsA和goodsB的操作都将影响同一个对象,这显然不是我们的本意。...但是别高兴的太早,关于克隆,还有一点内容需要介绍。   克隆分为浅克隆和深克隆。我们上面使用的只是浅克隆,那两者有什么区别呢?

    74360

    内部类(来自类和对象的补充)

    之前我们在讲类和对象时就提到过内部类,不过当时说了等讲完抽象类和接口再讲这个,现在兑现诺言的时候到了,那我们开始内部类的学习吧! 内部类 ❤️❤️内部类是指在一个类的内部定义的另一个类。...内部类可以访问外部类的所有成员,包括私有成员。内部类提供了一种封装和组织代码的方式,可以将相关的类和接口放在一起,增加代码的可读性和可维护性。...所以实例内部类的实例化需要先创建外部类的实例,然后再通过外部类的实例来创建实例内部类的对象。...(这个懂得都懂,就不多讲了) ❤️❤️除此之外,到了其他类中我们用内部类对象引用就只能引用其内部方法和变量(不能引用外部类的) 用外部类对象引用也只能引用其方法和变量(不能引用内部类的)...2.静态内部类的创建不依赖于外部类的实例对象,可以直接通过外部类名创建。

    35810

    深入解析Java对象和类在HotSpot VM内部的具体实现

    本篇讨论Java对象和类在HotSpot VM内部的具体实现,探索虚拟机在底层是如何对这些Java语言的概念建模的。...图3-2 使用jhsdb hsdb命令查看oop的内部数据 oop最开始的两个字段是_mark和_metadata,它们包含一些对象的元数据,接着是包含对象字段的数据。...对象头 了解“oop是指向一片内存的指针,只是将这片内存‘视作’(强制类型转换)Java对象/数组”十分重要,因为对象的本质就是用对象头和字段数据填充这片内存。...3.1节介绍了HotSpot VM中对象和类的设计原则。3.2节介绍了对象和类模型,它们在JVM层表示Java层的对象。3.3节介绍了类模型,它们在JVM层表示Java层的Class。...本文给大家讲解的内容是深入解析Java对象和类在HotSpot VM内部的具体实现 下篇文章给大家讲解的是探讨虚拟机运行时的Java线程、栈帧、Java/JVM沟通、Unsafe类; 觉得文章不错的朋友可以转发此文关注小编

    90640

    java静态内部类和成员内部类的区别

    想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:  1....嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。 ...(){        //System.out.println(num);//不能直接访问外部类的非静态成员 // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)        System.out.println..., 不能访问外部类的非静态成员, 这是由Java语法中"静态方法不能直接访问非静态成员"所限定.注意, 外部类访问内部类的的成员有些特别, 不能直接访问, 但可以通过内部类实例来访问, 这是因为静态嵌套内的所有成员和方法默认为静态的了...非静态内部类的非静态成员可以访问外部类的非静态变量。     生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。

    1.1K10

    【java基础】ConcurrentHashMap1.7和1.8的不同实现

    ConcurrentHashMap有更深入的了解,本文将对ConcurrentHashMap1.7和1.8的不同实现进行分析。...1.7实现 数据结构 jdk1.7中采用Segment + HashEntry的方式进行实现,结构如下: ?...ConcurrentHashMap初始化时,计算出Segment数组的大小ssize和每个Segment中HashEntry数组的大小cap,并初始化Segment数组的第一个元素;其中ssize大小为...,实现如下: 场景:线程A和线程B同时执行相同Segment对象的put方法 1、线程A执行tryLock()方法成功获取锁,则把HashEntry对象插入到相应的位置; 2、线程B获取锁失败,则执行...所以在准确计算元素时存在一定的难度,一般的思路是统计每个Segment对象中的元素个数,然后进行累加,但是这种方式计算出来的结果并不一样的准确的,因为在计算后面几个Segment的元素个数时,已经计算过的

    56931

    PHP- 复合数据类型-对象的克隆和比较

    在 PHP 中,我们可以使用clone关键字来克隆一个对象。克隆一个对象会创建一个新的对象,并将原对象的属性值复制到新对象中。...然后,我们创建了一个Person对象$p1,并使用clone关键字克隆它,从而创建了一个新的对象$p2,并将原对象$p1的属性值复制到新对象$p2中。...在外部,我们可以通过访问属性$name来获取对象的属性值。在后面,我们修改了对象$p2的属性值,但并没有修改对象$p1的属性值。在 PHP 中,我们可以使用==和===运算符来比较两个对象是否相等。...==运算符比较两个对象的属性值是否相等,===运算符比较两个对象是否指向同一个内存地址。...";} // 输出:Objects are not identical.在上面的代码中,我们创建了两个相同属性值的Person对象$p1和$p2,并分别使用==和===运算符比较它们。

    52721

    java面对对象(下.2抽象类和接口,内部类)

    今天我们来总结下java中的抽象类和接口,前面我们已经了解了类的概念,那为什么还要引入新的的概念呢?一切的产生都归结于需要(程序员的需求:懒得敲很多代码了!!!)  ...抽象方法:只有方法的声明,没有方法的实现。以分号结束: 比如: public abstract void talk() ; 含有抽象方法的类必须被声明为抽象类。 抽象类不能被实例化。...抽象类是用来被继承的, 抽象类的子类必须重 写父类的抽象方法 ,并提供方法体。若没有重写全部的抽象方法,仍 为抽象类。...不能用 abstract 修饰变量、代码块、构造器; 不能用 abstract 修饰私有方法、静态方法、 final 的方法、 final 的类  概述 接口的应用:代理模式(...Proxy)  内部类

    21230

    Java的类和对象

    https://www.captainbed.cn/f1 Java的类和对象是面向对象编程的核心概念。类是对象的模板,定义对象的属性和方法;对象是类的实例,具有类定义的属性和方法,并能进行交互。...通过类和对象,Java实现代码重用和模块化。...Java Java是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 二、类和类的实例化 类就是一类对象的统称。对象就是这一类具体化的一个实例。...总的来说:类相当于一个模板,对象是由模板产生的样本。一个类,可以产生无数的对象。 声明一个类就是创建一个新的数据类型,而类在 Java 中属于引用类型, Java 使用关键字 class 来声明类。...三、类的成员 类的成员可以包含以下:字段、方法、代码块、内部类和接口等 字段/属性/成员变量 在类中, 但是方法外部定义的变量.

    21500
    领券