首页 > 其他分享 >对象的创建方式:浅拷贝和深拷贝

对象的创建方式:浅拷贝和深拷贝

时间:2024-09-15 17:50:25浏览次数:3  
标签:对象 创建 数据类型 传递 实现 引用 拷贝

对象的创建方式:浅拷贝和深拷贝


前言

今天面试了一家公司,问到了一个面试题:对象的创建方式,我只想到了一个new关键字来创建,面试结束一查才恍然大悟,对象的创建方式不止是使用new来创建,还可以使用拷贝的方式,而拷贝又分为浅拷贝和深拷贝,我们来详细了解一下。


一、值传递和引用传递

在将浅拷贝之前,我们首先来讲一下值传递和引用传递吧,我来说一下我的理解,值传递和引用传递是数据复制的方式。
值传递:值传递是传递参数和原变量的数据相同,但存储位置不同,两者完全独立,不会相互影响(基本数据类型和String都是值传递,因为String类型数据底层由final修饰的字符数组常量,因此当字符串改变时会指向新的字符串的地址,并不会影响原数据的内存地址)
引用传递:引用传递指的是传递参数和原变量指向同一块内存地址,当有一方数据改变时,会影响另一块数据

二、浅拷贝和深拷贝的理解

1 浅拷贝

复制的对象和原对象的基本数据类型是值传递,引用数据类型是引用传递,共用同一个引用(即指向同一块内存地址),当有一方数据修改时另一方会受到影响。

在这里插入图片描述

2.深拷贝

复制的对象和原对象的基本数据类型是值传递,引用数据类型不是引用传递,而是创建一个对象,复制原对象的引用数据,但是指向不同的内存地址,它们之间完全对立,不会收到影响。
在这里插入图片描述


三、代码验证和实现

3.1 浅拷贝的代码实现

我使用的是StringUtils类的copyProperties实现浅拷贝

导入依赖以及代码实现

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

结果分析

浅拷贝的复制对象和原对象地址相同,它们的基本数据类型变量和引用数据类型变量相同,且引用数据指向的地址相同,当引用数据改变后,另一方数据也会改变。

3.2 深拷贝的代码实现

一、实现cloneable接口

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

结果分析

我们发现通过深克隆出来的对象和原对象的地址不同,它们的引用数据类型指向的内存地址也不同,当有一方的基本数据和引用数据发生改变时,另一方不会受到影响。

实现Cloneable接口并重写方法的缺点

当对象实现接口并重写克隆方法后,如果对象中含有其他对象,那么这个对象将会是浅克隆,因此需要让内部的所有对象都实现克隆接口并重写克隆方法,但是如果要被克隆的对象嵌套了很多对象,那么实现克隆将会异常的麻烦

二、实现序列化

在这里插入图片描述

标签:对象,创建,数据类型,传递,实现,引用,拷贝
From: https://blog.csdn.net/m0_71338251/article/details/142265681

相关文章

  • 开发nodejs RESETful api 创建项目流程
    开发nodejsRESETfulapi创建项目流程1.安装vm-windows、node.js和npm安装Node.js时,建议使用版本管理器,因为版本变更速度非常快。你可能需要根据所使用的不同项目的需要在多个Node.js版本之间进行切换。Node版本管理器(通常称为nvm)是安装多个版本的Node.js的最......
  • chapter08 面向对象编程高级 知识点总结Note
    文章目录static修饰符单例设计模式main()方法类的成员代码块实例变量赋值位置顺序final关键字abstract关键字使用抽象应用模板方法设计接口语法应用(多态匿名实现类)jdk8jdk9接口新特性类的成员内部类枚举类(自定义enum方法实现接口)注解常用注解与JUnit单元测试......
  • 如何创建和使用ExecutorService
    使用Executors工厂类来创建不同类型的ExecutorService。newFixedThreadPool(intn)可以创建一个固定大小的线程池。newCachedThreadPool()则可以创建一个根据需要自动扩展的线程池。实际案例:创建一个简单的多线程程序,使用ExecutorService执行一批任务,并获取它们的执行结果。......
  • 阿里云盘突发“灾难级 Bug”,创建相册之后可以随意观看他人照片
    多名网友在社交媒体上反映,阿里云盘出现了一起令人震惊的隐私安全事件。据用户反馈,在阿里云盘的相册功能中,只要创建一个新的文件夹,竟然能够自动加载并显示其他用户的照片,这些照片内容多样,包括自拍、风景照、家人旅游照片等,引发了广泛关注和讨论。据报道,9月14日晚,多位网友在......
  • 快速掌握类和对象
    目录1.面向对象的概念1.1面向对象的编程步骤2.类2.1类的详解2.2类的实例化---对象3.对象3.1对象的构造及初始化3.2构造方法3.3默认初始化4.this关键字5.static关键字5.1为什么要有static5.2static修饰成员变量---类变量5.3static修饰成员方法---类......
  • Spring 源码解读:使用FactoryBean创建复杂对象的实现
    引言在Spring框架中,FactoryBean是一个特殊的Bean,它允许开发者通过实现FactoryBean接口来控制Bean的创建过程,特别适用于创建复杂对象。FactoryBean可以将复杂对象的创建逻辑与业务逻辑分离,提供更高的灵活性和可扩展性。在本篇文章中,我们将手动实现一个FactoryBean接口,展示......
  • windows C++ 并行编程-并行容器和对象
    并行模式库(PPL)包括几个容器和对象,这些容器和对象提供对其元素的线程安全访问。并发容器提供对最重要操作的并发安全访问。在这里,并发安全意味着指针或迭代器始终有效。它不保证元素初始化或特定的遍历顺序。这些容器的功能与C++标准库提供的功能类似。例如,concurren......
  • 结构体类型,结构体变量的创建和初始化
    1.结构体类型的声明结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体语法规范structtag//结构体名字{member-list;//成员名字}variable-list;//结构体命名的变量使用举例例如描述⼀个学⽣:structStu{charname[20];//名字......
  • 创建型模式-单例模式
    单例模式有两种常见的实现方式:饿汉式和懒汉式。以下是它们的代码示例:1.饿汉式(EagerInitialization)在类加载时就创建实例,线程安全,适用于单例对象耗费资源较小的场景。publicclassSingletonEager{//在类加载时就创建实例privatestaticfinalSingletonEag......
  • java 反射创建内部类
    Java反射创建内部类在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时检查或修改类的行为。内部类(InnerClass)则是一种特殊的类,它定义在另一个类的内部,并可以访问外部类的成员。本文将深入探讨如何使用Java反射来创建内部类的实例,并展示其在实际开发中的应用。内部类的基......