一,浅拷贝

①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。

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

二,深拷贝

设想一下,一个类有一个对象,其成员变量中又有一个对象,该对象指向另一个对象,另一个对象又指向另一个对象,直到一个确定的实例。这就形成了对象图。那么,对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝!

三,总结

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

四,深浅拷贝实现方法

public class Person implementsCloneable {privateString name;private intage;public Person(intage, String name) {this.age =age;this.name =name;

}publicPerson() {

}public intgetAge() {returnage;

}publicString getName() {returnname;

}//clone是浅拷贝//@Override//protected Object clone() throws CloneNotSupportedException {//return super.clone();//}//深拷贝

@Overrideprotected Object clone() throwsCloneNotSupportedException {

String name= new String(this.name);return new Person(23, name);

}public static void main(String[] args) throwsCloneNotSupportedException {

Person person1= new Person(23, "李四");//Person person2 = (Person) person1.clone();//浅拷贝

Person person2 = (Person) person1.clone();//深拷贝

String result = person1.getName() == person2.getName() ? "clone是浅拷贝" : "clone是深拷贝";

System.out.println(result);

}

}

java的深浅拷贝_Java中深浅拷贝相关推荐

  1. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  2. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  3. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

  4. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

  5. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件

    获取文件的绝对路径,读取该文件 一.文件目录打印图 下面的文件目录图,是项目中文件的位置信息:下面的例子是按照这个图来演示的. . |-- java | |-- ibard | | |-- demo1 ...

  6. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  7. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  8. java string 对象地址_Java中String对象的存储位置(学习笔记)

    packagetest.string.equal;public classMain {/*** 创建了三个对象,"helloworld对象创建在常量池中",每次new String ...

  9. java 定义整数数组_JAVA中数组的正确定义方法是什么?

    数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. §5.1一维数组 一.一维数组的定义 type arrayName[]; 其中类型(type)可以为Java中任 ...

最新文章

  1. Javascript+PHP实现在线拍照功能 (转)
  2. Eclipse Git 克隆项目的时候出现Internal error; consult Eclipse error log
  3. HTTPS之SSL处理过程,对此加密和非对称加密
  4. 文件不能自动求和_Excel求和公式函数的使用方法教程
  5. python入门实践19章_求助贴,python编程才能够入门到实践 第19章 19.2.2 代码出错
  6. 互联网搜索的哪些环节 机器学习_机器学习、深度学习以及强化学习在金融领域有哪些应用?...
  7. 中文转unicode编码英文不转
  8. linux ftp 500误,Linux Vsftp报错500 OOPS如何修复
  9. 计算机数字键盘如何用,电脑小数字键盘不能使用的原因和解决方法
  10. Linux Netfilter/NAT的两个典型问题
  11. 远程主机强迫关闭了一个现有的连接.
  12. Java 高并发之魂
  13. 从前,有座山,山里有座庙,庙里有苦逼IT
  14. 常用二极管介绍和整流二极管1N4007参数解读
  15. android有多个活动,Android活动一探究竟
  16. Django配置163邮箱出现 authentication failed(535)错误解决方法
  17. word交叉引用、连续多文献引用等
  18. 软件测试工程师这个岗位职责是什么?具体都需要干什么?
  19. 【案例】蜂巢链:基于区块链的资产证劵化
  20. 高压线性 LED恒流驱动器 PWM调光 内置MOS1A 外置MOS 2A

热门文章

  1. span之间的空隙怎样解决?
  2. 4个万兆光口+16个千兆光口+8个千兆combo光电复用口万兆三层核心工业以太网交换机HY5700-854XG16GX8GC
  3. 7-45 小何的旅行I分数 25
  4. LVS 负载均衡集群(一)| 超详细!一文带你了解 LVS 负载均衡集群
  5. Kubernetes监控在小米的落地
  6. Python+uiautomator2手机UI自动化测试实战
  7. Echarts地图自定义图标Symbol同时动态更改图标进行切换显示
  8. LaTeX 段落:段落缩进、段落间距、行距
  9. springboot校园二手书籍交易平台 毕业设计-附源码131558
  10. html5 阿狸照片展示,阿狸手抄报美观简洁图片5张