首页 > 其他分享 >为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么

为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么

时间:2024-11-12 14:31:21浏览次数:1  
标签:克隆 区别 System test student println 拷贝 out

有时需要复制一个对象,并且希望保留原有的对象进行接下来的操作。这时就需要使用克隆。

如何实现对象克隆?

  1. 实现Cloneable接口并重写clone方法
  • 实现​​Cloneable​​接口后,可以调用​​Object.clone()​​方法来创建一个新的对象。
  1. 通过序列化和反序列化实现深克隆
  • 将对象转换为字节流(序列化),然后再将字节流转回对象(反序列化)。
  1. 使用BeanUtils、Apache Commons或Spring等工具类库提供的bean工具
  • 这些工具提供了方便的克隆功能,但通常只能实现浅克隆。

深拷贝和浅拷贝的区别是什么?

 

  • 浅拷贝:仅复制基本类型变量,不复制引用类型的变量。
  • 深拷贝:既复制基本类型变量,又复制引用类型的变量。

示例代码解析

浅拷贝示例
public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        Address address = new Address();
        address.setDescribe("北京市朝阳区");
        student.setAddress(address);

        try {
            Student cloneStu = (Student) student.clone();
            System.out.println("------------------------------浅拷贝----------------------------------");
            System.out.println("student == cloneStu: " + (student == cloneStu));
            System.out.println("student.getAddress() == cloneStu.getAddress(): " + (student.getAddress() == cloneStu.getAddress()));
            System.out.println("student.getAddress().getDescribe() == cloneStu.getAddress().getDescribe(): " + (student.getAddress().getDescribe() == cloneStu.getAddress().getDescribe()));

            // 修改属性前
            System.out.println(student.toString());
            System.out.println(cloneStu.toString());

            // 修改属性
            student.setName("李四");
            address.setDescribe("上海市浦东新区");

            // 修改属性后
            System.out.println(student.toString());
            System.out.println(cloneStu.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
深拷贝示例
public class DeepCloneTest implements Cloneable {
    private String name;
    private int age;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        DeepCloneTest test = new DeepCloneTest();
        test.name = "张三";
        test.age = 20;

        try {
            DeepCloneTest cloneTest = (DeepCloneTest) test.clone();
            System.out.println("------------------------------深拷贝----------------------------------");
            System.out.println("test == cloneTest: " + (test == cloneTest));
            System.out.println("test.name == cloneTest.name: " + (test.name == cloneTest.name));
            System.out.println("test.age == cloneTest.age: " + (test.age == cloneTest.age));

            // 修改属性前
            System.out.println(test.toString());
            System.out.println(cloneTest.toString());

            // 修改属性
            test.name = "李四";
            test.age = 25;

            // 修改属性后
            System.out.println(test.toString());
            System.out.println(cloneTest.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

标签:克隆,区别,System,test,student,println,拷贝,out
From: https://www.cnblogs.com/2324hh/p/18541854

相关文章

  • python中copy模块的使用,深拷贝和浅拷贝
    文章目录一、copy模块的介绍1、copy模块二、copy模块的使用拓展说明:1、id()函数的使用2、is和==的区别python的轮子太多啦,下面介绍一下这个小模块的使用一、copy模块的介绍1、copy模块copy模块用于对象的拷贝操作。copy模块非常简单,只有两个api。分别是copy.......
  • NVR接入录像回放平台EasyCVR视频分析设备平台视频监控热知识分享:2.4G和5G的路由器区别
    在当今数字化时代,无线网络已成为我们生活中不可或缺的一部分,而无线路由器作为连接数字世界的关键设备,其性能和功能直接影响着我们的网络体验。随着技术的发展,用户对无线路由器的需求不再仅限于基本的联网功能,而是开始追求更高速、更稳定、更安全的网络服务。同时,对于安防视频监控......
  • JDK、JRE、JVM之间的区别
     JVM(JavaVirtualMachine,Java虚拟机):-JVM是Java程序的运行平台,它是一种抽象化的计算机,可以将编译后的Java字节码(.class文件)转换为特定操作系统能够执行的机器码。它负责管理内存分配、垃圾回收、线程管理等底层服务,使得Java具有“一次编写,到处运行”的跨平台能力。JRE......
  • JDK、JRE、JVM之间的区别
     JVM(JavaVirtualMachine,Java虚拟机):-JVM是Java程序的运行平台,它是一种抽象化的计算机,可以将编译后的Java字节码(.class文件)转换为特定操作系统能够执行的机器码。它负责管理内存分配、垃圾回收、线程管理等底层服务,使得Java具有“一次编写,到处运行”的跨平台能力。JRE......
  • Java中的 Exception 和 Error 有什么区别
    Exception和Error都是Throwable类的子类(在Java代码中只有继承了Throwable类的实例才可以被throw或者被catch)它们表示在程序运行时发生的异常或错误情况。总结来看:Exception表示可以被处理的程序异常,Error表示系统级的不可恢复错误。详细说明:1)Exception:是程序中可......
  • Java中包装类型和基本类型的区别:深入理解与应用
    Java中包装类型和基本类型的区别:深入理解与应用引言在Java编程中,基本类型(PrimitiveTypes)和包装类型(WrapperTypes)是两种不同的数据类型。基本类型是Java语言的核心部分,而包装类型则是为了提供更多的功能和灵活性。本文将深入探讨Java中包装类型和基本类型的区别,帮助你更......
  • 管理 Python 环境和依赖关系的工具 venv、virtualenv、pipenv 、poetry 、 miniforge
    管理Python环境和依赖关系的工具venv、virtualenv、pipenv、poetry、miniforge和anaconda的区别venv、virtualenv、pipenv、Poetry、Miniforge和Anaconda都是用于管理Python环境和依赖关系的工具,但它们在功能和使用场景上有一些显著的区别。以下是它们的主要区别:v......
  • 鸿蒙ArkTS和TS有什么区别?
    Ark是强类型,打包编译的时候会保留类型。提高程序运行效率。TS支持类型校验,但是并不严格,支持any、unknown这些不明确的类型。编译后其实js+d.ts,js文件不保留类型。ArkTS基本禁用了动态类型比如对象不能随意添加或者删除某些属性,对象类型要明确,需提前用interface或class把......
  • AI数字人克隆分身开源源码震撼上线!
    第一:丰富公模系统内置几十款数字人公共形象模板,无需克隆即可直接使用,快速生成专业主播出镜的高逼真数字人口播视频。第二:形象克隆只需自助在线上传一段30秒的视频,即可快速1:1克隆属于你的个性化数字人分身。双模式可选:目前我们的数字人小程序软件自带两种形象克隆模式可......
  • 重载和重写的区别
     重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们在实现多态性时起着关键作用,但两者之间有明显的区别:定义上的区别:重载(Overloading)指的是在同一个类中可以有多个方法名相同,但这些方法的参数列表(参数的个数、类型或顺序)不同,或者是方法的返回类型在Ja......