首页 > 编程语言 >Java学习之克隆

Java学习之克隆

时间:2024-11-28 22:34:21浏览次数:11  
标签:Java 克隆 int clone 学习 user date user2 User

把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。

  • 克隆对象

    方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。

    1.重写Object中的clone方法

    • 浅克隆

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

    深克隆

    2.让javabean类实现cloneable接口

    3.创建对象并调用clone

    User user = new User("张三",18,"男");
            User user2 = (User)user.clone();

  • 浅克隆

    将对象内部的基本数据类型和引用数据类型全部拷贝过来。

重写clone方法

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

执行以下代码

int []date ={1,2,3,4,5,6,7,8,9,10};
User user = new User("张三",18,"男",date);
User user2 = (User)user.clone();
int[] arr = user2.getDate();
arr[0]=100;
System.out.println(user);
System.out.println(user2);

运行结果如下

显然,该方法是浅克隆

  • 深克隆

    基本数据类型拷贝过来,引用数据类型会创建新的。

重写clone方法

protected Object clone() throws CloneNotSupportedException {
        int[] date = this.date;
        int[] newDate = new int[date.length];
        for (int i = 0; i < date.length; i++) {
            newDate[i] = date[i];
        }
        User u = (User)super.clone();
        u.date = newDate;
        return u;
    }

执行以下代码

int []date ={1,2,3,4,5,6,7,8,9,10};
User user = new User("张三",18,"男",date);
User user2 = (User)user.clone();
int[] arr = user2.getDate();
arr[0]=100;
System.out.println(user);
System.out.println(user2);

运行结果如下

显然,该方法是深克隆

但是这种方法太繁琐了,我们可以通过导入第三方工具gson来快速进行深克隆

Gson 是 Google 提供的一个用来在 Java 对象和 JSON 数据之间进行映射的 Java 库。它允许你将 Java 对象转换为它们对应的 JSON 表示形式

通过引入Maven依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

然后执行以下代码

int []date ={1,2,3,4,5,6,7,8,9,10};
        User user = new User("张三",18,"男",date);
        
        Gson gson=new Gson();
        //把对象变成一个字符串
        String json = gson.toJson(user);
        //再把字符串变回对象
        User user2=gson.fromJson(json,User.class);
        
        int[] arr = user.getDate();
        arr[0]=100;
        System.out.println(user);
        System.out.println(user2);

运行结果如下

这样就优雅的完成了深克隆

标签:Java,克隆,int,clone,学习,user,date,user2,User
From: https://blog.csdn.net/2301_81288466/article/details/144013659

相关文章

  • 【学习笔记】(二)SpringBoot项目启动的大致流程
    SpringBoot执行流程梳理书接上回,上回说到JarLaunch通过反射调用,进入到了我们的Spring项目main方法中。本节将会大致的梳理Spring启动的执行流程,并把我在阅读源码时碰到的问题做一个简要的记录。为后续引出我们常常叨叨的Spring自动配置打下基础。文章目录SpringBoot执......
  • JavaWeb学习之HTML与CSS
    HTML超文本标记语言超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。标记语言:由标签树成的语言HTML标签都是预定义好的。例如:使用<a>展示超链接,使用<img>展示图片,<video>展示视频。HTML代码直接在浏览器中运行,HTML标签由浏览......
  • C# 与深度学习:构建智能应用的新途径
    随着人工智能技术的飞速发展,深度学习已经成为智能应用的核心驱动力之一。许多开发者和工程师纷纷投入到深度学习的世界中,试图利用这一技术为应用程序赋予“智慧”。然而,提到深度学习,许多人往往首先想到的是Python,毕竟它在这一领域有着强大的库和广泛的支持。然而,随着C#和.......
  • 如何从学渣到学霸:学习成长的技术性思考与实现路径
    程序员的思维乐园微积分在生活中的应用与思维启发捕鹿到瞬时速度的趣味探索微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。数据库才是最强架构你还在被“复杂架构”误导吗?把业务逻辑写入数据库,重新定义简单与效率。正则表达式灾难重新认识“KISS原则”......
  • python学习自用(其五)
    函数系统函数:内主函数,模块中的类自定义函数:根据需要自定义的功能格式:def函数名(形参):调用:函数名(实参)defsum(*args):total=0foriinargs:total+=ireturntotalprint(f'{sum(1,6,-1,-3)}')*args和**kwargs是Python中用于函数定义的特殊语......
  • 【机器学习】什么是逻辑回归?从入门到精通:掌握逻辑回归与二分类问题的解决之道
    从入门到精通:掌握逻辑回归与二分类问题的解决之道引言1.1逻辑回归简介1.2逻辑回归的应用场景逻辑回归基本原理2.1逻辑回归概述逻辑回归的基本思想预测类别的概率2.2线性模型与Sigmoid函数线性模型Sigmoid函数Sigmoid函数的性质为什么选择Sigmoid函数2.3逻辑回归......
  • ORB-SLAM2源码学习:ORBmatcher.cc:ORBmatcher::SearchByProjection通过地图点投影进行特
    前言在ORB-SALM2中,使用最多的匹配方式就是投影匹配的方式SearchByProjection(),根据参数列表的不同可以有不同的函数重载。1.原理:1.投影地图点的来源:1.恒速模型追踪时,地图点来自前一个普通的帧。2.局部地图跟踪时,地图点来自所有的局部地图点。3.重定位时,地图点来自所有的候......
  • AI大模型学习
    AI大模型探索之旅在你我之间,技术的界限似乎越来越模糊。人工智能(AI)逐渐渗透到各个领域,根据一些数据和统计,未来十年,AI将为全球经济贡献多达15.7万亿美元的价值。这一切的核心,正是“AI大模型”。这次,我们将一起深入探讨这一复杂的技术,了解它的定义、训练、应用及面临的挑战。......
  • MarkDown语法学习
    大标题 (#)标题2 (##)标题3 (###)引用 (>)有序列表:(1.)序列1序列2无序列表:(-)序列1序列2任务格子:(-[])任务1任务2代码块(```语言)#include<iostream>intmain(){return0;}数学公式: ($$)$$\frac{\partialf}{\partialx}=......
  • 【java编程】Unsafe 类
    Unsafe类不是一个ClassLoader,但是为什么要在本篇文章提起,其实是因为该类可以进行注入恶意类到JVM中.Unsafe类简介sun.misc.Unsafe类是一个提供底层、不安全的操作,比如直接内存访问、线程调度、原子操作等功能的工具类。这个类主要被Java内部库使用,比如Java的NIO、并......