文章目录

  • 一、拷贝的引入
    • (1)、引用拷贝
    • (2)、对象拷贝
  • 二、浅拷贝
    • (1)、定义
    • (2)、浅拷贝实例
  • 三、深拷贝
    • (1)、定义
    • (2)、深拷贝实例

一、拷贝的引入

(1)、引用拷贝

创建一个指向对象的引用变量的拷贝。

Teacher teacher = new Teacher("Taylor",26);
Teacher otherteacher = teacher;
System.out.println(teacher);
System.out.println(otherteacher);

输出结果:

blog.Teacher@355da254
blog.Teacher@355da254

结果分析:由输出结果可以看出,它们的地址值是相同的,那么它们肯定是同一个对象。teacher和otherteacher的只是引用而已,他们都指向了一个相同的对象Teacher(“Taylor”,26)。这就叫做引用拷贝。

(2)、对象拷贝

创建对象本身的一个副本。

Teacher teacher = new Teacher("Swift",26);
Teacher otherteacher = (Teacher)teacher.clone();
System.out.println(teacher);
System.out.println(otherteacher);

输出结果:

blog.Teacher@355da254
blog.Teacher@4dc63996

结果分析:由输出结果可以看出,它们的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量,这就叫做对象拷贝。

注:深拷贝和浅拷贝都是对象拷贝

二、浅拷贝

(1)、定义

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。

简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象

(2)、浅拷贝实例

package com.test;public class ShallowCopy {public static void main(String[] args) throws CloneNotSupportedException {Teacher teacher = new Teacher();teacher.setName("riemann");teacher.setAge(27);Student2 student1 = new Student2();student1.setName("edgar");student1.setAge(18);student1.setTeacher(teacher);Student2 student2 = (Student2) student1.clone();System.out.println("拷贝后");System.out.println(student2.getName());System.out.println(student2.getAge());System.out.println(student2.getTeacher().getName());System.out.println(student2.getTeacher().getAge());System.out.println("修改老师的信息后-------------");// 修改老师的信息teacher.setName("Games");System.out.println(student1.getTeacher().getName());System.out.println(student2.getTeacher().getName());}
}class Teacher implements Cloneable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Student2 implements Cloneable {private String name;private int age;private Teacher teacher;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}
}

输出结果:

拷贝后
edgar
18
riemann
27
修改老师的信息后-------------
Games
Games

结果分析:两个引用student1和student2指向不同的两个对象,但是两个引用student1和student2中的两个teacher引用指向的是同一个对象,所以说明是浅拷贝。

三、深拷贝

(1)、定义

深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

(2)、深拷贝实例

package com.test;public class DeepCopy {public static void main(String[] args) throws CloneNotSupportedException {Teacher2 teacher = new Teacher2();teacher.setName("riemann");teacher.setAge(27);Student3 student1 = new Student3();student1.setName("edgar");student1.setAge(18);student1.setTeacher(teacher);Student3 student2 = (Student3) student1.clone();System.out.println("拷贝后");System.out.println(student2.getName());System.out.println(student2.getAge());System.out.println(student2.getTeacher().getName());System.out.println(student2.getTeacher().getAge());System.out.println("修改老师的信息后-------------");// 修改老师的信息teacher.setName("Games");System.out.println(student1.getTeacher().getName());System.out.println(student2.getTeacher().getName());}
}class Teacher2 implements Cloneable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Object clone() throws CloneNotSupportedException {return super.clone();}
}class Student3 implements Cloneable {private String name;private int age;private Teacher2 teacher;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Teacher2 getTeacher() {return teacher;}public void setTeacher(Teacher2 teacher) {this.teacher = teacher;}public Object clone() throws CloneNotSupportedException {// 浅复制时:// Object object = super.clone();// return object;// 改为深复制:Student3 student = (Student3) super.clone();// 本来是浅复制,现在将Teacher对象复制一份并重新set进来student.setTeacher((Teacher2) student.getTeacher().clone());return student;}
}

输出结果:

拷贝后
edgar
18
riemann
27
修改老师的信息后-------------
Games
riemann

结果分析:

两个引用student1和student2指向不同的两个对象,两个引用student1和student2中的两个teacher引用指向的是两个对象,但对teacher对象的修改只能影响student1对象,所以说是深拷贝。

关于Java深拷贝和浅拷贝区别,你学废了么?


真诚地邀请您加入我们的大家庭.
在这里不仅有技术知识分享,还有博主们之间的互帮互助
不定期发红包,每月更有抽奖环节,游戏机和实体书相赠(包邮)
让我们抱团取暖,抱团内卷.打造美好C站.期待您的加入.
备注 : CSDN-xxxxxx (xxxxxx代表你csdn的昵称)

面试官:Java深拷贝和浅拷贝区别相关推荐

  1. 面试官:深拷贝与浅拷贝有啥区别?

    文章目录 1.前言 2.基本类型的拷贝 3.引用类型的拷贝 3.1 关于引用类型的浅拷贝 3.2 关于引用类型的深拷贝 1.前言 首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在 ...

  2. Java 深入理解深拷贝和浅拷贝区别

    title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...

  3. 吊打面试官 | Java到底是值传递还是引用传递

    HI ! 我是小小,我们又见面了,今天是本周的第六篇,这篇主要讲解关于Java到底是值传递还是引用传递. 先说答案 答案为值传递 答案解释 先说一下值传递和引用传递的概念和区别 值传递:是指在调用函数 ...

  4. 2020我也当了面试官-java面试题之一

    2020我也当了面试官-java面试题之一 写在前面   最近一段时间开始帮团队招聘一些1-3年的java开发人员,参与几场下来,发现有些面试官问的问题虽然基础,我却记忆有些模糊.大概是平常CRUD太 ...

  5. 面试官:useLayoutEffect和useEffect的区别

    面试官:useLayoutEffect和useEffect的区别 hello,这里是潇晨,大家面试的过程中有没有遇到过这样的问题呢,useLayoutEffect和useEffect的区别是什么,大家 ...

  6. java -- 深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝

    文章目录 1. 深拷贝和浅拷贝的区别 1.1 浅拷贝实例 1.1.1 测试1 直接赋值 1.1.2 测试2 改变源对象的值 1.2 深拷贝实例 `这是用于深拷贝的测试类` 1.2.1 方法一: 构造函 ...

  7. 面试官 | Java中的注解是如何工作的?

    自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述 ...

  8. 面试官:Java如何绑定线程到指定CPU上执行?

    不知道你是啥感觉,但是我第一次看到这个问题的时候,我是懵逼的. 而且它还是一个面试题. 我懵逼倒不是因为我不知道答案,而是恰好我之前在非常机缘巧合的情况下知道了答案. 我感觉非常的冷门,作为一个考察候 ...

  9. 面试官 | Java 对象不使用时为什么要赋值为 null?

    作者 | zhantong 来源 | www.polarxiong.com 前言 许多Java开发者都曾听说过"不使用的对象应手动赋值为null"这句话,而且好多开发者一直信奉着这 ...

最新文章

  1. java链式编程_Java 中的链式编程
  2. python的concat函数_python concat函数
  3. 有一些事情你不必要尝试
  4. 【tensorflow】 GPU 显存分配设置
  5. linux less命令简介
  6. console修改 ajax,【快速】chrome中console下ajax访问后台
  7. 中文能用rsa加密吗_外文文献数据库能用中文词进行检索吗?
  8. 《大数据》第2期 专题导读
  9. mysql如何进行分组操作的_mysql group by 对多个字段进行分组操作
  10. 苹果电脑删除软件_5款Mac查杀恶意流氓软件,防护你的MacOS电脑,随时清理优化更加安全!...
  11. mysql 线上修改参数_9.10、mysql进程、状态在线修改参数重要知识
  12. 消防信号二总线有没电压_消防主机总线电压偏低 消防二总线详解
  13. linux查看系统信息命令 转自:http://blog.chinaitlab.com/html/31/1365331-180901.html
  14. 如果让你来制作一个访问量很高的大型网站,你会如何来管理所有CSS文件、JS与图片?
  15. linux系统上安装微信(Ubuntu/Debian 微信安装)
  16. 完美解决composer提示输入用户名和密码
  17. ###好好好好好########呼叫中心FAQ
  18. 启动远程计算机的屏保,远程桌面能使用屏幕保护吗
  19. websocket配置
  20. Linux虚拟机(lvm)报Unmount and run xfs_repair

热门文章

  1. 汽车科目一学习考试系统
  2. 识不足则多虑,威不足则多怒,信不足则多言
  3. 兄弟Brother DCP-8110D 驱动
  4. TWICImage.SaveToStream(Stream: TStream)方法修正
  5. SetWindowLong 用法
  6. Go语言实现PoW共识算法(详解)
  7. 鼠标滚轮事件(mousewheel / DOMMouseScroll)兼容性处理
  8. C#:CheckedListBox的用法
  9. acrh17华硕固件_华硕RT-ACRH17路由不死OpBoot
  10. [转载]PDA软件推荐