复制

  将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。

1.直接赋值

  在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化时,a2里面的成员变量也会跟着变化。

2.浅复制(复制引用但不复制引用的对象)

 浅复制,又称为浅拷贝。创建一个新对象,然后将当前对象非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段时引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

 1 class Resume implements Cloneable{
2 public Object clone() {
3 try {
4 return (Resume)super.clone();
5 } catch (Exception e) {
6 e.printStackTrace();
7 return null;
8 }
9 }
10 }

3.深复制(复制对象和其引用对象)

  又称深拷贝,不仅复制对象本身,而且复制对象包含的引用指向的所有对象。

 1 class Student implements Cloneable {
2 String name;
3 int age;
4 Professor p;
5 Student(String name, int age, Professor p) {
6 this.name = name;
7 this.age = age;
8 this.p = p;
9 }
10 public Object clone() {
11 Student o = null;
12 try {
13 o = (Student) super.clone();
14 } catch (CloneNotSupportedException e) {
15 System.out.println(e.toString());
16 }
17 o.p = (Professor) p.clone();
18 return o;
19 }
20 }

使用clone()方法克隆一个对象的步骤:

  1)被克隆的类要实现Cloneable接口。

  2)被克隆的类要重写clone()方法。

  那么在编程时,如何选择使用哪种复制方式呢?首先,检查类有无非基本类型(即对象)的数据成员。若没有,则返回super.clone()即可。若有,确保类中包含的所有非基本类型的成员变量都实现了深复制。

引申:浅复制与深复制的区别?

  浅复制(Shallow Clone):被复制的对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它引用的对象。

  深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不是原有的那些被引用的对象。换而言之,深复制把复制的对象所引用的对象都复制了一遍。

扩展:

  原型模式主要用于对象的复制,实现了接口(实现Cloneable接口),重写一个方法(重写Object类中的clone()方法),即完成了原型模式。

  原型模式中的拷贝分为“浅拷贝”和“深拷贝”:

    浅拷贝:对值类型的成员变量进行值的复制,对引用类型得成员变量只复制引用,不复制引用的对象。

    深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。

  (Object类的clone方法只会拷贝对象中的基本数据类型的值,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。)

java中的浅拷贝和深拷贝的更多相关文章

  1. 【转】JAVA中的浅拷贝和深拷贝

    原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...

  2. java中的浅拷贝与深拷贝

    浅拷贝: package test; class Student implements Cloneable { private int number; public int getNumber() { ...

  3. 【Java】 Java中的浅拷贝和深拷贝

    先抛出结论: 浅拷贝是引用拷贝,A对象拷贝B以后,A对象和B对象指向同一块内存地址,改变A对象的属性值会触发B对象属性的改变,有安全风险 深拷贝是对象拷贝,A对象拷贝B以后,A对象和B对象指向不同的额 ...

  4. 深入理解Java中的Clone与深拷贝和浅拷贝

    1.Java对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象. ...

  5. Java对象的浅拷贝和深拷贝&&String类型的赋值

    Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...

  6. js中的浅拷贝和深拷贝

    说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...

  7. Javascript中的浅拷贝和深拷贝

    很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用 ...

  8. 浅谈JS中的浅拷贝与深拷贝

    前端工程师应该都比较熟悉浅拷贝和深拷贝的概念,在日常业务代码的过程中,特别是做数据处理的时候,经常行的会遇到,比如如何在不修改原对象的基础上,重新生成一个一模一样的对象,加以利用,又或是,如何巧妙地运 ...

  9. javascript中的浅拷贝和深拷贝(拷贝引用和拷贝实例)

    作者:千锋教育链接:https://www.zhihu.com/question/23031215/answer/326129003来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

随机推荐

  1. JSR303 校验扩展(分组、按顺序校验)

    1.在spring MVC 项目中使用JSR303 校验数据合法性,一般情况下使用方法为 (1)在接受数据的实体使用注解标添加校验规则 package com.hzsj.wechatdto; impo ...

  2. zookeeper集群的搭建(CentOS 7)

    注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...

  3. html中的锚点设置

    html中的锚点 一.页面内跳转的锚点设置 页面内的跳转需要两步: 方法一: ①:设置一个锚点链接去找喵星人:(注意:href属性的属性值最前面要加#) ②:在页面中需要的位置设置锚点<a na ...

  4. vlang

    参考 V语言中文教程 - 基础部分

  5. static修饰的成员与非static修饰类的成员的区别

    ① 格式 : 1> static修饰的,称为静态成员,非static修饰的,称为非静态成员. ② 内存位置: 1>static修饰的,在方法区的静态区中,非static修饰的,在堆中的对象 ...

  6. 在html中展示pdf

    pc端 插件: https://pdfobject.com/ 使用: <!doctype html> <html lang="en"> <head&g ...

  7. 将div的内容生成清晰的PDF、高清PDF

    //需要引入html2canvas.js.jquery.js文件 html: <button type="button" class="btn btn-primar ...

  8. php学习第一天(记录注意事项)

  9. Android 一共有多少种动画?准确告诉你!

    Android 动画 Android 动画在开发中是不可或缺的功能,或者说是界面灵动的添加剂.那你是否总结过 Android 中总共为开发者提供了多少种方式的动画呢?今天就为大家总结归纳一下.   报 ...

  10. 2019-11-29-WPF-轻量级-MVVM-框架入门-2.1.2

    title author date CreateTime categories WPF 轻量级 MVVM 框架入门 2.1.2 lindexi 2019-11-29 10:16:10 +0800 20 ...